]> code.delx.au - spectrwm/blobdiff - spectrwm.c
Add border with unfocused color for all windows in manage_window.
[spectrwm] / spectrwm.c
index 5382bc7d7ab1b1e6f5ad6664832636c76bf3a4b9..648b0c54dc0e47fb0008a1f6d5da128c770340dc 100644 (file)
@@ -546,7 +546,6 @@ union arg {
 #define SWM_ARG_ID_FOCUSNEXT   (0)
 #define SWM_ARG_ID_FOCUSPREV   (1)
 #define SWM_ARG_ID_FOCUSMAIN   (2)
-#define SWM_ARG_ID_FOCUSCUR    (4)
 #define SWM_ARG_ID_SWAPNEXT    (10)
 #define SWM_ARG_ID_SWAPPREV    (11)
 #define SWM_ARG_ID_SWAPMAIN    (12)
@@ -697,6 +696,7 @@ char        *get_atom_name(xcb_atom_t);
 char   *get_notify_detail_label(uint8_t);
 char   *get_notify_mode_label(uint8_t);
 #endif
+struct ws_win  *get_region_focus(struct swm_region *);
 xcb_screen_t   *get_screen(int);
 char   *get_win_name(xcb_window_t);
 uint32_t getstate(xcb_window_t);
@@ -2828,7 +2828,6 @@ switchws(struct swm_region *r, union arg *args)
        struct swm_region       *this_r, *other_r;
        struct ws_win           *win;
        struct workspace        *new_ws, *old_ws;
-       union arg               a;
 
        if (!(r && r->s))
                return;
@@ -2863,10 +2862,16 @@ switchws(struct swm_region *r, union arg *args)
        this_r->ws = new_ws;
        new_ws->r = this_r;
 
+       unfocus_win(old_ws->focus);
+
        stack();
 
-       a.id = SWM_ARG_ID_FOCUSCUR;
-       focus(new_ws->r, &a);
+       /* unmap old windows */
+       if (unmap_old)
+               TAILQ_FOREACH(win, &old_ws->winlist, entry)
+                       unmap_window(win);
+
+       new_ws->focus = get_region_focus(new_ws->r);
 
        /* unmap old windows */
        if (unmap_old)
@@ -2948,7 +2953,6 @@ void
 cyclescr(struct swm_region *r, union arg *args)
 {
        struct swm_region       *rr = NULL;
-       union arg               a;
        int                     i, x, y, num_screens;
 
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
@@ -2980,8 +2984,7 @@ cyclescr(struct swm_region *r, union arg *args)
        xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, 0,
            x, y);
 
-       a.id = SWM_ARG_ID_FOCUSCUR;
-       focus(rr, &a);
+       rr->ws->focus = get_region_focus(rr);
 
        if (rr->ws->focus) {
                /* move to focus window */
@@ -3179,11 +3182,30 @@ done:
        return get_focus_magic(winfocus);
 }
 
+struct ws_win *
+get_region_focus(struct swm_region *r)
+{
+       struct ws_win           *winfocus = NULL;
+
+       if (!(r && r->ws))
+               return NULL;
+
+       if (r->ws->focus && !r->ws->focus->iconic)
+               winfocus = r->ws->focus;
+       else if (r->ws->focus_prev && !r->ws->focus_prev->iconic)
+               winfocus = r->ws->focus_prev;
+       else
+               TAILQ_FOREACH(winfocus, &r->ws->winlist, entry)
+                       if (!winfocus->iconic)
+                               break;
+
+       return get_focus_magic(winfocus);
+}
+
 void
 focus(struct swm_region *r, union arg *args)
 {
-       struct ws_win           *winfocus = NULL, *head;
-       struct ws_win           *cur_focus = NULL;
+       struct ws_win           *head, *cur_focus = NULL, *winfocus = NULL;
        struct ws_win_list      *wl = NULL;
        struct workspace        *ws = NULL;
        int                     all_iconics;
@@ -3193,21 +3215,6 @@ focus(struct swm_region *r, union arg *args)
 
        DNPRINTF(SWM_D_FOCUS, "focus: id: %d\n", args->id);
 
-       /* treat FOCUS_CUR special */
-       if (args->id == SWM_ARG_ID_FOCUSCUR) {
-               if (r->ws->focus && r->ws->focus->iconic == 0)
-                       winfocus = r->ws->focus;
-               else if (r->ws->focus_prev && r->ws->focus_prev->iconic == 0)
-                       winfocus = r->ws->focus_prev;
-               else
-                       TAILQ_FOREACH(winfocus, &r->ws->winlist, entry)
-                               if (winfocus->iconic == 0)
-                                       break;
-
-               r->ws->focus = get_focus_magic(winfocus);
-               return;
-       }
-
        if ((cur_focus = r->ws->focus) == NULL)
                return;
        ws = r->ws;
@@ -3287,7 +3294,6 @@ void
 cycle_layout(struct swm_region *r, union arg *args)
 {
        struct workspace        *ws = r->ws;
-       union arg               a;
 
        /* suppress unused warning since var is needed */
        (void)args;
@@ -3301,9 +3307,7 @@ cycle_layout(struct swm_region *r, union arg *args)
        stack();
        bar_update();
 
-       a.id = SWM_ARG_ID_FOCUSCUR;
-       focus(r, &a);
-       focus_win(r->ws->focus);
+       focus_win(get_region_focus(r));
 
        focus_flush();
 }
@@ -4466,7 +4470,6 @@ void
 floating_toggle(struct swm_region *r, union arg *args)
 {
        struct ws_win           *win = r->ws->focus;
-       union arg               a;
 
        /* suppress unused warning since var is needed */
        (void)args;
@@ -4482,11 +4485,8 @@ floating_toggle(struct swm_region *r, union arg *args)
 
        stack();
 
-       if (win == win->ws->focus) {
-               a.id = SWM_ARG_ID_FOCUSCUR;
-               focus(win->ws->r, &a);
-               focus_win(win->ws->focus);
-       }
+       if (win == win->ws->focus)
+               focus_win(win);
 
        focus_flush();
 }
@@ -6750,12 +6750,12 @@ manage_window(xcb_window_t id, uint16_t mapped)
 {
        xcb_window_t            trans = XCB_WINDOW_NONE;
        struct ws_win           *win, *ww;
-       int                     ws_idx, border_me = 0;
+       int                     ws_idx;
        char                    ws_idx_str[SWM_PROPLEN];
        struct swm_region       *r;
        struct pid_e            *p;
        struct quirk            *qp;
-       uint32_t                event_mask, i;
+       uint32_t                i, wa[2];
        xcb_icccm_get_wm_protocols_reply_t      wpr;
 
        if ((win = find_window(id)) != NULL) {
@@ -6796,9 +6796,9 @@ manage_window(xcb_window_t id, uint16_t mapped)
        /* Ignore window border if there is one. */
        WIDTH(win) = win->wa->width;
        HEIGHT(win) = win->wa->height;
-       X(win) = win->wa->x + win->wa->border_width;
-       Y(win) = win->wa->y + win->wa->border_width;
-       win->bordered = 0;
+       X(win) = win->wa->x + win->wa->border_width - border_width;
+       Y(win) = win->wa->y + win->wa->border_width - border_width;
+       win->bordered = 1;
        win->mapped = mapped;
        win->floatmaxed = 0;
        win->ewmh_flags = 0;
@@ -6853,7 +6853,6 @@ manage_window(xcb_window_t id, uint16_t mapped)
        } else if (trans && (ww = find_window(trans)) != NULL) {
                /* Launch transients in the same ws as parent. */
                win->ws = ww->ws;
-               border_me = 1;
        } else {
                win->ws = r->ws;
        }
@@ -6883,7 +6882,6 @@ manage_window(xcb_window_t id, uint16_t mapped)
                        DNPRINTF(SWM_D_CLASS, "manage_window: java window "
                            "detected.\n");
                        win->java = 1;
-                       border_me = 1;
                }
 
                TAILQ_FOREACH(qp, &quirks, entry) {
@@ -6891,20 +6889,16 @@ manage_window(xcb_window_t id, uint16_t mapped)
                            !strcmp(win->ch.instance_name, qp->name)) {
                                DNPRINTF(SWM_D_CLASS, "manage_window: on quirks"
                                    "list; mask: 0x%lx\n", qp->quirk);
-                               if (qp->quirk & SWM_Q_FLOAT) {
+                               if (qp->quirk & SWM_Q_FLOAT)
                                        win->floating = 1;
-                                       border_me = 1;
-                               }
                                win->quirks = qp->quirk;
                        }
                }
        }
 
        /* Alter window position if quirky */
-       if (win->quirks & SWM_Q_ANYWHERE) {
+       if (win->quirks & SWM_Q_ANYWHERE)
                win->manual = 1;
-               border_me = 1;
-       }
 
        /* Reset font sizes (the bruteforce way; no default keybinding). */
        if (win->quirks & SWM_Q_XTERM_FONTADJ) {
@@ -6914,28 +6908,23 @@ manage_window(xcb_window_t id, uint16_t mapped)
                        fake_keypress(win, XK_KP_Add, XCB_MOD_MASK_SHIFT);
        }
 
-       if (border_me) {
-               win->bordered = 1;
-               X(win) -= border_width;
-               Y(win) -= border_width;
-       }
-
        /* Make sure window is positioned inside its region, if its active. */
-       if (win->ws->r)
+       if (win->ws->r) {
                constrain_window(win, win->ws->r, 0);
-
-       if (win->ws->r || border_me)
                update_window(win);
+       }
 
-       /* Select which X events to monitor. */
-       event_mask = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE |
-           XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
+
+       /* Select which X events to monitor and set border pixel color. */
+       wa[0] = win->s->c[SWM_S_COLOR_UNFOCUS].pixel;
+       wa[1] = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_PROPERTY_CHANGE |
+           XCB_EVENT_MASK_STRUCTURE_NOTIFY;
 #ifdef SWM_DEBUG
-       event_mask |= XCB_EVENT_MASK_LEAVE_WINDOW;
+       wa[1] |= XCB_EVENT_MASK_LEAVE_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE;
 #endif
 
-       xcb_change_window_attributes(conn, win->id, XCB_CW_EVENT_MASK,
-           &event_mask);
+       xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL |
+           XCB_CW_EVENT_MASK, wa);
 
 out:
        /* Figure out where to stack the window in the workspace. */
@@ -8279,7 +8268,6 @@ main(int argc, char *argv[])
 {
        struct swm_region       *r, *rr;
        struct ws_win           *winfocus = NULL;
-       union arg               a;
        char                    conf[PATH_MAX], *cfile = NULL;
        struct stat             sb;
        int                     xfd, i, num_screens;
@@ -8436,9 +8424,7 @@ noconfig:
                                    rr->s[0].root, 0, 0, 0, 0, X(rr),
                                    Y(rr) + (bar_enabled ? bar_height : 0));
 
-                       a.id = SWM_ARG_ID_FOCUSCUR;
-                       focus(rr, &a);
-                       focus_win(rr->ws->focus);
+                       focus_win(get_region_focus(rr));
                        focus_flush();
                        winfocus = NULL;
                        continue;