Browse Source

Add uicb function client_focus_next/prev_tab

Martin Duquesnoy 12 years ago
parent
commit
35a40f8b71
5 changed files with 63 additions and 25 deletions
  1. 4 0
      src/client.c
  2. 29 0
      src/client.h
  3. 24 22
      src/config.h
  4. 1 1
      src/wmfs.c
  5. 5 2
      wmfsrc2

+ 4 - 0
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
 */

+ 29 - 0
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)

+ 24 - 22
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 },

+ 1 - 1
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));
 

+ 5 - 2
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]