[gnome-settings-daemon/gnome-3-24] media-keys: Fix grabbing of previously disabled shortcuts
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/gnome-3-24] media-keys: Fix grabbing of previously disabled shortcuts
- Date: Sat, 22 Jul 2017 16:55:55 +0000 (UTC)
commit 1d5dee9cabd0ce358c31d40b09127c565f26f0c3
Author: Florian Müllner <fmuellner gnome org>
Date: Sat Jul 8 19:21:34 2017 +0200
media-keys: Fix grabbing of previously disabled shortcuts
If a key is not actually grabbed when we try to ungrab it, we register
the request and ungrab the key after the grab operation has completed.
This avoids leaking bindings when a shortcut is disabled while a grab
operation is in progress, however it means that any grab operation done
after trying to ungrab an unset shortcut will be immediately undone.
This is the currently the case when a shortcut settings changes, which
we handle as a simple combination of ungrab and grab - we need to make
sure to only request a later ungrab if there's a pending grab.
https://bugzilla.gnome.org/show_bug.cgi?id=784702
plugins/media-keys/gsd-media-keys-manager.c | 22 +++++++++++++++++++---
1 files changed, 19 insertions(+), 3 deletions(-)
---
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index b5a1818..e1c0d5f 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -505,11 +505,12 @@ grab_accelerator_complete (GObject *object,
g_error_free (error);
}
+ keyname = get_key_string (key);
+ g_hash_table_remove (manager->priv->keys_pending_grab, keyname);
+
if (key->ungrab_requested)
ungrab_media_key (key, manager);
- keyname = get_key_string (key);
- g_hash_table_remove (manager->priv->keys_pending_grab, keyname);
media_key_unref (key);
g_slice_free (GrabData, data);
@@ -566,12 +567,27 @@ ungrab_accelerator_complete (GObject *object,
}
}
+static gboolean
+is_pending_grab (MediaKey *key,
+ GsdMediaKeysManager *manager)
+{
+ char *keyname = get_key_string (key);
+ const char *val;
+ gboolean pending_grab;
+
+ val = g_hash_table_lookup (manager->priv->keys_pending_grab, keyname);
+ pending_grab = val != NULL;
+ g_free (keyname);
+
+ return pending_grab;
+}
+
static void
ungrab_media_key (MediaKey *key,
GsdMediaKeysManager *manager)
{
if (key->accel_id == 0) {
- key->ungrab_requested = TRUE;
+ key->ungrab_requested = is_pending_grab (key, manager);
return;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]