]> code.delx.au - spectrwm/blobdiff - spectrwm.c
Map all top-level-windows in max_stack.
[spectrwm] / spectrwm.c
index 40e2944e1bd91ddcc1e646b63ec99997512ffbf1..42c8bd22665a0d32b44307be8c43e2163378a8bd 100644 (file)
@@ -924,6 +924,7 @@ char        *get_notify_mode_label(uint8_t);
 #endif
 struct ws_win  *get_pointer_win(xcb_window_t);
 struct ws_win  *get_region_focus(struct swm_region *);
+int     get_region_index(struct swm_region *);
 xcb_screen_t   *get_screen(int);
 #ifdef SWM_DEBUG
 char   *get_stack_mode_name(uint8_t);
@@ -1176,6 +1177,27 @@ get_screen(int screen)
        return (NULL);
 }
 
+int
+get_region_index(struct swm_region *r)
+{
+       struct swm_region       *rr;
+       int                      ridx = 0;
+
+       if (r == NULL)
+               return -1;
+
+       TAILQ_FOREACH(rr, &r->s->rl, entry) {
+               if (rr == r)
+                       break;
+               ++ridx;
+       }
+
+       if (rr == NULL)
+               return -1;
+
+       return ridx;
+}
+
 void
 focus_flush(void)
 {
@@ -3317,11 +3339,6 @@ set_region(struct swm_region *r)
        if (r == NULL)
                return;
 
-       /* Skip if only one region on this screen. */
-       rf = TAILQ_FIRST(&r->s->rl);
-       if (TAILQ_NEXT(rf, entry) == NULL)
-               goto out;
-
        rf = r->s->r_focus;
        /* Unfocus old region bar. */
        if (rf) {
@@ -3337,7 +3354,6 @@ set_region(struct swm_region *r)
        xcb_change_window_attributes(conn, r->bar->id,
            XCB_CW_BORDER_PIXEL, &r->s->c[SWM_S_COLOR_BAR_BORDER].pixel);
 
-out:
        r->s->r_focus = r;
 }
 
@@ -4426,7 +4442,7 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
 {
        struct swm_geometry     gg = *g;
        struct ws_win           *w, *win = NULL, *parent = NULL;
-       int                     winno, num_screens;
+       int                     winno;
 
        DNPRINTF(SWM_D_STACK, "max_stack: workspace: %d\n", ws->idx);
 
@@ -4451,11 +4467,13 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
        DNPRINTF(SWM_D_STACK, "max_stack: win: 0x%x\n", win->id);
 
        /* maximize all top level windows */
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
        TAILQ_FOREACH(w, &ws->winlist, entry) {
                if (w->transient || w->iconic)
                        continue;
 
+               if (!win->mapped && w != win)
+                       map_window(w);
+
                if (w->floating && !w->floatmaxed) {
                        /*
                         * retain geometry for retrieval on exit from
@@ -4479,14 +4497,9 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
 
                        update_window(w);
                }
-
-               /* Unmap unwanted windows if not multi-screen. */
-               if (num_screens <= 1 && outputs <= 1 && w != win &&
-                   w != parent && w->transient != win->id)
-                       unmap_window(w);
        }
 
-       /* If a parent exists, map it first. */
+       /* If a parent exists, map/raise it first. */
        if (parent) {
                map_window(parent);
 
@@ -4499,10 +4512,10 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
                        }
        }
 
-       /* Map focused window. */
+       /* Map/raise focused window. */
        map_window(win);
 
-       /* Finally, map children of focus window. */
+       /* Finally, map/raise children of focus window. */
        TAILQ_FOREACH(w, &ws->winlist, entry)
                if (w->transient == win->id && !w->iconic) {
                        stack_floater(w, ws->r);
@@ -5813,6 +5826,13 @@ spawn_expand(struct swm_region *r, union arg *args, const char *spawn_name,
                            strdup(r->s->c[SWM_S_COLOR_UNFOCUS].name))
                            == NULL)
                                err(1, "spawn_custom color unfocus");
+               } else if (!strcasecmp(ap, "$region_index")) {
+                       if (asprintf(&real_args[i], "%d",
+                           get_region_index(r) + 1) < 1)
+                               err(1, "spawn_custom region index");
+               } else if (!strcasecmp(ap, "$workspace_index")) {
+                       if (asprintf(&real_args[i], "%d", r->ws->idx + 1) < 1)
+                               err(1, "spawn_custom workspace index");
                } else {
                        /* no match --> copy as is */
                        if ((real_args[i] = strdup(ap)) == NULL)