From 35a40f8b7176d423c48b47475656cc9738f6764a Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Thu, 12 Jan 2012 14:36:56 +0100 Subject: [PATCH] Add uicb function client_focus_next/prev_tab --- src/client.c | 4 ++++ src/client.h | 29 +++++++++++++++++++++++++++++ src/config.h | 46 ++++++++++++++++++++++++---------------------- src/wmfs.c | 2 +- wmfsrc2 | 7 +++++-- 5 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/client.c b/src/client.c index 009216c..e74e415 100644 --- a/src/client.c +++ b/src/client.c @@ -82,6 +82,10 @@ CLIENT_ACTION_LIST(focus, prev) CLIENT_ACTION_LIST(swapsel, next) CLIENT_ACTION_LIST(swapsel, prev) +/* uicb_client_focus_next/prev_tab() */ +CLIENT_ACTION_LIST(focus, next_tab) +CLIENT_ACTION_LIST(focus, prev_tab) + /** Send a ConfigureRequest event to the struct client * \param c struct client pointer */ diff --git a/src/client.h b/src/client.h index e65a09d..63858e1 100644 --- a/src/client.h +++ b/src/client.h @@ -70,6 +70,8 @@ void uicb_client_focus_next(Uicb); void uicb_client_focus_prev(Uicb); void uicb_client_swapsel_next(Uicb); void uicb_client_swapsel_prev(Uicb); +void uicb_client_focus_next_tab(Uicb); +void uicb_client_focus_prev_tab(Uicb); static inline struct client* client_next(struct client *c) @@ -89,6 +91,33 @@ client_prev(struct client *c) return cc; } +static inline struct client* +client_next_tab(struct client *c) +{ + struct client *n = client_next(c); + + if(!(c->flags & CLIENT_TABMASTER)) + return NULL; + + while(!(n->flags & CLIENT_TABBED) && n != c) + n = client_next(n); + + return n; +} + +static inline struct client* +client_prev_tab(struct client *c) +{ + struct client *p = client_prev(c); + + if(!(c->flags & CLIENT_TABMASTER)) + return NULL; + + while(!(p->flags & CLIENT_TABBED) && p != c) + p = client_prev(p); + + return p; +} static inline struct client* client_tab_next(struct client *c) diff --git a/src/config.h b/src/config.h index cda3625..f3111d0 100644 --- a/src/config.h +++ b/src/config.h @@ -41,28 +41,30 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] = { "layout_next_set", uicb_layout_next_set }, /* Client */ - { "client_close", uicb_client_close }, - { "client_resize_right", uicb_client_resize_Right }, - { "client_resize_left", uicb_client_resize_Left }, - { "client_resize_top", uicb_client_resize_Top }, - { "client_resize_bottom", uicb_client_resize_Bottom }, - { "client_focus_right", uicb_client_focus_Right }, - { "client_focus_left", uicb_client_focus_Left }, - { "client_focus_top", uicb_client_focus_Top }, - { "client_focus_bottom", uicb_client_focus_Bottom }, - { "client_tab_right", uicb_client_tab_Right }, - { "client_tab_left", uicb_client_tab_Left }, - { "client_tab_top", uicb_client_tab_Top }, - { "client_tab_bottom", uicb_client_tab_Bottom }, - { "client_swap_right", uicb_client_swap_Right }, - { "client_swap_left", uicb_client_swap_Left }, - { "client_swap_top", uicb_client_swap_Top }, - { "client_swap_bottom", uicb_client_swap_Bottom }, - { "client_focus_next", uicb_client_focus_next }, - { "client_focus_prev", uicb_client_focus_prev }, - { "client_swap_next", uicb_client_swapsel_next }, - { "client_swap_prev", uicb_client_swapsel_prev }, - { "client_untab", uicb_client_untab }, + { "client_close", uicb_client_close }, + { "client_resize_right", uicb_client_resize_Right }, + { "client_resize_left", uicb_client_resize_Left }, + { "client_resize_top", uicb_client_resize_Top }, + { "client_resize_bottom", uicb_client_resize_Bottom }, + { "client_focus_right", uicb_client_focus_Right }, + { "client_focus_left", uicb_client_focus_Left }, + { "client_focus_top", uicb_client_focus_Top }, + { "client_focus_bottom", uicb_client_focus_Bottom }, + { "client_tab_right", uicb_client_tab_Right }, + { "client_tab_left", uicb_client_tab_Left }, + { "client_tab_top", uicb_client_tab_Top }, + { "client_tab_bottom", uicb_client_tab_Bottom }, + { "client_swap_right", uicb_client_swap_Right }, + { "client_swap_left", uicb_client_swap_Left }, + { "client_swap_top", uicb_client_swap_Top }, + { "client_swap_bottom", uicb_client_swap_Bottom }, + { "client_focus_next", uicb_client_focus_next }, + { "client_focus_prev", uicb_client_focus_prev }, + { "client_swap_next", uicb_client_swapsel_next }, + { "client_swap_prev", uicb_client_swapsel_prev }, + { "client_untab", uicb_client_untab }, + { "client_focus_next_tab", uicb_client_focus_next_tab }, + { "client_focus_prev_tab", uicb_client_focus_prev_tab }, /* Status */ { "status" , uicb_status }, diff --git a/src/wmfs.c b/src/wmfs.c index 0c4d00f..b630724 100644 --- a/src/wmfs.c +++ b/src/wmfs.c @@ -190,7 +190,6 @@ wmfs_scan(void) int tag = -1, screen = -1, flags = -1; unsigned long ir, il; long *ret, *tret; - bool pstag = false; XWindowAttributes wa; Window usl, usl2, *w = NULL, tm, focus; Atom rt; @@ -466,6 +465,7 @@ int main(int argc, char **argv) { bool r; + (void)argc; W = (struct wmfs*)xcalloc(1, sizeof(struct wmfs)); diff --git a/wmfsrc2 b/wmfsrc2 index 6b0928b..0bd9d46 100644 --- a/wmfsrc2 +++ b/wmfsrc2 @@ -134,8 +134,11 @@ [key] mod = {"Super"} key = "q" func = "client_close" [/key] - # Focus next / prev client - [key] mod = { "Alt" } key = "Tab" func = "client_focus_next" [/key][key] mod = { "Alt", "Shift" } key = "Tab" func = "client_focus_prev" [/key] + # Focus next / prev client and next / prev tabbed client + [key] mod = { "Alt" } key = "Tab" func = "client_focus_next" [/key] + [key] mod = { "Alt", "Shift" } key = "Tab" func = "client_focus_prev" [/key] + [key] mod = { "Super" } key = "Tab" func = "client_focus_next_tab" [/key] + [key] mod = { "Super", "Shift" } key = "Tab" func = "client_focus_prev_tab" [/key] # Focus next client with direction [key] mod = {"Alt"} key = "h" func = "client_focus_left" [/key]