- (guint32*)windows, win_it - windows);
-
- g_print("Client list:");
- for (it = client_list; it; it = it->next)
- g_print("0x%lx ", ((Client*)it->data)->window);
- g_print("\n");
- g_print("Stacking order: ");
- for (it = stacking_list; it; it = it->next)
- if (WINDOW_IS_CLIENT(it->data))
- g_print("0x%lx ", ((Client*)it->data)->window);
- g_print("\n");
-
- if (windows)
- g_free(windows);
+ (guint32*)windows, i);
+
+ g_free(windows);
+}
+
+static void do_restack(GList *wins, GList *before)
+{
+ GList *it, *next;
+ Window *win;
+ int i;
+
+ /* pls only restack stuff in the same layer at a time */
+ for (it = wins; it; it = next) {
+ next = g_list_next(it);
+ if (!next) break;
+ g_assert (window_layer(it->data) == window_layer(next->data));
+ }
+
+
+ win = g_new(Window, g_list_length(wins) + 1);
+
+ if (before == stacking_list)
+ win[0] = focus_backup;
+ else if (!before)
+ win[0] = window_top(g_list_last(stacking_list)->data);
+ else
+ win[0] = window_top(g_list_previous(before)->data);
+
+ for (i = 1, it = wins; it; ++i, it = g_list_next(it)) {
+ win[i] = window_top(it->data);
+ stacking_list = g_list_insert_before(stacking_list, before, it->data);
+ }
+
+ /* XXX some debug checking of the stacking list's order */
+ for (it = stacking_list; ; it = next) {
+ next = g_list_next(it);
+ if (!next) break;
+ g_assert(window_layer(it->data) >= window_layer(next->data));
+ }
+
+ XRestackWindows(ob_display, win, i);
+ g_free(win);
+
+ stacking_set_list();