MFH: r542258
Update patch to Fix leaked keygrabs when layout changes to code merged upstream. PR: 244290 Submitted by: Aryeh Friedman <aryeh.friedman AT gmail.com>, many others Obtained from: https://gitlab.xfce.org/xfce/libxfce4ui/-/merge_requests/2 Differential Revision: https://reviews.freebsd.org/D24995 Approved by: portmgr (joneum)
This commit is contained in:
parent
9dc5efc0fe
commit
97f0d0ef34
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/branches/2020Q3/; revision=542340
@ -3,7 +3,7 @@
|
||||
|
||||
PORTNAME= libxfce4menu
|
||||
PORTVERSION= 4.14.1
|
||||
PORTREVISION= 1
|
||||
PORTREVISION= 2
|
||||
CATEGORIES= x11 xfce
|
||||
MASTER_SITES= XFCE
|
||||
DISTNAME= libxfce4ui-${DISTVERSIONFULL}
|
||||
|
@ -1,99 +1,74 @@
|
||||
--- libxfce4kbd-private/xfce-shortcuts-grabber.c.orig 2020-04-08 15:05:21 UTC
|
||||
--- libxfce4kbd-private/xfce-shortcuts-grabber.c.orig 2019-08-11 16:02:06 UTC
|
||||
+++ libxfce4kbd-private/xfce-shortcuts-grabber.c
|
||||
@@ -74,6 +74,16 @@ struct _XfceKey
|
||||
@@ -72,8 +72,9 @@ struct _XfceShortcutsGrabberPrivate
|
||||
|
||||
struct _XfceKey
|
||||
{
|
||||
guint keyval;
|
||||
guint modifiers;
|
||||
+ /*
|
||||
+ * Cache of old keycodes grabbed by this key. Used to ungrab the keycodes we
|
||||
+ * actually grabbed.
|
||||
+ *
|
||||
+ * An arbitrary number of keys may generate the same keyval. Rather than add
|
||||
+ * memory allocation to this path, I just constrained the unmapping behavior
|
||||
+ * to 8 identically coded keys. It seems unlikely? But I am no xkeyboard
|
||||
+ * expert.
|
||||
+ */
|
||||
+ int keycodes[8];
|
||||
- guint keyval;
|
||||
- guint modifiers;
|
||||
+ guint keyval;
|
||||
+ guint modifiers;
|
||||
+ GArray *keycodes;
|
||||
};
|
||||
|
||||
|
||||
@@ -269,12 +279,20 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
}
|
||||
|
||||
/* Get all keys generating keyval */
|
||||
- if (!gdk_keymap_get_entries_for_keyval (keymap,key->keyval,
|
||||
+ if (grab && !gdk_keymap_get_entries_for_keyval (keymap,key->keyval,
|
||||
&keys, &n_keys))
|
||||
{
|
||||
TRACE ("Got no keys for keyval");
|
||||
return;
|
||||
}
|
||||
+ if (grab)
|
||||
+ {
|
||||
+ if (n_keys > G_N_ELEMENTS(key->keycodes))
|
||||
+ TRACE ("Got %d keys for keyval but can remember only %d", n_keys,
|
||||
+ (int)G_N_ELEMENTS(key->keycodes));
|
||||
+ }
|
||||
+ else
|
||||
+ n_keys = G_N_ELEMENTS(key->keycodes);
|
||||
|
||||
if (n_keys == 0)
|
||||
{
|
||||
@@ -290,9 +308,9 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
for (i = 0; i < n_keys; i ++)
|
||||
{
|
||||
/* Grab all hardware keys generating keyval */
|
||||
+ if (grab)
|
||||
+ TRACE ("New Keycode: %d", keys[i].keycode);
|
||||
|
||||
- TRACE ("Keycode: %d", keys[i].keycode);
|
||||
-
|
||||
for (j = 0; j < screens; j++)
|
||||
{
|
||||
/* Do the grab on all screens */
|
||||
@@ -338,11 +356,14 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
False,
|
||||
@@ -339,10 +340,14 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
GrabModeAsync,
|
||||
GrabModeAsync);
|
||||
- else
|
||||
+ else {
|
||||
+ if (key->keycodes[i] == -1)
|
||||
+ break;
|
||||
XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
|
||||
else
|
||||
- XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
|
||||
- keys[i].keycode,
|
||||
+ key->keycodes[i],
|
||||
modifiers | mod_masks [k],
|
||||
root_window);
|
||||
+ }
|
||||
- modifiers | mod_masks [k],
|
||||
- root_window);
|
||||
+ {
|
||||
+ if (i >= key->keycodes->len)
|
||||
+ break;
|
||||
+ XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
|
||||
+ g_array_index (key->keycodes, guint, i),
|
||||
+ modifiers | mod_masks [k],
|
||||
+ root_window);
|
||||
+ }
|
||||
}
|
||||
|
||||
gdk_flush ();
|
||||
@@ -355,9 +376,18 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
@@ -355,8 +360,20 @@ xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *gra
|
||||
TRACE ("Failed to ungrab");
|
||||
}
|
||||
}
|
||||
+ /* Remember the old keycode, as we need it to ungrab. */
|
||||
+ if (grab && i < G_N_ELEMENTS (key->keycodes))
|
||||
+ key->keycodes[i] = keys[i].keycode;
|
||||
+ else if (!grab)
|
||||
+ key->keycodes[i] = -1;
|
||||
+ if (grab)
|
||||
+ g_array_append_val (key->keycodes, keys[i].keycode);
|
||||
+ else
|
||||
+ g_array_index(key->keycodes, guint, i) = UINT_MAX;
|
||||
}
|
||||
|
||||
- g_free (keys);
|
||||
+ if (grab) {
|
||||
+ g_free (keys);
|
||||
+ for (; i < G_N_ELEMENTS (key->keycodes); i++)
|
||||
+ key->keycodes[i] = -1;
|
||||
+ }
|
||||
+ /* Cleanup elements containing UINT_MAX from the key->keycodes array */
|
||||
+ for (i = key->keycodes->len - 1; i >= 0; i --)
|
||||
+ {
|
||||
+ if (g_array_index(key->keycodes, guint, i) == UINT_MAX)
|
||||
+ g_array_remove_index_fast(key->keycodes, i);
|
||||
+ }
|
||||
+
|
||||
g_free (keys);
|
||||
}
|
||||
|
||||
|
||||
@@ -514,6 +544,8 @@ xfce_shortcuts_grabber_add (XfceShortcutsGrabber *grab
|
||||
@@ -514,6 +531,7 @@ xfce_shortcuts_grabber_add (XfceShortcutsGrabber *grab
|
||||
g_return_if_fail (shortcut != NULL);
|
||||
|
||||
key = g_new0 (XfceKey, 1);
|
||||
+ for (size_t i = 0; i < G_N_ELEMENTS (key->keycodes); i++)
|
||||
+ key->keycodes[i] = -1;
|
||||
+ key->keycodes = g_array_new (FALSE, TRUE, sizeof (guint));
|
||||
|
||||
gtk_accelerator_parse (shortcut, &key->keyval, &key->modifiers);
|
||||
|
||||
@@ -523,7 +541,10 @@ xfce_shortcuts_grabber_add (XfceShortcutsGrabber *grab
|
||||
g_hash_table_insert (grabber->priv->keys, g_strdup (shortcut), key);
|
||||
}
|
||||
else
|
||||
- g_free (key);
|
||||
+ {
|
||||
+ g_array_free (key->keycodes, TRUE);
|
||||
+ g_free (key);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user