[mutter/override-redirect-exclusion: 7/15] meta_display_list_windows: Exclude override-redirect



commit ace0521cbac47e75753bef234f1126a9776d1d1b
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Mon Jun 15 15:32:23 2009 -0400

    meta_display_list_windows: Exclude override-redirect
    
    Don't include override-redirect windows in the list return by
    meta_display_list_windows(), since we almost never want to handle
    them when considering "all window" for the display. Add a separate
    meta_display_list_all_windows() that includes override-redirect
    windows.
    
    http://bugzilla.gnome.org/show_bug.cgi?id=582639

 src/core/display-private.h |    1 +
 src/core/display.c         |   62 +++++++++++++++++++++++++++++++++++++------
 src/core/screen.c          |    2 +-
 src/core/workspace.c       |   10 +++++-
 4 files changed, 63 insertions(+), 12 deletions(-)
---
diff --git a/src/core/display-private.h b/src/core/display-private.h
index e3abc47..bfbe34e 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -367,6 +367,7 @@ gboolean    meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
                                                        Window xwindow);
 
 GSList*     meta_display_list_windows        (MetaDisplay *display);
+GSList*     meta_display_list_all_windows    (MetaDisplay *display);
 
 MetaDisplay* meta_display_for_x_display  (Display     *xdisplay);
 MetaDisplay* meta_get_display            (void);
diff --git a/src/core/display.c b/src/core/display.c
index 5920047..e0f96b1 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -812,13 +812,19 @@ meta_display_open (void)
   return TRUE;
 }
 
+typedef struct {
+  GSList *winlist;
+  gboolean include_override_redirect;
+} ListifyClosure;
+
 static void
 listify_func (gpointer key, gpointer value, gpointer data)
 {
-  GSList **listp;
+  ListifyClosure *closure = data;
+  MetaWindow *window = value;
 
-  listp = data;
-  *listp = g_slist_prepend (*listp, value);
+  if (closure->include_override_redirect || !window->override_redirect)
+    closure->winlist = g_slist_prepend (closure->winlist, window);
 }
 
 static gint
@@ -832,17 +838,21 @@ ptrcmp (gconstpointer a, gconstpointer b)
     return 0;
 }
 
-GSList*
-meta_display_list_windows (MetaDisplay *display)
+static GSList*
+list_windows (MetaDisplay *display,
+              gboolean     include_override_redirect)
 {
+  ListifyClosure closure;
   GSList *winlist;
   GSList *tmp;
   GSList *prev;
-  
-  winlist = NULL;
+
+  closure.winlist = NULL;
+  closure.include_override_redirect = include_override_redirect;
   g_hash_table_foreach (display->window_ids,
                         listify_func,
-                        &winlist);
+                        &closure);
+  winlist = closure.winlist;
 
   /* Uniquify the list, since both frame windows and plain
    * windows are in the hash
@@ -883,6 +893,40 @@ meta_display_list_windows (MetaDisplay *display)
   return winlist;
 }
 
+/**
+ * meta_display_list_windows:
+ * @display: a #MetaDisplay
+ *
+ * Lists windows for the display, excluding override-redirect
+ * windows.
+ *
+ * Return value: (transfer container): the list of windows.
+ */
+GSList*
+meta_display_list_windows (MetaDisplay *display)
+{
+  return list_windows (display, FALSE);
+}
+
+/**
+ * meta_display_list_all_windows:
+ * @display: a #MetaDisplay
+ *
+ * Lists windows for the display, including override-redirect
+ * windows. You usually want to use meta_display_list_windows()
+ * instead, since override-redirect windows are by definition
+ * outside the scope of window management. This function is most
+ * useful if you are interested in how things are displayed on
+ * the screen.
+ *
+ * Return value: (transfer container): the list of windows.
+ */
+GSList*
+meta_display_list_all_windows (MetaDisplay *display)
+{
+  return list_windows (display, TRUE);
+}
+
 void
 meta_display_close (MetaDisplay *display,
                     guint32      timestamp)
@@ -4824,7 +4868,7 @@ meta_display_unmanage_windows_for_screen (MetaDisplay *display,
   GSList *tmp;
   GSList *winlist;
 
-  winlist = meta_display_list_windows (display);
+  winlist = meta_display_list_all_windows (display);
   winlist = g_slist_sort (winlist, meta_display_stack_cmp);
 
   /* Unmanage all windows */
diff --git a/src/core/screen.c b/src/core/screen.c
index 4e23407..b3fca98 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -934,7 +934,7 @@ meta_screen_composite_all_windows (MetaScreen *screen)
   if (!display->compositor)
     return;
 
-  windows = meta_display_list_windows (display);
+  windows = meta_display_list_all_windows (display);
   for (tmp = windows; tmp != NULL; tmp = tmp->next)
     meta_compositor_add_window (display->compositor, tmp->data);
   g_slist_free (windows);
diff --git a/src/core/workspace.c b/src/core/workspace.c
index ca8acf0..0791358 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -620,8 +620,14 @@ meta_workspace_update_window_hints (MetaWorkspace *workspace)
     }
 }
 
-/* get windows contained on workspace, including workspace->windows
- * and also sticky windows.
+/**
+ * meta_display_list_windows:
+ * @display: a #MetaDisplay
+ *
+ * Gets windows contained on the workspace, including workspace->windows
+ * and also sticky windows. Override-redirect windows are not included.
+ *
+ * Return value: (transfer container): the list of windows.
  */
 GList*
 meta_workspace_list_windows (MetaWorkspace *workspace)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]