summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2022-10-09 22:35:54 +0300
committerMarco Trevisan <mail@3v1n0.net>2022-11-28 17:46:53 +0000
commitad69fe45d7692319ead0d9d98b23b30071262a9e (patch)
treec1fc0adf9960cd81db94372596ebdd392d1978f7
parent58fe70175b096b94d462e59e86ca721abc2b6c5f (diff)
downloadlibwnck-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.c15
-rw-r--r--libwnck/wnck-handle-private.h3
-rw-r--r--libwnck/wnck-handle.c28
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: