JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Roll version for release
[spectrwm.git] / scrotwm.c
index 97f4c08..7145108 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -52,7 +52,7 @@
 
 static const char      *cvstag = "$scrotwm$";
 
-#define        SWM_VERSION     "0.9.25"
+#define        SWM_VERSION     "0.9.26"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -198,6 +198,7 @@ int                 bar_version = 0;
 sig_atomic_t           bar_alarm = 0;
 int                    bar_delay = 30;
 int                    bar_enabled = 1;
+int                    bar_at_bottom = 0;
 int                    bar_extra = 1;
 int                    bar_extra_running = 0;
 int                    bar_verbose = 1;
@@ -921,7 +922,7 @@ bar_refresh(void)
 void
 bar_setup(struct swm_region *r)
 {
-       int                     i;
+       int                     i, x, y;
 
        if (bar_fs) {
                XFreeFont(display, bar_fs);
@@ -941,9 +942,11 @@ bar_setup(struct swm_region *r)
                errx(1, "couldn't create font structure");
 
        bar_height = bar_fs->ascent + bar_fs->descent + 3;
+       x = X(r);
+       y = bar_at_bottom ? (Y(r) + HEIGHT(r) - bar_height) : Y(r);
 
        r->bar_window = XCreateSimpleWindow(display,
-           r->s->root, X(r), Y(r), WIDTH(r) - 2, bar_height - 2,
+           r->s->root, x, y, WIDTH(r) - 2, bar_height - 2,
            1, r->s->c[SWM_S_COLOR_BAR_BORDER].color,
            r->s->c[SWM_S_COLOR_BAR].color);
        bar_gc = XCreateGC(display, r->bar_window, 0, &bar_gcv);
@@ -1106,9 +1109,8 @@ unmap_window(struct ws_win *win)
        set_win_state(win, IconicState);
 
        XUnmapWindow(display, win->id);
-       if (win->ws->r)
-               XSetWindowBorder(display, win->id,
-                   win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
+       XSetWindowBorder(display, win->id,
+           win->s->c[SWM_S_COLOR_UNFOCUS].color); 
 }
 
 void
@@ -1389,7 +1391,7 @@ unfocus_win(struct ws_win *win)
                return;
 
        if (validate_ws(win->ws))
-               abort();
+               abort(); /* XXX replace with return at some point */
 
        if (win->ws->r == NULL)
                return;
@@ -1454,7 +1456,8 @@ focus_win(struct ws_win *win)
                return;
 
        if (validate_ws(win->ws))
-               abort();
+               abort(); /* XXX replace with return at some point */
+
        if (validate_win(win)) {
                kill_refs(win);
                return;
@@ -1740,10 +1743,10 @@ focus_prev(struct ws_win *win)
 
        /* if in max_stack try harder */
        if (ws->cur_layout->flags & SWM_L_FOCUSPREV) {
-               if (cur_focus != ws->focus_prev)
-                       winfocus = ws->focus_prev;
-               else if (cur_focus != ws->focus)
-                       winfocus = ws->focus;
+               if (cur_focus != ws->focus_prev)
+                       winfocus = ws->focus_prev;
+               else if (cur_focus != ws->focus)
+                       winfocus = ws->focus;
                else
                        winfocus = TAILQ_PREV(win, ws_win_list, entry);
                if (winfocus)
@@ -1797,7 +1800,7 @@ focus(struct swm_region *r, union arg *args)
        winlostfocus = cur_focus;
 
        switch (args->id) {
-       case SWM_ARG_ID_FOCUSPREV:
+       case SWM_ARG_ID_FOCUSPREV:
                winfocus = TAILQ_PREV(cur_focus, ws_win_list, entry);
                if (winfocus == NULL)
                        winfocus = TAILQ_LAST(wl, ws_win_list);
@@ -1880,7 +1883,8 @@ stack(void) {
                        g.w -= 2;
                        g.h -= 2;
                        if (bar_enabled) {
-                               g.y += bar_height;
+                               if (!bar_at_bottom)
+                                       g.y += bar_height;
                                g.h -= bar_height;
                        }
                        r->ws->cur_layout->l_stack(r->ws, &g);
@@ -3555,7 +3559,8 @@ enum      { SWM_S_BAR_DELAY, SWM_S_BAR_ENABLED, SWM_S_STACK_ENABLED,
          SWM_S_CYCLE_VISIBLE, SWM_S_SS_ENABLED, SWM_S_TERM_WIDTH,
          SWM_S_TITLE_CLASS_ENABLED, SWM_S_TITLE_NAME_ENABLED,
          SWM_S_FOCUS_MODE, SWM_S_DISABLE_BORDER, SWM_S_BAR_FONT,
-         SWM_S_BAR_ACTION, SWM_S_SPAWN_TERM, SWM_S_SS_APP, SWM_S_DIALOG_RATIO
+         SWM_S_BAR_ACTION, SWM_S_SPAWN_TERM, SWM_S_SS_APP, SWM_S_DIALOG_RATIO,
+         SWM_S_BAR_AT_BOTTOM
        };
 
 int
@@ -3568,6 +3573,9 @@ setconfvalue(char *selector, char *value, int flags)
        case SWM_S_BAR_ENABLED:
                bar_enabled = atoi(value);
                break;
+       case SWM_S_BAR_AT_BOTTOM:
+               bar_at_bottom = atoi(value);
+               break;
        case SWM_S_STACK_ENABLED:
                stack_enabled = atoi(value);
                break;
@@ -3678,6 +3686,7 @@ struct config_option {
 };
 struct config_option configopt[] = {
        { "bar_enabled",                setconfvalue,   SWM_S_BAR_ENABLED },
+       { "bar_at_bottom",              setconfvalue,   SWM_S_BAR_AT_BOTTOM },
        { "bar_border",                 setconfcolor,   SWM_S_COLOR_BAR_BORDER },
        { "bar_color",                  setconfcolor,   SWM_S_COLOR_BAR },
        { "bar_font_color",             setconfcolor,   SWM_S_COLOR_BAR_FONT },
@@ -4062,9 +4071,17 @@ focus_magic(struct ws_win *win, int do_trans)
                        if (win->child_trans->take_focus)
                                client_msg(win, takefocus);
                } else {
-                       focus_win(win->child_trans);
-                       if (win->child_trans->take_focus)
-                               client_msg(win->child_trans, takefocus);
+                       /* make sure transient hasn't dissapeared */
+                       if (validate_win(win->child_trans) == 0) {
+                               focus_win(win->child_trans);
+                               if (win->child_trans->take_focus)
+                                       client_msg(win->child_trans, takefocus);
+                       } else {
+                               win->child_trans = NULL;
+                               focus_win(win);
+                               if (win->take_focus)
+                                       client_msg(win, takefocus);
+                       }
                }
        } else {
                /* regular focus */