Skip to content

Commit

Permalink
Fix key mapping changes when moving from macOS to other platform
Browse files Browse the repository at this point in the history
Removes separate `Command` key (use `Meta` instead).
Adds an event flag to automatically remap `Command` <-> `Control` (cannot be set alongside `Control` or `Meta`).
  • Loading branch information
bruvzg committed Sep 7, 2022
1 parent 6b92dbf commit 6f4d233
Show file tree
Hide file tree
Showing 50 changed files with 513 additions and 494 deletions.
2 changes: 1 addition & 1 deletion core/core_constants.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,11 +433,11 @@ void register_global_constants() {

BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_CODE_MASK, CODE_MASK);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_MODIFIER_MASK, MODIFIER_MASK);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, CMD_OR_CTRL);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, SHIFT);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, ALT);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, META);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, CTRL);
BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(KeyModifierMask, KEY_MASK, CMD);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, KPAD);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, GROUP_SWITCH);

Expand Down
90 changes: 53 additions & 37 deletions core/input/input_event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,33 @@ int64_t InputEventFromWindow::get_window_id() const {

///////////////////////////////////

void InputEventWithModifiers::set_store_command(bool p_enabled) {
store_command = p_enabled;
void InputEventWithModifiers::set_command_or_control_autoremap(bool p_enabled) {
command_or_control_autoremap = p_enabled;
if (command_or_control_autoremap) {
#ifdef MACOS_ENABLED
ctrl_pressed = false;
meta_pressed = true;
#else
ctrl_pressed = true;
meta_pressed = false;
#endif
} else {
ctrl_pressed = false;
meta_pressed = false;
}
emit_changed();
}

bool InputEventWithModifiers::is_storing_command() const {
return store_command;
bool InputEventWithModifiers::is_command_or_control_autoremap() const {
return command_or_control_autoremap;
}

bool InputEventWithModifiers::is_command_or_control_pressed() const {
#ifdef MACOS_ENABLED
return meta_pressed;
#else
return ctrl_pressed;
#endif
}

void InputEventWithModifiers::set_shift_pressed(bool p_enabled) {
Expand All @@ -170,6 +190,7 @@ bool InputEventWithModifiers::is_alt_pressed() const {
}

void InputEventWithModifiers::set_ctrl_pressed(bool p_enabled) {
ERR_FAIL_COND_MSG(command_or_control_autoremap, "Command/Control autoremaping is enabled, cannot set Control directly!");
ctrl_pressed = p_enabled;
emit_changed();
}
Expand All @@ -179,6 +200,7 @@ bool InputEventWithModifiers::is_ctrl_pressed() const {
}

void InputEventWithModifiers::set_meta_pressed(bool p_enabled) {
ERR_FAIL_COND_MSG(command_or_control_autoremap, "Command/Control autoremaping is enabled, cannot set Meta directly!");
meta_pressed = p_enabled;
emit_changed();
}
Expand All @@ -187,15 +209,6 @@ bool InputEventWithModifiers::is_meta_pressed() const {
return meta_pressed;
}

void InputEventWithModifiers::set_command_pressed(bool p_enabled) {
command_pressed = p_enabled;
emit_changed();
}

bool InputEventWithModifiers::is_command_pressed() const {
return command_pressed;
}

void InputEventWithModifiers::set_modifiers_from_event(const InputEventWithModifiers *event) {
set_alt_pressed(event->is_alt_pressed());
set_shift_pressed(event->is_shift_pressed());
Expand All @@ -217,6 +230,13 @@ Key InputEventWithModifiers::get_modifiers_mask() const {
if (is_meta_pressed()) {
mask |= KeyModifierMask::META;
}
if (is_command_or_control_autoremap()) {
#ifdef MACOS_ENABLED
mask |= KeyModifierMask::META;
#else
mask |= KeyModifierMask::CTRL;
#endif
}
return mask;
}

Expand Down Expand Up @@ -248,8 +268,10 @@ String InputEventWithModifiers::to_string() {
}

void InputEventWithModifiers::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_store_command", "enable"), &InputEventWithModifiers::set_store_command);
ClassDB::bind_method(D_METHOD("is_storing_command"), &InputEventWithModifiers::is_storing_command);
ClassDB::bind_method(D_METHOD("set_command_or_control_autoremap", "enable"), &InputEventWithModifiers::set_command_or_control_autoremap);
ClassDB::bind_method(D_METHOD("is_command_or_control_autoremap"), &InputEventWithModifiers::is_command_or_control_autoremap);

ClassDB::bind_method(D_METHOD("is_command_or_control_pressed"), &InputEventWithModifiers::is_command_or_control_pressed);

ClassDB::bind_method(D_METHOD("set_alt_pressed", "pressed"), &InputEventWithModifiers::set_alt_pressed);
ClassDB::bind_method(D_METHOD("is_alt_pressed"), &InputEventWithModifiers::is_alt_pressed);
Expand All @@ -263,34 +285,24 @@ void InputEventWithModifiers::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_meta_pressed", "pressed"), &InputEventWithModifiers::set_meta_pressed);
ClassDB::bind_method(D_METHOD("is_meta_pressed"), &InputEventWithModifiers::is_meta_pressed);

ClassDB::bind_method(D_METHOD("set_command_pressed", "pressed"), &InputEventWithModifiers::set_command_pressed);
ClassDB::bind_method(D_METHOD("is_command_pressed"), &InputEventWithModifiers::is_command_pressed);

ADD_PROPERTY(PropertyInfo(Variant::BOOL, "store_command"), "set_store_command", "is_storing_command");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "command_or_control_autoremap"), "set_command_or_control_autoremap", "is_command_or_control_autoremap");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "alt_pressed"), "set_alt_pressed", "is_alt_pressed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shift_pressed"), "set_shift_pressed", "is_shift_pressed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ctrl_pressed"), "set_ctrl_pressed", "is_ctrl_pressed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "meta_pressed"), "set_meta_pressed", "is_meta_pressed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "command_pressed"), "set_command_pressed", "is_command_pressed");
}

void InputEventWithModifiers::_validate_property(PropertyInfo &p_property) const {
if (store_command) {
// If we only want to Store "Command".
#ifdef APPLE_STYLE_KEYS
// Don't store "Meta" on Mac.
if (command_or_control_autoremap) {
// Cannot be used with Meta/Command or Control!
if (p_property.name == "meta_pressed") {
p_property.usage ^= PROPERTY_USAGE_STORAGE;
}
#else
// Don't store "Ctrl".
if (p_property.name == "ctrl_pressed") {
p_property.usage ^= PROPERTY_USAGE_STORAGE;
}
#endif
} else {
// We don't want to store command, only ctrl or meta (on mac).
if (p_property.name == "command_pressed") {
if (p_property.name == "command_or_control_autoremap") {
p_property.usage ^= PROPERTY_USAGE_STORAGE;
}
}
Expand Down Expand Up @@ -399,14 +411,18 @@ Ref<InputEventKey> InputEventKey::create_reference(Key p_keycode) {
if ((p_keycode & KeyModifierMask::ALT) != Key::NONE) {
ie->set_alt_pressed(true);
}
if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE) {
ie->set_ctrl_pressed(true);
}
if ((p_keycode & KeyModifierMask::CMD) != Key::NONE) {
ie->set_command_pressed(true);
}
if ((p_keycode & KeyModifierMask::META) != Key::NONE) {
ie->set_meta_pressed(true);
if ((p_keycode & KeyModifierMask::CMD_OR_CTRL) != Key::NONE) {
ie->set_command_or_control_autoremap(true);
if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE || (p_keycode & KeyModifierMask::META) != Key::NONE) {
WARN_PRINT("Invalid Key Modifiers: Command or Control autoremapping is enabled, Meta and Control values are ignored!");
}
} else {
if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE) {
ie->set_ctrl_pressed(true);
}
if ((p_keycode & KeyModifierMask::META) != Key::NONE) {
ie->set_meta_pressed(true);
}
}

return ie;
Expand Down
25 changes: 6 additions & 19 deletions core/input/input_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,32 +107,22 @@ class InputEventFromWindow : public InputEvent {
class InputEventWithModifiers : public InputEventFromWindow {
GDCLASS(InputEventWithModifiers, InputEventFromWindow);

bool store_command = true;
bool command_or_control_autoremap = false;

bool shift_pressed = false;
bool alt_pressed = false;
#ifdef APPLE_STYLE_KEYS
union {
bool command_pressed;
bool meta_pressed = false; //< windows/mac key
};

bool meta_pressed = false; // "Command" on macOS, "Meta/Win" key on other platforms.
bool ctrl_pressed = false;
#else
union {
bool command_pressed; //< windows/mac key
bool ctrl_pressed = false;
};
bool meta_pressed = false; //< windows/mac key
#endif

protected:
static void _bind_methods();
void _validate_property(PropertyInfo &p_property) const;

public:
void set_store_command(bool p_enabled);
bool is_storing_command() const;
void set_command_or_control_autoremap(bool p_enabled);
bool is_command_or_control_autoremap() const;

bool is_command_or_control_pressed() const;

void set_shift_pressed(bool p_pressed);
bool is_shift_pressed() const;
Expand All @@ -146,9 +136,6 @@ class InputEventWithModifiers : public InputEventFromWindow {
void set_meta_pressed(bool p_pressed);
bool is_meta_pressed() const;

void set_command_pressed(bool p_pressed);
bool is_command_pressed() const;

void set_modifiers_from_event(const InputEventWithModifiers *event);

Key get_modifiers_mask() const;
Expand Down
Loading

0 comments on commit 6f4d233

Please sign in to comment.