diff --git a/src/client.c b/src/client.c index 7c3adf3..fa56246 100644 --- a/src/client.c +++ b/src/client.c @@ -480,7 +480,7 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar) Window trans, dw; Status rettrans; XSetWindowAttributes at; - int mx, my, dint; + int mx, my, dint; uint duint; screen_get_sel(); @@ -490,10 +490,11 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar) c->screen = selscreen; c->flags = 0; + + XQueryPointer(dpy, ROOT, &dw, &dw, &mx, &my, &dint, &dint, &duint); + if(conf.client.place_at_mouse) { - XQueryPointer(dpy, ROOT, &dw, &dw, &mx, &my, &dint, &dint, &duint); - mx += BORDH; my += TBARH; @@ -522,6 +523,9 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar) c->ogeo.height = c->geo.height = wa->height; c->tag = seltag[c->screen]; + c->layer = (sel && sel->layer > 0) ? sel->layer : 1; + + at.event_mask = PropertyChangeMask; frame_create(c); diff --git a/src/config.c b/src/config.c index 672e44b..d961351 100644 --- a/src/config.c +++ b/src/config.c @@ -69,7 +69,11 @@ func_name_list_t tmp_func_list[] = {"reload", uicb_reload }, {"launcher", uicb_launcher }, {"set_layout", uicb_set_layout }, - {"menu", uicb_menu } + {"menu", uicb_menu }, + {"set_client_layer", uicb_set_client_layer }, + {"set_layer", uicb_set_layer } + + }; key_name_list_t key_list[] = @@ -334,7 +338,7 @@ conf_tag_section(char *src) /* If there is no tag in the conf or more than * MAXTAG (32) print an error and create only one. */ - Tag default_tag = { "WMFS", NULL, 0, + Tag default_tag = { "WMFS", NULL, 0, 1, 0.50, 1, False, False, IB_Top, layout_name_to_struct(conf.layout, "tile_right", conf.nlayout, layout_list) }; @@ -375,6 +379,7 @@ conf_tag_section(char *src) tags[k][conf.ntag[k]].mwfact = get_opt(cfgtmp, "0.65", "mwfact").fnum; tags[k][conf.ntag[k]].nmaster = get_opt(cfgtmp, "1", "nmaster").num; tags[k][conf.ntag[k]].resizehint = get_opt(cfgtmp, "false", "resizehint").bool; + tags[k][conf.ntag[k]].layers = 1; tmp = _strdup(get_opt(cfgtmp, "top", "infobar_position").str); diff --git a/src/init.c b/src/init.c index 161fce8..39a25ff 100644 --- a/src/init.c +++ b/src/init.c @@ -173,6 +173,7 @@ init_layout(void) {"tile_mirror_vertical", mirror_vertical }, {"mirror_horizontal", mirror_horizontal }, {"tile_mirror_horizontal", mirror_horizontal }, + {"layer", layer }, {"max", maxlayout }, {"maxlayout", maxlayout }, {"freelayout", freelayout }, diff --git a/src/layout.c b/src/layout.c index a2b2654..7c3786e 100644 --- a/src/layout.c +++ b/src/layout.c @@ -212,7 +212,7 @@ uicb_set_nmaster(uicb_t cmd) for(nc = 0, c = tiled_client(selscreen, clients); c; c = tiled_client(selscreen, c->next), ++nc); if(!nc || tags[selscreen][seltag[selscreen]].nmaster + n == 0 - || tags[selscreen][seltag[selscreen]].nmaster + n > nc) + || tags[selscreen][seltag[selscreen]].nmaster + n > nc) return; tags[selscreen][seltag[selscreen]].nmaster += n; @@ -223,6 +223,43 @@ uicb_set_nmaster(uicb_t cmd) return; } +void +uicb_set_client_layer(uicb_t cmd) +{ + int n = atoi(cmd); + + screen_get_sel(); + + CHECK(sel); + + if(sel->layer + n < 1 + || sel->layer + n > tags[selscreen][seltag[selscreen]].layers) + return; + + sel->layer += n; + + tags[selscreen][seltag[selscreen]].layout.func(selscreen); + + return; +} + +void +uicb_set_layer(uicb_t cmd) +{ + int n = atoi(cmd); + + screen_get_sel(); + + if(tags[selscreen][seltag[selscreen]].layers + n < 1) + return; + + tags[selscreen][seltag[selscreen]].layers += n; + tags[selscreen][seltag[selscreen]].layout.func(selscreen); + + return; +} + + /** Grid layout function */ void @@ -587,6 +624,62 @@ mirror(int screen, Bool horizontal) return; } +/** Layer layout function +*/ +void +layer(int screen) +{ + Client *c; + XRectangle geo = { 0 }; + XRectangle sg = sgeo[screen]; + int n, i, l = tags[screen][seltag[screen]].layers; + int *x = NULL; + int *nl = NULL; + + for(n = 0, c = tiled_client(screen, clients); c; c = tiled_client(screen, c->next), ++n); + CHECK(n); + + x = emalloc(l + 1, sizeof(int)); + nl = emalloc(l + 1, sizeof(int)); + + for(i = 0; i < l + 1; ++i) + { + x[i] = sg.x; + nl[i] = 0; + } + + for(c = tiled_client(screen, clients); c; c = tiled_client(screen, c->next)) + ++nl[c->layer]; + + for(i = 0, c = tiled_client(screen, clients); c; c = tiled_client(screen, c->next), ++i) + { + /* Set client property */ + c->flags &= ~(MaxFlag | LMaxFlag); + c->flags |= TileFlag; + + for(; c->layer > l; --(c->layer)); + + geo.x = x[c->layer]; + geo.height = (sg.height / l) - BORDH; + geo.width = (sg.width / ((nl[c->layer]) ? nl[c->layer] : 1)) - BORDH * 2; + geo.y = sg.y + ((geo.height + TBARH + BORDH) * c->layer) - (geo.height + TBARH + BORDH); + + if(c->layer == l) + geo.height = (sg.y + sg.height) - geo.y - BORDH; + + client_moveresize(c, geo, False); + + x[c->layer] = geo.x + geo.width + BORDH * 2; + } + + free(x); + free(nl); + + ewmh_update_current_tag_prop(); + + return; +} + /** Tile Right function */ void diff --git a/src/structs.h b/src/structs.h index d653606..7fab91c 100644 --- a/src/structs.h +++ b/src/structs.h @@ -37,7 +37,7 @@ #define NBUTTON 8 #define MAXTAG 36 -#define NUM_OF_LAYOUT 9 +#define NUM_OF_LAYOUT 10 /* Clients flags definition */ #define FreeFlag (1 << 1) @@ -166,6 +166,8 @@ struct Client uint tag; /* Screen */ int screen; + /* Layer */ + int layer; /* Window attribute */ XRectangle geo; XRectangle tmp_geo; @@ -241,6 +243,7 @@ typedef struct char *name; char **clients; int nclients; + int layers; float mwfact; int nmaster; Bool resizehint; diff --git a/src/wmfs.h b/src/wmfs.h index cce5a98..e1c2cc7 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -288,7 +288,8 @@ Client *tiled_client(int screen, Client *c); void tile_bottom(int screen); void mirror_vertical(int screen); void mirror_horizontal(int screen); -/* }}} */ + void layer(int screen); + /* }}} */ void uicb_togglemax(uicb_t); void uicb_togglefree(uicb_t); void uicb_layout_prev(uicb_t); @@ -297,6 +298,9 @@ void uicb_set_mwfact(uicb_t); void uicb_set_nmaster(uicb_t); void uicb_set_layout(uicb_t); void uicb_toggle_resizehint(uicb_t); +void uicb_set_layer(uicb_t cmd); +void uicb_set_client_layer(uicb_t cmd); + /* init.c */ void init(void);