From a2f95e115c4d9f3b505c1984f5adf82749e49cbd Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 25 Nov 2011 18:42:41 -0500 Subject: [PATCH] Load _DBUS_APPLICATION_ID property, expose it via API This is used to associate GtkApplication -> X window, and will be consumed by gnome-shell. https://bugzilla.gnome.org/show_bug.cgi?id=664851 --- src/core/window-private.h | 2 ++ src/core/window-props.c | 25 +++++++++++++++++++++++++ src/core/window.c | 27 ++++++++++++++++++++++++++- src/meta/atomnames.h | 1 + src/meta/window.h | 2 ++ 5 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/core/window-private.h b/src/core/window-private.h index 55afdde16..08df05c92 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -97,9 +97,11 @@ struct _MetaWindow char *role; char *sm_client_id; char *wm_client_machine; + char *startup_id; char *mutter_hints; char *gtk_theme_variant; + char *dbus_application_id; int net_wm_pid; diff --git a/src/core/window-props.c b/src/core/window-props.c index 837e0556c..2f97a26ca 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -1592,6 +1592,30 @@ reload_gtk_theme_variant (MetaWindow *window, } } +static void +reload_dbus_application_id (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + char *new_id = NULL; + char *current_id = window->dbus_application_id; + + if (value->type != META_PROP_VALUE_INVALID) + new_id = value->v.str; + + if (g_strcmp0 (new_id, current_id)) + { + g_free (current_id); + + if (new_id) + window->dbus_application_id = g_strdup (new_id); + else + window->dbus_application_id = NULL; + + g_object_notify ((GObject*)window, "dbus-application-id"); + } +} + /** * Initialises the property hooks system. Each row in the table named "hooks" * represents an action to take when a property is found on a newly-created @@ -1645,6 +1669,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) { display->atom__MOTIF_WM_HINTS, META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints, TRUE, FALSE }, { XA_WM_TRANSIENT_FOR, META_PROP_VALUE_WINDOW, reload_transient_for, TRUE, FALSE }, { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8, reload_gtk_theme_variant, TRUE, FALSE }, + { display->atom__DBUS_APPLICATION_ID, META_PROP_VALUE_UTF8, reload_dbus_application_id, TRUE, FALSE }, { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, TRUE, FALSE }, { display->atom_WM_STATE, META_PROP_VALUE_INVALID, NULL, FALSE, FALSE }, { display->atom__NET_WM_ICON, META_PROP_VALUE_INVALID, reload_net_wm_icon, FALSE, FALSE }, diff --git a/src/core/window.c b/src/core/window.c index 8d6267254..7bf216030 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -164,7 +164,8 @@ enum { PROP_APPEARS_FOCUSED, PROP_RESIZEABLE, PROP_ABOVE, - PROP_WM_CLASS + PROP_WM_CLASS, + PROP_DBUS_APPLICATION_ID }; enum @@ -221,6 +222,7 @@ meta_window_finalize (GObject *object) g_free (window->icon_name); g_free (window->desc); g_free (window->gtk_theme_variant); + g_free (window->dbus_application_id); } static void @@ -284,6 +286,9 @@ meta_window_get_property(GObject *object, case PROP_ABOVE: g_value_set_boolean (value, win->wm_state_above); break; + case PROP_DBUS_APPLICATION_ID: + g_value_set_string (value, win->dbus_application_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -450,6 +455,14 @@ meta_window_class_init (MetaWindowClass *klass) NULL, G_PARAM_READABLE)); + g_object_class_install_property (object_class, + PROP_DBUS_APPLICATION_ID, + g_param_spec_string ("dbus-application-id", + "_DBUS_APPLICATION_ID", + "Contents of the _DBUS_APPLICATION_ID property of this window", + NULL, + G_PARAM_READABLE)); + window_signals[WORKSPACE_CHANGED] = g_signal_new ("workspace-changed", G_TYPE_FROM_CLASS (object_class), @@ -10211,6 +10224,18 @@ meta_window_get_wm_class_instance (MetaWindow *window) return window->res_name; } +/** + * meta_window_get_dbus_application_id: + * @window: a #MetaWindow + * + * Return value: (transfer none): the application ID + **/ +const char * +meta_window_get_dbus_application_id (MetaWindow *window) +{ + return window->dbus_application_id; +} + /** * meta_window_get_compositor_private: * @window: a #MetaWindow diff --git a/src/meta/atomnames.h b/src/meta/atomnames.h index bfbc778fc..514452caf 100644 --- a/src/meta/atomnames.h +++ b/src/meta/atomnames.h @@ -59,6 +59,7 @@ item(_MUTTER_SET_KEYBINDINGS_MESSAGE) item(_MUTTER_TOGGLE_VERBOSE) item(_MUTTER_HINTS) item(_GTK_THEME_VARIANT) +item(_DBUS_APPLICATION_ID) item(_GNOME_WM_KEYBINDINGS) item(_GNOME_PANEL_ACTION) item(_GNOME_PANEL_ACTION_MAIN_MENU) diff --git a/src/meta/window.h b/src/meta/window.h index 832d4b868..bf493f59d 100644 --- a/src/meta/window.h +++ b/src/meta/window.h @@ -95,6 +95,8 @@ const char * meta_window_get_wm_class (MetaWindow *window); const char * meta_window_get_wm_class_instance (MetaWindow *window); gboolean meta_window_showing_on_its_workspace (MetaWindow *window); +const char * meta_window_get_dbus_application_id (MetaWindow *window); + void meta_window_move(MetaWindow *window, gboolean user_op, int root_x_nw, int root_y_nw); void meta_window_move_frame(MetaWindow *window, gboolean user_op, int root_x_nw, int root_y_nw); void meta_window_move_resize_frame (MetaWindow *window, gboolean user_op, int root_x_nw, int root_y_nw, int w, int h);