[libwnck/wip/muktupavels/wnck-handle-3: 4/4] window: move window_hash to WnckHandle
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libwnck/wip/muktupavels/wnck-handle-3: 4/4] window: move window_hash to WnckHandle
- Date: Tue, 28 Dec 2021 11:51:11 +0000 (UTC)
commit bfe6ef6b43c3175e6c2348c7a912fe447a8084a5
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Tue Dec 28 13:50:24 2021 +0200
window: move window_hash to WnckHandle
libwnck/private.h | 2 --
libwnck/window.c | 37 ++++++++++++-------------------------
libwnck/wnck-handle-private.h | 10 ++++++++++
libwnck/wnck-handle.c | 37 ++++++++++++++++++++++++++++++++++++-
4 files changed, 58 insertions(+), 28 deletions(-)
---
diff --git a/libwnck/private.h b/libwnck/private.h
index 6bf8f7e..26a3437 100644
--- a/libwnck/private.h
+++ b/libwnck/private.h
@@ -70,8 +70,6 @@ const char* _wnck_window_get_startup_id (WnckWindow *window);
time_t _wnck_window_get_needs_attention_time (WnckWindow *window);
time_t _wnck_window_or_transient_get_needs_attention_time (WnckWindow *window);
-void _wnck_window_shutdown_all (void);
-
WnckWorkspace* _wnck_workspace_create (int number,
WnckScreen *screen);
void _wnck_workspace_destroy (WnckWorkspace *space);
diff --git a/libwnck/window.c b/libwnck/window.c
index 25c56a5..8f6c8b7 100644
--- a/libwnck/window.c
+++ b/libwnck/window.c
@@ -48,8 +48,6 @@
#define FALLBACK_NAME _("Untitled window")
#define ALL_WORKSPACES ((int) 0xFFFFFFFF)
-static GHashTable *window_hash = NULL;
-
/* Keep 0-7 in sync with the numbers in the WindowState enum. Yeah I'm
* a loser.
*/
@@ -219,16 +217,6 @@ static WnckWindow* find_last_transient_for (GList *windows,
static guint signals[LAST_SIGNAL] = { 0 };
-void
-_wnck_window_shutdown_all (void)
-{
- if (window_hash != NULL)
- {
- g_hash_table_destroy (window_hash);
- window_hash = NULL;
- }
-}
-
static void
wnck_window_init (WnckWindow *window)
{
@@ -460,10 +448,7 @@ wnck_window_finalize (GObject *object)
WnckWindow*
wnck_window_get (gulong xwindow)
{
- if (window_hash == NULL)
- return NULL;
- else
- return g_hash_table_lookup (window_hash, &xwindow);
+ return _wnck_handle_get_window (_wnck_get_handle (), xwindow);
}
/**
@@ -488,15 +473,14 @@ _wnck_window_create (Window xwindow,
WnckScreen *screen,
gint sort_order)
{
+ WnckHandle *handle;
WnckWindow *window;
Screen *xscreen;
- if (window_hash == NULL)
- window_hash = g_hash_table_new_full (_wnck_xid_hash, _wnck_xid_equal,
- NULL, g_object_unref);
+ handle = _wnck_screen_get_handle (screen);
+ window = _wnck_handle_get_window (handle, xwindow);
- g_return_val_if_fail (g_hash_table_lookup (window_hash, &xwindow) == NULL,
- NULL);
+ g_return_val_if_fail (window == NULL, NULL);
xscreen = WNCK_SCREEN_XSCREEN (screen);
@@ -504,9 +488,9 @@ _wnck_window_create (Window xwindow,
window->priv->xwindow = xwindow;
window->priv->screen = screen;
- g_hash_table_insert (window_hash, &window->priv->xwindow, window);
+ _wnck_handle_insert_window (handle, &window->priv->xwindow, window);
- /* Hash now owns one ref, caller gets none */
+ /* Handle now owns one ref, caller gets none */
/* Note that xwindow may correspond to a WnckApplication's xwindow,
* that's why we select the union of the mask we want for Application
@@ -567,15 +551,18 @@ _wnck_window_create (Window xwindow,
void
_wnck_window_destroy (WnckWindow *window)
{
+ WnckHandle *handle;
Window xwindow = window->priv->xwindow;
g_return_if_fail (WNCK_IS_WINDOW (window));
+ handle = _wnck_screen_get_handle (window->priv->screen);
+
g_return_if_fail (wnck_window_get (xwindow) == window);
- g_hash_table_remove (window_hash, &xwindow);
+ _wnck_handle_remove_window (handle, &xwindow);
- /* Removing from hash also removes the only ref WnckWindow had */
+ /* Removing from handle also removes the only ref WnckWindow had */
g_return_if_fail (wnck_window_get (xwindow) == NULL);
}
diff --git a/libwnck/wnck-handle-private.h b/libwnck/wnck-handle-private.h
index c0f8d9d..ff5b4f9 100644
--- a/libwnck/wnck-handle-private.h
+++ b/libwnck/wnck-handle-private.h
@@ -59,6 +59,16 @@ void _wnck_handle_remove_application (WnckHandle *self,
WnckApplication *_wnck_handle_get_application (WnckHandle *self,
gulong xwindow);
+void _wnck_handle_insert_window (WnckHandle *self,
+ gpointer xwindow,
+ WnckWindow *window);
+
+void _wnck_handle_remove_window (WnckHandle *self,
+ gpointer xwindow);
+
+WnckWindow *_wnck_handle_get_window (WnckHandle *self,
+ gulong xwindow);
+
G_END_DECLS
#endif
diff --git a/libwnck/wnck-handle.c b/libwnck/wnck-handle.c
index 1bbb3a4..f1ddf1c 100644
--- a/libwnck/wnck-handle.c
+++ b/libwnck/wnck-handle.c
@@ -40,6 +40,7 @@ struct _WnckHandle
GHashTable *class_group_hash;
GHashTable *app_hash;
+ GHashTable *window_hash;
};
enum
@@ -177,7 +178,12 @@ wnck_handle_finalize (GObject *object)
}
_wnck_screen_shutdown_all ();
- _wnck_window_shutdown_all ();
+
+ if (self->window_hash != NULL)
+ {
+ g_hash_table_destroy (self->window_hash);
+ self->window_hash = NULL;
+ }
G_OBJECT_CLASS (wnck_handle_parent_class)->finalize (object);
}
@@ -273,6 +279,11 @@ wnck_handle_init (WnckHandle *self)
NULL,
g_object_unref);
+ self->window_hash = g_hash_table_new_full (_wnck_xid_hash,
+ _wnck_xid_equal,
+ NULL,
+ g_object_unref);
+
gdk_window_add_filter (NULL, filter_func, self);
}
@@ -366,3 +377,27 @@ _wnck_handle_get_application (WnckHandle *self,
return g_hash_table_lookup (self->app_hash, &xwindow);
}
+
+void
+_wnck_handle_insert_window (WnckHandle *self,
+ gpointer xwindow,
+ WnckWindow *window)
+{
+ g_hash_table_insert (self->window_hash, xwindow, window);
+}
+
+void
+_wnck_handle_remove_window (WnckHandle *self,
+ gpointer xwindow)
+{
+ g_hash_table_remove (self->window_hash, xwindow);
+}
+
+WnckWindow *
+_wnck_handle_get_window (WnckHandle *self,
+ gulong xwindow)
+{
+ g_return_val_if_fail (WNCK_IS_HANDLE (self), NULL);
+
+ return g_hash_table_lookup (self->window_hash, &xwindow);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]