summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2014-12-14 00:29:08 +0200
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2015-01-21 17:32:40 +0200
commit5f8113e3f5921c2736cc0d906813b4cffbb37f4b (patch)
tree9b833a0e34c3513d4b9dc9df6f763f560761e021
parentd3325a0d047e27b8e6abde18a6ebb1c94b571869 (diff)
downloadgnome-settings-daemon-5f8113e3f5921c2736cc0d906813b4cffbb37f4b.tar.gz
media-keys: watch org.gnome.Shell.KeyGrabber dbus name
-rw-r--r--plugins/media-keys/Makefile.am8
-rw-r--r--plugins/media-keys/gsd-media-keys-manager.c54
-rw-r--r--plugins/media-keys/org.gnome.Shell.KeyGrabber.xml (renamed from plugins/media-keys/org.gnome.ShellKeyGrabber.xml)2
3 files changed, 50 insertions, 14 deletions
diff --git a/plugins/media-keys/Makefile.am b/plugins/media-keys/Makefile.am
index d8f2e6ab..6ab3c6ef 100644
--- a/plugins/media-keys/Makefile.am
+++ b/plugins/media-keys/Makefile.am
@@ -22,11 +22,11 @@ gsd-marshal.h: gsd-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=gsd_marshal $< --header --internal > $@
shell-key-grabber.c: shell-key-grabber.h
-shell-key-grabber.h: Makefile.am org.gnome.ShellKeyGrabber.xml
- gdbus-codegen --interface-prefix org.gnome. \
+shell-key-grabber.h: Makefile.am org.gnome.Shell.KeyGrabber.xml
+ gdbus-codegen --interface-prefix org.gnome.Shell \
--generate-c-code shell-key-grabber \
--c-namespace Shell \
- $(srcdir)/org.gnome.ShellKeyGrabber.xml
+ $(srcdir)/org.gnome.Shell.KeyGrabber.xml
libmedia_keys_la_SOURCES = \
gsd-media-keys-plugin.c \
@@ -122,7 +122,7 @@ gsd_test_media_keys_LDADD = \
EXTRA_DIST = \
gsd-marshal.list \
README.media-keys-API \
- org.gnome.ShellKeyGrabber.xml \
+ org.gnome.Shell.KeyGrabber.xml \
$(plugin_in_files)
CLEANFILES = \
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 227da6fc..7738bd24 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -74,6 +74,9 @@
#define SHELL_DBUS_NAME "org.gnome.Shell"
#define SHELL_DBUS_PATH "/org/gnome/Shell"
+#define SHELL_KEY_GRABBER_DBUS_NAME "org.gnome.Shell.KeyGrabber"
+#define SHELL_KEY_GRABBER_DBUS_PATH "/org/gnome/Shell/KeyGrabber"
+
#define CUSTOM_BINDING_SCHEMA SETTINGS_BINDING_DIR ".custom-keybinding"
#define SHELL_GRABBER_RETRY_INTERVAL 1
@@ -172,6 +175,7 @@ struct GsdMediaKeysManagerPrivate
GsdShellOSD *shell_osd_proxy;
/* Shell KeyGrabber stuff */
+ gint key_grabber_id;
ShellKeyGrabber *key_grabber;
GCancellable *grab_cancellable;
@@ -2315,13 +2319,6 @@ shell_presence_changed (GsdMediaKeysManager *manager)
name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (manager->priv->shell_proxy));
if (name_owner) {
- shell_key_grabber_proxy_new_for_bus (G_BUS_TYPE_SESSION,
- 0,
- name_owner,
- SHELL_DBUS_PATH,
- manager->priv->grab_cancellable,
- on_key_grabber_ready, manager);
-
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
0, NULL,
name_owner,
@@ -2331,8 +2328,6 @@ shell_presence_changed (GsdMediaKeysManager *manager)
on_screencast_proxy_ready, manager);
g_free (name_owner);
} else {
- g_ptr_array_set_size (manager->priv->keys, 0);
- g_clear_object (&manager->priv->key_grabber);
g_clear_object (&manager->priv->screencast_proxy);
}
}
@@ -2554,6 +2549,35 @@ inhibit_done (GObject *source,
}
static void
+on_shell_key_grabber_name_appeared (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ GsdMediaKeysManager *manager = GSD_MEDIA_KEYS_MANAGER (user_data);
+
+ shell_key_grabber_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ 0,
+ SHELL_KEY_GRABBER_DBUS_NAME,
+ SHELL_KEY_GRABBER_DBUS_PATH,
+ manager->priv->grab_cancellable,
+ on_key_grabber_ready,
+ manager);
+}
+
+static void
+on_shell_key_grabber_name_vanished (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GsdMediaKeysManager *manager = GSD_MEDIA_KEYS_MANAGER (user_data);
+
+ if (manager->priv->keys != NULL)
+ g_ptr_array_set_size (manager->priv->keys, 0);
+ g_clear_object (&manager->priv->key_grabber);
+}
+
+static void
gsd_media_keys_manager_init (GsdMediaKeysManager *manager)
{
GError *error;
@@ -2604,6 +2628,13 @@ gsd_media_keys_manager_init (GsdMediaKeysManager *manager)
inhibit_done,
manager);
+ manager->priv->key_grabber_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
+ SHELL_KEY_GRABBER_DBUS_NAME,
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ on_shell_key_grabber_name_appeared,
+ on_shell_key_grabber_name_vanished,
+ manager,
+ NULL);
}
static void
@@ -2626,6 +2657,11 @@ gsd_media_keys_manager_finalize (GObject *object)
g_clear_object (&media_keys_manager->priv->logind_proxy);
g_clear_object (&media_keys_manager->priv->screen_saver_proxy);
+ if (media_keys_manager->priv->key_grabber_id != 0) {
+ g_bus_unwatch_name (media_keys_manager->priv->key_grabber_id);
+ media_keys_manager->priv->key_grabber_id = 0;
+ }
+
G_OBJECT_CLASS (gsd_media_keys_manager_parent_class)->finalize (object);
}
diff --git a/plugins/media-keys/org.gnome.ShellKeyGrabber.xml b/plugins/media-keys/org.gnome.Shell.KeyGrabber.xml
index a245481a..ddd6d82e 100644
--- a/plugins/media-keys/org.gnome.ShellKeyGrabber.xml
+++ b/plugins/media-keys/org.gnome.Shell.KeyGrabber.xml
@@ -1,5 +1,5 @@
<node>
- <interface name="org.gnome.Shell">
+ <interface name="org.gnome.Shell.KeyGrabber">
<annotation name="org.gtk.GDBus.C.Name" value="KeyGrabber"/>
<method name="GrabAccelerator">
<arg type="s" direction="in" name="accelerator"/>