File gnome-settings-daemon-timeout-grabbing-keys.patch of Package gnome-settings-daemon
From 05f168842f4754fa409029651842e9333f75fe05 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mantas=20Mikul=C4=97nas?= <grawity@gmail.com>
Date: Mon, 5 Feb 2018 10:57:00 +0200
Subject: [PATCH] media-keys: Wait forever for GrabAccelerators() to succeed
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
On slower machines (esp. with tracker and/or dropbox starting on login)
this may take more than the usual timeout of ~25 seconds.
We cannot use the existing retry loop here – in this bug, the first call
actually *succeeds* from gnome-shell's side, even if gsd-mediakeys gives
up on waiting for the reply.
So if we called GrabAccelerators again, we would receive no accel IDs
(because all keys are duplicates), and gnome-shell would keep sending
AcceleratorActivated signals with accel IDs that the 1st call has
established – resulting in exactly the same "Could not find accelerator
for accel id" as we're trying to fix.
https://bugzilla.gnome.org/show_bug.cgi?id=792353
---
plugins/media-keys/gsd-media-keys-manager.c | 22 ++++++++++++++--------
plugins/media-keys/org.gnome.ShellKeyGrabber.xml | 4 ----
2 files changed, 14 insertions(+), 12 deletions(-)
Index: b/plugins/media-keys/gsd-media-keys-manager.c
===================================================================
--- a/plugins/media-keys/gsd-media-keys-manager.c 2018-04-04 12:50:14.469324589 +0800
+++ b/plugins/media-keys/gsd-media-keys-manager.c 2018-04-04 12:50:33.937584284 +0800
@@ -80,6 +80,7 @@
#define CUSTOM_BINDING_SCHEMA SETTINGS_BINDING_DIR ".custom-keybinding"
+#define SHELL_GRABBER_CALL_TIMEOUT G_MAXINT
#define SHELL_GRABBER_RETRY_INTERVAL 1
#define OSD_ALL_OUTPUTS -1
@@ -427,13 +428,14 @@
GAsyncResult *result,
gpointer user_data)
{
- GVariant *actions;
+ GVariant *ret, *actions;
gboolean retry = FALSE;
GError *error = NULL;
GsdMediaKeysManager *manager = user_data;
- shell_key_grabber_call_grab_accelerators_finish (SHELL_KEY_GRABBER (object),
- &actions, result, &error);
+ ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), result, &error);
+ g_variant_get (ret, "(@au)", &actions);
+ g_variant_unref (ret);
if (error) {
retry = (error->code == G_DBUS_ERROR_UNKNOWN_METHOD);
@@ -478,11 +480,15 @@
g_free (tmp);
}
- shell_key_grabber_call_grab_accelerators (manager->priv->key_grabber,
- g_variant_builder_end (&builder),
- manager->priv->grab_cancellable,
- grab_accelerators_complete,
- manager);
+ g_dbus_proxy_call (G_DBUS_PROXY (manager->priv->key_grabber),
+ "GrabAccelerators",
+ g_variant_new ("(@a(su))",
+ g_variant_builder_end (&builder)),
+ G_DBUS_CALL_FLAGS_NONE,
+ SHELL_GRABBER_CALL_TIMEOUT,
+ manager->priv->grab_cancellable,
+ grab_accelerators_complete,
+ manager);
}
static void
Index: b/plugins/media-keys/org.gnome.ShellKeyGrabber.xml
===================================================================
--- a/plugins/media-keys/org.gnome.ShellKeyGrabber.xml 2018-04-04 12:50:14.469324589 +0800
+++ b/plugins/media-keys/org.gnome.ShellKeyGrabber.xml 2018-04-04 12:50:33.937584284 +0800
@@ -6,10 +6,6 @@
<arg type="u" direction="in" name="flags"/>
<arg type="u" direction="out" name="action"/>
</method>
- <method name="GrabAccelerators">
- <arg type="a(su)" direction="in" name="accelerators"/>
- <arg type="au" direction="out" name="actions"/>
- </method>
<method name="UngrabAccelerator">
<arg type="u" direction="in" name="action"/>
<arg type="b" direction="out" name="success"/>