COMMON: Perform some keymapper-related changes to the KeyState struct

The == operator in KeyState should not be checking for sticky modifier
keys. This allows the keymapper's defined actions to function correctly
in desktop platforms, when sticky modifier keys such as caps lock and
num lock are turned on. Also, added some sanity checks to hasFlags()
and enums for sticky and non-sticky keys
This commit is contained in:
Filippos Karapetis 2011-12-30 13:59:05 +02:00
parent adb5342247
commit a473934abd
2 changed files with 17 additions and 6 deletions

View File

@ -97,7 +97,7 @@ public:
List<const HardwareKey*>::const_iterator it;
for (it = _keys.begin(); it != _keys.end(); it++) {
if (keystate.keycode == (*it)->key.keycode && keystate.hasFlags((*it)->key.flags))
if ((*it)->key == keystate)
return (*it);
}
return 0;

View File

@ -224,11 +224,14 @@ enum {
KBD_CTRL = 1 << 0,
KBD_ALT = 1 << 1,
KBD_SHIFT = 1 << 2,
KBD_NON_STICKY = (KBD_CTRL|KBD_ALT|KBD_SHIFT),
// Sticky modifier flags
KBD_NUM = 1 << 3,
KBD_CAPS = 1 << 4,
KBD_SCRL = 1 << 5
KBD_SCRL = 1 << 5,
KBD_STICKY = (KBD_NUM|KBD_CAPS|KBD_SCRL)
};
/**
@ -281,19 +284,27 @@ struct KeyState {
/**
* Check whether the non-sticky flags are *exactly* as specified by f.
* This ignors the sticky flags (KBD_NUM, KBD_CAPS, KBD_SCRL).
* This ignores the sticky flags (KBD_NUM, KBD_CAPS, KBD_SCRL).
* Sticky flags should never be passed to this function.
* If you just want to check whether a modifier flag is set, just bit-and
* the flag. E.g. to check whether the control key modifier is set,
* you can write
* if (keystate.flags & KBD_CTRL) { ... }
*/
bool hasFlags(byte f) const {
return f == (flags & ~(KBD_NUM|KBD_CAPS|KBD_SCRL));
assert (!(f & KBD_STICKY));
return f == (flags & ~KBD_STICKY);
}
/**
* Check if two key states are equal. This implementation ignores the state
* of the sticky flags (caps lock, num lock, scroll lock) completely. This
* functionality is currently only used by the keymapper.
*/
bool operator==(const KeyState &x) const {
// intentionally ignore ascii
return keycode == x.keycode && flags == x.flags;
// Intentionally ignore ASCII, as the keycode and non-sticky flag
// combination should suffice.
return keycode == x.keycode && hasFlags(x.flags & ~KBD_STICKY);
}
};