- if (size > 0) {
- windows = g_new(Window, size);
- win_it = windows;
- for (it = g_list_last(stacking_list); it != NULL;
- it = it->prev, ++win_it)
- *win_it = ((Client*)it->data)->window;
- } else
- windows = NULL;
-
- PROP_SET32A(ob_root, net_client_list_stacking, window, windows, size);
-
- if (windows)
- g_free(windows);
+ if (stacking_list) {
+ windows = g_new(Window, g_list_length(stacking_list));
+ for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
+ if (WINDOW_IS_CLIENT(it->data))
+ windows[i++] = WINDOW_AS_CLIENT(it->data)->window;
+ }
+ }
+
+ PROP_SETA32(RootWindow(ob_display, ob_screen),
+ net_client_list_stacking, window, (guint32*)windows, i);
+
+ g_free(windows);
+}
+
+static void do_restack(GList *wins, GList *before)
+{
+ GList *it, *next;
+ Window *win;
+ int i;
+
+#ifdef DEBUG
+ /* 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));
+ }
+ if (before)
+ g_assert(window_layer(it->data) >= window_layer(before->data));
+#endif
+
+ win = g_new(Window, g_list_length(wins) + 1);
+
+ if (before == stacking_list)
+ win[0] = screen_support_win;
+ 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);
+ g_assert(win[i] != None); /* better not call stacking shit before
+ setting your top level window value */
+ stacking_list = g_list_insert_before(stacking_list, before, it->data);
+ }
+
+#ifdef DEBUG
+ /* 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));
+ }
+#endif
+
+ XRestackWindows(ob_display, win, i);
+ g_free(win);
+
+ stacking_set_list();