[libwnck/wip/muktupavels/screen] screen: move screens to WnckHandle




commit ecf9f5608e4816fe9c8d5ff9f5bed45234685ca3
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Feb 18 20:33:39 2022 +0200

    screen: move screens to WnckHandle

 libwnck/private.h             |  10 ++--
 libwnck/screen.c              | 113 +++++-------------------------------
 libwnck/util.c                |   3 +-
 libwnck/wnck-handle-private.h |  11 ++++
 libwnck/wnck-handle.c         | 132 +++++++++++++++++++++++++++++++++++++-----
 5 files changed, 154 insertions(+), 115 deletions(-)
---
diff --git a/libwnck/private.h b/libwnck/private.h
index 26a34377..3336f38c 100644
--- a/libwnck/private.h
+++ b/libwnck/private.h
@@ -110,8 +110,6 @@ void _wnck_screen_change_workspace_name (WnckScreen *screen,
                                          int         number,
                                          const char *name);
 
-void _wnck_screen_shutdown_all          (void);
-
 gboolean _wnck_workspace_set_geometry (WnckWorkspace *space, int w, int h);
 gboolean _wnck_workspace_set_viewport (WnckWorkspace *space, int x, int y);
 
@@ -120,6 +118,12 @@ Display *_wnck_get_default_display (void);
 
 #define WNCK_SCREEN_XSCREEN(screen) (_wnck_screen_get_xscreen (screen))
 
+void       _wnck_screen_construct      (WnckScreen *screen,
+                                        WnckHandle *handle,
+                                        Display    *display,
+                                        int         number);
+
+Window     _wnck_screen_get_xroot      (WnckScreen *screen);
 Screen    *_wnck_screen_get_xscreen    (WnckScreen *screen);
 GdkScreen *_wnck_screen_get_gdk_screen (WnckScreen *screen);
 
@@ -127,8 +131,6 @@ GdkScreen *_wnck_screen_get_gdk_screen (WnckScreen *screen);
 SnDisplay* _wnck_screen_get_sn_display (WnckScreen *screen);
 #endif
 
-WnckScreen* _wnck_screen_get_existing (int number);
-
 WnckHandle    *_wnck_screen_get_handle          (WnckScreen    *screen);
 
 void           _wnck_pager_activate_workspace   (WnckWorkspace *wspace,
diff --git a/libwnck/screen.c b/libwnck/screen.c
index 473c3fce..094f23ef 100644
--- a/libwnck/screen.c
+++ b/libwnck/screen.c
@@ -65,8 +65,6 @@
 #define _NET_WM_BOTTOMRIGHT 2
 #define _NET_WM_BOTTOMLEFT  3
 
-static WnckScreen** screens = NULL;
-
 struct _WnckScreenPrivate
 {
   WnckHandle *handle;
@@ -500,8 +498,6 @@ wnck_screen_finalize (GObject *object)
   g_free (screen->priv->wm_name);
   screen->priv->wm_name = NULL;
 
-  screens[screen->priv->number] = NULL;
-
 #ifdef HAVE_STARTUP_NOTIFICATION
   sn_display_unref (screen->priv->sn_display);
   screen->priv->sn_display = NULL;
@@ -526,12 +522,13 @@ sn_error_trap_pop (SnDisplay *display,
 }
 #endif /* HAVE_STARTUP_NOTIFICATION */
 
-static void
-wnck_screen_construct (Display    *display,
-                       WnckScreen *screen,
-                       int         number)
+void
+_wnck_screen_construct (WnckScreen *screen,
+                        WnckHandle *handle,
+                        Display    *display,
+                        int         number)
 {
-  screen->priv->handle = _wnck_get_handle ();
+  screen->priv->handle = handle;
 
   /* Create the initial state of the screen. */
   screen->priv->xroot = RootWindow (display, number);
@@ -578,44 +575,7 @@ wnck_screen_construct (Display    *display,
 WnckScreen*
 wnck_screen_get (int index)
 {
-  Display *display;
-
-  display = _wnck_get_default_display ();
-
-  g_return_val_if_fail (display != NULL, NULL);
-
-  if (index >= ScreenCount (display))
-    return NULL;
-
-  if (screens == NULL)
-    {
-      screens = g_new0 (WnckScreen*, ScreenCount (display));
-    }
-
-  if (screens[index] == NULL)
-    {
-      screens[index] = g_object_new (WNCK_TYPE_SCREEN, NULL);
-
-      wnck_screen_construct (display, screens[index], index);
-    }
-
-  return screens[index];
-}
-
-WnckScreen*
-_wnck_screen_get_existing (int number)
-{
-  Display *display;
-
-  display = _wnck_get_default_display ();
-
-  g_return_val_if_fail (display != NULL, NULL);
-  g_return_val_if_fail (number < ScreenCount (display), NULL);
-
-  if (screens != NULL)
-    return screens[number];
-  else
-    return NULL;
+  return _wnck_handle_get_screen (_wnck_get_handle (), index);
 }
 
 /**
@@ -630,15 +590,7 @@ _wnck_screen_get_existing (int number)
 WnckScreen*
 wnck_screen_get_default (void)
 {
-  int default_screen;
-  Display *default_display = _wnck_get_default_display ();
-
-  if (default_display == NULL)
-    return NULL;
-
-  default_screen = DefaultScreen (default_display);
-
-  return wnck_screen_get (default_screen);
+  return _wnck_handle_get_default_screen (_wnck_get_handle ());
 }
 
 /**
@@ -658,24 +610,8 @@ wnck_screen_get_default (void)
 WnckScreen*
 wnck_screen_get_for_root (gulong root_window_id)
 {
-  int i;
-  Display *display;
-
-  if (screens == NULL)
-    return NULL;
-
-  i = 0;
-  display = _wnck_get_default_display ();
-
-  while (i < ScreenCount (display))
-    {
-      if (screens[i] != NULL && screens[i]->priv->xroot == root_window_id)
-        return screens[i];
-
-      ++i;
-    }
-
-  return NULL;
+  return _wnck_handle_get_screen_for_root (_wnck_get_handle (),
+                                           root_window_id);
 }
 
 WnckHandle *
@@ -2494,6 +2430,12 @@ wnck_screen_get_height (WnckScreen *screen)
   return HeightOfScreen (screen->priv->xscreen);
 }
 
+Window
+_wnck_screen_get_xroot (WnckScreen *screen)
+{
+  return screen->priv->xroot;
+}
+
 Screen *
 _wnck_screen_get_xscreen (WnckScreen *screen)
 {
@@ -2724,26 +2666,3 @@ _wnck_screen_change_workspace_name (WnckScreen *screen,
 
   g_free (names);
 }
-
-void
-_wnck_screen_shutdown_all (void)
-{
-  int i;
-  Display *display;
-
-  if (screens == NULL)
-    return;
-
-  display = _wnck_get_default_display ();
-
-  for (i = 0; i < ScreenCount (display); ++i)
-    {
-      if (screens[i] != NULL) {
-        g_object_unref (screens[i]);
-        screens[i] = NULL;
-      }
-    }
-
-  g_free (screens);
-  screens = NULL;
-}
diff --git a/libwnck/util.c b/libwnck/util.c
index fa06c345..64f796e5 100644
--- a/libwnck/util.c
+++ b/libwnck/util.c
@@ -210,7 +210,8 @@ wnck_set_default_mini_icon_size (gsize size)
   _wnck_handle_set_default_mini_icon_size (_wnck_get_handle (), size);
 
   default_screen = DefaultScreen (_wnck_get_default_display ());
-  screen = _wnck_screen_get_existing (default_screen);
+  screen = _wnck_handle_get_existing_screen (_wnck_get_handle (),
+                                             default_screen);
 
   if (WNCK_IS_SCREEN (screen))
     {
diff --git a/libwnck/wnck-handle-private.h b/libwnck/wnck-handle-private.h
index ff5b4f94..05ce22bd 100644
--- a/libwnck/wnck-handle-private.h
+++ b/libwnck/wnck-handle-private.h
@@ -29,6 +29,17 @@ WnckHandle      *_wnck_handle_new                        (WnckClientType  client
 
 WnckClientType   _wnck_handle_get_client_type            (WnckHandle     *self);
 
+WnckScreen      *_wnck_handle_get_default_screen         (WnckHandle     *self);
+
+WnckScreen      *_wnck_handle_get_screen                 (WnckHandle     *self,
+                                                          int             index);
+
+WnckScreen      *_wnck_handle_get_screen_for_root        (WnckHandle     *self,
+                                                          gulong          root_window_id);
+
+WnckScreen      *_wnck_handle_get_existing_screen        (WnckHandle     *self,
+                                                          int             number);
+
 void             _wnck_handle_set_default_icon_size      (WnckHandle     *self,
                                                           gsize           icon_size);
 
diff --git a/libwnck/wnck-handle.c b/libwnck/wnck-handle.c
index f1ddf1c7..157aabea 100644
--- a/libwnck/wnck-handle.c
+++ b/libwnck/wnck-handle.c
@@ -1,5 +1,7 @@
 /*
  * Copyright (C) 2001 Havoc Pennington
+ * Copyright (C) 2003 Kim Woelders
+ * Copyright (C) 2003 Red Hat, Inc.
  * Copyright (C) 2005-2007 Vincent Untz
  * Copyright (C) 2021 Alberts Muktupāvels
  *
@@ -31,16 +33,18 @@ G_DECLARE_FINAL_TYPE (WnckHandle, wnck_handle, WNCK, HANDLE, GObject)
 
 struct _WnckHandle
 {
-  GObject         parent;
+  GObject          parent;
 
-  WnckClientType  client_type;
+  WnckScreen     **screens;
 
-  gsize           default_icon_size;
-  gsize           default_mini_icon_size;
+  WnckClientType   client_type;
 
-  GHashTable     *class_group_hash;
-  GHashTable     *app_hash;
-  GHashTable     *window_hash;
+  gsize            default_icon_size;
+  gsize            default_mini_icon_size;
+
+  GHashTable      *class_group_hash;
+  GHashTable      *app_hash;
+  GHashTable      *window_hash;
 };
 
 enum
@@ -61,19 +65,23 @@ filter_func (GdkXEvent *gdkxevent,
              GdkEvent  *event,
              gpointer   data)
 {
+  WnckHandle *self;
   XEvent *xevent = gdkxevent;
 #ifdef HAVE_STARTUP_NOTIFICATION
   int i;
   Display *display;
 #endif /* HAVE_STARTUP_NOTIFICATION */
 
+  self = WNCK_HANDLE (data);
+
   switch (xevent->type)
     {
     case PropertyNotify:
       {
         WnckScreen *screen;
 
-        screen = wnck_screen_get_for_root (xevent->xany.window);
+        screen = _wnck_handle_get_screen_for_root (self, xevent->xany.window);
+
         if (screen != NULL)
           {
             _wnck_screen_process_property_notify (screen, xevent);
@@ -122,11 +130,12 @@ filter_func (GdkXEvent *gdkxevent,
 
       while (i < ScreenCount (display))
         {
-          WnckScreen *s;
+          WnckScreen *screen;
 
-          s = _wnck_screen_get_existing (i);
-          if (s != NULL)
-            sn_display_process_event (_wnck_screen_get_sn_display (s),
+          screen = _wnck_handle_get_existing_screen (self, i);
+
+          if (screen != NULL)
+            sn_display_process_event (_wnck_screen_get_sn_display (screen),
                                       xevent);
 
           ++i;
@@ -177,7 +186,16 @@ wnck_handle_finalize (GObject *object)
       self->app_hash = NULL;
     }
 
-  _wnck_screen_shutdown_all ();
+  if (self->screens != NULL)
+    {
+      Display *display;
+      int i;
+
+      for (i = 0; i < ScreenCount (display); ++i)
+        g_clear_object (&self->screens[i]);
+
+      g_clear_pointer (&self->screens, g_free);
+    }
 
   if (self->window_hash != NULL)
     {
@@ -301,6 +319,94 @@ _wnck_handle_get_client_type (WnckHandle *self)
   return self->client_type;
 }
 
+WnckScreen *
+_wnck_handle_get_default_screen (WnckHandle *self)
+{
+  Display *display;
+
+  g_return_val_if_fail (WNCK_IS_HANDLE (self), NULL);
+
+  display = _wnck_get_default_display ();
+  if (display == NULL)
+    return NULL;
+
+  return _wnck_handle_get_screen (self, DefaultScreen (display));
+}
+
+WnckScreen *
+_wnck_handle_get_screen (WnckHandle *self,
+                         int         index)
+{
+  Display *display;
+
+  display = _wnck_get_default_display ();
+
+  g_return_val_if_fail (WNCK_IS_HANDLE (self), NULL);
+  g_return_val_if_fail (display != NULL, NULL);
+
+  if (index >= ScreenCount (display))
+    return NULL;
+
+  if (self->screens == NULL)
+    self->screens = g_new0 (WnckScreen*, ScreenCount (display));
+
+  if (self->screens[index] == NULL)
+    {
+      self->screens[index] = g_object_new (WNCK_TYPE_SCREEN, NULL);
+
+      _wnck_screen_construct (self->screens[index], self, display, index);
+    }
+
+  return self->screens[index];
+}
+
+WnckScreen *
+_wnck_handle_get_screen_for_root (WnckHandle *self,
+                                  gulong      root_window_id)
+{
+  Display *display;
+  int i;
+
+  g_return_val_if_fail (WNCK_IS_HANDLE (self), NULL);
+
+  if (self->screens == NULL)
+    return NULL;
+
+  display = _wnck_get_default_display ();
+  i = 0;
+
+  while (i < ScreenCount (display))
+    {
+      WnckScreen *screen;
+
+      screen = self->screens[i];
+      if (screen != NULL && _wnck_screen_get_xroot (screen) == root_window_id)
+        return screen;
+
+      ++i;
+    }
+
+  return NULL;
+}
+
+WnckScreen *
+_wnck_handle_get_existing_screen (WnckHandle *self,
+                                  int         number)
+{
+  Display *display;
+
+  display = _wnck_get_default_display ();
+
+  g_return_val_if_fail (WNCK_IS_HANDLE (self), NULL);
+  g_return_val_if_fail (display != NULL, NULL);
+  g_return_val_if_fail (number < ScreenCount (display), NULL);
+
+  if (self->screens != NULL)
+    return self->screens[number];
+
+  return NULL;
+}
+
 void
 _wnck_handle_set_default_icon_size (WnckHandle *self,
                                     gsize       icon_size)


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