[metacity] don't read most properties for override-redirect windows



commit ba5005fc29bb4b45f174959185ada8d5639499e2
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Feb 26 23:27:29 2017 +0200

    don't read most properties for override-redirect windows
    
    Combination of multiple mutter commits:
    https://git.gnome.org/browse/mutter/commit/?id=fd27647440ca0068450a5a74aadaae15dc065e00
    https://git.gnome.org/browse/mutter/commit/?id=10fe91d7044dd53f3c942a89e43288ce1f59c37c
    https://git.gnome.org/browse/mutter/commit/?id=6190b650564c39b8b70a591f2a68ec3de831b455

 src/core/window-props.c |   43 ++++++++++++++++++++++++++-----------------
 src/core/window.c       |   24 +++++++++++++++++++-----
 2 files changed, 45 insertions(+), 22 deletions(-)
---
diff --git a/src/core/window-props.c b/src/core/window-props.c
index c45f09b..bd29af7 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -68,8 +68,9 @@ typedef void (* ReloadValueFunc) (MetaWindow    *window,
 typedef enum {
   NONE       = 0,
   LOAD_INIT  = (1 << 0),
-  INIT_ONLY  = (1 << 1),
-  FORCE_INIT = (1 << 2),
+  INCLUDE_OR = (1 << 1),
+  INIT_ONLY  = (1 << 2),
+  FORCE_INIT = (1 << 3),
 } MetaPropHookFlags;
 
 struct _MetaWindowPropHooks {
@@ -178,7 +179,8 @@ init_prop_value (MetaWindow          *window,
                  MetaWindowPropHooks *hooks,
                  MetaPropValue       *value)
 {
-  if (!hooks || hooks->type == META_PROP_VALUE_INVALID)
+  if (!hooks || hooks->type == META_PROP_VALUE_INVALID ||
+      (window->override_redirect && !(hooks->flags & INCLUDE_OR)))
     {
       value->type = META_PROP_VALUE_INVALID;
       value->atom = None;
@@ -196,7 +198,7 @@ reload_prop_value (MetaWindow          *window,
                    MetaPropValue       *value,
                    gboolean             initial)
 {
-  if (hooks && hooks->reload_func != NULL)
+  if (!(window->override_redirect && !(hooks->flags & INCLUDE_OR)))
     (* hooks->reload_func) (window, value, initial);
 }
 
@@ -1617,36 +1619,49 @@ reload_gtk_theme_variant (MetaWindow    *window,
 void
 meta_display_init_window_prop_hooks (MetaDisplay *display)
 {
+  /* The ordering here is significant for the properties we load
+   * initially: they are roughly ordered in the order we want them to
+   * be gotten. We want to get window name and class first so we can
+   * use them in error messages and such. However, name is modified
+   * depending on wm_client_machine, so push it slightly sooner.
+   *
+   * For override-redirect windows, we pay attention to:
+   *
+   *  - properties that identify the window: useful for debugging
+   *    purposes.
+   *  - NET_WM_WINDOW_TYPE: can be used to do appropriate handling
+   *    for different types of override-redirect windows.
+   */
   MetaWindowPropHooks hooks[] = {
     {
       display->atom_WM_CLIENT_MACHINE,
       META_PROP_VALUE_STRING,
       reload_wm_client_machine,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       display->atom__NET_WM_NAME,
       META_PROP_VALUE_UTF8,
       reload_net_wm_name,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       XA_WM_CLASS,
       META_PROP_VALUE_CLASS_HINT,
       reload_wm_class,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       display->atom__NET_WM_PID,
       META_PROP_VALUE_CARDINAL,
       reload_net_wm_pid,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       XA_WM_NAME,
       META_PROP_VALUE_TEXT_PROPERTY,
       reload_wm_name,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       display->atom__NET_WM_DESKTOP,
@@ -1664,7 +1679,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
       display->atom__NET_WM_SYNC_REQUEST_COUNTER,
       META_PROP_VALUE_SYNC_COUNTER,
       reload_update_counter,
-      LOAD_INIT
+      LOAD_INIT | INCLUDE_OR
     },
     {
       XA_WM_NORMAL_HINTS,
@@ -1727,12 +1742,6 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
       LOAD_INIT
     },
     {
-      display->atom_WM_STATE,
-      META_PROP_VALUE_INVALID,
-      NULL,
-      NONE
-    },
-    {
       display->atom__NET_WM_ICON,
       META_PROP_VALUE_INVALID,
       reload_net_wm_icon,
@@ -1772,7 +1781,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
       display->atom__NET_WM_WINDOW_TYPE,
       META_PROP_VALUE_ATOM_LIST,
       reload_net_wm_window_type,
-      LOAD_INIT | FORCE_INIT
+      LOAD_INIT | INCLUDE_OR | FORCE_INIT
     },
     {
       display->atom__NET_WM_STRUT,
diff --git a/src/core/window.c b/src/core/window.c
index b36ee1b..4b3dfbf 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -561,8 +561,11 @@ meta_window_new_with_attrs (MetaDisplay       *display,
 
   meta_window_load_initial_properties (window);
 
-  update_sm_hints (window); /* must come after transient_for */
-  meta_window_update_icon_now (window);
+  if (!window->override_redirect)
+    update_sm_hints (window); /* must come after transient_for */
+
+  if (!window->override_redirect)
+    meta_window_update_icon_now (window);
 
   if (window->initially_iconic)
     {
@@ -595,7 +598,7 @@ meta_window_new_with_attrs (MetaDisplay       *display,
    * much we can do...except record the current time so that any children
    * can use this time as a fallback.
    */
-  if (!window->net_wm_user_time_set) {
+  if (!window->override_redirect && !window->net_wm_user_time_set) {
     MetaWindow *parent = NULL;
     if (window->xtransient_for)
       parent = meta_display_lookup_x_window (window->display,
@@ -710,9 +713,12 @@ meta_window_new_with_attrs (MetaDisplay       *display,
     }
 
   /* for the various on_all_workspaces = TRUE possible above */
-  meta_window_set_current_workspace_hint (window);
+  if (!window->override_redirect)
+    {
+      meta_window_set_current_workspace_hint (window);
 
-  meta_window_update_struts (window);
+      meta_window_update_struts (window);
+    }
 
   /* Must add window to stack before doing move/resize, since the
    * window might have fullscreen size (i.e. should have been
@@ -5809,6 +5815,8 @@ gboolean
 meta_window_get_icon_geometry (MetaWindow    *window,
                                MetaRectangle *rect)
 {
+  g_return_val_if_fail (!window->override_redirect, FALSE);
+
   if (window->icon_geometry_set)
     {
       if (rect)
@@ -5951,6 +5959,8 @@ meta_window_update_icon_now (MetaWindow *window)
   GdkPixbuf *icon;
   GdkPixbuf *mini_icon;
 
+  g_return_if_fail (!window->override_redirect);
+
   icon = NULL;
   mini_icon = NULL;
 
@@ -6054,6 +6064,8 @@ meta_window_update_struts (MetaWindow *window)
   int nitems;
   gboolean changed;
 
+  g_return_if_fail (!window->override_redirect);
+
   meta_verbose ("Updating struts for %s\n", window->desc);
 
   old_struts = window->struts;
@@ -8447,6 +8459,8 @@ meta_window_set_user_time (MetaWindow *window,
    * a future time.
    */
 
+  g_return_if_fail (!window->override_redirect);
+
   /* Only update the time if this timestamp is newer... */
   if (window->net_wm_user_time_set &&
       XSERVER_TIME_IS_BEFORE (timestamp, window->net_wm_user_time))


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