From ecc79e7a9b68a4cea2d76ab7a21442d67758d3cb Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 29 Jul 2011 17:28:14 -0400 Subject: [PATCH] make a special "ALL" ObClientSet which contains all clients. This saves copying all the clients into the set. IMPORTANT: This client set will test as a "true" boolean regardless of if there are clients present or not. - We did this to allow for boolean filters. A boolean filter returns the "ALL" set for its true value, and an empty set for its false value. --- openbox/client_set.c | 48 ++++++++++++++++++++++++++++++++++++-------- openbox/client_set.h | 8 ++++++++ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/openbox/client_set.c b/openbox/client_set.c index 866feee4..fb47de0c 100644 --- a/openbox/client_set.c +++ b/openbox/client_set.c @@ -23,6 +23,7 @@ #include struct _ObClientSet { + gboolean all; GHashTable *h; }; @@ -36,6 +37,7 @@ ObClientSet* client_set_empty(void) ObClientSet *set; set = g_slice_new(ObClientSet); + set->all = FALSE; set->h = g_hash_table_new(g_int_hash, g_int_equal); client_add_destroy_notify((ObClientCallback)client_destroyed, set); return set; @@ -57,21 +59,21 @@ ObClientSet* client_set_single(void) ObClientSet* client_set_all(void) { ObClientSet *set; - GList *it; if (!client_list) return NULL; - set = client_set_empty(); - for (it = client_list; it; it = g_list_next(it)) { - ObClient *c = it->data; - g_hash_table_insert(set->h, &c->window, c); - } + set = g_slice_new(ObClientSet); + set->all = TRUE; + set->h = NULL; return set; } void client_set_destroy(ObClientSet *set) { - client_remove_destroy_notify_data((ObClientCallback)client_destroyed, set); - g_hash_table_destroy(set->h); + if (!set->all) { + client_remove_destroy_notify_data((ObClientCallback)client_destroyed, + set); + g_hash_table_destroy(set->h); + } g_slice_free(ObClientSet, set); } @@ -89,6 +91,14 @@ ObClientSet* client_set_union(ObClientSet *a, ObClientSet *b) g_return_val_if_fail(a != NULL, NULL); g_return_val_if_fail(b != NULL, NULL); + if (a->all) { + client_set_destroy(b); + return a; + } + if (b->all) { + client_set_destroy(a); + return b; + } g_hash_table_foreach(b->h, foreach_union, a->h); client_set_destroy(b); return a; @@ -108,6 +118,15 @@ ObClientSet* client_set_intersection(ObClientSet *a, ObClientSet *b) g_return_val_if_fail(a != NULL, NULL); g_return_val_if_fail(b != NULL, NULL); + if (a->all) { + client_set_destroy(a); + return b; + } + if (b->all) { + client_set_destroy(b); + return a; + } + g_hash_table_foreach_remove(a->h, foreach_intersection, b->h); client_set_destroy(b); return a; @@ -154,3 +173,16 @@ ObClientSet* client_set_expand(ObClientSet *set, ObClientSetExpandFunc f, } return set; } + +gboolean client_set_is_empty(ObClientSet *set) +{ + if (set->all) return client_list == NULL; + else return g_hash_table_size(set->h) == 0; +} + +gboolean client_set_test_boolean(ObClientSet *set) +{ + if (set->all) return TRUE; + else return g_hash_table_size(set->h) > 0; +} + diff --git a/openbox/client_set.h b/openbox/client_set.h index 3537018a..6e930019 100644 --- a/openbox/client_set.h +++ b/openbox/client_set.h @@ -56,3 +56,11 @@ ObClientSet* client_set_reduce(ObClientSet *set, ObClientSetReduceFunc f, will be added to the set. */ ObClientSet* client_set_expand(ObClientSet *set, ObClientSetExpandFunc f, gpointer data); + +/*! Returns TRUE if there is nothing in the set. */ +gboolean client_set_is_empty(ObClientSet *set); + +/*! Returns TRUE if there is someting in the set, or if it is the special + "ALL" set, which contains all clients. Even when there are no clients + present, this set returns TRUE. */ +gboolean client_set_test_boolean(ObClientSet *set); -- 2.34.1