From 94ff81575062ecdd57a28eb8a3c7bfaaa6b77b03 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Fri, 5 Apr 2024 14:04:58 -0400 Subject: window: Parse _GTK_APPLICATION_ID property GTK+ has support for the application ID property. This will allow Marco to reconstruct the path to the desktop spec file and so have access to all internal attributes (e.g. name, icon, etc.) --- src/core/atomnames.h | 1 + src/core/window-private.h | 1 + src/core/window-props.c | 25 +++++++++++++++++++++++++ src/core/window.c | 5 ++++- 4 files changed, 31 insertions(+), 1 deletion(-) (limited to 'src/core') diff --git a/src/core/atomnames.h b/src/core/atomnames.h index cea869d0..4b99f163 100644 --- a/src/core/atomnames.h +++ b/src/core/atomnames.h @@ -60,6 +60,7 @@ item(_MARCO_SET_KEYBINDINGS_MESSAGE) item(_MARCO_TOGGLE_VERBOSE) item(_GTK_THEME_VARIANT) item(_GTK_FRAME_EXTENTS) +item(_GTK_APPLICATION_ID) item(_GTK_SHOW_WINDOW_MENU) item(_GTK_WORKAREAS) item(_MATE_PANEL_ACTION) diff --git a/src/core/window-private.h b/src/core/window-private.h index 02b7df42..c6117654 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -133,6 +133,7 @@ struct _MetaWindow char *wm_client_machine; char *startup_id; char *gtk_theme_variant; + char *gtk_application_id; int net_wm_pid; diff --git a/src/core/window-props.c b/src/core/window-props.c index d106152d..83f1de3d 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -1602,6 +1602,30 @@ reload_gtk_theme_variant (MetaWindow *window, meta_ui_update_frame_style (window->screen->ui, window->frame->xwindow); } } + +static void +reload_gtk_application_id (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + char *requested = NULL; + char *current = window->gtk_application_id; + + if (value->type != META_PROP_VALUE_INVALID) + { + requested = value->v.str; + meta_verbose ("Requested \"%s\" gtk-application-id for window %s.\n", + requested, window->desc); + } + + if (g_strcmp0 (requested, current) != 0) + { + g_free (current); + + window->gtk_application_id = g_strdup (requested); + } +} + /** * 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 @@ -1651,6 +1675,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window }, { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8, reload_gtk_theme_variant, }, { display->atom__GTK_FRAME_EXTENTS, META_PROP_VALUE_CARDINAL_LIST, reload_gtk_frame_extents }, + { display->atom__GTK_APPLICATION_ID, META_PROP_VALUE_UTF8, reload_gtk_application_id }, { 0 }, }; diff --git a/src/core/window.c b/src/core/window.c index c1702dd8..658ca957 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -263,7 +263,7 @@ meta_window_new_with_attrs (MetaDisplay *display, gulong existing_wm_state; gulong event_mask; MetaMoveResizeFlags flags; -#define N_INITIAL_PROPS 20 +#define N_INITIAL_PROPS 21 Atom initial_props[N_INITIAL_PROPS]; int i; gboolean has_shape; @@ -563,6 +563,7 @@ meta_window_new_with_attrs (MetaDisplay *display, window->wm_client_machine = NULL; window->startup_id = NULL; window->gtk_theme_variant = NULL; + window->gtk_application_id = NULL; window->net_wm_pid = -1; @@ -621,6 +622,7 @@ meta_window_new_with_attrs (MetaDisplay *display, initial_props[i++] = display->atom__NET_WM_USER_TIME_WINDOW; initial_props[i++] = display->atom__NET_WM_FULLSCREEN_MONITORS; initial_props[i++] = display->atom__GTK_THEME_VARIANT; + initial_props[i++] = display->atom__GTK_APPLICATION_ID; g_assert (N_INITIAL_PROPS == i); meta_window_reload_properties (window, initial_props, N_INITIAL_PROPS, TRUE); @@ -9015,6 +9017,7 @@ meta_window_finalize (GObject *object) g_clear_pointer (&window->icon_name, g_free); g_clear_pointer (&window->desc, g_free); g_clear_pointer (&window->gtk_theme_variant, g_free); + g_clear_pointer (&window->gtk_application_id, g_free); G_OBJECT_CLASS (meta_window_parent_class)->finalize (object); } -- cgit v1.2.1