Browse Source

Add layout_integrate_left/right/top/bottom uicb functions

Martin Duquesnoy 12 years ago
parent
commit
057814d5f5
4 changed files with 101 additions and 61 deletions
  1. 29 29
      src/client.c
  2. 36 32
      src/config.h
  3. 29 0
      src/layout.c
  4. 7 0
      src/layout.h

+ 29 - 29
src/client.c

@@ -14,38 +14,38 @@
 #include "screen.h"
 #include "mouse.h"
 
-#define CLIENT_RESIZE_DIR(D)                          \
-void uicb_client_resize_##D(Uicb cmd)                 \
-{                                                     \
-     if(W->client)                                    \
-          client_fac_resize(W->client, D, ATOI(cmd)); \
-}
+#define CLIENT_RESIZE_DIR(D)                                    \
+     void uicb_client_resize_##D(Uicb cmd)                      \
+     {                                                          \
+          if(W->client)                                         \
+               client_fac_resize(W->client, D, ATOI(cmd));      \
+     }
 
-#define CLIENT_ACTION_DIR(A, D)                                \
-void uicb_client_##A##_##D(Uicb cmd)                           \
-{                                                              \
-     (void)cmd;                                                \
-     struct client *c;                                         \
-     if(W->client && (c = client_next_with_pos(W->client, D))) \
-          client_##A(c);                                       \
-}
+#define CLIENT_ACTION_DIR(A, D)                                         \
+     void uicb_client_##A##_##D(Uicb cmd)                               \
+     {                                                                  \
+          (void)cmd;                                                    \
+          struct client *c;                                             \
+          if(W->client && (c = client_next_with_pos(W->client, D)))     \
+               client_##A(c);                                           \
+     }
 
-#define CLIENT_ACTION_IDIR(A, D)     \
-void uicb_client_##A##_##D(Uicb cmd) \
-{                                    \
-     (void)cmd;                      \
-     if(W->client)                   \
-          client_##A(W->client, D);  \
-}
+#define CLIENT_ACTION_IDIR(A, D)                \
+     void uicb_client_##A##_##D(Uicb cmd)       \
+     {                                          \
+          (void)cmd;                            \
+          if(W->client)                         \
+               client_##A(W->client, D);        \
+     }
 
-#define CLIENT_ACTION_LIST(A, L)                  \
-void uicb_client_##A##_##L(Uicb cmd)              \
-{                                                 \
-     (void)cmd;                                   \
-     struct client *c;                            \
-     if(W->client && (c = client_##L(W->client))) \
-          client_##A(c);                          \
-}
+#define CLIENT_ACTION_LIST(A, L)                        \
+     void uicb_client_##A##_##L(Uicb cmd)               \
+     {                                                  \
+          (void)cmd;                                    \
+          struct client *c;                             \
+          if(W->client && (c = client_##L(W->client)))  \
+               client_##A(c);                           \
+     }
 
 /* uicb_client_resize_dir() */
 CLIENT_RESIZE_DIR(Right)

+ 36 - 32
src/config.h

@@ -40,40 +40,44 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] =
      { "tag_click",            uicb_tag_click },
 
      /* Layout */
-     { "layout_vmirror",      uicb_layout_vmirror },
-     { "layout_hmirror",      uicb_layout_hmirror },
-     { "layout_rotate_left",  uicb_layout_rotate_left },
-     { "layout_rotate_right", uicb_layout_rotate_right },
-     { "layout_prev_set",     uicb_layout_prev_set },
-     { "layout_next_set",     uicb_layout_next_set },
+     { "layout_vmirror",          uicb_layout_vmirror },
+     { "layout_hmirror",          uicb_layout_hmirror },
+     { "layout_rotate_left",      uicb_layout_rotate_left },
+     { "layout_rotate_right",     uicb_layout_rotate_right },
+     { "layout_prev_set",         uicb_layout_prev_set },
+     { "layout_next_set",         uicb_layout_next_set },
+     { "layout_integrate_left",   uicb_layout_integrate_Left },
+     { "layout_integrate_right",  uicb_layout_integrate_Right },
+     { "layout_integrate_top",    uicb_layout_integrate_Top },
+     { "layout_integrate_bottom", uicb_layout_integrate_Bottom },
 
      /* 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_focus_next_tab", uicb_client_focus_next_tab },
-     { "client_focus_prev_tab", uicb_client_focus_prev_tab },
-     { "client_focus_click",    uicb_client_focus_click },
-     { "client_toggle_free",    uicb_client_toggle_free },
+     { "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 },
+     { "client_focus_click",      uicb_client_focus_click },
+     { "client_toggle_free",      uicb_client_toggle_free },
 
      /* Status */
      { "status" , uicb_status },

+ 29 - 0
src/layout.c

@@ -557,6 +557,35 @@ uicb_layout_hmirror(Uicb cmd)
      layout_save_set(W->screen->seltag);
 }
 
+#define LAYOUT_INTEGRATE_DIR(D)\
+     void uicb_layout_integrate_##D(Uicb cmd)                           \
+     {                                                                  \
+          (void)cmd;                                                    \
+          if(W->client)                                                 \
+               layout_integrate(W->client, D);                          \
+     }
+static void
+layout_integrate(struct client *c, enum position p)
+{
+     struct client *n;
+     struct client ghost = *c;
+
+     if(!(c->flags & CLIENT_TILED))
+          return;
+
+     if((n = client_next_with_pos(c, p))
+        && (n->flags & CLIENT_TILED))
+     {
+          layout_split_integrate(c, n);
+          layout_split_arrange_closed(&ghost);
+     }
+}
+
+LAYOUT_INTEGRATE_DIR(Left);
+LAYOUT_INTEGRATE_DIR(Right);
+LAYOUT_INTEGRATE_DIR(Top);
+LAYOUT_INTEGRATE_DIR(Bottom);
+
 void
 layout_client(struct client *c)
 {

+ 7 - 0
src/layout.h

@@ -42,5 +42,12 @@ void uicb_layout_rotate_right(Uicb cmd);
 void uicb_layout_prev_set(Uicb cmd);
 void uicb_layout_next_set(Uicb cmd);
 
+/* Generated */
+void uicb_layout_integrate_Left(Uicb);
+void uicb_layout_integrate_Right(Uicb);
+void uicb_layout_integrate_Top(Uicb);
+void uicb_layout_integrate_Bottom(Uicb);
+
+
 #endif /* LAYOUT_H */