wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit c81c95aa6cde93fb9029e0514cfeb36666514c00
parent 66e5228fa35585b621a7cd049149b4993b5fc8d9
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Sun, 19 Feb 2006 15:40:44 +0100

enabled partial column mode (experimental yet, don't use it, don't complain)


Diffstat:
cmd/wm/area.c | 11+++++++++++
cmd/wm/bar.c | 6++++++
cmd/wm/client.c | 74++++++++++++++++++++++++++++++++++----------------------------------------
cmd/wm/column.c | 86+++++++++++++++++++------------------------------------------------------------
cmd/wm/page.c | 6+++---
cmd/wm/wm.h | 7+++----
6 files changed, 77 insertions(+), 113 deletions(-)

diff --git a/cmd/wm/area.c b/cmd/wm/area.c @@ -14,6 +14,7 @@ alloc_area(Page *p) Area *a = cext_emallocz(sizeof(Area)); a->page = p; a->id = id++; + update_area_geometry(a); p->area = (Area **)cext_array_attach((void **)p->area, a, sizeof(Area *), &p->areasz); p->sel = p->narea; p->narea++; @@ -21,12 +22,22 @@ alloc_area(Page *p) } void +update_area_geometry(Area *a) +{ + a->rect = rect; + a->rect.height -= brect.height; +} + +void destroy_area(Area *a) { size_t i; + Page *p = a->page; while(a->nclient) detach_client(client[i], False); free(a->client); + cext_array_detach((void **)p->area, a, &p->areasz); + p->narea--; free(a); } diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c @@ -30,6 +30,7 @@ detach_label(Label *l) void update_bar_geometry() { + size_t i, j; brect = rect; brect.height = xfont->ascent + xfont->descent + 4; brect.y = rect.height - brect.height; @@ -39,6 +40,11 @@ update_bar_geometry() pmapbar = XCreatePixmap(dpy, winbar, brect.width, brect.height, DefaultDepth(dpy, screen)); XSync(dpy, False); draw_bar(); + for(i = 0; i < npage; i++) + for(j = 1; j < page[i]->narea; j++) { + update_area_geometry(page[i]->area[j]); + arrange_column(page[i]->area[j]); + } } void diff --git a/cmd/wm/client.c b/cmd/wm/client.c @@ -10,18 +10,6 @@ #include "wm.h" -/* -static void max_client(void *obj, char *arg); -*/ - -/* action table for /?/ namespace */ -/* -Action client_acttbl[] = { - {"max", max_client}, - {0, 0} -}; -*/ - Client * alloc_client(Window w, XWindowAttributes *wa) { @@ -393,16 +381,15 @@ attach_client(Client *c) reparent_client(c, c->frame.win, c->rect.x, c->rect.y); - if(p->sel) - attach_column(c); - else { - Area *a = p->area[0]; - a->client = (Client **)cext_array_attach((void **)a->client, c, - sizeof(Client *), &a->clientsz); - a->nclient++; - c->area = a; - } - resize_client(c, &c->frame.rect, nil); + Area *a = p->area[p->sel]; + a->client = (Client **)cext_array_attach((void **)a->client, c, + sizeof(Client *), &a->clientsz); + a->nclient++; + c->area = a; + if(p->sel > 0) /* column mode */ + arrange_column(a); + else /* normal mode */ + resize_client(c, &c->frame.rect, nil); map_client(c); XMapWindow(dpy, c->frame.win); focus_client(c, True); @@ -411,32 +398,39 @@ attach_client(Client *c) void detach_client(Client *c, Bool unmap) { - if(c->area) { + Area *a = c->area; + if(a) { size_t i; for(i = 0; i < nclient; i++) if(client[i]->revert == c) client[i]->revert = nil; - if(area_to_index(c->area) > 0) - detach_column(c); - else { - Area *a = c->area; - cext_array_detach((void **)a->client, c, &a->clientsz); - a->nclient--; - if(a->sel >= a->nclient) - a->sel = 0; - if(!c->destroyed) { - if(!unmap) { - det = (Client **)cext_array_attach((void **)det, c, + cext_array_detach((void **)a->client, c, &a->clientsz); + a->nclient--; + if(a->sel >= a->nclient) + a->sel = 0; + if(!c->destroyed) { + if(!unmap) { + det = (Client **)cext_array_attach((void **)det, c, sizeof(Client *), &detsz); - ndet++; - unmap_client(c); + ndet++; + unmap_client(c); + } + c->rect.x = c->frame.rect.x; + c->rect.y = c->frame.rect.y; + reparent_client(c, root, c->rect.x, c->rect.y); + XUnmapWindow(dpy, c->frame.win); + } + if(area_to_index(a)) { /* column */ + if(!a->nclient) { + Page *p = a->page; + if(p->narea != 2) { + destroy_area(a); + arrange_page(p, True); } - c->rect.x = c->frame.rect.x; - c->rect.y = c->frame.rect.y; - reparent_client(c, root, c->rect.x, c->rect.y); - XUnmapWindow(dpy, c->frame.win); } + else + arrange_column(a); } } c->area = nil; diff --git a/cmd/wm/column.c b/cmd/wm/column.c @@ -9,20 +9,18 @@ #include "wm.h" void -arrange_column(Page *p, Area *col) +arrange_column(Area *col) { size_t i; unsigned int h; - for(i = 0; (i < col->clientsz) && col->client[i]; i++); h = col->rect.height; - if(i) - h /= i; - for(i = 0; (i < col->clientsz) && col->client[i]; i++) { + h /= col->nclient; + for(i = 0; i < col->nclient; i++) { Client *c = col->client[i]; c->frame.rect = col->rect; c->frame.rect.y += i * h; - if((i + 1 < col->clientsz) && col->client[i + 1]) + if(i + 1 < col->nclient) c->frame.rect.height = h; else c->frame.rect.height = @@ -32,68 +30,24 @@ arrange_column(Page *p, Area *col) } void -arrange_page(Page *p) +arrange_page(Page *p, Bool update_colums) { size_t i; - for(i = 1; i < p->narea; i++) - arrange_column(p, p->area[i]); -} - -void -attach_column(Client *c) -{ - Page *p = page[sel]; - Area *col = p->narea && (p->sel > 0) ? p->area[p->sel] : nil; - - if(!col) { - col = cext_emallocz(sizeof(Area)); - col->rect = rect; - p->area = (Area **)cext_array_attach((void **)p->area, col, - sizeof(Area *), &p->areasz); - p->sel = p->narea; - p->narea++; - } - - c->area = col; - col->client = (Client **)cext_array_attach((void **)col->client, c, - sizeof(Client *), &col->clientsz); - arrange_column(p, col); -} - -static void -update_column_width(Page *p) -{ - size_t i; - unsigned int width; if(p->narea == 1) return; - - width = rect.width / (p->narea - 1); - for(i = 1; i < p->narea; i++) { - p->area[i]->rect = rect; - p->area[i]->rect.x = i * width; - p->area[i]->rect.width = width; - } - arrange_page(p); -} - -void -detach_column(Client *c) -{ - Area *col = c->area; - Page *p = col->page; - - cext_array_detach((void **)col->client, c, &col->clientsz); - if(!col->client[0]) { - cext_array_detach((void **)p->area, col, &p->areasz); - p->narea--; - free(col); - update_column_width(p); + + if(update_colums) { + unsigned int width = rect.width / (p->narea - 1); + for(i = 1; i < p->narea; i++) { + p->area[i]->rect = rect; + p->area[i]->rect.x = i * width; + p->area[i]->rect.width = width; + } } - else - arrange_column(p, col); -} + for(i = 1; i < p->narea; i++) + arrange_column(p->area[i]); +} static void match_horiz(Area *col, XRectangle *r) @@ -179,8 +133,8 @@ drop_moving(Client *c, XRectangle *new, XPoint * pt) cext_array_detach((void **)src->client, c, &src->clientsz); tgt->client = (Client **)cext_array_attach((void **)tgt->client, c, sizeof(Client *), &tgt->clientsz); - arrange_column(p, src); - arrange_column(p, tgt); + arrange_column(src); + arrange_column(tgt); } else { for(i = 0; (i < src->clientsz) && src->client[i] && !blitz_ispointinrect(pt->x, pt->y, &src->client[i]->frame.rect); i++); @@ -189,7 +143,7 @@ drop_moving(Client *c, XRectangle *new, XPoint * pt) for(j = 0; (j < src->clientsz) && src->client[j] && (src->client[j] != c); j++); src->client[j] = src->client[i]; src->client[i] = c; - arrange_column(p, src); + arrange_column(src); } } focus_client(c, False); @@ -267,7 +221,7 @@ new_column(Page *p) col->client = (Client **)cext_array_attach((void **)col->client, c, sizeof(Client *), &col->clientsz); c->area = col; - update_column_width(p); + arrange_page(p, True); focus_client(c, True); } diff --git a/cmd/wm/page.c b/cmd/wm/page.c @@ -18,6 +18,7 @@ alloc_page() p->id = id++; alloc_area(p); + alloc_area(p); page = (Page **)cext_array_attach((void **)page, p, sizeof(Page *), &pagesz); npage++; focus_page(p); @@ -31,9 +32,8 @@ destroy_page(Page *p) { unsigned int i; Page *new = p->revert; - for(i = 0; i < p->narea; i++) - destroy_area(p->area[i]); - free(p->area); + while(p->narea) + destroy_area(p->area[0]); cext_array_detach((void **)page, p, &pagesz); npage--; diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -196,6 +196,7 @@ Area *alloc_area(Page *p); void destroy_area(Area *a); int area_to_index(Area *a); int aid_to_index(Page *p, unsigned short id); +void update_area_geometry(Area *a); /* bar.c */ Label *new_label(); @@ -271,10 +272,8 @@ int page_to_index(Page *p); void spawn(char *cmd); /* column.c */ -void arrange_page(Page *p); -void arrange_column(Page *p, Area *col); -void attach_column(Client *c); -void detach_column(Client *c); +void arrange_page(Page *p, Bool update_colums); +void arrange_column(Area *col); void resize_column(Client *c, XRectangle *r, XPoint *pt); void select_column(Client *c, char *arg); void new_column(Page *p);