Files
oboe/osx/dialogxml/dialog.keys.h
Celtic Minstrel 88cb60fb8d Embark on an epic journey to document the dialog engine in as much detail as possible.
... and the previous commits (from 56f73cb on) were by and large a result of things noticed during this process.
2014-12-06 13:37:43 -05:00

92 lines
2.9 KiB
C

//
// dialog.keys.h
// BoE
//
// Created by Celtic Minstrel on 14-03-31.
//
//
#ifndef BoE_dialog_keys_h
#define BoE_dialog_keys_h
/// @file
/// Key-related classes and types.
/// Keyboard modifiers, as a bit-field-like enumeration.
/// Note that mod_ctrl refers to both the control key and the Mac's command key.
/// It also covers the "meta" key supported in certain other systems, and may
/// also be triggered by the Windows key.
///
/// Use mod_contains() to check if a specific modifier is set in the bit field.
enum eKeyMod {
mod_none = 0, ///< No modifier
/// @{ A single modifier
mod_alt = 1, mod_shift = 2, mod_ctrl = 4,
/// @}
/// @{ Two modifiers
mod_altshift = mod_alt + mod_shift,
mod_altctrl = mod_alt + mod_ctrl,
mod_shiftctrl = mod_shift + mod_ctrl,
/// @}
/// All modifiers
mod_all = mod_alt + mod_shift + mod_ctrl,
};
/// Representations of special keys.
/// Not all of these represent a literal single keypress.
/// Some refer to common two-keypress keyboard shortcuts.
enum eSpecKey {
key_left, key_right, key_up, key_down,
key_esc, key_enter, key_tab, key_help, // key_help should bind to the help key on Mac and the F1 key on Windows
key_bsp, key_del, key_home, key_end, key_pgup, key_pgdn, // TODO: Implement these
key_copy, key_cut, key_paste, key_selectall
// TODO: On Mac, command-left should trigger key_home; command-right should trigger key_end;
// command-up should trigger key_pgup; and command-down should trigger key_pgdn.
// This is in addition to the home, end, pgup, pgdn keys triggering these.
};
/// Represents a keypress.
struct cKey {
/// If true, it's a special key. Otherwise, a character has been typed.
bool spec;
union {
/// The character that has been typed.
unsigned char c;
/// The special key that was pressed.
eSpecKey k;
};
/// A bit field of held key modifiers.
eKeyMod mod;
};
/// Combine two key modifiers.
/// @param lhs @param rhs
/// @return lhs + rhs
eKeyMod operator + (eKeyMod lhs, eKeyMod rhs);
/// Cancel out a key modifier.
/// @param lhs @param rhs
/// @return lhs - rhs
eKeyMod operator - (eKeyMod lhs, eKeyMod rhs);
/// Combine two key modifiers.
/// @param lhs The key modifier set to modify.
/// @param rhs The key modifier to remove.
/// @return lhs, now modified.
eKeyMod&operator += (eKeyMod&lhs, eKeyMod rhs);
/// Cancel out a key modifier.
/// @param lhs The key modifier set to modify.
/// @param rhs The key modifier to remove.
/// @return lhs, now modified.
eKeyMod&operator -= (eKeyMod&lhs, eKeyMod rhs);
/// Compare two keys.
/// @param a @param b
/// @return Whether they are equal.
bool operator== (cKey a, cKey b);
/// Check if haystack contains the modifier specified by needle.
/// @param haystack The set of modifiers to check.
/// @param needle The modifier to check for; generally one of mod_alt, mod_shift, or mod_ctrl.
/// @return true if the needle is in the haystack
bool mod_contains(eKeyMod haystack, eKeyMod needle);
#endif