Layout: Add layer layout (manual layout), testing.
This commit is contained in:
parent
42856c5e63
commit
ff729f59fa
10
src/client.c
10
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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
95
src/layout.c
95
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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user