X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=scrotwm.c;h=be3ba9071a7d3cb29cf0456fdddc0476c50ee4f0;hb=aff4537ab8b626dd4acfff07d0386b65f54eaef9;hp=958f6523bda10802532be38d834fb73a554dccba;hpb=68bba3e25eabe8257674ed972fbe4f0d99aa4e1f;p=spectrwm.git diff --git a/scrotwm.c b/scrotwm.c index 958f652..be3ba90 100644 --- 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) {