applied the changes made by Icarus Sparry

This commit is contained in:
Anselm R. Garbe 2006-04-02 22:53:56 +02:00
parent 178c157229
commit 03cb248e71
17 changed files with 541 additions and 485 deletions

View File

@ -19,6 +19,8 @@ all: wmiiwm
@echo CC $<
@${CC} -c ${CFLAGS} $<
${OBJ}: wm.h
wmiiwm: ${OBJ}
@echo LD $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}

View File

@ -8,6 +8,14 @@
#include "wm.h"
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
area_to_evector(area_vec_t *view)
{
return (evector_t *) view;
}
Area *
alloc_area(View *v)
{
@ -17,10 +25,8 @@ alloc_area(View *v)
a->id = id++;
a->rect = rect;
a->rect.height = rect.height - brect.height;
v->area = (Area **)cext_array_attach((void **)v->area, a,
sizeof(Area *), &v->areasz);
v->sel = v->narea;
v->narea++;
cext_evector_attach(area_to_evector(&v->area), a);
v->sel = v->area.size -1;
return a;
}
@ -29,17 +35,16 @@ destroy_area(Area *a)
{
unsigned int i;
View *v = a->view;
if(a->nframe)
if(a->frame.size)
return;
if(a->frame)
free(a->frame);
if(a->frame.data)
free(a->frame.data);
if(v->revert == area2index(a))
v->revert = 0;
for(i = 0; i < nclient; i++)
if(client[i]->revert == a)
client[i]->revert = 0;
cext_array_detach((void **)v->area, a, &v->areasz);
v->narea--;
for(i = 0; i < client.size; i++)
if(client.data[i]->revert == a)
client.data[i]->revert = 0;
cext_evector_detach(area_to_evector(&v->area), a);
if(v->sel > 1)
v->sel--;
free(a);
@ -50,8 +55,8 @@ area2index(Area *a)
{
int i;
View *v = a->view;
for(i = 0; i < v->narea; i++)
if(v->area[i] == a)
for(i = 0; i < v->area.size; i++)
if(v->area.data[i] == a)
return i;
return -1;
}
@ -60,8 +65,8 @@ int
aid2index(View *v, unsigned short id)
{
int i;
for(i = 0; i < v->narea; i++)
if(v->area[i]->id == id)
for(i = 0; i < v->area.size; i++)
if(v->area.data[i]->id == id)
return i;
return -1;
}
@ -81,20 +86,20 @@ select_area(Area *a, char *arg)
if(!strncmp(arg, "toggle", 7)) {
if(i)
i = 0;
else if(v->revert > 0 && v->revert < v->narea)
else if(v->revert > 0 && v->revert < v->area.size)
i = v->revert;
else
i = 1;
} else if(!strncmp(arg, "prev", 5)) {
if(i > 0) {
if(i == 1)
i = v->narea - 1;
i = v->area.size - 1;
else
i--;
}
} else if(!strncmp(arg, "next", 5)) {
if(i > 0) {
if(i + 1 < v->narea)
if(i + 1 < v->area.size)
i++;
else
i = 1;
@ -102,18 +107,18 @@ select_area(Area *a, char *arg)
}
else {
const char *errstr;
i = cext_strtonum(arg, 0, v->narea - 1, &errstr);
i = cext_strtonum(arg, 0, v->area.size - 1, &errstr);
if(errstr)
return;
}
new = v->area[i];
if(new->nframe)
focus_client(new->frame[new->sel]->client);
new = v->area.data[i];
if(new->frame.size)
focus_client(new->frame.data[new->sel]->client);
v->sel = i;
for(i = 0; i < a->nframe; i++)
draw_client(a->frame[i]->client);
for(i = 0; i < a->frame.size; i++)
draw_client(a->frame.data[i]->client);
if(!new->nframe) {
if(!new->frame.size) {
update_view_label(v);
draw_bar();
}
@ -128,6 +133,14 @@ send2area(Area *to, Area *from, Client *c)
focus_client(c);
}
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
frame_to_evector(frame_vec_t *view)
{
return (evector_t *) view;
}
void
attach_toarea(Area *a, Client *c)
{
@ -144,14 +157,10 @@ attach_toarea(Area *a, Client *c)
f->rect = c->rect;
f->rect.width += 2 * def.border;
f->rect.height += def.border + bar_height();
c->frame = (Frame **)cext_array_attach(
(void **)c->frame, f, sizeof(Frame *), &c->framesz);
c->nframe++;
c->sel = c->nframe - 1;
a->frame = (Frame **)cext_array_attach(
(void **)a->frame, f, sizeof(Frame *), &a->framesz);
a->nframe++;
a->sel = a->nframe - 1;
cext_evector_attach(frame_to_evector(&c->frame), f);
c->sel = c->frame.size - 1;
cext_evector_attach(frame_to_evector(&a->frame),f);
a->sel = a->frame.size - 1;
if(area2index(a)) /* column */
arrange_column(a);
else /* floating */
@ -161,48 +170,46 @@ attach_toarea(Area *a, Client *c)
void
detach_fromarea(Area *a, Client *c)
{
Frame *f;
Frame *f = nil;
View *v = a->view;
int i;
for(i = 0; i < c->nframe; i++)
if(c->frame[i]->area == a) {
f = c->frame[i];
for(i = 0; i < c->frame.size; i++)
if(c->frame.data[i]->area == a) {
f = c->frame.data[i];
break;
}
cext_array_detach((void **)c->frame, f, &c->framesz);
cext_array_detach((void **)a->frame, f, &a->framesz);
cext_evector_detach(frame_to_evector(&c->frame), f);
cext_evector_detach(frame_to_evector(&a->frame), f);
free(f);
c->nframe--;
if(c->sel > 0)
c->sel--;
a->nframe--;
if(a->sel > 0)
a->sel--;
i = area2index(a);
if(i && a->nframe)
if(i && a->frame.size)
arrange_column(a);
else {
if(i) {
if(v->narea > 2)
if(v->area.size > 2)
destroy_area(a);
else if(!a->nframe && v->area[0]->nframe)
else if(!a->frame.size && v->area.data[0]->frame.size)
v->sel = 0; /* focus floating area if it contains something */
arrange_view(v, True);
}
else if(!i && !a->nframe) {
else if(!i && !a->frame.size) {
if(c->trans) {
/* focus area of transient, if possible */
Client *cl = win2client(c->trans);
if(cl && cl->nframe) {
a = cl->frame[cl->sel]->area;
if(cl && cl->frame.size) {
a = cl->frame.data[cl->sel]->area;
if(a->view == v)
v->sel = area2index(a);
}
}
else if(v->area[1]->nframe)
else if(v->area.data[1]->frame.size)
v->sel = 1; /* focus first col as fallback */
}
}
@ -238,19 +245,19 @@ relax_area(Area *a)
unsigned int i, yoff, h, hdiff;
Bool fallthrough = False;
if(!a->nframe)
if(!a->frame.size)
return;
switch(a->mode) {
case Colequal:
h = a->rect.height;
h /= a->nframe;
h /= a->frame.size;
if(h < 2 * bar_height())
fallthrough = True;
break;
case Colstack:
yoff = a->rect.y;
h = a->rect.height - (a->nframe - 1) * bar_height();
h = a->rect.height - (a->frame.size - 1) * bar_height();
if(h < 3 * bar_height())
fallthrough = True;
break;
@ -259,8 +266,8 @@ relax_area(Area *a)
}
if(fallthrough) {
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect.x = a->rect.x + (a->rect.width - f->rect.width) / 2;
f->rect.y = a->rect.y + (a->rect.height - f->rect.height) / 2;
resize_client(f->client, &f->rect, False);
@ -270,8 +277,8 @@ relax_area(Area *a)
/* some relaxing from potential increment gaps */
h = 0;
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
if(a->mode == Colmax) {
if(h < f->rect.height)
h = f->rect.height;
@ -282,8 +289,8 @@ relax_area(Area *a)
/* try to add rest space to all clients if not COL_STACK mode */
if(a->mode != Colstack) {
for(i = 0; (h < a->rect.height) && (i < a->nframe); i++) {
Frame *f = a->frame[i];
for(i = 0; (h < a->rect.height) && (i < a->frame.size); i++) {
Frame *f = a->frame.data[i];
unsigned int tmp = f->rect.height;
f->rect.height += (a->rect.height - h);
resize_client(f->client, &f->rect, True);
@ -291,10 +298,10 @@ relax_area(Area *a)
}
}
hdiff = (a->rect.height - h) / a->nframe;
hdiff = (a->rect.height - h) / a->frame.size;
yoff = a->rect.y + hdiff / 2;
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect.x = a->rect.x + (a->rect.width - f->rect.width) / 2;
f->rect.y = yoff;
if(a->mode != Colmax)
@ -308,20 +315,20 @@ arrange_column(Area *a)
{
unsigned int i, yoff, h;
if(!a->nframe)
if(!a->frame.size)
return;
switch(a->mode) {
case Colequal:
h = a->rect.height;
h /= a->nframe;
h /= a->frame.size;
if(h < 2 * bar_height())
goto Fallthrough;
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect = a->rect;
f->rect.y += i * h;
if(i + 1 < a->nframe)
if(i + 1 < a->frame.size)
f->rect.height = h;
else
f->rect.height =
@ -331,11 +338,11 @@ arrange_column(Area *a)
break;
case Colstack:
yoff = a->rect.y;
h = a->rect.height - (a->nframe - 1) * bar_height();
h = a->rect.height - (a->frame.size - 1) * bar_height();
if(h < 3 * bar_height())
goto Fallthrough;
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect = a->rect;
f->rect.y = yoff;
if(i == a->sel)
@ -348,8 +355,8 @@ arrange_column(Area *a)
break;
Fallthrough:
case Colmax:
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect = a->rect;
resize_client(f->client, &f->rect, True);
}
@ -366,8 +373,8 @@ match_horiz(Area *a, XRectangle *r)
{
unsigned int i;
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
for(i = 0; i < a->frame.size; i++) {
Frame *f = a->frame.data[i];
f->rect.x = r->x;
f->rect.width = r->width;
resize_client(f->client, &f->rect, False);
@ -384,14 +391,14 @@ drop_resize(Frame *f, XRectangle *new)
unsigned int i;
unsigned int min_height = 2 * bar_height();
for(i = 1; (i < v->narea) && (v->area[i] != a); i++);
for(i = 1; (i < v->area.size) && (v->area.data[i] != a); i++);
/* first managed area is indexed 1, thus (i > 1) ? ... */
west = (i > 1) ? v->area[i - 1] : nil;
east = i + 1 < v->narea ? v->area[i + 1] : nil;
west = (i > 1) ? v->area.data[i - 1] : nil;
east = i + 1 < v->area.size ? v->area.data[i + 1] : nil;
for(i = 0; (i < a->nframe) && (a->frame[i] != f); i++);
north = i ? a->frame[i - 1] : nil;
south = i + 1 < a->nframe ? a->frame[i + 1] : nil;
for(i = 0; (i < a->frame.size) && (a->frame.data[i] != f); i++);
north = i ? a->frame.data[i - 1] : nil;
south = i + 1 < a->frame.size ? a->frame.data[i + 1] : nil;
/* validate (and trim if necessary) horizontal resize */
if(new->width < MIN_COLWIDTH) {
@ -487,22 +494,22 @@ drop_moving(Frame *f, XRectangle *new, XPoint * pt)
View *v = src->view;
unsigned int i;
if(!pt || src->nframe < 2)
if(!pt || src->frame.size < 2)
return;
for(i = 1; (i < v->narea) &&
!blitz_ispointinrect(pt->x, pt->y, &v->area[i]->rect); i++);
if((tgt = ((i < v->narea) ? v->area[i] : nil))) {
for(i = 1; (i < v->area.size) &&
!blitz_ispointinrect(pt->x, pt->y, &v->area.data[i]->rect); i++);
if((tgt = ((i < v->area.size) ? v->area.data[i] : nil))) {
if(tgt != src)
send2area(tgt, src, f->client);
else {
for(i = 0; (i < src->nframe) && !blitz_ispointinrect(
pt->x, pt->y, &src->frame[i]->rect); i++);
if((i < src->nframe) && (f != src->frame[i])) {
for(i = 0; (i < src->frame.size) && !blitz_ispointinrect(
pt->x, pt->y, &src->frame.data[i]->rect); i++);
if((i < src->frame.size) && (f != src->frame.data[i])) {
unsigned int j = frame2index(f);
Frame *tmp = src->frame[j];
src->frame[j] = src->frame[i];
src->frame[i] = tmp;
Frame *tmp = src->frame.data[j];
src->frame.data[j] = src->frame.data[i];
src->frame.data[i] = tmp;
arrange_column(src);
focus_client(f->client);
}
@ -513,7 +520,7 @@ drop_moving(Frame *f, XRectangle *new, XPoint * pt)
void
resize_area(Client *c, XRectangle *r, XPoint *pt)
{
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
if((f->rect.width == r->width) && (f->rect.height == r->height))
drop_moving(f, r, pt);
else
@ -524,8 +531,8 @@ Bool
clientofarea(Area *a, Client *c)
{
unsigned int i;
for(i = 0; i < a->nframe; i++)
if(a->frame[i]->client == c)
for(i = 0; i < a->frame.size; i++)
if(a->frame.data[i]->client == c)
return True;
return False;
}

View File

@ -42,6 +42,14 @@ comp_label_name(const void *l1, const void *l2)
return strcmp(ll1->name, ll2->name);
}
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
label_to_evector(label_vec_t *view)
{
return (evector_t *) view;
}
Label *
get_label(char *name, Bool intern)
{
@ -56,11 +64,9 @@ get_label(char *name, Bool intern)
cext_strlcpy(l->name, name, sizeof(l->name));
cext_strlcpy(l->colstr, def.selcolor, sizeof(l->colstr));
l->color = def.sel;
label = (Label **)cext_array_attach((void **)label, l,
sizeof(Label *), &labelsz);
nlabel++;
qsort(label, nlabel, sizeof(Label *), comp_label_name);
qsort(label, nlabel, sizeof(Label *), comp_label_intern);
cext_evector_attach(label_to_evector(&label), l);
qsort(label.data, label.size, sizeof(Label *), comp_label_name);
qsort(label.data, label.size, sizeof(Label *), comp_label_intern);
return l;
}
@ -68,8 +74,7 @@ get_label(char *name, Bool intern)
void
destroy_label(Label *l)
{
cext_array_detach((void **)label, l, &labelsz);
nlabel--;
cext_evector_detach(label_to_evector(&label), l);
}
unsigned int
@ -92,14 +97,14 @@ update_bar_geometry()
DefaultDepth(dpy, screen));
XSync(dpy, False);
draw_bar();
for(i = 0; i < nview; i++) {
for(j = 1; j < view[i]->narea; j++) {
Area *a = view[i]->area[j];
for(i = 0; i < view.size; i++) {
for(j = 1; j < view.data[i]->area.size; j++) {
Area *a = view.data[i]->area.data[j];
a->rect.height = rect.height - brect.height;
arrange_column(a);
}
for(j = 0; j < view[i]->area[0]->nframe; j++) {
Frame *f = view[i]->area[0]->frame[j];
for(j = 0; j < view.data[i]->area.data[0]->frame.size; j++) {
Frame *f = view.data[i]->area.data[0]->frame.data[j];
resize_client(f->client, &f->rect, False);
}
}
@ -123,13 +128,13 @@ draw_bar()
blitz_drawlabel(dpy, &d);
blitz_drawborder(dpy, &d);
if(!nlabel)
if(!label.size)
return;
for(i = 0; (i < nlabel) && (w < brect.width); i++) {
l = label[i];
for(i = 0; (i < label.size) && (w < brect.width); i++) {
l = label.data[i];
if(l->intern) {
if(nview && !strncmp(l->name, def.tag, sizeof(l->name)))
if(view.size && !strncmp(l->name, def.tag, sizeof(l->name)))
l->color = def.sel;
else
l->color = def.norm;
@ -143,26 +148,26 @@ draw_bar()
w += l->rect.width;
}
if(i != nlabel) { /* give all labels same width */
w = brect.width / nlabel;
for(i = 0; i < nlabel; i++) {
l = label[i];
if(i != label.size) { /* give all labels same width */
w = brect.width / label.size;
for(i = 0; i < label.size; i++) {
l = label.data[i];
l->rect.x = i * w;
l->rect.width = w;
}
}
else { /* expand label properly */
for(exp = 0; (exp < nlabel) && (label[exp]->intern); exp++);
if(exp == nlabel)
for(exp = 0; (exp < label.size) && (label.data[exp]->intern); exp++);
if(exp == label.size)
exp = -1;
else
label[exp]->rect.width += (brect.width - w);
for(i = 1; i < nlabel; i++)
label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width;
label.data[exp]->rect.width += (brect.width - w);
for(i = 1; i < label.size; i++)
label.data[i]->rect.x = label.data[i - 1]->rect.x + label.data[i - 1]->rect.width;
}
for(i = 0; i < nlabel; i++) {
l = label[i];
for(i = 0; i < label.size; i++) {
l = label.data[i];
d.color = l->color;
d.rect = l->rect;
d.data = l->data;
@ -181,8 +186,8 @@ int
label2index(Label *l)
{
int i;
for(i = 0; i < nlabel; i++)
if(label[i] == l)
for(i = 0; i < label.size; i++)
if(label.data[i] == l)
return i;
return -1;
}
@ -191,8 +196,8 @@ int
lid2index(unsigned short id)
{
int i;
for(i = 0; i < nlabel; i++)
if(label[i]->id == id)
for(i = 0; i < label.size; i++)
if(label.data[i]->id == id)
return i;
return -1;
}
@ -204,9 +209,9 @@ name2label(const char *name)
unsigned int i;
cext_strlcpy(buf, name, sizeof(buf));
for(i = 0; i < nlabel; i++)
if(!strncmp(label[i]->name, name, sizeof(label[i]->name)))
return label[i];
for(i = 0; i < label.size; i++)
if(!strncmp(label.data[i]->name, name, sizeof(label.data[i]->name)))
return label.data[i];
return nil;
}
@ -216,19 +221,19 @@ update_bar_tags()
unsigned int i;
Label *l = nil;
for(i = 0; (i < nlabel) && label[i]->intern; i++) {
l = label[i];
for(i = 0; (i < label.size) && label.data[i]->intern; i++) {
l = label.data[i];
if(!istag(l->name) && !name2view(l->name)) {
destroy_label(l);
i--;
}
}
for(i = 0; i < ntag; i++) {
l = get_label(tag[i], True);
cext_strlcpy(l->data, tag[i], sizeof(l->data));
for(i = 0; i < tag.size; i++) {
l = get_label(tag.data[i], True);
cext_strlcpy(l->data, tag.data[i], sizeof(l->data));
}
for(i = 0; i < nview; i++)
update_view_label(view[i]);
for(i = 0; i < view.size; i++)
update_view_label(view.data[i]);
draw_bar();
}

View File

@ -12,6 +12,14 @@
#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask)
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
client_to_evector(client_vec_t *view)
{
return (evector_t *) view;
}
Client *
alloc_client(Window w, XWindowAttributes *wa)
{
@ -59,10 +67,7 @@ alloc_client(Window w, XWindowAttributes *wa)
CWOverrideRedirect | CWBackPixmap | CWEventMask, &fwa);
c->gc = XCreateGC(dpy, c->framewin, 0, 0);
XSync(dpy, False);
client = (Client **)cext_array_attach((void **)client, c,
sizeof(Client *), &clientsz);
nclient++;
cext_evector_attach(client_to_evector(&client), c);
return c;
}
@ -81,7 +86,7 @@ void
focus_client(Client *c)
{
Client *old = sel_client();
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
View *v = f->area->view;
int i = area2index(f->area);
@ -137,7 +142,7 @@ void
configure_client(Client *c)
{
XConfigureEvent e;
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
e.type = ConfigureNotify;
e.event = c->win;
e.window = c->win;
@ -200,7 +205,7 @@ update_client_property(Client *c, XPropertyEvent *e)
cext_strlcpy(c->name, (char*) name.value, sizeof(c->name));
free(name.value);
}
if(c->nframe)
if(c->frame.size)
draw_client(c);
break;
case XA_WM_TRANSIENT_FOR:
@ -221,7 +226,7 @@ draw_client(Client *c)
Draw d = { 0 };
char buf[512];
if(!c->nframe)
if(!c->frame.size)
return; /* might not have been attached atm */
d.drawable = c->framewin;
@ -235,7 +240,7 @@ draw_client(Client *c)
/* draw border */
if(def.border) {
d.rect = c->frame[c->sel]->rect;
d.rect = c->frame.data[c->sel]->rect;
d.rect.x = d.rect.y = 0;
d.notch = &c->rect;
blitz_drawlabel(dpy, &d);
@ -249,12 +254,12 @@ draw_client(Client *c)
tags2str(buf, sizeof(buf), c->tag, c->ntag);
d.align = WEST;
d.rect.x = d.rect.height + XTextWidth(xfont, buf, strlen(buf));
d.rect.width = c->frame[c->sel]->rect.width - d.rect.x;
d.rect.width = c->frame.data[c->sel]->rect.width - d.rect.x;
d.data = c->name;
blitz_drawlabel(dpy, &d);
blitz_drawborder(dpy, &d);
if(c->frame[c->sel]->area->mode == Colmax) {
if(c->frame.data[c->sel]->area->mode == Colmax) {
/* invert tag label */
unsigned long tmp = d.color.fg;
d.color.fg = d.color.bg;
@ -349,7 +354,7 @@ manage_client(Client *c)
reparent_client(c, c->framewin, c->rect.x, c->rect.y);
v = nview ? view[sel] : alloc_view(def.tag);
v = view.size ? view.data[sel] : alloc_view(def.tag);
if(!c->ntag) {
for(i = 0; i < v->ntag; i++) {
cext_strlcpy(c->tag[i], v->tag[i], sizeof(c->tag[i]));
@ -375,25 +380,24 @@ destroy_client(Client *c)
XGrabServer(dpy);
XSetErrorHandler(dummy_error_handler);
for(i = 0; i < nview; i++)
detach_fromview(view[i], c);
for(i = 0; i < view.size; i++)
detach_fromview(view.data[i], c);
unmap_client(c);
if(c->nframe) {
c->rect.x = c->frame[c->sel]->rect.x;
c->rect.y = c->frame[c->sel]->rect.y;
if(c->frame.size) {
c->rect.x = c->frame.data[c->sel]->rect.x;
c->rect.y = c->frame.data[c->sel]->rect.y;
}
reparent_client(c, root, c->rect.x, c->rect.y);
XFreeGC(dpy, c->gc);
XDestroyWindow(dpy, c->framewin);
cext_array_detach((void **)client, c, &clientsz);
nclient--;
cext_evector_detach(client_to_evector(&client), c);
update_tags();
free(c);
if((cl = sel_client_of_view(view[sel])))
if((cl = sel_client_of_view(view.data[sel])))
focus_client(cl);
XSync(dpy, False);
@ -404,7 +408,7 @@ destroy_client(Client *c)
Client *
sel_client()
{
return nview ? sel_client_of_view(view[sel]) : nil;
return view.size ? sel_client_of_view(view.data[sel]) : nil;
}
static void
@ -437,27 +441,27 @@ match_sizehints(Client *c)
h = c->size.min_height;
}
/* client_width = base_width + i * c->size.width_inc for an integer i */
w = c->frame[c->sel]->rect.width - 2 * def.border - w;
w = c->frame.data[c->sel]->rect.width - 2 * def.border - w;
if(s->width_inc > 0)
c->frame[c->sel]->rect.width -= w % s->width_inc;
c->frame.data[c->sel]->rect.width -= w % s->width_inc;
h = c->frame[c->sel]->rect.height - def.border - bar_height() - h;
h = c->frame.data[c->sel]->rect.height - def.border - bar_height() - h;
if(s->height_inc > 0)
c->frame[c->sel]->rect.height -= h % s->height_inc;
c->frame.data[c->sel]->rect.height -= h % s->height_inc;
}
}
void
resize_client(Client *c, XRectangle *r, Bool ignore_xcall)
{
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
f->rect = *r;
if((f->area->mode != Colstack) || (f->area->sel == frame2index(f)))
match_sizehints(c);
if(!ignore_xcall) {
if(f->area->view == view[sel])
if(f->area->view == view.data[sel])
XMoveResizeWindow(dpy, c->framewin, f->rect.x,
f->rect.y, f->rect.width, f->rect.height);
else
@ -479,35 +483,35 @@ resize_client(Client *c, XRectangle *r, Bool ignore_xcall)
void
select_client(Client *c, char *arg)
{
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
Area *a = f->area;
int i = frame2index(f);
if(i == -1)
return;
if(!strncmp(arg, "prev", 5)) {
if(!i)
i = a->nframe - 1;
i = a->frame.size - 1;
else
i--;
} else if(!strncmp(arg, "next", 5)) {
if(i + 1 < a->nframe)
if(i + 1 < a->frame.size)
i++;
else
i = 0;
}
else {
const char *errstr;
i = cext_strtonum(arg, 0, a->nframe - 1, &errstr);
i = cext_strtonum(arg, 0, a->frame.size - 1, &errstr);
if(errstr)
return;
}
focus_client(a->frame[i]->client);
focus_client(a->frame.data[i]->client);
}
void
swap_client(Client *c, char *arg)
{
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
Area *o, *a = f->area;
View *v = a->view;
int i = area2index(a), j = frame2index(f);
@ -517,22 +521,22 @@ swap_client(Client *c, char *arg)
if(!strncmp(arg, "prev", 5) && i) {
if(i == 1)
o = v->area[v->narea - 1];
o = v->area.data[v->area.size - 1];
else
o = v->area[i - 1];
o = v->area.data[i - 1];
goto Swaparea;
}
else if(!strncmp(arg, "next", 5) && i) {
if(i < v->narea - 1)
o = v->area[i + 1];
if(i < v->area.size - 1)
o = v->area.data[i + 1];
else
o = v->area[1];
o = v->area.data[1];
Swaparea:
if(o == a)
return;
a->frame[j] = o->frame[o->sel];
a->frame[j]->area = a;
o->frame[o->sel] = f;
a->frame.data[j] = o->frame.data[o->sel];
a->frame.data[j]->area = a;
o->frame.data[o->sel] = f;
f->area = o;
arrange_column(o);
}
@ -540,17 +544,17 @@ Swaparea:
if(j)
i = j - 1;
else
i = a->nframe - 1;
a->frame[j] = a->frame[i];
a->frame[i] = f;
i = a->frame.size - 1;
a->frame.data[j] = a->frame.data[i];
a->frame.data[i] = f;
}
else if(!strncmp(arg, "down", 5) && i) {
if(j + 1 < a->nframe)
if(j + 1 < a->frame.size)
i = j + 1;
else
i = 0;
a->frame[j] = a->frame[i];
a->frame[i] = f;
a->frame.data[j] = a->frame.data[i];
a->frame.data[i] = f;
}
if(area2index(a))
arrange_column(a);
@ -561,7 +565,7 @@ void
send2area_client(Client *c, char *arg)
{
const char *errstr;
Frame *f = c->frame[c->sel];
Frame *f = c->frame.data[c->sel];
Area *to, *a = f->area;
View *v = a->view;
int i = area2index(a);
@ -569,36 +573,36 @@ send2area_client(Client *c, char *arg)
if(i == -1)
return;
if(!strncmp(arg, "new", 4) && i) {
if(a->nframe == 1 || v->narea - 1 >= rect.width / MIN_COLWIDTH)
if(a->frame.size == 1 || v->area.size - 1 >= rect.width / MIN_COLWIDTH)
return;
to = alloc_area(v);
arrange_view(v, True);
}
else if(!strncmp(arg, "prev", 5) && i) {
if(i == 1)
to = v->area[v->narea - 1];
to = v->area.data[v->area.size - 1];
else
to = v->area[i - 1];
to = v->area.data[i - 1];
}
else if(!strncmp(arg, "next", 5) && i) {
if(i < v->narea - 1)
to = v->area[i + 1];
if(i < v->area.size - 1)
to = v->area.data[i + 1];
else
to = v->area[1];
to = v->area.data[1];
}
else if(!strncmp(arg, "toggle", 7)) {
if(i)
to = v->area[0];
else if(c->revert && c->revert != v->area[0])
to = v->area.data[0];
else if(c->revert && c->revert != v->area.data[0])
to = c->revert;
else
to = v->area[1];
to = v->area.data[1];
}
else {
i = cext_strtonum(arg, 0, v->narea - 1, &errstr);
i = cext_strtonum(arg, 0, v->area.size - 1, &errstr);
if(errstr)
return;
to = v->area[i];
to = v->area.data[i];
}
send2area(to, a, c);
}
@ -607,13 +611,13 @@ void
resize_all_clients()
{
unsigned int i;
for(i = 0; i < nclient; i++) {
Client *c = client[i];
if(c->nframe && c->frame[c->sel]->area) {
if(area2index(c->frame[c->sel]->area))
resize_area(c, &c->frame[c->sel]->rect, nil);
for(i = 0; i < client.size; i++) {
Client *c = client.data[i];
if(c->frame.size && c->frame.data[c->sel]->area) {
if(area2index(c->frame.data[c->sel]->area))
resize_area(c, &c->frame.data[c->sel]->rect, nil);
else
resize_client(c, &c->frame[c->sel]->rect, False);
resize_client(c, &c->frame.data[c->sel]->rect, False);
}
}
}
@ -622,14 +626,14 @@ resize_all_clients()
void
focus(Client *c)
{
Frame *f = c->nframe ? c->frame[c->sel] : nil;
Frame *f = c->frame.size ? c->frame.data[c->sel] : nil;
View *v;
if(!f)
return;
v = f->area->view;
if(view[sel] != v)
if(view.data[sel] != v)
focus_view(v);
focus_client(c);
}
@ -638,8 +642,8 @@ int
cid2index(unsigned short id)
{
int i;
for(i = 0; i < nclient; i++)
if(client[i]->id == id)
for(i = 0; i < client.size; i++)
if(client.data[i]->id == id)
return i;
return -1;
}

View File

@ -60,10 +60,10 @@ handle_buttonpress(XEvent *e)
static char buf[32];
if(ev->window == barwin) {
unsigned int i;
for(i = 0; i < nlabel; i++)
if(blitz_ispointinrect(ev->x, ev->y, &label[i]->rect)) {
for(i = 0; i < label.size; i++)
if(blitz_ispointinrect(ev->x, ev->y, &label.data[i]->rect)) {
snprintf(buf, sizeof(buf), "LabelClick %s %d\n",
label[i]->name, ev->button);
label.data[i]->name, ev->button);
write_event(buf);
return;
}
@ -85,9 +85,9 @@ handle_buttonpress(XEvent *e)
else
mouse_move(c);
}
if(c->nframe) {
if(c->frame.size) {
snprintf(buf, sizeof(buf), "ClientClick %d %d\n",
frame2index(c->frame[c->sel]) + 1, ev->button);
frame2index(c->frame.data[c->sel]) + 1, ev->button);
write_event(buf);
}
}
@ -106,7 +106,7 @@ handle_configurerequest(XEvent *e)
if(c) {
gravitate(c, True);
if(c->nframe && (area2index(c->frame[c->sel]->area) == 0)) {
if(c->frame.size && (area2index(c->frame.data[c->sel]->area) == 0)) {
if(ev->value_mask & CWX)
c->rect.x = ev->x;
if(ev->value_mask & CWY)
@ -121,8 +121,8 @@ handle_configurerequest(XEvent *e)
gravitate(c, False);
if(c->nframe) {
Frame *f = c->frame[c->sel];
if(c->frame.size) {
Frame *f = c->frame.data[c->sel];
f->rect.x = wc.x = c->rect.x - def.border;
f->rect.y = wc.y = c->rect.y - bar_height();
f->rect.width = wc.width = c->rect.width + 2 * def.border;
@ -131,7 +131,7 @@ handle_configurerequest(XEvent *e)
wc.border_width = 1;
wc.sibling = None;
wc.stack_mode = ev->detail;
if(f->area->view != view[sel])
if(f->area->view != view.data[sel])
f->rect.x += 2 * rect.width;
XConfigureWindow(dpy, c->framewin, ev->value_mask, &wc);
configure_client(c);
@ -143,10 +143,10 @@ handle_configurerequest(XEvent *e)
wc.width = ev->width;
wc.height = ev->height;
if(c && c->nframe) {
if(c && c->frame.size) {
wc.x = def.border;
wc.y = bar_height();
if(area2index(c->frame[c->sel]->area) > 0) {
if(area2index(c->frame.data[c->sel]->area) > 0) {
wc.width = c->rect.width;
wc.height = c->rect.height;
}

View File

@ -9,8 +9,8 @@ int
frid2index(Area *a, unsigned short id)
{
int i;
for(i = 0; i < a->nframe; i++)
if(a->frame[i]->id == id)
for(i = 0; i < a->frame.size; i++)
if(a->frame.data[i]->id == id)
return i;
return -1;
}
@ -20,8 +20,8 @@ frame2index(Frame *f)
{
int i;
Area *a = f->area;
for(i = 0; i < a->nframe; i++)
if(a->frame[i] == f)
for(i = 0; i < a->frame.size; i++)
if(a->frame.data[i] == f)
return i;
return -1;
}
@ -30,8 +30,8 @@ Client *
win2clientframe(Window w)
{
unsigned int i;
for(i = 0; (i < clientsz) && client[i]; i++)
if(client[i]->framewin == w)
return client[i];
for(i = 0; (i < client.size) && client.data[i]; i++)
if(client.data[i]->framewin == w)
return client.data[i];
return nil;
}

View File

@ -126,9 +126,9 @@ decode_qpath(Qid *qid, unsigned char *type, int *i1, int *i2, int *i3)
}
}
if(i2id && (*i1 != -1)) {
*i2 = aid2index(view[*i1], i2id);
*i2 = aid2index(view.data[*i1], i2id);
if(i3id && (*i2 != -1))
*i3 = frid2index(view[*i1]->area[*i2], i3id);
*i3 = frid2index(view.data[*i1]->area.data[*i2], i3id);
}
}
}
@ -155,12 +155,12 @@ qid2name(Qid *qid)
case FsDlabel:
if(i1 == -1)
return nil;
return label[i1]->name;
return label.data[i1]->name;
break;
case FsDarea:
if(i1 == -1 || i2 == -1)
return nil;
if(view[i1]->sel == i2)
if(view.data[i1]->sel == i2)
return "sel";
snprintf(buf, sizeof(buf), "%u", i2);
return buf;
@ -174,7 +174,7 @@ qid2name(Qid *qid)
case FsDclient:
if(i1 == -1 || i2 == -1 || i3 == -1)
return nil;
if(view[i1]->area[i2]->sel == i3)
if(view.data[i1]->area.data[i2]->sel == i3)
return "sel";
snprintf(buf, sizeof(buf), "%u", i3);
return buf;
@ -317,22 +317,22 @@ mkqid(Qid *dir, char *wname, Qid *new)
break;
case FsDview:
new->type = IXP_QTDIR;
new->path = mkqpath(FsDview, nview ? view[sel]->id : 0, 0, 0);
new->path = mkqpath(FsDview, view.size ? view.data[sel]->id : 0, 0, 0);
break;
case FsDarea:
if(dir_i1 == -1 || dir_type != FsDview)
return -1;
{
View *p = view[dir_i1];
View *p = view.data[dir_i1];
new->type = IXP_QTDIR;
if(!strncmp(wname, "sel", 4)) {
new->path = mkqpath(FsDarea, p->id, p->area[p->sel]->id, 0);
new->path = mkqpath(FsDarea, p->id, p->area.data[p->sel]->id, 0);
}
else {
i = cext_strtonum(wname, 0, 0xffff, &err);
if(err || (i >= p->narea))
if(err || (i >= p->area.size))
return -1;
new->path = mkqpath(FsDarea, p->id, p->area[i]->id, 0);
new->path = mkqpath(FsDarea, p->id, p->area.data[i]->id, 0);
}
}
break;
@ -340,19 +340,19 @@ mkqid(Qid *dir, char *wname, Qid *new)
if(dir_i1 == -1 || dir_i2 == -1 || dir_type != FsDarea)
return -1;
{
View *p = view[dir_i1];
Area *a = p->area[dir_i2];
View *p = view.data[dir_i1];
Area *a = p->area.data[dir_i2];
new->type = IXP_QTDIR;
if(!strncmp(wname, "sel", 4)) {
if(!a->nframe)
if(!a->frame.size)
return -1;
new->path = mkqpath(FsDclient, p->id, a->id, a->frame[a->sel]->id);
new->path = mkqpath(FsDclient, p->id, a->id, a->frame.data[a->sel]->id);
}
else {
i = cext_strtonum(wname, 0, 0xffff, &err);
if(err || (i >= a->nframe))
if(err || (i >= a->frame.size))
return -1;
new->path = mkqpath(FsDclient, p->id, a->id, a->frame[i]->id);
new->path = mkqpath(FsDclient, p->id, a->id, a->frame.data[i]->id);
}
}
break;
@ -360,9 +360,9 @@ mkqid(Qid *dir, char *wname, Qid *new)
if(dir_type != FsDclients)
return -1;
i = cext_strtonum(wname, 0, 0xffff, &err);
if(err || (i >= nclient))
if(err || (i >= client.size))
return -1;
new->path = mkqpath(FsDGclient, client[i]->id, 0, 0);
new->path = mkqpath(FsDGclient, client.data[i]->id, 0, 0);
break;
case FsDlabel:
if(dir_type != FsDbar)
@ -481,12 +481,12 @@ type2stat(Stat *stat, char *wname, Qid *dir)
break;
case FsFgeom:
if(dir_type == FsDclient) {
f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
f = view.data[dir_i1]->area.data[dir_i2]->frame.data[dir_i3];
snprintf(buf, sizeof(buf), "%d %d %d %d", f->rect.x, f->rect.y,
f->rect.width, f->rect.height);
}
else {
Client *c = client[dir_i1];
Client *c = client.data[dir_i1];
snprintf(buf, sizeof(buf), "%d %d %d %d", c->rect.x, c->rect.y,
c->rect.width, c->rect.height);
}
@ -494,36 +494,36 @@ type2stat(Stat *stat, char *wname, Qid *dir)
break;
case FsFclass:
if(dir_type == FsDclient) {
f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
f = view.data[dir_i1]->area.data[dir_i2]->frame.data[dir_i3];
return mkstat(stat, dir, wname, strlen(f->client->classinst), DMREAD);
}
else
return mkstat(stat, dir, wname, strlen(client[dir_i1]->classinst), DMREAD);
return mkstat(stat, dir, wname, strlen(client.data[dir_i1]->classinst), DMREAD);
break;
case FsFname:
if(dir_type == FsDclient) {
f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
f = view.data[dir_i1]->area.data[dir_i2]->frame.data[dir_i3];
return mkstat(stat, dir, wname, strlen(f->client->name), DMREAD);
}
else
return mkstat(stat, dir, wname, strlen(client[dir_i1]->name), DMREAD);
return mkstat(stat, dir, wname, strlen(client.data[dir_i1]->name), DMREAD);
break;
case FsFtags:
switch(dir_type) {
case FsDclient:
f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
f = view.data[dir_i1]->area.data[dir_i2]->frame.data[dir_i3];
tags2str(buf, sizeof(buf), f->client->tag, f->client->ntag);
return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE);
break;
case FsDGclient:
tags2str(buf, sizeof(buf), client[dir_i1]->tag, client[dir_i1]->ntag);
tags2str(buf, sizeof(buf), client.data[dir_i1]->tag, client.data[dir_i1]->ntag);
return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE);
break;
default:
{
unsigned int i, len = 0;
for(i = 0; i < ntag; i++)
len += strlen(tag[i]) + 1;
for(i = 0; i < tag.size; i++)
len += strlen(tag.data[i]) + 1;
return mkstat(stat, dir, wname, len, DMREAD);
}
break;
@ -534,10 +534,10 @@ type2stat(Stat *stat, char *wname, Qid *dir)
return mkstat(stat, dir, wname, strlen(def.tag), DMREAD);
break;
case FsFdata:
return mkstat(stat, dir, wname, (dir_i1 == nlabel) ? 0 : strlen(label[dir_i1]->data), DMREAD | DMWRITE);
return mkstat(stat, dir, wname, (dir_i1 == label.size) ? 0 : strlen(label.data[dir_i1]->data), DMREAD | DMWRITE);
break;
case FsFmode:
return mkstat(stat, dir, wname, strlen(mode2str(view[dir_i1]->area[dir_i2]->mode)), DMREAD | DMWRITE);
return mkstat(stat, dir, wname, strlen(mode2str(view.data[dir_i1]->area.data[dir_i2]->mode)), DMREAD | DMWRITE);
break;
case FsFcolors:
case FsFselcolors:
@ -685,7 +685,7 @@ xremove(IXPConn *c, Fcall *fcall)
switch(type) {
case FsDlabel:
{
Label *l = label[i1];
Label *l = label.data[i1];
if(l->intern)
return Enoperm;
/* now detach the label */
@ -726,7 +726,7 @@ xread(IXPConn *c, Fcall *fcall)
case FsDclients:
/* jump to offset */
len = 0;
for(i = 0; i < nclient; i++) {
for(i = 0; i < client.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len += type2stat(&stat, buf, &m->qid);
if(len <= fcall->offset)
@ -734,7 +734,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
}
/* offset found, proceeding */
for(; i < nclient; i++) {
for(; i < client.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -746,15 +746,15 @@ xread(IXPConn *c, Fcall *fcall)
case FsDbar:
/* jump to offset */
len = 0;
for(i = 0; i < nlabel; i++) {
len += type2stat(&stat, label[i]->name, &m->qid);
for(i = 0; i < label.size; i++) {
len += type2stat(&stat, label.data[i]->name, &m->qid);
if(len <= fcall->offset)
continue;
break;
}
/* offset found, proceeding */
for(; i < nlabel; i++) {
len = type2stat(&stat, label[i]->name, &m->qid);
for(; i < label.size; i++) {
len = type2stat(&stat, label.data[i]->name, &m->qid);
if(fcall->count + len > fcall->iounit)
break;
fcall->count += len;
@ -764,11 +764,11 @@ xread(IXPConn *c, Fcall *fcall)
case FsDview:
/* jump to offset */
len = type2stat(&stat, "tag", &m->qid);
if(nview) {
if(view.size) {
len += type2stat(&stat, "ctl", &m->qid);
if(view[i1]->narea)
if(view.data[i1]->area.size)
len += type2stat(&stat, "sel", &m->qid);
for(i = 0; i < view[i1]->narea; i++) {
for(i = 0; i < view.data[i1]->area.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len += type2stat(&stat, buf, &m->qid);
if(len <= fcall->offset)
@ -776,7 +776,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
}
/* offset found, proceeding */
for(; i < view[i1]->narea; i++) {
for(; i < view.data[i1]->area.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -791,9 +791,9 @@ xread(IXPConn *c, Fcall *fcall)
len = type2stat(&stat, "ctl", &m->qid);
if(i2)
len += type2stat(&stat, "mode", &m->qid);
if(view[i1]->area[i2]->nframe)
if(view.data[i1]->area.data[i2]->frame.size)
len += type2stat(&stat, "sel", &m->qid);
for(i = 0; i < view[i1]->area[i2]->nframe; i++) {
for(i = 0; i < view.data[i1]->area.data[i2]->frame.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len += type2stat(&stat, buf, &m->qid);
if(len <= fcall->offset)
@ -801,7 +801,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
}
/* offset found, proceeding */
for(; i < view[i1]->area[i2]->nframe; i++) {
for(; i < view.data[i1]->area.data[i2]->frame.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -847,17 +847,17 @@ xread(IXPConn *c, Fcall *fcall)
if(m->qid.dir_type == FsDroot) {
len = 0;
/* jump to offset */
for(i = 0; i < ntag; i++) {
len += strlen(tag[i]) + 1;
for(i = 0; i < tag.size; i++) {
len += strlen(tag.data[i]) + 1;
if(len <= fcall->offset)
continue;
}
/* offset found, proceeding */
for(; i < ntag; i++) {
len = strlen(tag[i]) + 1;
for(; i < tag.size; i++) {
len = strlen(tag.data[i]) + 1;
if(fcall->count + len > fcall->iounit)
break;
memcpy(p + fcall->count, tag[i], len - 1);
memcpy(p + fcall->count, tag.data[i], len - 1);
memcpy(p + fcall->count + len - 1, "\n", 1);
fcall->count += len;
}
@ -878,11 +878,11 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "bar", &m->qid);
p = ixp_enc_stat(p, &stat);
if(ntag) {
if(tag.size) {
fcall->count += type2stat(&stat, "tags", &m->qid);
p = ixp_enc_stat(p, &stat);
}
if(nclient) {
if(client.size) {
fcall->count += type2stat(&stat, "clients", &m->qid);
p = ixp_enc_stat(p, &stat);
}
@ -890,7 +890,7 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
break;
case FsDclients:
for(i = 0; i < nclient; i++) {
for(i = 0; i < client.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -900,8 +900,8 @@ xread(IXPConn *c, Fcall *fcall)
}
break;
case FsDbar:
for(i = 0; i < nlabel; i++) {
len = type2stat(&stat, label[i]->name, &m->qid);
for(i = 0; i < label.size; i++) {
len = type2stat(&stat, label.data[i]->name, &m->qid);
if(fcall->count + len > fcall->iounit)
break;
fcall->count += len;
@ -909,7 +909,7 @@ xread(IXPConn *c, Fcall *fcall)
}
break;
case FsDlabel:
if(i1 >= nlabel)
if(i1 >= label.size)
return Enofile;
fcall->count = type2stat(&stat, "colors", &m->qid);
p = ixp_enc_stat(p, &stat);
@ -933,14 +933,14 @@ xread(IXPConn *c, Fcall *fcall)
case FsDview:
fcall->count = type2stat(&stat, "tag", &m->qid);
p = ixp_enc_stat(p, &stat);
if(nview) {
if(view.size) {
fcall->count += type2stat(&stat, "ctl", &m->qid);
p = ixp_enc_stat(p, &stat);
if(view[i1]->narea) {
if(view.data[i1]->area.size) {
fcall->count += type2stat(&stat, "sel", &m->qid);
p = ixp_enc_stat(p, &stat);
}
for(i = 0; i < view[i1]->narea; i++) {
for(i = 0; i < view.data[i1]->area.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -957,11 +957,11 @@ xread(IXPConn *c, Fcall *fcall)
fcall->count += type2stat(&stat, "mode", &m->qid);
p = ixp_enc_stat(p, &stat);
}
if(view[i1]->area[i2]->nframe) {
if(view.data[i1]->area.data[i2]->frame.size) {
fcall->count += type2stat(&stat, "sel", &m->qid);
p = ixp_enc_stat(p, &stat);
}
for(i = 0; i < view[i1]->area[i2]->nframe; i++) {
for(i = 0; i < view.data[i1]->area.data[i2]->frame.size; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@ -998,12 +998,12 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsFgeom:
if(m->qid.dir_type == FsDclient) {
f = view[i1]->area[i2]->frame[i3];
f = view.data[i1]->area.data[i2]->frame.data[i3];
snprintf(buf, sizeof(buf), "%d %d %d %d", f->rect.x, f->rect.y,
f->rect.width, f->rect.height);
}
else {
Client *c = client[i1];
Client *c = client.data[i1];
snprintf(buf, sizeof(buf), "%d %d %d %d", c->rect.x, c->rect.y,
c->rect.width, c->rect.height);
}
@ -1012,45 +1012,45 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsFclass:
if(m->qid.dir_type == FsDclient) {
if((fcall->count = strlen(view[i1]->area[i2]->frame[i3]->client->classinst)))
memcpy(p, view[i1]->area[i2]->frame[i3]->client->classinst, fcall->count);
if((fcall->count = strlen(view.data[i1]->area.data[i2]->frame.data[i3]->client->classinst)))
memcpy(p, view.data[i1]->area.data[i2]->frame.data[i3]->client->classinst, fcall->count);
}
else {
if((fcall->count = strlen(client[i1]->classinst)))
memcpy(p, client[i1]->classinst, fcall->count);
if((fcall->count = strlen(client.data[i1]->classinst)))
memcpy(p, client.data[i1]->classinst, fcall->count);
}
break;
case FsFname:
if(m->qid.dir_type == FsDclient) {
if((fcall->count = strlen(view[i1]->area[i2]->frame[i3]->client->name)))
memcpy(p, view[i1]->area[i2]->frame[i3]->client->name, fcall->count);
if((fcall->count = strlen(view.data[i1]->area.data[i2]->frame.data[i3]->client->name)))
memcpy(p, view.data[i1]->area.data[i2]->frame.data[i3]->client->name, fcall->count);
}
else {
if((fcall->count = strlen(client[i1]->name)))
memcpy(p, client[i1]->name, fcall->count);
if((fcall->count = strlen(client.data[i1]->name)))
memcpy(p, client.data[i1]->name, fcall->count);
}
break;
case FsFtags:
switch(m->qid.dir_type) {
case FsDclient:
{
Client *c = view[i1]->area[i2]->frame[i3]->client;
Client *c = view.data[i1]->area.data[i2]->frame.data[i3]->client;
tags2str(buf, sizeof(buf), c->tag, c->ntag);
if((fcall->count = strlen(buf)))
memcpy(p, buf, fcall->count);
}
break;
case FsDGclient:
tags2str(buf, sizeof(buf), client[i1]->tag, client[i1]->ntag);
tags2str(buf, sizeof(buf), client.data[i1]->tag, client.data[i1]->ntag);
if((fcall->count = strlen(buf)))
memcpy(p, buf, fcall->count);
break;
default:
for(i = 0; i < ntag; i++) {
len = strlen(tag[i]) + 1;
for(i = 0; i < tag.size; i++) {
len = strlen(tag.data[i]) + 1;
if(fcall->count + len > fcall->iounit)
break;
memcpy(p + fcall->count, tag[i], len - 1);
memcpy(p + fcall->count, tag.data[i], len - 1);
memcpy(p + fcall->count + len - 1, "\n", 1);
fcall->count += len;
}
@ -1058,20 +1058,20 @@ xread(IXPConn *c, Fcall *fcall)
}
break;
case FsFdata:
if(i1 >= nlabel)
if(i1 >= label.size)
return Enofile;
if((fcall->count = strlen(label[i1]->data)))
memcpy(p, label[i1]->data, fcall->count);
if((fcall->count = strlen(label.data[i1]->data)))
memcpy(p, label.data[i1]->data, fcall->count);
break;
case FsFtag:
if((fcall->count = strlen(def.tag)))
memcpy(p, def.tag, fcall->count);
break;
case FsFcolors:
if(i1 >= nlabel)
if(i1 >= label.size)
return Enofile;
if((fcall->count = strlen(label[i1]->colstr)))
memcpy(p, label[i1]->colstr, fcall->count);
if((fcall->count = strlen(label.data[i1]->colstr)))
memcpy(p, label.data[i1]->colstr, fcall->count);
break;
case FsFselcolors:
if((fcall->count = strlen(def.selcolor)))
@ -1106,7 +1106,7 @@ xread(IXPConn *c, Fcall *fcall)
case FsFmode:
if(!i2)
return Enofile;
snprintf(buf, sizeof(buf), "%s", mode2str(view[i1]->area[i2]->mode));
snprintf(buf, sizeof(buf), "%s", mode2str(view.data[i1]->area.data[i2]->mode));
fcall->count = strlen(buf);
memcpy(p, buf, fcall->count);
break;
@ -1140,10 +1140,10 @@ static void
draw_clients()
{
unsigned int i, j;
for(i = 0; i < nclient; i++)
for(j = 0; j < client[i]->nframe; j++)
if(client[i]->frame[j]->area->view == view[sel])
draw_client(client[i]);
for(i = 0; i < client.size; i++)
for(j = 0; j < client.data[i]->frame.size; j++)
if(client.data[i]->frame.data[j]->area->view == view.data[sel])
draw_client(client.data[i]);
}
static char *
@ -1179,18 +1179,18 @@ xwrite(IXPConn *c, Fcall *fcall)
break;
case FsDview:
if(!strncmp(buf, "select ", 7))
if(nview)
select_area(view[i1]->area[view[i1]->sel], &buf[7]);
if(view.size)
select_area(view.data[i1]->area.data[view.data[i1]->sel], &buf[7]);
break;
case FsDarea:
if(!strncmp(buf, "select ", 7)) {
Area *a = view[i1]->area[i2];
if(a->nframe)
select_client(a->frame[a->sel]->client, &buf[7]);
Area *a = view.data[i1]->area.data[i2];
if(a->frame.size)
select_client(a->frame.data[a->sel]->client, &buf[7]);
}
break;
case FsDclient:
f = view[i1]->area[i2]->frame[i3];
f = view.data[i1]->area.data[i2]->frame.data[i3];
if(!strncmp(buf, "kill", 5))
kill_client(f->client);
else if(!strncmp(buf, "sendto ", 7))
@ -1200,7 +1200,7 @@ xwrite(IXPConn *c, Fcall *fcall)
break;
case FsDGclient:
if(!strncmp(buf, "kill", 5))
kill_client(client[i1]);
kill_client(client.data[i1]);
break;
default:
break;
@ -1225,13 +1225,13 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(buf, fcall->data, fcall->count);
buf[fcall->count] = 0;
if(m->qid.dir_type == FsDclient) {
f = view[i1]->area[i2]->frame[i3];
f = view.data[i1]->area.data[i2]->frame.data[i3];
f->client->ntag = str2tags(f->client->tag, buf);
}
else
client[i1]->ntag = str2tags(client[i1]->tag, buf);
client.data[i1]->ntag = str2tags(client.data[i1]->tag, buf);
update_tags();
draw_client(client[i1]);
draw_client(client.data[i1]);
break;
case FsFgeom:
if(fcall->count > sizeof(buf))
@ -1239,7 +1239,7 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(buf, fcall->data, fcall->count);
buf[fcall->count] = 0;
if(m->qid.dir_type == FsDclient) {
f = view[i1]->area[i2]->frame[i3];
f = view.data[i1]->area.data[i2]->frame.data[i3];
blitz_strtorect(&rect, &f->rect, buf);
if(i2)
resize_area(f->client, &f->rect, nil);
@ -1249,19 +1249,19 @@ xwrite(IXPConn *c, Fcall *fcall)
break;
case FsFdata:
len = fcall->count;
if(len >= sizeof(label[i1]->data))
len = sizeof(label[i1]->data) - 1;
memcpy(label[i1]->data, fcall->data, len);
label[i1]->data[len] = 0;
if(len >= sizeof(label.data[i1]->data))
len = sizeof(label.data[i1]->data) - 1;
memcpy(label.data[i1]->data, fcall->data, len);
label.data[i1]->data[len] = 0;
draw_bar();
break;
case FsFcolors:
if((i1 >= nlabel) || (fcall->count != 23) || (fcall->data[0] != '#')
if((i1 >= label.size) || (fcall->count != 23) || (fcall->data[0] != '#')
|| (fcall->data[8] != '#') || (fcall->data[16] != '#'))
return Ebadvalue;
memcpy(label[i1]->colstr, fcall->data, fcall->count);
label[i1]->colstr[fcall->count] = 0;
blitz_loadcolor(dpy, screen, label[i1]->colstr, &label[i1]->color);
memcpy(label.data[i1]->colstr, fcall->data, fcall->count);
label.data[i1]->colstr[fcall->count] = 0;
blitz_loadcolor(dpy, screen, label.data[i1]->colstr, &label.data[i1]->color);
draw_bar();
break;
case FsFselcolors:
@ -1328,10 +1328,10 @@ xwrite(IXPConn *c, Fcall *fcall)
buf[fcall->count] = 0;
if((i = str2mode(buf)) == -1)
return Ebadvalue;
view[i1]->area[i2]->mode = i;
arrange_column(view[i1]->area[i2]);
if(view[i1]->area[i2]->nframe == 1) /* little hack to update the taglabel */
draw_client(view[i1]->area[i2]->frame[view[i1]->area[i2]->sel]->client);
view.data[i1]->area.data[i2]->mode = i;
arrange_column(view.data[i1]->area.data[i2]);
if(view.data[i1]->area.data[i2]->frame.size == 1) /* little hack to update the taglabel */
draw_client(view.data[i1]->area.data[i2]->frame.data[view.data[i1]->area.data[i2]->sel]->client);
break;
case FsFevent:
if(fcall->count > sizeof(buf))

View File

@ -86,12 +86,20 @@ static Key *
name2key(const char *name)
{
unsigned int i;
for(i = 0; i < nkey; i++)
if(!strncmp(key[i]->name, name, sizeof(key[i]->name)))
return key[i];
for(i = 0; i < key.size; i++)
if(!strncmp(key.data[i]->name, name, sizeof(key.data[i]->name)))
return key.data[i];
return nil;
}
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
key_to_evector(key_vec_t *view)
{
return (evector_t *) view;
}
static Key *
get_key(const char *name)
{
@ -128,8 +136,7 @@ get_key(const char *name)
}
if(r) {
r->id = id++;
key = (Key **)cext_array_attach((void **)key, r, sizeof(Key *), &keysz);
nkey++;
cext_evector_attach(key_to_evector(&key), r);
}
return r;
@ -139,8 +146,7 @@ void
destroy_key(Key *k)
{
Key *n;
cext_array_detach((void **)key, k, &keysz);
nkey--;
cext_evector_detach(key_to_evector(&key), k);
while(k) {
n = k->next;
free(k);
@ -240,7 +246,7 @@ handle_key(Window w, unsigned long mod, KeyCode keycode)
{
unsigned int nfound;
char buf[128];
Key **found = match_keys(key, nkey, mod, keycode, False, &nfound);
Key **found = match_keys(key.data, key.size, mod, keycode, False, &nfound);
switch(nfound) {
case 0:
XBell(dpy, 0);
@ -269,9 +275,9 @@ update_keys()
init_lock_modifiers();
while(nkey) {
ungrab_key(key[0]);
destroy_key(key[0]);
while(key.size) {
ungrab_key(key.data[0]);
destroy_key(key.data[0]);
}
for(l = p = def.keys; p && *p;) {

View File

@ -233,9 +233,9 @@ mouse_move(Client *c)
int snaph = rect.height * def.snap / 1000;
unsigned int num;
unsigned int dmask;
XRectangle *rects = rectangles(c->frame[c->sel]->area->view,
area2index(c->frame[c->sel]->area) == 0, &num);
XRectangle frect = c->frame[c->sel]->rect;
XRectangle *rects = rectangles(c->frame.data[c->sel]->area->view,
area2index(c->frame.data[c->sel]->area) == 0, &num);
XRectangle frect = c->frame.data[c->sel]->rect;
XPoint pt;
XQueryPointer(dpy, c->framewin, &dummy, &dummy, &i, &i, &wex, &wey, &dmask);
@ -259,7 +259,7 @@ mouse_move(Client *c)
case ButtonRelease:
if(!first) {
draw_pseudo_border(&frect);
if(area2index(c->frame[c->sel]->area))
if(area2index(c->frame.data[c->sel]->area))
resize_area(c, &frect, &pt);
else
resize_client(c, &frect, False);
@ -475,9 +475,9 @@ mouse_resize(Client *c, Align align)
int snaph = rect.height * def.snap / 1000;
unsigned int dmask;
unsigned int num;
XRectangle *rects = rectangles(c->frame[c->sel]->area->view,
area2index(c->frame[c->sel]->area) == 0, &num);
XRectangle frect = c->frame[c->sel]->rect;
XRectangle *rects = rectangles(c->frame.data[c->sel]->area->view,
area2index(c->frame.data[c->sel]->area) == 0, &num);
XRectangle frect = c->frame.data[c->sel]->rect;
XRectangle origin = frect;
XQueryPointer(dpy, c->framewin, &dummy, &dummy, &i, &i, &ox, &oy, &dmask);
@ -501,7 +501,7 @@ mouse_resize(Client *c, Align align)
draw_pseudo_border(&frect);
pt.x = px;
pt.y = py;
if(area2index(c->frame[c->sel]->area))
if(area2index(c->frame.data[c->sel]->area))
resize_area(c, &frect, &pt);
else
resize_client(c, &frect, False);

View File

@ -39,7 +39,7 @@ update_rules()
{
unsigned int i;
int mode = IGNORE;
char *p, *r, *t, regex[256], tags[256];
char *p, *r=nil, *t=nil, regex[256], tags[256];
if(!def.rules || !strlen(def.rules))
return;
@ -81,6 +81,7 @@ update_rules()
mode = IGNORE;
*r = 0;
rule[i].is_valid = !regcomp(&rule[i].regex, regex, 0);
/* Is there a memory leak here if the rule is invalid? */
}
else {
*r = *p;

View File

@ -12,8 +12,8 @@ Bool
istag(char *t)
{
unsigned int i;
for(i = 0; i < ntag; i++)
if(!strncmp(tag[i], t, strlen(t)))
for(i = 0; i < tag.size; i++)
if(!strncmp(tag.data[i], t, strlen(t)))
return True;
return False;
}
@ -44,46 +44,59 @@ organize_client(View *v, Client *c)
}
}
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
tag_to_evector(tag_vec_t *view)
{
return (evector_t *) view;
}
void
ensure_tag(char *arg)
{
if(!istag(arg)) {
cext_evector_attach(tag_to_evector(&tag), strdup(arg));
}
}
void
update_tags()
{
unsigned int i, j;
for(i = 0; i < ntag; i++) {
free(tag[i]);
tag[i] = nil;
for(i = 0; i < tag.size; i++) {
free(tag.data[i]);
tag.data[i] = nil;
}
ntag = 0;
tag.size = 0;
for(i = 0; i < nclient; i++) {
for(j = 0; j < client[i]->ntag; j++) {
if(!istag(client[i]->tag[j])) {
tag = (char **)cext_array_attach((void **)tag, strdup(client[i]->tag[j]),
sizeof(char *), &tagsz);
ntag++;
}
for(i = 0; i < client.size; i++) {
for(j = 0; j < client.data[i]->ntag; j++) {
ensure_tag(client.data[i]->tag[j]);
}
}
for(i = 0; nview && (i < nclient); i++) {
for(j = 0; j < nview; j++) {
View *v = view[j];
for(i = 0; view.size && (i < client.size); i++) {
for(j = 0; j < view.size; j++) {
View *v = view.data[j];
if(j == sel)
continue;
organize_client(v, client[i]);
organize_client(v, client.data[i]);
}
organize_client(view[sel], client[i]);
organize_client(view.data[sel], client.data[i]);
}
if(nview && !hasclient(view[sel])) {
destroy_view(view[sel]);
if(nview)
focus_view(view[sel]);
if(view.size && !hasclient(view.data[sel])) {
destroy_view(view.data[sel]);
if(view.size)
focus_view(view.data[sel]);
else
update_bar_tags();
}
if(!nview && ntag)
select_view(tag[0]);
if(!view.size && tag.size)
select_view(tag.data[0]);
else
update_bar_tags();
}

View File

@ -8,6 +8,14 @@
#include "wm.h"
/* We expect the optimiser to remove this function, It is included to ensure type safeness.
*/
static evector_t *
view_to_evector(view_vec_t *view)
{
return (evector_t *) view;
}
View *
alloc_view(char *name)
{
@ -18,20 +26,19 @@ alloc_view(char *name)
v->ntag = str2tags(v->tag, name);
alloc_area(v);
alloc_area(v);
view = (View **)cext_array_attach((void **)view, v, sizeof(View *), &viewsz);
sel = nview++;
sel = view.size;
cext_evector_attach(view_to_evector(&view), v);
return v;
}
void
destroy_view(View *v)
{
while(v->narea)
destroy_area(v->area[0]);
while(v->area.size)
destroy_area(v->area.data[0]);
cext_array_detach((void **)view, v, &viewsz);
nview--;
if(sel >= nview)
cext_evector_detach(view_to_evector(&view), v);
if(sel >= view.size)
sel = 0;
free(v);
@ -41,8 +48,8 @@ int
view2index(View *v)
{
int i;
for(i = 0; i < nview; i++)
if(v == view[i])
for(i = 0; i < view.size; i++)
if(v == view.data[i])
return i;
return -1;
}
@ -53,10 +60,10 @@ update_frame_selectors(View *v)
unsigned int i, j;
/* select correct frames of clients */
for(i = 0; i < nclient; i++)
for(j = 0; j < client[i]->nframe; j++)
if(client[i]->frame[j]->area->view == v)
client[i]->sel = j;
for(i = 0; i < client.size; i++)
for(j = 0; j < client.data[i]->frame.size; j++)
if(client.data[i]->frame.data[j]->area->view == v)
client.data[i]->sel = j;
}
void
@ -67,9 +74,9 @@ focus_view(View *v)
char vname[256];
/* cleanup other empty views */
for(i = 0; i < nview; i++)
if(!hasclient(view[i])) {
destroy_view(view[i]);
for(i = 0; i < view.size; i++)
if(!hasclient(view.data[i])) {
destroy_view(view.data[i]);
i--;
}
@ -82,17 +89,17 @@ focus_view(View *v)
update_frame_selectors(v);
/* gives all(!) clients proper geometry (for use of different tags) */
for(i = 0; i < nclient; i++)
if(client[i]->nframe) {
Frame *f = client[i]->frame[client[i]->sel];
for(i = 0; i < client.size; i++)
if(client.data[i]->frame.size) {
Frame *f = client.data[i]->frame.data[client.data[i]->sel];
if(f->area->view == v) {
XMoveWindow(dpy, client[i]->framewin, f->rect.x, f->rect.y);
if(client[i]->nframe > 1)
resize_client(client[i], &f->rect, False);
draw_client(client[i]);
XMoveWindow(dpy, client.data[i]->framewin, f->rect.x, f->rect.y);
if(client.data[i]->frame.size > 1)
resize_client(client.data[i], &f->rect, False);
draw_client(client.data[i]);
}
else
XMoveWindow(dpy, client[i]->framewin,
XMoveWindow(dpy, client.data[i]->framewin,
2 * rect.width + f->rect.x, f->rect.y);
}
if((c = sel_client_of_view(v)))
@ -110,23 +117,23 @@ rectangles(View *v, Bool isfloat, unsigned int *num)
*num = 0;
if(isfloat)
*num = v->area[0]->nframe;
*num = v->area.data[0]->frame.size;
else {
for(i = 1; i < v->narea; i++)
*num += v->area[i]->nframe;
for(i = 1; i < v->area.size; i++)
*num += v->area.data[i]->frame.size;
}
if(*num) {
result = cext_emallocz(*num * sizeof(XRectangle));
if(isfloat) {
for(i = 0; i < *num; i++)
result[i] = v->area[0]->frame[0]->rect;
result[i] = v->area.data[0]->frame.data[0]->rect;
}
else {
unsigned int j, n = 0;
for(i = 1; i < v->narea; i++) {
for(j = 0; j < v->area[i]->nframe; j++)
result[n++] = v->area[i]->frame[j]->rect;
for(i = 1; i < v->area.size; i++) {
for(j = 0; j < v->area.data[i]->frame.size; j++)
result[n++] = v->area.data[i]->frame.data[j]->rect;
}
}
}
@ -137,8 +144,8 @@ int
vid2index(unsigned short id)
{
int i;
for(i = 0; i < nview; i++)
if(view[i]->id == id)
for(i = 0; i < view.size; i++)
if(view.data[i]->id == id)
return i;
return -1;
}
@ -150,8 +157,8 @@ name2view(char *name)
char vname[256];
unsigned int i;
for(i = 0; i < nview; i++) {
v = view[i];
for(i = 0; i < view.size; i++) {
v = view.data[i];
tags2str(vname, sizeof(vname), v->tag, v->ntag);
if(!strncmp(vname, name, strlen(name)))
return v;
@ -171,18 +178,18 @@ get_view(char *name)
return v;
ntags = str2tags(tags, name);
for(i = 0; i < nclient; i++)
for(i = 0; i < client.size; i++)
for(j = 0; j < ntags; j++)
if(clienthastag(client[i], tags[j]))
if(clienthastag(client.data[i], tags[j]))
goto Createview;
return nil;
Createview:
v = alloc_view(name);
for(i = 0; i < nclient; i++)
for(i = 0; i < client.size; i++)
for(j = 0; j < ntags; j++)
if(clienthastag(client[i], tags[j]) && !clientofview(v, client[i]))
attach_toview(v, client[i]);
if(clienthastag(client.data[i], tags[j]) && !clientofview(v, client.data[i]))
attach_toview(v, client.data[i]);
return v;
}
@ -190,8 +197,8 @@ Bool
hasclient(View *v)
{
unsigned int i;
for(i = 0; i < v->narea; i++)
if(v->area[i]->nframe)
for(i = 0; i < v->area.size; i++)
if(v->area.data[i]->frame.size)
return True;
return False;
}
@ -202,11 +209,7 @@ select_view(char *arg)
View *v = get_view(arg);
if(!v)
return;
if(!istag(arg)) {
tag = (char **)cext_array_attach((void **)tag, strdup(arg),
sizeof(char *), &tagsz);
ntag++;
}
ensure_tag(arg);
focus_view(v);
}
@ -214,8 +217,8 @@ Bool
clientofview(View *v, Client *c)
{
unsigned int i;
for(i = 0; i < v->narea; i++)
if(clientofarea(v->area[i], c))
for(i = 0; i < v->area.size; i++)
if(clientofarea(v->area.data[i], c))
return True;
return False;
}
@ -225,9 +228,9 @@ detach_fromview(View *v, Client *c)
{
int i;
Client *cl;
for(i = 0; i < v->narea; i++) {
if(clientofarea(v->area[i], c)) {
detach_fromarea(v->area[i], c);
for(i = 0; i < v->area.size; i++) {
if(clientofarea(v->area.data[i], c)) {
detach_fromarea(v->area.data[i], c);
XMoveWindow(dpy, c->framewin, 2 * rect.width, 0);
}
}
@ -241,14 +244,14 @@ attach_toview(View *v, Client *c)
Area *a;
if(c->trans || c->floating)
a = v->area[0];
a = v->area.data[0];
else
a = v->area[v->sel];
a = v->area.data[v->sel];
attach_toarea(a, c);
map_client(c);
XMapWindow(dpy, c->framewin);
if(v == view[sel])
if(v == view.data[sel])
focus_client(c);
}
@ -256,8 +259,8 @@ Client *
sel_client_of_view(View *v)
{
if(v) {
Area *a = v->narea ? v->area[v->sel] : nil;
return (a && a->nframe) ? a->frame[a->sel]->client : nil;
Area *a = v->area.size ? v->area.data[v->sel] : nil;
return (a && a->frame.size) ? a->frame.data[a->sel]->client : nil;
}
return nil;
}
@ -269,20 +272,20 @@ restack_view(View *v)
static Window *wins = nil;
static unsigned int winssz = 0;
if(nclient > winssz) {
winssz = 2 * nclient;
if(client.size > winssz) {
winssz = 2 * client.size;
free(wins);
wins = cext_emallocz(sizeof(Window) * winssz);
}
for(i = 0; i < v->narea; i++) {
Area *a = v->area[i];
if(a->nframe) {
wins[n++] = a->frame[a->sel]->client->framewin;
for(j = 0; j < a->nframe; j++) {
for(i = 0; i < v->area.size; i++) {
Area *a = v->area.data[i];
if(a->frame.size) {
wins[n++] = a->frame.data[a->sel]->client->framewin;
for(j = 0; j < a->frame.size; j++) {
if(j == a->sel)
continue;
wins[n++] = a->frame[j]->client->framewin;
wins[n++] = a->frame.data[j]->client->framewin;
}
}
}
@ -297,12 +300,12 @@ arrange_view(View *v, Bool updategeometry)
unsigned int i;
unsigned int width;
if(v->narea == 1)
if(v->area.size == 1)
return;
width = rect.width / (v->narea - 1);
for(i = 1; i < v->narea; i++) {
Area *a = v->area[i];
width = rect.width / (v->area.size - 1);
for(i = 1; i < v->area.size; i++) {
Area *a = v->area.data[i];
if(updategeometry) {
a->rect.height = rect.height - brect.height;
a->rect.x = (i - 1) * width;

View File

@ -33,9 +33,9 @@ win2client(Window w)
{
unsigned int i;
for(i = 0; (i < clientsz) && client[i]; i++)
if(client[i]->win == w)
return client[i];
for(i = 0; (i < client.size) && client.data[i]; i++)
if(client.data[i]->win == w)
return client.data[i];
return nil;
}
@ -201,10 +201,10 @@ static void
cleanup()
{
unsigned int i;
Client *c;
for(i = 0; client && client[i]; i++) {
c = client[i];
reparent_client(c, root, c->frame[c->sel]->rect.x, c->frame[c->sel]->rect.y);
for(i = 0; i<client.size; i++) {
Client *c = client.data[i];
Frame *cf = c->frame.data[c->sel];
reparent_client(c, root, cf->rect.x, cf->rect.y);
}
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
@ -293,15 +293,15 @@ main(int argc, char *argv[])
ixp_server_open_conn(&srv, ConnectionNumber(dpy), check_x_event, nil);
init_x_event_handler();
ntag = tagsz = nview = nclient = viewsz = clientsz = sel = 0;
view = nil;
tag = nil;
client = nil;
tag.size = view.size = client.size = sel = 0;
view.data = nil;
tag.data = nil;
client.data = nil;
key = nil;
keysz = nkey = 0;
label = nil;
nlabel = labelsz = 0;
key.data = nil;
key.size = 0;
label.data = nil;
label.size = 0;
def.rules = nil;
def.rulessz = 0;
def.keys = nil;

View File

@ -73,24 +73,24 @@ typedef struct Area Area;
typedef struct Frame Frame;
typedef struct Client Client;
EVECTOR(area_vec_t, Area*);
struct View {
char tag[MAX_TAGS][MAX_TAGLEN];
unsigned int ntag;
unsigned short id;
Area **area;
unsigned int areasz;
unsigned int narea;
area_vec_t area;
unsigned int sel;
unsigned int revert;
};
EVECTOR(frame_vec_t, Frame*);
struct Area {
unsigned short id;
Frame **frame;
frame_vec_t frame;
View *view;
unsigned int framesz;
unsigned int sel;
unsigned int nframe;
int mode;
XRectangle rect;
};
@ -117,10 +117,8 @@ struct Client {
XSizeHints size;
Window framewin;
GC gc;
Frame **frame;
unsigned int framesz;
frame_vec_t frame;
unsigned int sel;
unsigned int nframe;
Area *revert;
};
@ -160,22 +158,24 @@ typedef struct {
} Default;
/* global variables */
View **view;
unsigned int nview;
unsigned int viewsz;
EVECTOR(view_vec_t, View*);
view_vec_t view;
unsigned int sel;
Client **client;
unsigned int nclient;
unsigned int clientsz;
Key **key;
unsigned int keysz;
unsigned int nkey;
Label **label;
unsigned int nlabel;
unsigned int labelsz;
char **tag;
unsigned int ntag;
unsigned int tagsz;
EVECTOR(client_vec_t, Client*);
client_vec_t client;
EVECTOR(key_vec_t, Key*);
key_vec_t key;
EVECTOR(label_vec_t, Label*);
label_vec_t label;
EVECTOR(tag_vec_t, char *);
tag_vec_t tag;
//char **tag;
//unsigned int ntag;
//unsigned int tagsz;
Display *dpy;
IXPServer *ixps;
@ -284,6 +284,7 @@ unsigned int str2tags(char tags[MAX_TAGS][MAX_TAGLEN], const char *stags);
void tags2str(char *stags, unsigned int stagsz,
char tags[MAX_TAGS][MAX_TAGLEN], unsigned int ntags);
Bool istag(char *t);
void ensure_tag(char *t);
void update_tags();
/* view.c */

View File

@ -1,7 +1,7 @@
# Customize to fit your system
# paths
PREFIX = /usr/local
PREFIX = /tmp/wmiibin
CONFPREFIX = ${PREFIX}/etc
MANPREFIX = ${PREFIX}/share/man
@ -14,9 +14,9 @@ VERSION = 3-current
LIBS = -L${PREFIX}/lib -L/usr/lib -lc -lm -L${X11LIB} -lX11
# Linux/BSD
CFLAGS = -g -Wall -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
CFLAGS = -ggdb -Wall -O -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
-DVERSION=\"${VERSION}\"
LDFLAGS = -g ${LIBS}
LDFLAGS = -ggdb ${LIBS}
# Solaris
#CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\"

View File

@ -3,7 +3,7 @@
include ../config.mk
SRC = array.c emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c
SRC = array.c emallocz.c estrdup.c evector.c strlcat.c strlcpy.c strtonum.c tokenize.c
OBJ = ${SRC:.c=.o}
@ -16,6 +16,8 @@ all: libcext.a
@echo CC $<
@${CC} -c ${CFLAGS} $<
$(OBJ): cext.h
libcext.a: ${OBJ}
@echo AR $@
@${AR} $@ ${OBJ}

View File

@ -16,6 +16,18 @@ void cext_array_detach(void **array, void *p, unsigned int *size);
/* emallocz.c */
void *cext_emallocz(unsigned int size);
/* evector.c */
#define EVECTOR(name, type) \
typedef struct { \
unsigned int size; \
type * data; \
} name
EVECTOR(evector_t, void*);
void cext_evector_attach(evector_t *vector, void *data_to_be_added);
void cext_evector_detach(evector_t *vector, void *data_to_be_removed);
/* estrdup.c */
char *cext_estrdup(const char *s);