[Scummvm-git-logs] scummvm master -> 29dd15af0c3ddb8f2b130c60b35ac0d9e115d695

bgK bastien.bouclet at gmail.com
Fri Feb 14 18:32:46 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
29dd15af0c KEYMAPPER: Enable remapping the keyboard modifier keys


Commit: 29dd15af0c3ddb8f2b130c60b35ac0d9e115d695
    https://github.com/scummvm/scummvm/commit/29dd15af0c3ddb8f2b130c60b35ac0d9e115d695
Author: Bastien Bouclet (bastien.bouclet at gmail.com)
Date: 2020-02-14T19:30:00+01:00

Commit Message:
KEYMAPPER: Enable remapping the keyboard modifier keys

Changed paths:
    backends/keymapper/hardware-input.cpp
    backends/keymapper/hardware-input.h
    backends/keymapper/keymap.cpp
    backends/keymapper/keymap.h
    common/keyboard.h


diff --git a/backends/keymapper/hardware-input.cpp b/backends/keymapper/hardware-input.cpp
index b3ab98d..01a62a2 100644
--- a/backends/keymapper/hardware-input.cpp
+++ b/backends/keymapper/hardware-input.cpp
@@ -205,6 +205,19 @@ const KeyTableEntry defaultKeys[] = {
 	{"AUDIOREWIND", KEYCODE_AUDIOREWIND, "Audio Rewind"},
 	{"AUDIOFASTFORWARD", KEYCODE_AUDIOFASTFORWARD, "Audio Fast-Forward"},
 
+	// Modifier keys
+	{"SCROLLOCK", KEYCODE_SCROLLOCK, "Scroll Lock"   },
+	{"CAPSLOCK",  KEYCODE_CAPSLOCK,  "Caps Lock"     },
+	{"NUMLOCK",   KEYCODE_NUMLOCK,   "Num Lock"      },
+	{"LSHIFT",    KEYCODE_LSHIFT,    "Left Shift"    },
+	{"RSHIFT",    KEYCODE_RSHIFT,    "Right Shift"   },
+	{"LALT",      KEYCODE_LALT,      "Left Alt"      },
+	{"RALT",      KEYCODE_RALT,      "Right Alt"     },
+	{"LCTRL",     KEYCODE_LCTRL,     "Left Control"  },
+	{"RCTRL",     KEYCODE_RCTRL,     "Right Control" },
+	{"LMETA",     KEYCODE_LMETA,     "Left Meta"     },
+	{"RMETA",     KEYCODE_RMETA,     "Right Meta"    },
+
 	{0, KEYCODE_INVALID, 0}
 };
 
@@ -314,9 +327,11 @@ HardwareInput KeyboardHardwareInputSet::findHardwareInput(const Event &event) co
 	switch (event.type) {
 	case EVENT_KEYDOWN:
 	case EVENT_KEYUP: {
+		KeyState normalizedKeystate = normalizeKeyState(event.kbd);
+
 		const KeyTableEntry *key = nullptr;
 		for (key = _keys;  key->hwId; key++) {
-			if (event.kbd.keycode == key->keycode) {
+			if (normalizedKeystate.keycode == key->keycode) {
 				break;
 			}
 		}
@@ -330,7 +345,7 @@ HardwareInput KeyboardHardwareInputSet::findHardwareInput(const Event &event) co
 		byte modifierFlags = 0;
 
 		for (const ModifierTableEntry *modifier = _modifiers;  modifier->id; modifier++) {
-			if (event.kbd.flags & modifier->flag) {
+			if (normalizedKeystate.flags & modifier->flag) {
 				id += modifier->id;
 				id += "+";
 				fullKeyDesc += modifier->desc;
@@ -346,6 +361,50 @@ HardwareInput KeyboardHardwareInputSet::findHardwareInput(const Event &event) co
 	}
 }
 
+KeyState KeyboardHardwareInputSet::normalizeKeyState(const KeyState &keystate) {
+	KeyState normalizedKeystate = keystate;
+
+	// We ignore the sticky modifiers as they traditionally
+	// have no impact on the outcome of key presses.
+	// TODO: Maybe Num Lock should act as a modifier for the keypad.
+	normalizedKeystate.flags &= ~KBD_STICKY;
+
+	// Modifier keypresses ignore the corresponding modifier flag.
+	// That way, for example, `Left Shift` is not identified
+	// as `Shift+Left Shift` by the keymapper.
+	switch (normalizedKeystate.keycode) {
+	case KEYCODE_LSHIFT:
+	case KEYCODE_RSHIFT:
+		normalizedKeystate.flags &= ~KBD_SHIFT;
+		break;
+	case KEYCODE_LCTRL:
+	case KEYCODE_RCTRL:
+		normalizedKeystate.flags &= ~KBD_CTRL;
+		break;
+	case KEYCODE_LALT:
+	case KEYCODE_RALT:
+		normalizedKeystate.flags &= ~KBD_ALT;
+		break;
+	case KEYCODE_LMETA:
+	case KEYCODE_RMETA:
+		normalizedKeystate.flags &= ~KBD_META;
+		break;
+	case KEYCODE_SCROLLOCK:
+		normalizedKeystate.flags &= ~KBD_SCRL;
+		break;
+	case KEYCODE_CAPSLOCK:
+		normalizedKeystate.flags &= ~KBD_CAPS;
+		break;
+	case KEYCODE_NUMLOCK:
+		normalizedKeystate.flags &= ~KBD_NUM;
+		break;
+	default:
+		break;
+	}
+
+	return normalizedKeystate;
+}
+
 MouseHardwareInputSet::MouseHardwareInputSet(const HardwareInputTableEntry *buttonEntries) :
 		_buttonEntries(buttonEntries) {
 	assert(_buttonEntries);
diff --git a/backends/keymapper/hardware-input.h b/backends/keymapper/hardware-input.h
index bb64169..c72f937 100644
--- a/backends/keymapper/hardware-input.h
+++ b/backends/keymapper/hardware-input.h
@@ -234,6 +234,9 @@ public:
 	HardwareInput findHardwareInput(const String &id) const override;
 	HardwareInput findHardwareInput(const Event &event) const override;
 
+	/** Transform a keystate into a canonical form that can be used to unambiguously identify the keypress */
+	static KeyState normalizeKeyState(const KeyState &keystate);
+
 private:
 	const KeyTableEntry *_keys;
 	const ModifierTableEntry *_modifiers;
diff --git a/backends/keymapper/keymap.cpp b/backends/keymapper/keymap.cpp
index d3a7878..055b4c0 100644
--- a/backends/keymapper/keymap.cpp
+++ b/backends/keymapper/keymap.cpp
@@ -128,7 +128,8 @@ Keymap::ActionArray Keymap::getMappedActions(const Event &event) const {
 	switch (event.type) {
 	case EVENT_KEYDOWN:
 	case EVENT_KEYUP: {
-		HardwareInput hardwareInput = HardwareInput::createKeyboard("", event.kbd, "");
+		KeyState normalizedKeystate = KeyboardHardwareInputSet::normalizeKeyState(event.kbd);
+		HardwareInput hardwareInput = HardwareInput::createKeyboard("", normalizedKeystate, "");
 		return _hwActionMap[hardwareInput];
 	}
 	case EVENT_LBUTTONDOWN:
diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h
index a5f7df6..d860c41 100644
--- a/backends/keymapper/keymap.h
+++ b/backends/keymapper/keymap.h
@@ -44,20 +44,21 @@ struct HardwareInput;
 class HardwareInputSet;
 class KeymapperDefaultBindings;
 
-struct Event_EqualTo {
+struct HardwareInput_EqualTo {
 	bool operator()(const HardwareInput& x, const HardwareInput& y) const {
 		return (x.type == y.type)
-		        && (x.key == y.key) // TODO: Remove the equality operator from KeyState
+		        && (x.key.keycode == y.key.keycode)
+		        && (x.key.flags == y.key.flags)
 		        && (x.inputCode == y.inputCode);
 	}
 };
 
-struct Event_Hash {
+struct HardwareInput_Hash {
 	uint operator()(const HardwareInput& x) const {
 		uint hash = 7;
 		hash = 31 * hash + x.type;
 		hash = 31 * hash + x.key.keycode;
-		hash = 31 * hash + (x.key.flags & ~KBD_STICKY);
+		hash = 31 * hash + x.key.flags;
 		hash = 31 * hash + x.inputCode;
 		return hash;
 	}
@@ -169,7 +170,7 @@ private:
 	void registerMappings(Action *action, const StringArray &hwInputIds);
 	bool areMappingsIdentical(const Array<HardwareInput> &inputs, const StringArray &mapping);
 
-	typedef HashMap<HardwareInput, ActionArray, Event_Hash, Event_EqualTo> HardwareActionMap;
+	typedef HashMap<HardwareInput, ActionArray, HardwareInput_Hash, HardwareInput_EqualTo> HardwareActionMap;
 
 	KeymapType _type;
 	String _id;
diff --git a/common/keyboard.h b/common/keyboard.h
index ca26e6b..86ab6f9 100644
--- a/common/keyboard.h
+++ b/common/keyboard.h
@@ -346,8 +346,8 @@ struct KeyState {
 
 	/**
 	 * 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.
+	 * of the sticky flags (caps lock, num lock, scroll lock) completely.
+	 * @todo is this still being used?
 	 */
 	bool operator==(const KeyState &x) const {
 		// Intentionally ignore ASCII, as the keycode and non-sticky flag




More information about the Scummvm-git-logs mailing list