[gnome-settings-daemon] media-keys: Fix grabbing of previously disabled shortcuts
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] media-keys: Fix grabbing of previously disabled shortcuts
- Date: Wed, 19 Jul 2017 16:18:20 +0000 (UTC)
commit 19ce2c11c77cd65ea6bb6fdb68fd70e4f8531394
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 793f559..7f98bfc 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -503,11 +503,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);
@@ -564,12 +565,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]