if (win->ws->r == NULL)
return;
- grabbuttons(win, 0);
- XSetWindowBorder(display, win->id,
- win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
-
if (win->ws->focus == win) {
win->ws->focus = NULL;
win->ws->focus_prev = win;
}
+
+ grabbuttons(win, 0);
+ XSetWindowBorder(display, win->id,
+ win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
}
void
if (win->ws->r != NULL) {
XSetWindowBorder(display, win->id,
win->ws->r->s->c[SWM_S_COLOR_FOCUS].color);
- grabbuttons(win, 1);
if (win->ws->cur_layout->flags & SWM_L_MAPONFOCUS)
XMapRaised(display, win->id);
XSetInputFocus(display, win->id,
RevertToPointerRoot, CurrentTime);
- XSync(display, False);
+ grabbuttons(win, 1);
}
}
{
int wsid = args->id;
struct swm_region *this_r, *other_r;
- struct ws_win *win, *winfocus = NULL;
+ struct ws_win *win, *winfocus = NULL, *parent = NULL;
struct workspace *new_ws, *old_ws;
this_r = r;
*/
if (new_ws->old_r == this_r)
TAILQ_FOREACH(win, &new_ws->winlist, entry)
- XMapRaised(display, win->id);
+ if (!(win->ws->cur_layout->flags &
+ SWM_L_MAPONFOCUS))
+ XMapRaised(display, win->id);
TAILQ_FOREACH(win, &old_ws->winlist, entry)
unmap_window(win);
ignore_enter = 1;
stack();
- focus_win(winfocus);
+ if (winfocus) {
+ /* make sure we see the parent window */
+ if (winfocus->transient) {
+ parent = find_window(winfocus->transient);
+ if (parent)
+ focus_win(parent);
+ }
+
+ focus_win(winfocus);
+ }
+ ignore_enter = 0;
bar_update();
}
void
cyclescr(struct swm_region *r, union arg *args)
{
- struct swm_region *rr;
- int i;
+ struct swm_region *rr = NULL;
+ struct workspace *ws = NULL;
+ struct ws_win *winfocus = NULL;
+ int i, x, y;
/* do nothing if we don't have more than one screen */
if (!(ScreenCount(display) > 1 || outputs > 1))
default:
return;
};
+ if (rr == NULL)
+ return;
+
+ ws = rr->ws;
+ winfocus = ws->focus;
+ if (winfocus == NULL)
+ winfocus = ws->focus_prev;
+ if (winfocus) {
+ /* use window coordinates */
+ x = winfocus->g.x + 1;
+ y = winfocus->g.y + 1;
+ } else {
+ /* use region coordinates */
+ x = rr->g.x + 1;
+ y = rr->g.y + 1 + bar_enabled ? bar_height : 0;
+ }
+
unfocus_all();
XSetInputFocus(display, PointerRoot, RevertToPointerRoot, CurrentTime);
- XWarpPointer(display, None, rr->s[i].root, 0, 0, 0, 0, rr->g.x,
- rr->g.y + bar_enabled ? bar_height : 0);
+ XWarpPointer(display, None, rr->s[i].root, 0, 0, 0, 0, x, y);
+
+ focus_win(winfocus);
}
void
cycle_layout(struct swm_region *r, union arg *args)
{
struct workspace *ws = r->ws;
- struct ws_win *winfocus;
+ struct ws_win *winfocus, *parent = NULL;
DNPRINTF(SWM_D_EVENT, "cycle_layout: workspace: %d\n", ws->idx);
ignore_enter = 1;
stack();
- focus_win(winfocus);
+ /* make sure we see the parent window */
+ if (winfocus) {
+ if (winfocus->transient)
+ parent = find_window(winfocus->transient);
+ if (parent)
+ focus_win(parent);
+ focus_win(winfocus);
+ }
ignore_enter = 0;
}
}
if (font_adjusted)
font_adjusted--;
- XSync(display, False);
}
void
if (ScreenCount(display) > 1 || outputs > 1)
winfocus = win;
-
unmap_window(win);
TAILQ_REMOVE(&ws->winlist, win, entry);
TAILQ_INSERT_TAIL(&nws->winlist, win, entry);
}
}
}
-
+ ignore_enter = 1;
unmanage_window(win);
stack();
if (winfocus)
focus_win(winfocus);
+ ignore_enter = 0;
}
SWM_EV_EPILOGUE(display);
if (QLength(display))
return;
- if ((win = find_window(ev->window)) != NULL)
+ if ((win = find_window(ev->window)) != NULL) {
+ if (win->ws->focus == win)
+ return;
focus_win(win);
+ }
}
void
win = find_window(e->xunmap.window);
if (win == NULL)
goto done;
- if (win->transient)
- goto done;
if (getstate(e->xunmap.window) == NormalState) {
/*
ws = win->ws;
/* if we are max_stack try harder to focus on something */
- if (ws->cur_layout->flags & SWM_L_FOCUSPREV)
- if (win != ws->focus && win != ws->focus_prev)
+ if (ws->cur_layout->flags & SWM_L_FOCUSPREV) {
+ if (win->transient)
+ winfocus = find_window(win->transient);
+ else if (win != ws->focus && win != ws->focus_prev)
winfocus = ws->focus_prev;
+ }
/* normal and fallback if haven't found anything to focus on */
if (winfocus == NULL) {
if (TAILQ_FIRST(&ws->winlist) == win)
winfocus = TAILQ_NEXT(win, entry);
else {
- winfocus = TAILQ_PREV(ws->focus, ws_win_list,
- entry);
+ if (ws->focus)
+ winfocus = TAILQ_PREV(ws->focus,
+ ws_win_list, entry);
if (winfocus == NULL)
winfocus = TAILQ_LAST(&ws->winlist,
ws_win_list);
/* trash window and refocus */
unmanage_window(win);
+ ignore_enter = 1;
stack();
focus_win(winfocus);
+ ignore_enter = 0;
}
done: