From ad69fe45d7692319ead0d9d98b23b30071262a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Sun, 9 Oct 2022 22:35:54 +0300 Subject: screen: fallback to WM_CLASS when window group is not provided If application/window does not provide window group use WM_CLASS to consider if window belongs to the same application. https://gitlab.gnome.org/GNOME/libwnck/-/issues/146 --- libwnck/screen.c | 15 +++++++++------ libwnck/wnck-handle-private.h | 3 +++ libwnck/wnck-handle.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/libwnck/screen.c b/libwnck/screen.c index 35d33c2..1d3c040 100644 --- a/libwnck/screen.c +++ b/libwnck/screen.c @@ -1388,8 +1388,8 @@ update_client_list (WnckScreen *screen) { Window leader; WnckApplication *app; - const char *res_class; - WnckClassGroup *class_group; + const char *res_class; + WnckClassGroup *class_group; window = _wnck_window_create (mapping[i], screen, @@ -1397,11 +1397,16 @@ update_client_list (WnckScreen *screen) created = g_list_prepend (created, window); - /* Application */ - leader = wnck_window_get_group_leader (window); + res_class = wnck_window_get_class_group_name (window); + /* Application */ app = wnck_handle_get_application (screen->priv->handle, leader); + + if (app == NULL) + app = _wnck_handle_get_application_from_res_class (screen->priv->handle, + res_class); + if (app == NULL) { app = _wnck_application_create (leader, screen); @@ -1412,8 +1417,6 @@ update_client_list (WnckScreen *screen) /* Class group */ - res_class = wnck_window_get_class_group_name (window); - class_group = wnck_handle_get_class_group (screen->priv->handle, res_class); if (class_group == NULL) { diff --git a/libwnck/wnck-handle-private.h b/libwnck/wnck-handle-private.h index 0633104..78e8961 100644 --- a/libwnck/wnck-handle-private.h +++ b/libwnck/wnck-handle-private.h @@ -46,6 +46,9 @@ void _wnck_handle_insert_application (WnckHandle *self, void _wnck_handle_remove_application (WnckHandle *self, gpointer xwindow); +WnckApplication *_wnck_handle_get_application_from_res_class (WnckHandle *self, + const char *res_class); + void _wnck_handle_insert_window (WnckHandle *self, gpointer xwindow, WnckWindow *window); diff --git a/libwnck/wnck-handle.c b/libwnck/wnck-handle.c index fa11d3d..e6d776b 100644 --- a/libwnck/wnck-handle.c +++ b/libwnck/wnck-handle.c @@ -614,6 +614,34 @@ _wnck_handle_remove_application (WnckHandle *self, g_hash_table_remove (self->app_hash, xwindow); } +WnckApplication * +_wnck_handle_get_application_from_res_class (WnckHandle *self, + const char *res_class) +{ + GHashTableIter iter; + gpointer value; + + if (res_class == NULL || *res_class == '\0') + return NULL; + + g_hash_table_iter_init (&iter, self->app_hash); + while (g_hash_table_iter_next (&iter, NULL, &value)) + { + WnckApplication *app; + GList *windows; + const char *window_res_class; + + app = WNCK_APPLICATION (value); + + windows = wnck_application_get_windows (app); + window_res_class = wnck_window_get_class_group_name (windows->data); + + if (g_strcmp0 (res_class, window_res_class) == 0) + return app; + } + + return NULL; +} /** * wnck_handle_get_application: -- cgit v1.2.1