mirror of
https://github.com/vale981/spectrwm
synced 2025-03-05 18:01:37 -05:00
First stab at rewriting the focus code. Test now or forever hold your
piece. I found a few nits but the direction is better and we should have a much easier time fixing those nits over time. This also modifies how transients are handled as they now can be obscured by other windows. Takes a little getting used to but again it makes more sense then the old behavior.
This commit is contained in:
parent
3403d0e9a9
commit
1140a71c42
1 changed files with 27 additions and 42 deletions
69
scrotwm.c
69
scrotwm.c
|
@ -403,9 +403,8 @@ union arg {
|
||||||
};
|
};
|
||||||
|
|
||||||
void focus(struct swm_region *, union arg *);
|
void focus(struct swm_region *, union arg *);
|
||||||
void focus_magic(struct ws_win *, int);
|
void focus_magic(struct ws_win *);
|
||||||
#define SWM_F_GENERIC (0)
|
|
||||||
#define SWM_F_TRANSIENT (1)
|
|
||||||
/* quirks */
|
/* quirks */
|
||||||
struct quirk {
|
struct quirk {
|
||||||
char *class;
|
char *class;
|
||||||
|
@ -1899,6 +1898,7 @@ focus_win(struct ws_win *win)
|
||||||
if (win->java == 0)
|
if (win->java == 0)
|
||||||
XSetInputFocus(display, win->id,
|
XSetInputFocus(display, win->id,
|
||||||
RevertToParent, CurrentTime);
|
RevertToParent, CurrentTime);
|
||||||
|
XMapRaised(display, win->id);
|
||||||
grabbuttons(win, 1);
|
grabbuttons(win, 1);
|
||||||
XSetWindowBorder(display, win->id,
|
XSetWindowBorder(display, win->id,
|
||||||
win->ws->r->s->c[SWM_S_COLOR_FOCUS].color);
|
win->ws->r->s->c[SWM_S_COLOR_FOCUS].color);
|
||||||
|
@ -2187,7 +2187,7 @@ done:
|
||||||
if (winfocus == winlostfocus || winfocus == NULL)
|
if (winfocus == winlostfocus || winfocus == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
focus_magic(winfocus, SWM_F_GENERIC);
|
focus_magic(winfocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2214,7 +2214,7 @@ focus(struct swm_region *r, union arg *args)
|
||||||
if (winfocus->iconic == 0)
|
if (winfocus->iconic == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
focus_magic(winfocus, SWM_F_GENERIC);
|
focus_magic(winfocus);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2231,18 +2231,11 @@ focus(struct swm_region *r, union arg *args)
|
||||||
if (head == NULL)
|
if (head == NULL)
|
||||||
head = TAILQ_LAST(wl, ws_win_list);
|
head = TAILQ_LAST(wl, ws_win_list);
|
||||||
winfocus = head;
|
winfocus = head;
|
||||||
for (;;) {
|
if (WINID(winfocus) == cur_focus->transient) {
|
||||||
if (winfocus == NULL)
|
head = TAILQ_PREV(winfocus, ws_win_list, entry);
|
||||||
break;
|
if (head == NULL)
|
||||||
if (!winfocus->iconic)
|
head = TAILQ_LAST(wl, ws_win_list);
|
||||||
break;
|
winfocus = head;
|
||||||
winfocus = TAILQ_PREV(winfocus, ws_win_list, entry);
|
|
||||||
if (winfocus == NULL)
|
|
||||||
winfocus = TAILQ_LAST(wl, ws_win_list);
|
|
||||||
if (winfocus == head) {
|
|
||||||
winfocus = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2251,19 +2244,6 @@ focus(struct swm_region *r, union arg *args)
|
||||||
if (head == NULL)
|
if (head == NULL)
|
||||||
head = TAILQ_FIRST(wl);
|
head = TAILQ_FIRST(wl);
|
||||||
winfocus = head;
|
winfocus = head;
|
||||||
for (;;) {
|
|
||||||
if (winfocus == NULL)
|
|
||||||
break;
|
|
||||||
if (!winfocus->iconic)
|
|
||||||
break;
|
|
||||||
winfocus = TAILQ_NEXT(winfocus, entry);
|
|
||||||
if (winfocus == NULL)
|
|
||||||
winfocus = TAILQ_FIRST(wl);
|
|
||||||
if (winfocus == head) {
|
|
||||||
winfocus = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SWM_ARG_ID_FOCUSMAIN:
|
case SWM_ARG_ID_FOCUSMAIN:
|
||||||
|
@ -2279,7 +2259,7 @@ focus(struct swm_region *r, union arg *args)
|
||||||
if (winfocus == winlostfocus || winfocus == NULL)
|
if (winfocus == winlostfocus || winfocus == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
focus_magic(winfocus, SWM_F_GENERIC);
|
focus_magic(winfocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2841,7 +2821,7 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
|
||||||
if (parent)
|
if (parent)
|
||||||
XMapRaised(display, parent->id);
|
XMapRaised(display, parent->id);
|
||||||
stack_floater(wintrans, ws->r);
|
stack_floater(wintrans, ws->r);
|
||||||
focus_magic(wintrans, SWM_F_TRANSIENT);
|
focus_magic(wintrans);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4576,9 +4556,12 @@ manage_window(Window id)
|
||||||
DNPRINTF(SWM_D_MISC, "manage previously unmanaged window "
|
DNPRINTF(SWM_D_MISC, "manage previously unmanaged window "
|
||||||
"%lu\n", win->id);
|
"%lu\n", win->id);
|
||||||
TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
|
TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
|
||||||
TAILQ_INSERT_TAIL(&win->ws->winlist, win, entry);
|
|
||||||
if (win->transient)
|
if (win->transient)
|
||||||
set_child_transient(win);
|
set_child_transient(win);
|
||||||
|
if (trans && (ww = find_window(trans)))
|
||||||
|
TAILQ_INSERT_AFTER(&win->ws->winlist, ww, win, entry);
|
||||||
|
else
|
||||||
|
TAILQ_INSERT_TAIL(&win->ws->winlist, win, entry);
|
||||||
ewmh_update_actions(win);
|
ewmh_update_actions(win);
|
||||||
return (win);
|
return (win);
|
||||||
}
|
}
|
||||||
|
@ -4651,7 +4634,10 @@ manage_window(Window id)
|
||||||
win->id = id;
|
win->id = id;
|
||||||
win->ws = ws;
|
win->ws = ws;
|
||||||
win->s = r->s; /* this never changes */
|
win->s = r->s; /* this never changes */
|
||||||
TAILQ_INSERT_TAIL(&ws->winlist, win, entry);
|
if (trans && (ww = find_window(trans)))
|
||||||
|
TAILQ_INSERT_AFTER(&ws->winlist, ww, win, entry);
|
||||||
|
else
|
||||||
|
TAILQ_INSERT_TAIL(&ws->winlist, win, entry);
|
||||||
|
|
||||||
win->g.w = win->wa.width;
|
win->g.w = win->wa.width;
|
||||||
win->g.h = win->wa.height;
|
win->g.h = win->wa.height;
|
||||||
|
@ -4793,8 +4779,7 @@ unmanage_window(struct ws_win *win)
|
||||||
/* focus on root just in case */
|
/* focus on root just in case */
|
||||||
XSetInputFocus(display, PointerRoot, PointerRoot, CurrentTime);
|
XSetInputFocus(display, PointerRoot, PointerRoot, CurrentTime);
|
||||||
|
|
||||||
if (!win->floating)
|
focus_prev(win);
|
||||||
focus_prev(win);
|
|
||||||
|
|
||||||
TAILQ_REMOVE(&win->ws->winlist, win, entry);
|
TAILQ_REMOVE(&win->ws->winlist, win, entry);
|
||||||
TAILQ_INSERT_TAIL(&win->ws->unmanagedlist, win, entry);
|
TAILQ_INSERT_TAIL(&win->ws->unmanagedlist, win, entry);
|
||||||
|
@ -4803,14 +4788,14 @@ unmanage_window(struct ws_win *win)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
focus_magic(struct ws_win *win, int do_trans)
|
focus_magic(struct ws_win *win)
|
||||||
{
|
{
|
||||||
DNPRINTF(SWM_D_FOCUS, "focus_magic: %lu %d\n", WINID(win), do_trans);
|
DNPRINTF(SWM_D_FOCUS, "focus_magic: %lu\n", WINID(win));
|
||||||
|
|
||||||
if (win == NULL)
|
if (win == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (do_trans == SWM_F_TRANSIENT && win->child_trans) {
|
if (win->child_trans) {
|
||||||
/* win = parent & has a transient so focus on that */
|
/* win = parent & has a transient so focus on that */
|
||||||
if (win->java) {
|
if (win->java) {
|
||||||
focus_win(win->child_trans);
|
focus_win(win->child_trans);
|
||||||
|
@ -4884,7 +4869,7 @@ buttonpress(XEvent *e)
|
||||||
if ((win = find_window(ev->window)) == NULL)
|
if ((win = find_window(ev->window)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
focus_magic(win, SWM_F_TRANSIENT);
|
focus_magic(win);
|
||||||
action = client_click;
|
action = client_click;
|
||||||
|
|
||||||
for (i = 0; i < LENGTH(buttons); i++)
|
for (i = 0; i < LENGTH(buttons); i++)
|
||||||
|
@ -5079,7 +5064,7 @@ enternotify(XEvent *e)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
focus_magic(win, SWM_F_TRANSIENT);
|
focus_magic(win);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lets us use one switch statement for arbitrary mode/detail combinations */
|
/* lets us use one switch statement for arbitrary mode/detail combinations */
|
||||||
|
@ -5177,7 +5162,7 @@ maprequest(XEvent *e)
|
||||||
/* make new win focused */
|
/* make new win focused */
|
||||||
r = root_to_region(win->wa.root);
|
r = root_to_region(win->wa.root);
|
||||||
if (win->ws == r->ws)
|
if (win->ws == r->ws)
|
||||||
focus_magic(win, SWM_F_GENERIC);
|
focus_magic(win);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Add table
Reference in a new issue