[gnome-settings-daemon] media-keys: Fix grabbing of previously disabled shortcuts



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]