GSList *client_list = NULL;
GHashTable *client_map = NULL;
+static Window *client_startup_stack_order = NULL;
+static gulong client_startup_stack_size = 0;
+
static void client_get_all(Client *self);
static void client_toggle_border(Client *self, gboolean show);
static void client_get_area(Client *self);
static void client_apply_startup_state(Client *self);
static Client *search_modal_tree(Client *node, Client *skip);
-static guint map_hash(Window w) { return w; }
-static gboolean map_key_comp(Window w1, Window w2) { return w1 == w2; }
+static guint map_hash(Window *w) { return *w; }
+static gboolean map_key_comp(Window *w1, Window *w2) { return *w1 == *w2; }
void client_startup()
{
client_map = g_hash_table_new((GHashFunc)map_hash,
(GEqualFunc)map_key_comp);
+
+ /* save the stacking order on startup! */
+ if (!PROP_GET32U(ob_root, net_client_list_stacking, window,
+ client_startup_stack_order, client_startup_stack_size))
+ g_message("failed");
+ g_message("%ld", client_startup_stack_size);
+
client_set_list();
}
}
}
XFree(children);
+
+ /* stack them as they were on startup!
+ why with stacking_lower? Why, because then windows who aren't in the
+ stacking list are on the top where you can see them instead of buried
+ at the bottom! */
+ for (i = client_startup_stack_size; i > 0; --i) {
+ Client *c;
+
+ w = client_startup_stack_order[i-1];
+ c = g_hash_table_lookup(client_map, &w);
+ if (c) stacking_lower(c);
+ }
+ g_free(client_startup_stack_order);
+ client_startup_stack_order = NULL;
+ client_startup_stack_size = 0;
}
void client_manage(Window window)
client_list = g_slist_append(client_list, client);
stacking_list = g_list_append(stacking_list, client);
- g_assert(!g_hash_table_lookup(client_map, (gpointer)client->window));
- g_hash_table_insert(client_map, (gpointer)window, client);
+ g_assert(!g_hash_table_lookup(client_map, &client->window));
+ g_hash_table_insert(client_map, &client->window, client);
/* update the focus lists */
if (client->desktop == DESKTOP_ALL) {
client_list = g_slist_remove(client_list, client);
stacking_list = g_list_remove(stacking_list, client);
- g_hash_table_remove(client_map, (gpointer)client->window);
+ g_hash_table_remove(client_map, &client->window);
/* update the focus lists */
if (client->desktop == DESKTOP_ALL) {
if (XGetTransientForHint(ob_display, self->window, &t) &&
t != self->window) { /* cant be transient to itself! */
self->transient = TRUE;
- c = g_hash_table_lookup(client_map, (gpointer)t);
+ c = g_hash_table_lookup(client_map, &t);
g_assert(c != self);/* if this happens then we need to check for it*/
if (!c /*XXX: && _group*/) {