summaryrefslogtreecommitdiff
path: root/gdk/gdkevents.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-15 15:23:00 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-03-15 17:14:49 -0400
commite3dcc3d369e090efbc96c629248836523be393ce (patch)
treebb12ee58ae6d5cab38655cc6847f9cdcc2108aa8 /gdk/gdkevents.c
parent568fe2e97b014a6021fcb7f25aadd14ff5bfef68 (diff)
downloadgtk+-e3dcc3d369e090efbc96c629248836523be393ce.tar.gz
wayland: Fix cross-layout accelerators
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.
Diffstat (limited to 'gdk/gdkevents.c')
-rw-r--r--gdk/gdkevents.c25
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;
}
}