diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2022-10-09 22:35:54 +0300 |
---|---|---|
committer | Marco Trevisan <mail@3v1n0.net> | 2022-11-28 17:46:53 +0000 |
commit | ad69fe45d7692319ead0d9d98b23b30071262a9e (patch) | |
tree | c1fc0adf9960cd81db94372596ebdd392d1978f7 | |
parent | 58fe70175b096b94d462e59e86ca721abc2b6c5f (diff) | |
download | libwnck-ad69fe45d7692319ead0d9d98b23b30071262a9e.tar.gz |
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
-rw-r--r-- | libwnck/screen.c | 15 | ||||
-rw-r--r-- | libwnck/wnck-handle-private.h | 3 | ||||
-rw-r--r-- | 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: |