Layout: Add layer layout (manual layout), testing.

This commit is contained in:
Martin Duquesnoy 2009-10-11 19:24:13 +02:00
parent 42856c5e63
commit ff729f59fa
6 changed files with 118 additions and 8 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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 },

View File

@ -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

View File

@ -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;

View File

@ -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);