diff --git a/client.c b/client.c index 272d750..3a19298 100644 --- a/client.c +++ b/client.c @@ -34,6 +34,10 @@ void client_show(Client *c) { set_wm_state(c, NormalState); } +void client_temp_raise(Client *c) { + XRaiseWindow(dpy, c->parent); +} + void client_raise(Client *c) { XRaiseWindow(dpy, c->parent); clients_stacking_order = list_to_tail(clients_stacking_order, c); @@ -46,6 +50,12 @@ void client_lower(Client *c) { ewmh_set_net_client_list_stacking(c->screen); } +void client_tuck(Client *c) { + struct list *elem = list_find(clients_stacking_order, c); + if (elem && elem->next) + XRestackWindows(dpy, (Window[]){((Client *)elem->next->data)->parent, c->parent}, 2); +} + void set_wm_state(Client *c, int state) { /* Using "long" for the type of "data" looks wrong, but the * fine people in the X Consortium defined it this way diff --git a/events.c b/events.c index 4835d23..cb9a40e 100644 --- a/events.c +++ b/events.c @@ -44,6 +44,7 @@ static void handle_key_event(XKeyEvent *e) { XUngrabKeyboard(dpy, CurrentTime); } ewmh_select_client(current); + client_raise(current); break; case KEY_DOCK_TOGGLE: set_docks_visible(current_screen, !current_screen->docks_visible); diff --git a/evilwm.h b/evilwm.h index d69bc95..67ddf21 100644 --- a/evilwm.h +++ b/evilwm.h @@ -253,8 +253,10 @@ extern int wm_exit; Client *find_client(Window w); void client_hide(Client *c); void client_show(Client *c); +void client_temp_raise(Client *c); void client_raise(Client *c); void client_lower(Client *c); +void client_tuck(Client *c); void gravitate_border(Client *c, int bw); void select_client(Client *c); #ifdef VWM diff --git a/screen.c b/screen.c index 9cc2d83..40ec4e1 100644 --- a/screen.c +++ b/screen.c @@ -408,6 +408,7 @@ void maximise_client(Client *c, int action, int hv) { void next(void) { struct list *newl = list_find(clients_tab_order, current); Client *newc = current; + client_tuck(current); do { if (newl) { newl = newl->next; @@ -432,7 +433,7 @@ void next(void) { if (!newc) return; client_show(newc); - client_raise(newc); + client_temp_raise(newc); select_client(newc); #ifdef WARP_POINTER setmouse(newc->window, newc->width + newc->border - 1,