From ace10756cb42ba8b80524426749f83d58360f5e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Fri, 18 Feb 2022 20:33:39 +0200 Subject: 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 26a3437..3336f38 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 473c3fc..094f23e 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 fa06c34..64f796e 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 ff5b4f9..05ce22b 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 f1ddf1c..157aabe 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) -- cgit v1.2.1