diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-03-15 15:23:00 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-03-15 16:10:09 -0400 |
commit | 413e9827c79eee424f8739882f7db56ba8756415 (patch) | |
tree | 6cf4588f76c60e24719f8f96047cdb171086a381 | |
parent | 47d9478a3ce8d4e4280e62db65f192e26eaa8174 (diff) | |
download | gtk+-fix-wayland-layout-changes.tar.gz |
wayland: Fix cross-layout acceleratorsfix-wayland-layout-changes
GTK traditionally lets you activate keyboard shortcuts
even if they are for a non-active layout. But it is meant
to only activate with a keysym from a non-active layout
when that symbol is not present in the current layout.
That last condition was lost when key event handling
was redone for GTK4. Bring it back.
-rw-r--r-- | gdk/gdkevents.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index eb39c95976..f7abfe75b5 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -1686,6 +1686,24 @@ gdk_key_event_is_modifier (GdkEvent *event) return self->key_is_modifier; } +static gboolean +keyval_in_group (GdkKeymap *keymap, + guint keyval, + int group) +{ + GdkKeymapKey *keys; + guint n_keys; + + gdk_keymap_get_cached_entries_for_keyval (keymap, keyval, &keys, &n_keys); + for (int i = 0; i < n_keys; i++) + { + if (keys[i].group == group) + return TRUE; + } + + return FALSE; +} + /** * gdk_key_event_matches: * @event: (type GdkKeyEvent): a key `GdkEvent` @@ -1781,10 +1799,9 @@ gdk_key_event_matches (GdkEvent *event, if (keys[i].keycode == keycode && keys[i].level == level && /* Only match for group if it's an accel mod */ - (!group_mod_is_accel_mod || keys[i].group == layout)) - { - return GDK_KEY_MATCH_PARTIAL; - } + (keys[i].group == layout || + (!group_mod_is_accel_mod && !keyval_in_group (keymap, keyval, layout)))) + return GDK_KEY_MATCH_PARTIAL; } } |