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