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



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]