JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
prevent double red bordering
[spectrwm.git] / scrotwm.c
index 958f652..be3ba90 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -416,6 +416,7 @@ struct quirk {
 #define SWM_Q_ANYWHERE         (1<<2)  /* don't position this window */
 #define SWM_Q_XTERM_FONTADJ    (1<<3)  /* adjust xterm fonts when resizing */
 #define SWM_Q_FULLSCREEN       (1<<4)  /* remove border */
+#define SWM_Q_FOCUSPREV                (1<<5)  /* focus on caller */
 };
 int                            quirks_size = 0, quirks_length = 0;
 struct quirk                   *quirks = NULL;
@@ -1902,6 +1903,12 @@ focus_win(struct ws_win *win)
        XGetInputFocus(display, &cur_focus, &rr);
        if ((cfw = find_window(cur_focus)) != NULL)
                unfocus_win(cfw);
+       else {
+               /* use larger hammer since the window was killed somehow */
+               TAILQ_FOREACH(cfw, &win->ws->winlist, entry)
+                       XSetWindowBorder(display, cfw->id,
+                           cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
+       }
 
        win->ws->focus = win;
 
@@ -2217,7 +2224,8 @@ focus_prev(struct ws_win *win)
        }
 
        /* if in max_stack try harder */
-       if (ws->cur_layout->flags & SWM_L_FOCUSPREV) {
+       if ((win->quirks & SWM_Q_FOCUSPREV) ||
+           (ws->cur_layout->flags & SWM_L_FOCUSPREV)) {
                if (cur_focus != ws->focus_prev)
                        winfocus = ws->focus_prev;
                else if (cur_focus != ws->focus)
@@ -2342,6 +2350,8 @@ cycle_layout(struct swm_region *r, union arg *args)
                ws->cur_layout = &layouts[0];
 
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
        a.id = SWM_ARG_ID_FOCUSCUR;
        focus(r, &a);
        bar_update();
@@ -2954,6 +2964,8 @@ iconify(struct swm_region *r, union arg *args)
        unmap_window(r->ws->focus);
        update_iconic(r->ws->focus, 1);
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
        r->ws->focus = NULL;
        a.id = SWM_ARG_ID_FOCUSCUR;
        focus(r, &a);
@@ -3157,6 +3169,8 @@ floating_toggle(struct swm_region *r, union arg *args)
            _NET_WM_STATE_TOGGLE);
 
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
 
        if (win == win->ws->focus) {
                a.id = SWM_ARG_ID_FOCUSCUR;
@@ -3216,6 +3230,8 @@ resize(struct ws_win *win, union arg *args)
        a.id = SWM_ARG_ID_MOVELAST;
        swapwin(r, &a);
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
 
        if (XGrabPointer(display, win->id, False, MOUSEMASK, GrabModeAsync,
            GrabModeAsync, None, None /* cursor */, CurrentTime) != GrabSuccess)
@@ -4309,7 +4325,7 @@ setconfquirk(char *selector, char *value, int flags)
 void
 setup_quirks(void)
 {
-       setquirk("MPlayer",             "xv",           SWM_Q_FLOAT | SWM_Q_FULLSCREEN);
+       setquirk("MPlayer",             "xv",           SWM_Q_FLOAT | SWM_Q_FULLSCREEN | SWM_Q_FOCUSPREV);
        setquirk("OpenOffice.org 3.2",  "VCLSalFrame",  SWM_Q_FLOAT);
        setquirk("Firefox-bin",         "firefox-bin",  SWM_Q_TRANSSZ);
        setquirk("Firefox",             "Dialog",       SWM_Q_FLOAT);
@@ -5037,6 +5053,8 @@ configurenotify(XEvent *e)
                adjust_font(win);
                if (font_adjusted)
                        stack();
+               if (focus_mode == SWM_FOCUS_DEFAULT)
+                       drain_enter_notify();
        }
 }
 
@@ -5060,6 +5078,8 @@ destroynotify(XEvent *e)
 
        unmanage_window(win);
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
        free_window(win);
 }
 
@@ -5346,6 +5366,9 @@ unmapnotify(XEvent *e)
                /* resend unmap because we ated it */
                XUnmapWindow(display, e->xunmap.window);
        }
+
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
 }
 
 void
@@ -5607,6 +5630,8 @@ screenchange(XEvent *e) {
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
 }
 
 void
@@ -5859,6 +5884,8 @@ main(int argc, char *argv[])
 
        grabkeys();
        stack();
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               drain_enter_notify();
 
        xfd = ConnectionNumber(display);
        while (running) {