diff options
author | Ryan Lortie <desrt@desrt.ca> | 2011-12-17 12:28:30 -0500 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2011-12-19 12:51:12 -0500 |
commit | 76d671d6a2ba44bece238b580728923374393c78 (patch) | |
tree | c1d922e9fab159991f021f45a28015acac35121a /gtk/gtkapplicationwindow.c | |
parent | cff5ba1bc2de91d7537395d862c96c1705f5fe30 (diff) | |
download | gtk+-76d671d6a2ba44bece238b580728923374393c78.tar.gz |
Move X property handling to GtkApplicationWindow
Don't try to deal with this using a qdata and signal connections in
GtkApplication.
Diffstat (limited to 'gtk/gtkapplicationwindow.c')
-rw-r--r-- | gtk/gtkapplicationwindow.c | 72 |
1 files changed, 69 insertions, 3 deletions
diff --git a/gtk/gtkapplicationwindow.c b/gtk/gtkapplicationwindow.c index cb4ed3dacb..fb9e5139c5 100644 --- a/gtk/gtkapplicationwindow.c +++ b/gtk/gtkapplicationwindow.c @@ -23,12 +23,18 @@ #include "gtkapplicationwindow.h" +#include "gtkapplicationprivate.h" #include "gtkmodelmenu.h" #include "gactionmuxer.h" #include "gtkaccelgroup.h" #include "gtkaccelmap.h" #include "gtkintl.h" +#include <gdk/gdk.h> +#ifdef GDK_WINDOWING_X11 +#include <gdk/x11/gdkx.h> +#endif + /** * SECTION:gtkapplicationwindow * @title: GtkApplicationWindow @@ -98,6 +104,10 @@ struct _GtkApplicationWindowPrivate GMenu *app_menu_section; GMenu *menubar_section; gboolean show_menubar; + + GDBusConnection *session; + gchar *object_path; + guint export_id; }; static void @@ -565,8 +575,10 @@ static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); + GtkApplication *application; GtkSettings *settings; + application = gtk_window_get_application (GTK_WINDOW (window)); settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", @@ -576,11 +588,8 @@ gtk_application_window_real_realize (GtkWidget *widget) if (window->priv->muxer == NULL) { - GtkApplication *application; GActionMuxer *muxer; - application = gtk_window_get_application (GTK_WINDOW (window)); - muxer = g_action_muxer_new (); g_action_muxer_insert (muxer, "app", G_ACTION_GROUP (application)); g_action_muxer_insert (muxer, "win", G_ACTION_GROUP (window)); @@ -594,6 +603,28 @@ gtk_application_window_real_realize (GtkWidget *widget) GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->realize (widget); + +#ifdef GDK_WINDOWING_X11 + { + GdkWindow *gdkwindow; + + gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); + + if (GDK_IS_X11_WINDOW (gdkwindow)) + { + const gchar *unique_id; + const gchar *app_id; + + gdk_x11_window_set_utf8_property (gdkwindow, "_DBUS_OBJECT_PATH", window->priv->object_path); + + unique_id = g_dbus_connection_get_unique_name (window->priv->session); + gdk_x11_window_set_utf8_property (gdkwindow, "_DBUS_UNIQUE_NAME", unique_id); + + app_id = g_application_get_application_id (G_APPLICATION (application)); + gdk_x11_window_set_utf8_property (gdkwindow, "_DBUS_APPLICATION_ID", app_id); + } + } +#endif } static void @@ -610,6 +641,41 @@ gtk_application_window_real_unrealize (GtkWidget *widget) ->unrealize (widget); } +gboolean +gtk_application_window_publish (GtkApplicationWindow *window, + GDBusConnection *session, + const gchar *object_path) +{ + g_assert (window->priv->session == NULL); + g_assert (window->priv->export_id == 0); + g_assert (window->priv->object_path == NULL); + + window->priv->export_id = g_dbus_connection_export_action_group (session, object_path, G_ACTION_GROUP (window), NULL); + + if (window->priv->export_id == 0) + return FALSE; + + window->priv->session = session; + window->priv->object_path = g_strdup (object_path); + + return TRUE; +} + +void +gtk_application_window_unpublish (GtkApplicationWindow *window) +{ + g_assert (window->priv->session != NULL); + g_assert (window->priv->export_id != 0); + g_assert (window->priv->object_path != NULL); + + g_dbus_connection_unexport_action_group (window->priv->session, window->priv->export_id); + window->priv->session = NULL; + window->priv->export_id = 0; + + g_free (window->priv->object_path); + window->priv->object_path = NULL; +} + static void gtk_application_window_real_map (GtkWidget *widget) { |