mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-18 16:03:05 +00:00
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:
parent
adb5342247
commit
a473934abd
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user