[mutter] window-props: Use a flags-based approach for our prop hooks



commit 6190b650564c39b8b70a591f2a68ec3de831b455
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Jul 10 14:31:25 2014 -0400

    window-props: Use a flags-based approach for our prop hooks
    
    This allows us to extend the table better with newer flags.

 src/x11/window-props.c |  102 ++++++++++++++++++++++++-----------------------
 1 files changed, 52 insertions(+), 50 deletions(-)
---
diff --git a/src/x11/window-props.c b/src/x11/window-props.c
index a20c8c3..8e0efe0 100644
--- a/src/x11/window-props.c
+++ b/src/x11/window-props.c
@@ -59,13 +59,18 @@ typedef void (* ReloadValueFunc) (MetaWindow    *window,
                                   MetaPropValue *value,
                                   gboolean       initial);
 
+typedef enum {
+  NONE       = 0,
+  LOAD_INIT  = (1 << 0),
+  INCLUDE_OR = (1 << 1),
+} MetaPropHookFlags;
+
 struct _MetaWindowPropHooks
 {
   Atom property;
   MetaPropValueType type;
   ReloadValueFunc reload_func;
-  gboolean load_initially;
-  gboolean include_override_redirect;
+  MetaPropHookFlags flags;
 };
 
 static void init_prop_value            (MetaWindow          *window,
@@ -127,7 +132,7 @@ meta_window_load_initial_properties (MetaWindow *window)
   for (i = 0; i < window->display->n_prop_hooks; i++)
     {
       MetaWindowPropHooks *hooks = &window->display->prop_hooks_table[i];
-      if (hooks->load_initially)
+      if (hooks->flags & LOAD_INIT)
         {
           init_prop_value (window, hooks, &values[j]);
           ++j;
@@ -142,7 +147,7 @@ meta_window_load_initial_properties (MetaWindow *window)
   for (i = 0; i < window->display->n_prop_hooks; i++)
     {
       MetaWindowPropHooks *hooks = &window->display->prop_hooks_table[i];
-      if (hooks->load_initially)
+      if (hooks->flags & LOAD_INIT)
         {
           /* If we didn't actually manage to load anything then we don't need
            * to call the reload function; this is different from a notification
@@ -166,7 +171,7 @@ init_prop_value (MetaWindow          *window,
                  MetaPropValue       *value)
 {
   if (!hooks || hooks->type == META_PROP_VALUE_INVALID ||
-      (window->override_redirect && !hooks->include_override_redirect))
+      (window->override_redirect && !(hooks->flags & INCLUDE_OR)))
     {
       value->type = META_PROP_VALUE_INVALID;
       value->atom = None;
@@ -184,7 +189,7 @@ reload_prop_value (MetaWindow          *window,
                    MetaPropValue       *value,
                    gboolean             initial)
 {
-  if (!(window->override_redirect && !hooks->include_override_redirect))
+  if (!(window->override_redirect && !(hooks->flags & INCLUDE_OR)))
     (* hooks->reload_func) (window, value, initial);
 }
 
@@ -1683,10 +1688,7 @@ RELOAD_STRING (gtk_menubar_object_path,     "gtk-menubar-object-path")
 void
 meta_display_init_window_prop_hooks (MetaDisplay *display)
 {
-  /* INIT: load initially
-   * O-R:  fetch for override-redirect windows
-   *
-   * The ordering here is significant for the properties we load
+  /* 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
@@ -1699,45 +1701,45 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
    *  - NET_WM_WINDOW_TYPE: can be used to do appropriate handling
    *    for different types of override-redirect windows.
    */
-  MetaWindowPropHooks hooks[] = {                                                       /* INIT   O-R     */
-    { display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, TRUE,  TRUE },
-    { display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       TRUE,  TRUE },
-    { XA_WM_CLASS,                     META_PROP_VALUE_CLASS_HINT, reload_wm_class,        TRUE,  TRUE },
-    { display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        TRUE,  TRUE },
-    { XA_WM_NAME,                      META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      TRUE,  TRUE },
-    { display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, TRUE,  TRUE },
-    { display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, TRUE, TRUE },
-    { display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    TRUE,  FALSE },
-    { display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    TRUE,  FALSE },
-    { display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, reload_update_counter, 
TRUE, TRUE },
-    { XA_WM_NORMAL_HINTS,              META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    TRUE,  FALSE },
-    { display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     TRUE,  FALSE },
-    { XA_WM_HINTS,                     META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         TRUE,  FALSE },
-    { display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  TRUE,  FALSE },
-    { display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     TRUE,  FALSE },
-    { display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      TRUE,  FALSE },
-    { XA_WM_TRANSIENT_FOR,             META_PROP_VALUE_WINDOW,    reload_transient_for,    TRUE,  FALSE },
-    { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, TRUE, FALSE },
-    { display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     
reload_gtk_hide_titlebar_when_maximized, TRUE, FALSE },
-    { display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         
reload_gtk_application_id,               TRUE, FALSE },
-    { display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         
reload_gtk_unique_bus_name,              TRUE, FALSE },
-    { display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         
reload_gtk_application_object_path,      TRUE, FALSE },
-    { display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         
reload_gtk_window_object_path,           TRUE, FALSE },
-    { display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         
reload_gtk_app_menu_object_path,         TRUE, FALSE },
-    { display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         
reload_gtk_menubar_object_path,          TRUE, FALSE },
-    { display->atom__GTK_FRAME_EXTENTS,                
META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                TRUE, FALSE },
-    { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, TRUE, 
FALSE },
-    { display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,       FALSE, FALSE },
-    { display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon,      FALSE, FALSE },
-    { display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry,     FALSE, 
FALSE },
-    { display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, FALSE, FALSE },
-    { display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, FALSE, FALSE },
-    { display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role,         TRUE, FALSE },
-    { display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type,  TRUE, TRUE },
-    { display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts,            FALSE, FALSE },
-    { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts,            FALSE, FALSE },
-    { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, FALSE, 
FALSE },
-    { display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity,  TRUE, TRUE },
+  MetaWindowPropHooks hooks[] = {
+    { display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       LOAD_INIT | 
INCLUDE_OR },
+    { XA_WM_CLASS,                     META_PROP_VALUE_CLASS_HINT, reload_wm_class,        LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        LOAD_INIT | 
INCLUDE_OR },
+    { XA_WM_NAME,                      META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    LOAD_INIT },
+    { display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    LOAD_INIT },
+    { display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, reload_update_counter, 
LOAD_INIT | INCLUDE_OR },
+    { XA_WM_NORMAL_HINTS,              META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    LOAD_INIT },
+    { display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     LOAD_INIT },
+    { XA_WM_HINTS,                     META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         LOAD_INIT },
+    { display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  LOAD_INIT },
+    { display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     LOAD_INIT },
+    { display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      LOAD_INIT },
+    { XA_WM_TRANSIENT_FOR,             META_PROP_VALUE_WINDOW,    reload_transient_for,    LOAD_INIT },
+    { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, LOAD_INIT },
+    { display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     
reload_gtk_hide_titlebar_when_maximized, LOAD_INIT },
+    { display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         
reload_gtk_application_id,               LOAD_INIT },
+    { display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         
reload_gtk_unique_bus_name,              LOAD_INIT },
+    { display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         
reload_gtk_application_object_path,      LOAD_INIT },
+    { display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         
reload_gtk_window_object_path,           LOAD_INIT },
+    { display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         
reload_gtk_app_menu_object_path,         LOAD_INIT },
+    { display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         
reload_gtk_menubar_object_path,          LOAD_INIT },
+    { display->atom__GTK_FRAME_EXTENTS,                
META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                LOAD_INIT },
+    { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, 
LOAD_INIT },
+    { display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,  NONE },
+    { display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon, NONE },
+    { display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry, LOAD_INIT },
+    { display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
+    { display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
+    { display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role, LOAD_INIT },
+    { display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT | 
INCLUDE_OR },
+    { display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE },
+    { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE },
+    { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, NONE },
+    { display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | 
INCLUDE_OR },
     { 0 },
   };
 
@@ -1752,7 +1754,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
   while (cursor->property)
     {
       /* Doing initial loading doesn't make sense if we just want notification */
-      g_assert (!(cursor->load_initially && cursor->type == META_PROP_VALUE_INVALID));
+      g_assert (!((cursor->flags & LOAD_INIT) && cursor->type == META_PROP_VALUE_INVALID));
 
       /* Atoms are safe to use with GINT_TO_POINTER because it's safe with
        * anything 32 bits or less, and atoms are 32 bits with the top three


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