summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2024-04-08 12:23:57 -0400
committerlukefromdc <[email protected]>2024-06-18 17:04:23 -0400
commit96a4b36b9feca559a512fe26cb7359178f1577cc (patch)
tree78d14df3c6b3d20b237b2f5193828c7ee3f3ee3a /src/core
parentcb83a91ed03c9e5ab2a1d8b932ffac3ba49e9fbb (diff)
downloadmarco-96a4b36b9feca559a512fe26cb7359178f1577cc.tar.bz2
marco-96a4b36b9feca559a512fe26cb7359178f1577cc.tar.xz
window: Parse _BAMF_DESKTOP_FILE propertyiconcache-use-gdesktopapp
In systems with bamfdaemon running, windows get this property for finding the dekstop spec file of an application. This can be used to find the defined icon for any application window that reports this attribute and provider much better icon matching.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/atomnames.h5
-rw-r--r--src/core/iconcache.c8
-rw-r--r--src/core/iconcache.h2
-rw-r--r--src/core/window-private.h1
-rw-r--r--src/core/window-props.c24
-rw-r--r--src/core/window.c37
6 files changed, 70 insertions, 7 deletions
diff --git a/src/core/atomnames.h b/src/core/atomnames.h
index 4b99f163..2e9e6c8d 100644
--- a/src/core/atomnames.h
+++ b/src/core/atomnames.h
@@ -77,6 +77,11 @@ item(TIMESTAMP)
item(VERSION)
item(ATOM_PAIR)
+/* This is only used if BAMF is installed and the daemon is running.
+ * Otherwise it's a no-op
+ */
+item(_BAMF_DESKTOP_FILE)
+
/* Oddities: These are used, and we need atoms for them,
* but when we need all _NET_WM hints (i.e. when we're making
* lists of which _NET_WM hints we support in order to advertise
diff --git a/src/core/iconcache.c b/src/core/iconcache.c
index 32107781..580a521c 100644
--- a/src/core/iconcache.c
+++ b/src/core/iconcache.c
@@ -702,7 +702,7 @@ scaled_from_pixdata (guchar *pixdata,
gboolean
meta_read_icons (MetaScreen *screen,
Window xwindow,
- char *app_id,
+ char *desktop_id,
MetaIconCache *icon_cache,
Pixmap wm_hints_pixmap,
Pixmap wm_hints_mask,
@@ -756,12 +756,12 @@ meta_read_icons (MetaScreen *screen,
if (icon_cache->origin <= USING_G_DESKTOP_APP &&
icon_cache->g_desktop_app_icon_dirty &&
- app_id != NULL)
+ desktop_id != NULL)
{
icon_cache->g_desktop_app_icon_dirty = FALSE;
- *iconp = meta_ui_get_window_icon_from_app (screen->ui, app_id);
- *mini_iconp = meta_ui_get_mini_icon_from_app (screen->ui, app_id);
+ *iconp = meta_ui_get_window_icon_from_desktop_id (screen->ui, desktop_id);
+ *mini_iconp = meta_ui_get_mini_icon_from_desktop_id (screen->ui, desktop_id);
if (*iconp && *mini_iconp)
{
diff --git a/src/core/iconcache.h b/src/core/iconcache.h
index 9aee499b..353787c7 100644
--- a/src/core/iconcache.h
+++ b/src/core/iconcache.h
@@ -69,7 +69,7 @@ gboolean meta_icon_cache_get_icon_invalidated (MetaIconCache *icon_cache);
gboolean meta_read_icons (MetaScreen *screen,
Window xwindow,
- char *app_id,
+ char *desktop_id,
MetaIconCache *icon_cache,
Pixmap wm_hints_pixmap,
Pixmap wm_hints_mask,
diff --git a/src/core/window-private.h b/src/core/window-private.h
index c6117654..52864a86 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -134,6 +134,7 @@ struct _MetaWindow
char *startup_id;
char *gtk_theme_variant;
char *gtk_application_id;
+ char *bamf_desktop_file;
int net_wm_pid;
diff --git a/src/core/window-props.c b/src/core/window-props.c
index fd08d33f..4d9600c2 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -1627,6 +1627,29 @@ reload_gtk_application_id (MetaWindow *window,
}
}
+static void
+reload_bamf_desktop_file (MetaWindow *window,
+ MetaPropValue *value,
+ gboolean initial)
+{
+ char *requested = NULL;
+ char *current = window->bamf_desktop_file;
+
+ if (value->type != META_PROP_VALUE_INVALID)
+ {
+ requested = value->v.str;
+ meta_verbose ("Requested _BAMF_DESKTOP_FILE \"%s\" for window %s.\n",
+ requested, window->desc);
+ }
+
+ if (g_strcmp0 (requested, current) != 0)
+ {
+ g_free (current);
+
+ window->bamf_desktop_file = 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
@@ -1677,6 +1700,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
{ 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 },
+ { display->atom__BAMF_DESKTOP_FILE, META_PROP_VALUE_STRING, reload_bamf_desktop_file },
{ 0 },
};
diff --git a/src/core/window.c b/src/core/window.c
index b58aff2f..050c89f8 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 21
+#define N_INITIAL_PROPS 22
Atom initial_props[N_INITIAL_PROPS];
int i;
gboolean has_shape;
@@ -564,6 +564,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
window->startup_id = NULL;
window->gtk_theme_variant = NULL;
window->gtk_application_id = NULL;
+ window->bamf_desktop_file = NULL;
window->net_wm_pid = -1;
@@ -623,6 +624,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
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;
+ initial_props[i++] = display->atom__BAMF_DESKTOP_FILE;
g_assert (N_INITIAL_PROPS == i);
meta_window_reload_properties (window, initial_props, N_INITIAL_PROPS, TRUE);
@@ -6109,6 +6111,33 @@ redraw_icon (MetaWindow *window)
meta_ui_queue_frame_draw (window->screen->ui, window->frame->xwindow);
}
+static gchar*
+meta_window_get_desktop_id (MetaWindow *window)
+{
+ gchar* desktop_id = NULL;
+
+ if (window->gtk_application_id != NULL)
+ {
+ meta_verbose ("Request desktop ID from _GTK_APPLICATION_ID '%s'\n", window->gtk_application_id);
+
+ /* Generate a desktop extension to the application ID (e.g. org.mate.Caja.desktop). */
+ desktop_id = g_strconcat(window->gtk_application_id, ".desktop", NULL);
+ }
+ else if (window->bamf_desktop_file != NULL)
+ {
+ meta_verbose ("Request desktop ID from _BAMF_DESKTOP_FILE '%s'\n", window->bamf_desktop_file);
+
+ /* Remove any paths to separate the application ID */
+ gchar **path_parts = g_strsplit (window->bamf_desktop_file, "/", -1);
+ /* Generate a desktop ID the application ID (e.g. org.mate.Caja.desktop). */
+ if (g_strv_length(path_parts) > 0)
+ desktop_id = g_strdup (path_parts[g_strv_length(path_parts)-1]);
+ g_strfreev (path_parts);
+ }
+
+ return desktop_id;
+}
+
void
meta_window_update_icon_now (MetaWindow *window)
{
@@ -6119,10 +6148,11 @@ meta_window_update_icon_now (MetaWindow *window)
mini_icon = NULL;
int icon_size = meta_prefs_get_icon_size();
+ gchar* desktop_id = meta_window_get_desktop_id (window);
if (meta_read_icons (window->screen,
window->xwindow,
- window->gtk_application_id,
+ desktop_id,
&window->icon_cache,
window->wm_hints_pixmap,
window->wm_hints_mask,
@@ -6145,6 +6175,8 @@ meta_window_update_icon_now (MetaWindow *window)
redraw_icon (window);
}
+ g_free (desktop_id);
+
g_assert (window->icon);
g_assert (window->mini_icon);
}
@@ -9018,6 +9050,7 @@ meta_window_finalize (GObject *object)
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_clear_pointer (&window->bamf_desktop_file, g_free);
G_OBJECT_CLASS (meta_window_parent_class)->finalize (object);
}