+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);
+ }
+
+ XRestackWindows(ob_display, win, i);
+ g_free(win);
+}
+
+static void raise(GList *wins)