From eac303f84c83b550afc19dc6076f4563e4039d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 26 Jun 2015 13:46:11 +0200 Subject: [PATCH] app-system: Improve StartupWMClass heuristics Our StartUpWMClass heuristics use a StartupWMClass -> .desktop ID mapping built from the list of all installed applications. In case of multiple .desktop files setting the same StartupWMClass, we currently simply pick the last one returned by g_app_info_get_all (), which can be a bit surprising: A window with WM_CLASS 'emacs', launched through a .desktop file named 'emacs.desktop' with a StartupWMClass of 'emacs' maps to ... 'emacsclient.desktop'! Make this case a bit less random by preferring the app info whose ID matches the StartupWMClass. https://bugzilla.gnome.org/show_bug.cgi?id=751541 --- src/shell-app-system.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/shell-app-system.c b/src/shell-app-system.c index ff838f979..a45da0d61 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -83,12 +83,18 @@ scan_startup_wm_class_to_id (ShellAppSystem *self) for (l = apps; l != NULL; l = l->next) { GAppInfo *info = l->data; - const char *startup_wm_class, *id; + const char *startup_wm_class, *id, *old_id; id = g_app_info_get_id (info); startup_wm_class = g_desktop_app_info_get_startup_wm_class (G_DESKTOP_APP_INFO (info)); - if (startup_wm_class != NULL) + if (startup_wm_class == NULL) + continue; + + /* In case multiple .desktop files set the same StartupWMClass, prefer + * the one where ID and StartupWMClass match */ + old_id = g_hash_table_lookup (priv->startup_wm_class_to_id, startup_wm_class); + if (old_id == NULL || strcmp (id, startup_wm_class) == 0) g_hash_table_insert (priv->startup_wm_class_to_id, g_strdup (startup_wm_class), g_strdup (id)); }