From 0242d5f765e36b0f25358f18e03a497a580eac53 Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Fri, 28 Nov 2025 10:39:03 -0500 Subject: [PATCH 1/2] workspace.c: Add new method for listing visible window stack. Returns only those windows that would be visible on the workspace. ref: https://github.com/linuxmint/cinnamon/pull/12202#issuecomment-3589047882 --- src/core/workspace.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ src/meta/workspace.h | 3 ++ 2 files changed, 72 insertions(+) diff --git a/src/core/workspace.c b/src/core/workspace.c index 12a288e74..ffea1ab8f 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -736,6 +736,75 @@ meta_workspace_list_windows (MetaWorkspace *workspace) return workspace_windows; } +/** + * meta_workspace_list_unobscured_windows: + * @workspace: a #MetaWorkspace + * + * This is the same as meta_workspace_list_windows, except it will + * only return windows that are not completely covered by other + * windows. Windows are returned in stacking order (bottom to top). + * + * Return value: (transfer container) (element-type MetaWindow): the + * list of visible windows in stacking order. + */ +GList* +meta_workspace_list_unobscured_windows (MetaWorkspace *workspace) +{ + GList *stacked_windows; + GList *visible_windows; + GList *stack_iter; + cairo_region_t *visible_region; + GHashTable *visible_set; + + stacked_windows = meta_stack_list_windows (workspace->display->stack, workspace); + visible_region = cairo_region_create_rectangle (&workspace->work_area_screen); + visible_set = g_hash_table_new (g_direct_hash, g_direct_equal); + + // Process windows from top to bottom in stacking order + for (stack_iter = g_list_last (stacked_windows); + stack_iter != NULL; + stack_iter = stack_iter->prev) + { + MetaWindow *window = stack_iter->data; + cairo_region_t *window_region; + + if (!meta_window_located_on_workspace (window, workspace)) + continue; + + if (window->minimized || !window->mapped) + continue; + + // Check what part of this window intersects the visible region + window_region = cairo_region_create_rectangle (&window->rect); + cairo_region_intersect (window_region, visible_region); + + if (!cairo_region_is_empty (window_region)) + { + g_hash_table_add (visible_set, window); + cairo_region_subtract (visible_region, window_region); + } + + cairo_region_destroy (window_region); + } + + cairo_region_destroy (visible_region); + + // Build result list in stacking order (bottom to top) + visible_windows = NULL; + for (stack_iter = stacked_windows; stack_iter != NULL; stack_iter = stack_iter->next) + { + MetaWindow *window = stack_iter->data; + + if (g_hash_table_contains (visible_set, window)) + visible_windows = g_list_append (visible_windows, window); + } + + g_hash_table_destroy (visible_set); + g_list_free (stacked_windows); + + return visible_windows; +} + void meta_workspace_invalidate_work_area (MetaWorkspace *workspace) { diff --git a/src/meta/workspace.h b/src/meta/workspace.h index 3986feca7..2689558d9 100644 --- a/src/meta/workspace.h +++ b/src/meta/workspace.h @@ -45,6 +45,9 @@ MetaDisplay *meta_workspace_get_display (MetaWorkspace *workspace); META_EXPORT GList* meta_workspace_list_windows (MetaWorkspace *workspace); +META_EXPORT +GList * meta_workspace_list_unobscured_windows (MetaWorkspace *workspace); + META_EXPORT void meta_workspace_get_work_area_for_monitor (MetaWorkspace *workspace, int which_monitor, From 85081f1343c501e367ae094dee4286a21525c7b7 Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Fri, 28 Nov 2025 11:01:49 -0500 Subject: [PATCH 2/2] update libmuffin0.symbols. --- debian/libmuffin0.symbols | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/libmuffin0.symbols b/debian/libmuffin0.symbols index 5eb685496..e81451b6e 100644 --- a/debian/libmuffin0.symbols +++ b/debian/libmuffin0.symbols @@ -2727,6 +2727,7 @@ libmuffin.so.0 libmuffin0 #MINVER# meta_workspace_get_work_area_for_monitor@Base 5.3.0 meta_workspace_index@Base 5.3.0 meta_workspace_list_windows@Base 5.3.0 + meta_workspace_list_unobscured_windows@Base 6.6.0 meta_workspace_manager_append_new_workspace@Base 5.3.0 meta_workspace_manager_get_active_workspace@Base 5.3.0 meta_workspace_manager_get_active_workspace_index@Base 5.3.0