summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2022-02-18 20:33:39 +0200
committerMarco Trevisan <mail@3v1n0.net>2022-02-22 15:49:57 +0000
commitace10756cb42ba8b80524426749f83d58360f5e2 (patch)
tree99973db58d6e1377b8cef9cb2fba4ad118c66ff2
parent7da54dc6b0036b303dea2f1a0e940b00884e42bf (diff)
downloadlibwnck-ace10756cb42ba8b80524426749f83d58360f5e2.tar.gz
screen: move screens to WnckHandle
-rw-r--r--libwnck/private.h10
-rw-r--r--libwnck/screen.c113
-rw-r--r--libwnck/util.c3
-rw-r--r--libwnck/wnck-handle-private.h11
-rw-r--r--libwnck/wnck-handle.c132
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)