set = g_slice_new(ObClientSet);
set->all = FALSE;
- set->h = g_hash_table_new(g_int_hash, g_int_equal);
+ set->h = NULL;
client_add_destroy_notify((ObClientCallback)client_destroyed, set);
return set;
}
c = event_current_target();
if (!c) return NULL;
- set = client_set_empty();
+ set = g_slice_new(ObClientSet);
+ set->all = FALSE;
+ set->h = g_hash_table_new(g_int_hash, g_int_equal);
g_hash_table_insert(set->h, &c->window, c);
return set;
}
if (!set->all) {
client_remove_destroy_notify_data((ObClientCallback)client_destroyed,
set);
- g_hash_table_destroy(set->h);
+ if (set->h) g_hash_table_destroy(set->h);
}
g_slice_free(ObClientSet, set);
}
client_set_destroy(a);
return b;
}
+ if (!a->h) {
+ client_set_destroy(a);
+ return b;
+ }
+ if (!b->h) {
+ client_set_destroy(b);
+ return a;
+ }
+
g_hash_table_foreach(b->h, foreach_union, a->h);
client_set_destroy(b);
return a;
client_set_destroy(b);
return a;
}
+ if (!a->h) {
+ client_set_destroy(b);
+ return a;
+ }
+ if (!b->h) {
+ client_set_destroy(a);
+ return b;
+ }
g_hash_table_foreach_remove(a->h, foreach_intersection, b->h);
client_set_destroy(b);
d.f = f;
d.data = data;
g_hash_table_foreach_remove(set->h, foreach_reduce, &d);
+ if (g_hash_table_size(set->h) == 0) {
+ g_hash_table_destroy(set->h);
+ set->h = NULL;
+ }
return set;
}
for (it = client_list; it; it = g_list_next(it)) {
ObClient *c = it->data;
- if (!g_hash_table_lookup(set->h, &c->window) && f(c, data))
- g_hash_table_insert(set->h, &c->window, c);
+ if (!set->h || !g_hash_table_lookup(set->h, &c->window))
+ if (f(c, data)) {
+ if (!set->h)
+ set->h = g_hash_table_new(g_int_hash, g_int_equal);
+ g_hash_table_insert(set->h, &c->window, c);
+ }
}
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;
+ else return set->h == NULL;
}
gboolean client_set_test_boolean(ObClientSet *set)
{
if (set->all) return TRUE;
- else return g_hash_table_size(set->h) > 0;
+ else return set->h != NULL;
}