commit 04bba2a6c4a6c8101401e6ef33ce199c84b2551f
parent 74a25f315800a0c57c9d3ba3d47a94cfd81a65bf
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Thu, 23 Mar 2006 10:36:51 +0100
separated tag.c into tag.c and view.c, renamed Tag to View, still some parts to be adapted
Diffstat:
12 files changed, 468 insertions(+), 453 deletions(-)
diff --git a/cmd/wm/Makefile b/cmd/wm/Makefile
@@ -9,7 +9,7 @@ LDFLAGS += -L../../liblitz -llitz -L../../libixp -lixp -L../../libcext -lcext
# Solaris
# LDFLAGS += -lsocket
-SRC = area.c bar.c fs.c frame.c wm.c kb.c client.c event.c mouse.c rule.c tag.c
+SRC = area.c bar.c fs.c frame.c wm.c kb.c client.c event.c mouse.c rule.c tag.c view.c
OBJ = ${SRC:.c=.o}
all: wmiiwm
diff --git a/cmd/wm/area.c b/cmd/wm/area.c
@@ -9,18 +9,18 @@
#include "wm.h"
Area *
-alloc_area(Tag *t)
+alloc_area(View *v)
{
static unsigned short id = 1;
Area *a = cext_emallocz(sizeof(Area));
- a->tag = t;
+ a->view = v;
a->id = id++;
a->rect = rect;
a->rect.height = rect.height - brect.height;
- t->area = (Area **)cext_array_attach((void **)t->area, a,
- sizeof(Area *), &t->areasz);
- t->sel = t->narea;
- t->narea++;
+ v->area = (Area **)cext_array_attach((void **)v->area, a,
+ sizeof(Area *), &v->areasz);
+ v->sel = v->narea;
+ v->narea++;
return a;
}
@@ -28,20 +28,20 @@ void
destroy_area(Area *a)
{
unsigned int i;
- Tag *t = a->tag;
+ View *v = a->view;
if(a->nframe)
return;
if(a->frame)
free(a->frame);
- if(t->revert == area2index(a))
- t->revert = 0;
+ 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 **)t->area, a, &t->areasz);
- t->narea--;
- if(t->sel > 1)
- t->sel--;
+ cext_array_detach((void **)v->area, a, &v->areasz);
+ v->narea--;
+ if(v->sel > 1)
+ v->sel--;
free(a);
}
@@ -49,19 +49,19 @@ int
area2index(Area *a)
{
int i;
- Tag *t = a->tag;
- for(i = 0; i < t->narea; i++)
- if(t->area[i] == a)
+ View *v = a->view;
+ for(i = 0; i < v->narea; i++)
+ if(v->area[i] == a)
return i;
return -1;
}
int
-aid2index(Tag *t, unsigned short id)
+aid2index(View *v, unsigned short id)
{
int i;
- for(i = 0; i < t->narea; i++)
- if(t->area[i]->id == id)
+ for(i = 0; i < v->narea; i++)
+ if(v->area[i]->id == id)
return i;
return -1;
}
@@ -70,29 +70,29 @@ void
select_area(Area *a, char *arg)
{
Area *new;
- Tag *t = a->tag;
+ View *v = a->view;
int i = area2index(a);
if(i == -1)
return;
if(i)
- t->revert = i;
+ v->revert = i;
if(!strncmp(arg, "toggle", 7)) {
if(i)
i = 0;
- else if(t->revert > 0 && t->revert < t->narea)
- i = t->revert;
+ else if(v->revert > 0 && v->revert < v->narea)
+ i = v->revert;
else
i = 1;
} else if(!strncmp(arg, "prev", 5)) {
if(i>0) {
if(i == 1)
- i = t->narea - 1;
+ i = v->narea - 1;
else
i--;
}
} else if(!strncmp(arg, "next", 5)) {
if(i>0) {
- if(i + 1 < t->narea)
+ if(i + 1 < v->narea)
i++;
else
i = 1;
@@ -100,14 +100,14 @@ select_area(Area *a, char *arg)
}
else {
const char *errstr;
- i = cext_strtonum(arg, 0, t->narea - 1, &errstr);
+ i = cext_strtonum(arg, 0, v->narea - 1, &errstr);
if(errstr)
return;
}
- new = t->area[i];
+ new = v->area[i];
if(new->nframe)
focus_client(new->frame[new->sel]->client);
- t->sel = i;
+ v->sel = i;
for(i = 0; i < a->nframe; i++)
draw_client(a->frame[i]->client);
}
@@ -127,7 +127,7 @@ attach_toarea(Area *a, Client *c)
static unsigned short id = 1;
Frame *f;
- if(clientoftag(a->tag, c))
+ if(clientoftag(a->view, c))
return;
f = cext_emallocz(sizeof(Frame));
f->id = id++;
@@ -153,7 +153,7 @@ void
detach_fromarea(Area *a, Client *c)
{
Frame *f;
- Tag *t = a->tag;
+ View *v = a->view;
int i;
for(i = 0; i < c->nframe; i++)
@@ -176,11 +176,11 @@ detach_fromarea(Area *a, Client *c)
arrange_area(a);
else {
if(i) {
- if(t->narea > 2)
+ if(v->narea > 2)
destroy_area(a);
- else if(!a->nframe && t->area[0]->nframe)
- t->sel = 0; /* focus floating area if it contains something */
- arrange_tag(t, True);
+ else if(!a->nframe && v->area[0]->nframe)
+ v->sel = 0; /* focus floating area if it contains something */
+ arrange_tag(v, True);
}
else if(!i && !a->nframe) {
if(c->trans) {
@@ -188,12 +188,12 @@ detach_fromarea(Area *a, Client *c)
Client *cl = win2client(c->trans);
if(cl && cl->nframe) {
a = cl->frame[cl->sel]->area;
- if(a->tag == t)
- t->sel = area2index(a);
+ if(a->view == v)
+ v->sel = area2index(a);
}
}
- else if(t->area[1]->nframe)
- t->sel = 1; /* focus first col as fallback */
+ else if(v->area[1]->nframe)
+ v->sel = 1; /* focus first col as fallback */
}
}
}
@@ -352,17 +352,17 @@ Fallthrough:
}
void
-arrange_tag(Tag *t, Bool updategeometry)
+arrange_tag(View *v, Bool updategeometry)
{
unsigned int i;
unsigned int width;
- if(t->narea == 1)
+ if(v->narea == 1)
return;
- width = rect.width / (t->narea - 1);
- for(i = 1; i < t->narea; i++) {
- Area *a = t->area[i];
+ width = rect.width / (v->narea - 1);
+ for(i = 1; i < v->narea; i++) {
+ Area *a = v->area[i];
if(updategeometry) {
a->rect.height = rect.height - brect.height;
a->rect.x = (i - 1) * width;
@@ -389,16 +389,16 @@ static void
drop_resize(Frame *f, XRectangle *new)
{
Area *west = nil, *east = nil, *a = f->area;
- Tag *t = a->tag;
+ View *v = a->view;
Frame *north = nil, *south = nil;
unsigned int i;
unsigned int min = 2 * bar_height();
Bool horiz_resize = False;
- for(i = 1; (i < t->narea) && (t->area[i] != a); i++);
+ for(i = 1; (i < v->narea) && (v->area[i] != a); i++);
/* first managed area is indexed 1, thus (i > 1) ? ... */
- west = (i > 1) ? t->area[i - 1] : nil;
- east = i + 1 < t->narea ? t->area[i + 1] : nil;
+ west = (i > 1) ? v->area[i - 1] : nil;
+ east = i + 1 < v->narea ? v->area[i + 1] : nil;
for(i = 0; (i < a->nframe) && (a->frame[i] != f); i++);
north = i ? a->frame[i - 1] : nil;
@@ -473,15 +473,15 @@ static void
drop_moving(Frame *f, XRectangle *new, XPoint * pt)
{
Area *tgt = nil, *src = f->area;
- Tag *t = src->tag;
+ View *v = src->view;
unsigned int i;
if(!pt || src->nframe < 2)
return;
- for(i = 1; (i < t->narea) &&
- !blitz_ispointinrect(pt->x, pt->y, &t->area[i]->rect); i++);
- if((tgt = ((i < t->narea) ? t->area[i] : nil))) {
+ 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))) {
if(tgt != src) {
send2area(tgt, src, f->client);
arrange_area(tgt);
diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c
@@ -63,14 +63,14 @@ update_bar_geometry()
DefaultDepth(dpy, screen));
XSync(dpy, False);
draw_bar();
- for(i = 0; i < ntag; i++) {
- for(j = 1; j < tag[i]->narea; j++) {
- Area *a = tag[i]->area[j];
+ for(i = 0; i < nview; i++) {
+ for(j = 1; j < view[i]->narea; j++) {
+ Area *a = view[i]->area[j];
a->rect.height = rect.height - brect.height;
arrange_area(a);
}
- for(j = 0; j < tag[i]->area[0]->nframe; j++) {
- Frame *f = tag[i]->area[0]->frame[j];
+ for(j = 0; j < view[i]->area[0]->nframe; j++) {
+ Frame *f = view[i]->area[0]->frame[j];
resize_client(f->client, &f->rect, False);
}
}
diff --git a/cmd/wm/client.c b/cmd/wm/client.c
@@ -82,7 +82,7 @@ focus_client(Client *c)
Frame *f = c->frame[c->sel];
int i = area2index(f->area);
- f->area->tag->sel = i;
+ f->area->view->sel = i;
f->area->sel = frame2index(f);
if(old && (old != c)) {
grab_mouse(old->win, AnyModifier, Button1);
@@ -92,7 +92,7 @@ focus_client(Client *c)
grab_mouse(c->win, Mod1Mask, Button1);
grab_mouse(c->win, Mod1Mask, Button3);
- restack_tag(f->area->tag);
+ restack_tag(f->area->view);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
draw_client(c);
@@ -317,7 +317,7 @@ gravitate(Client *c, Bool invert)
void
manage_client(Client *c)
{
- Tag *t;
+ View *v;
Client *trans;
unsigned int i;
@@ -331,16 +331,16 @@ manage_client(Client *c)
reparent_client(c, c->framewin, c->rect.x, c->rect.y);
- t = ntag ? tag[sel] : alloc_tag(def.tag);
+ v = nview ? view[sel] : alloc_tag(def.tag);
if(!c->ntag) {
- for(i = 0; i < t->ntag; i++) {
- cext_strlcpy(c->tag[i], t->tag[i], sizeof(c->tag[i]));
+ for(i = 0; i < v->ntag; i++) {
+ cext_strlcpy(c->tag[i], v->tag[i], sizeof(c->tag[i]));
c->ntag++;
}
}
else if((c->ntag == 1) && !strncmp(c->tag[0], "~", 2)) {
- for(i = 0; i < t->ntag && i + 1 < MAX_TAGS; i++) {
- cext_strlcpy(c->tag[i + 1], t->tag[i], sizeof(c->tag[i + 1]));
+ for(i = 0; i < v->ntag && i + 1 < MAX_TAGS; i++) {
+ cext_strlcpy(c->tag[i + 1], v->tag[i], sizeof(c->tag[i + 1]));
c->ntag++;
}
}
@@ -363,8 +363,8 @@ destroy_client(Client *c)
XGrabServer(dpy);
XSetErrorHandler(dummy_error_handler);
- for(i = 0; i < ntag; i++)
- detach_fromtag(tag[i], c);
+ for(i = 0; i < nview; i++)
+ detach_fromtag(view[i], c);
unmap_client(c);
@@ -381,7 +381,7 @@ destroy_client(Client *c)
update_tags();
free(c);
- if((cl = sel_client_of_tag(tag[sel])))
+ if((cl = sel_client_of_tag(view[sel])))
focus_client(cl);
XSync(dpy, False);
@@ -392,7 +392,7 @@ destroy_client(Client *c)
Client *
sel_client()
{
- return ntag ? sel_client_of_tag(tag[sel]) : nil;
+ return nview ? sel_client_of_tag(view[sel]) : nil;
}
static void
@@ -445,7 +445,7 @@ resize_client(Client *c, XRectangle *r, Bool ignore_xcall)
match_sizehints(c);
if(!ignore_xcall) {
- if(f->area->tag == tag[sel])
+ if(f->area->view == view[sel])
XMoveResizeWindow(dpy, c->framewin, f->rect.x,
f->rect.y, f->rect.width, f->rect.height);
else
@@ -498,7 +498,7 @@ send2area_client(Client *c, char *arg)
const char *errstr;
Frame *f = c->frame[c->sel];
Area *to, *a = f->area;
- Tag *t = a->tag;
+ View *v = a->view;
int i = area2index(a);
if(i == -1)
@@ -506,34 +506,34 @@ send2area_client(Client *c, char *arg)
if(!strncmp(arg, "new", 4) && i) {
if(a->nframe == 1)
return;
- to = alloc_area(t);
- arrange_tag(t, True);
+ to = alloc_area(v);
+ arrange_tag(v, True);
}
else if(!strncmp(arg, "prev", 5) && i) {
if(i == 1)
- to = t->area[t->narea - 1];
+ to = v->area[v->narea - 1];
else
- to = t->area[i - 1];
+ to = v->area[i - 1];
}
else if(!strncmp(arg, "next", 5) && i) {
- if(i < t->narea - 1)
- to = t->area[i + 1];
+ if(i < v->narea - 1)
+ to = v->area[i + 1];
else
- to = t->area[1];
+ to = v->area[1];
}
else if(!strncmp(arg, "toggle", 7)) {
if(i)
- to = t->area[0];
- else if(c->revert && c->revert != t->area[0])
+ to = v->area[0];
+ else if(c->revert && c->revert != v->area[0])
to = c->revert;
else
- to = t->area[1];
+ to = v->area[1];
}
else {
- i = cext_strtonum(arg, 0, t->narea - 1, &errstr);
+ i = cext_strtonum(arg, 0, v->narea - 1, &errstr);
if(errstr)
return;
- to = t->area[i];
+ to = v->area[i];
}
send2area(to, a, c);
}
@@ -558,14 +558,14 @@ void
focus(Client *c)
{
Frame *f = c->nframe ? c->frame[c->sel] : nil;
- Tag *t;
+ View *v;
if(!f)
return;
- t = f->area->tag;
- if(tag[sel] != t)
- focus_tag(t);
+ v = f->area->view;
+ if(view[sel] != v)
+ focus_tag(v);
focus_client(c);
}
diff --git a/cmd/wm/event.c b/cmd/wm/event.c
@@ -147,7 +147,7 @@ handle_configurerequest(XEvent *e)
wc.border_width = 1;
wc.sibling = None;
wc.stack_mode = ev->detail;
- if(f->area->tag != tag[sel])
+ if(f->area->view != view[sel])
f->rect.x += 2 * rect.width;
XConfigureWindow(dpy, c->framewin, ev->value_mask, &wc);
configure_client(c);
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -130,9 +130,9 @@ decode_qpath(Qid *qid, unsigned char *type, int *i1, int *i2, int *i3)
}
}
if(i2id && (*i1 != -1)) {
- *i2 = aid2index(tag[*i1], i2id);
+ *i2 = aid2index(view[*i1], i2id);
if(i3id && (*i2 != -1))
- *i3 = frid2index(tag[*i1]->area[*i2], i3id);
+ *i3 = frid2index(view[*i1]->area[*i2], i3id);
}
}
}
@@ -164,7 +164,7 @@ qid2name(Qid *qid)
case FsDarea:
if(i1 == -1 || i2 == -1)
return nil;
- if(tag[i1]->sel == i2)
+ if(view[i1]->sel == i2)
return "sel";
snprintf(buf, sizeof(buf), "%u", i2);
return buf;
@@ -178,7 +178,7 @@ qid2name(Qid *qid)
case FsDclient:
if(i1 == -1 || i2 == -1 || i3 == -1)
return nil;
- if(tag[i1]->area[i2]->sel == i3)
+ if(view[i1]->area[i2]->sel == i3)
return "sel";
snprintf(buf, sizeof(buf), "%u", i3);
return buf;
@@ -331,13 +331,13 @@ mkqid(Qid *dir, char *wname, Qid *new)
break;
case FsDview:
new->type = IXP_QTDIR;
- new->path = mkqpath(FsDview, ntag ? tag[sel]->id : 0, 0, 0);
+ new->path = mkqpath(FsDview, nview ? view[sel]->id : 0, 0, 0);
break;
case FsDarea:
if(dir_i1 == -1 || dir_type != FsDview)
return -1;
{
- Tag *p = tag[dir_i1];
+ View *p = view[dir_i1];
new->type = IXP_QTDIR;
if(!strncmp(wname, "sel", 4)) {
new->path = mkqpath(FsDarea, p->id, p->area[p->sel]->id, 0);
@@ -354,7 +354,7 @@ mkqid(Qid *dir, char *wname, Qid *new)
if(dir_i1 == -1 || dir_i2 == -1 || dir_type != FsDarea)
return -1;
{
- Tag *p = tag[dir_i1];
+ View *p = view[dir_i1];
Area *a = p->area[dir_i2];
new->type = IXP_QTDIR;
if(!strncmp(wname, "sel", 4)) {
@@ -500,7 +500,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
break;
case FsFgeom:
if(dir_type == FsDclient) {
- f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
+ f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
snprintf(buf, sizeof(buf), "%d %d %d %d", f->rect.x, f->rect.y,
f->rect.width, f->rect.height);
}
@@ -517,7 +517,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
break;
case FsFclass:
if(dir_type == FsDclient) {
- f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
+ f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
return mkstat(stat, dir, wname, strlen(f->client->classinst), DMREAD);
}
else
@@ -525,7 +525,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
break;
case FsFname:
if(dir_type == FsDclient) {
- f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
+ f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
return mkstat(stat, dir, wname, strlen(f->client->name), DMREAD);
}
else
@@ -534,7 +534,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
case FsFtags:
switch(dir_type) {
case FsDclient:
- f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
+ f = view[dir_i1]->area[dir_i2]->frame[dir_i3];
tags2str(buf, sizeof(buf), f->client->tag, f->client->ntag);
return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE);
break;
@@ -563,7 +563,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
return mkstat(stat, dir, wname, (dir_i1 == nlabel) ? 0 : strlen(label[dir_i1]->data), DMREAD | DMWRITE);
break;
case FsFmode:
- return mkstat(stat, dir, wname, strlen(mode2str(tag[dir_i1]->area[dir_i2]->mode)), DMREAD | DMWRITE);
+ return mkstat(stat, dir, wname, strlen(mode2str(view[dir_i1]->area[dir_i2]->mode)), DMREAD | DMWRITE);
break;
case FsFcolors:
case FsFselcolors:
@@ -792,11 +792,11 @@ xread(IXPConn *c, Fcall *fcall)
case FsDview:
/* jump to offset */
len = type2stat(&stat, "tag", &m->qid);
- if(ntag) {
+ if(nview) {
len += type2stat(&stat, "ctl", &m->qid);
- if(tag[i1]->narea)
+ if(view[i1]->narea)
len += type2stat(&stat, "sel", &m->qid);
- for(i = 0; i < tag[i1]->narea; i++) {
+ for(i = 0; i < view[i1]->narea; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len += type2stat(&stat, buf, &m->qid);
if(len <= fcall->offset)
@@ -804,7 +804,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
}
/* offset found, proceeding */
- for(; i < tag[i1]->narea; i++) {
+ for(; i < view[i1]->narea; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@@ -819,9 +819,9 @@ xread(IXPConn *c, Fcall *fcall)
len = type2stat(&stat, "ctl", &m->qid);
if(i2)
len += type2stat(&stat, "mode", &m->qid);
- if(tag[i1]->area[i2]->nframe)
+ if(view[i1]->area[i2]->nframe)
len += type2stat(&stat, "sel", &m->qid);
- for(i = 0; i < tag[i1]->area[i2]->nframe; i++) {
+ for(i = 0; i < view[i1]->area[i2]->nframe; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len += type2stat(&stat, buf, &m->qid);
if(len <= fcall->offset)
@@ -829,7 +829,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
}
/* offset found, proceeding */
- for(; i < tag[i1]->area[i2]->nframe; i++) {
+ for(; i < view[i1]->area[i2]->nframe; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@@ -972,14 +972,14 @@ xread(IXPConn *c, Fcall *fcall)
case FsDview:
fcall->count = type2stat(&stat, "tag", &m->qid);
p = ixp_enc_stat(p, &stat);
- if(ntag) {
+ if(nview) {
fcall->count += type2stat(&stat, "ctl", &m->qid);
p = ixp_enc_stat(p, &stat);
- if(tag[i1]->narea) {
+ if(view[i1]->narea) {
fcall->count += type2stat(&stat, "sel", &m->qid);
p = ixp_enc_stat(p, &stat);
}
- for(i = 0; i < tag[i1]->narea; i++) {
+ for(i = 0; i < view[i1]->narea; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@@ -996,11 +996,11 @@ xread(IXPConn *c, Fcall *fcall)
fcall->count += type2stat(&stat, "mode", &m->qid);
p = ixp_enc_stat(p, &stat);
}
- if(tag[i1]->area[i2]->nframe) {
+ if(view[i1]->area[i2]->nframe) {
fcall->count += type2stat(&stat, "sel", &m->qid);
p = ixp_enc_stat(p, &stat);
}
- for(i = 0; i < tag[i1]->area[i2]->nframe; i++) {
+ for(i = 0; i < view[i1]->area[i2]->nframe; i++) {
snprintf(buf, sizeof(buf), "%u", i);
len = type2stat(&stat, buf, &m->qid);
if(fcall->count + len > fcall->iounit)
@@ -1037,7 +1037,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsFgeom:
if(m->qid.dir_type == FsDclient) {
- f = tag[i1]->area[i2]->frame[i3];
+ f = view[i1]->area[i2]->frame[i3];
snprintf(buf, sizeof(buf), "%d %d %d %d", f->rect.x, f->rect.y,
f->rect.width, f->rect.height);
}
@@ -1056,8 +1056,8 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsFclass:
if(m->qid.dir_type == FsDclient) {
- if((fcall->count = strlen(tag[i1]->area[i2]->frame[i3]->client->classinst)))
- memcpy(p, tag[i1]->area[i2]->frame[i3]->client->classinst, fcall->count);
+ if((fcall->count = strlen(view[i1]->area[i2]->frame[i3]->client->classinst)))
+ memcpy(p, view[i1]->area[i2]->frame[i3]->client->classinst, fcall->count);
}
else {
if((fcall->count = strlen(client[i1]->classinst)))
@@ -1066,8 +1066,8 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsFname:
if(m->qid.dir_type == FsDclient) {
- if((fcall->count = strlen(tag[i1]->area[i2]->frame[i3]->client->name)))
- memcpy(p, tag[i1]->area[i2]->frame[i3]->client->name, fcall->count);
+ if((fcall->count = strlen(view[i1]->area[i2]->frame[i3]->client->name)))
+ memcpy(p, view[i1]->area[i2]->frame[i3]->client->name, fcall->count);
}
else {
if((fcall->count = strlen(client[i1]->name)))
@@ -1078,7 +1078,7 @@ xread(IXPConn *c, Fcall *fcall)
switch(m->qid.dir_type) {
case FsDclient:
{
- Client *c = tag[i1]->area[i2]->frame[i3]->client;
+ Client *c = view[i1]->area[i2]->frame[i3]->client;
tags2str(buf, sizeof(buf), c->tag, c->ntag);
if((fcall->count = strlen(buf)))
memcpy(p, buf, fcall->count);
@@ -1154,7 +1154,7 @@ xread(IXPConn *c, Fcall *fcall)
case FsFmode:
if(!i2)
return Enofile;
- snprintf(buf, sizeof(buf), "%s", mode2str(tag[i1]->area[i2]->mode));
+ snprintf(buf, sizeof(buf), "%s", mode2str(view[i1]->area[i2]->mode));
fcall->count = strlen(buf);
memcpy(p, buf, fcall->count);
break;
@@ -1190,7 +1190,7 @@ 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->tag == tag[sel])
+ if(client[i]->frame[j]->area->view == view[sel])
draw_client(client[i]);
}
@@ -1227,18 +1227,18 @@ xwrite(IXPConn *c, Fcall *fcall)
break;
case FsDview:
if(!strncmp(buf, "select ", 7))
- if(ntag)
- select_area(tag[i1]->area[tag[i1]->sel], &buf[7]);
+ if(nview)
+ select_area(view[i1]->area[view[i1]->sel], &buf[7]);
break;
case FsDarea:
if(!strncmp(buf, "select ", 7)) {
- Area *a = tag[i1]->area[i2];
+ Area *a = view[i1]->area[i2];
if(a->nframe)
select_client(a->frame[a->sel]->client, &buf[7]);
}
break;
case FsDclient:
- f = tag[i1]->area[i2]->frame[i3];
+ f = view[i1]->area[i2]->frame[i3];
if(!strncmp(buf, "kill", 5))
kill_client(f->client);
else if(!strncmp(buf, "sendto ", 7))
@@ -1283,7 +1283,7 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(buf, fcall->data, fcall->count);
buf[fcall->count] = 0;
if(m->qid.dir_type == FsDclient) {
- f = tag[i1]->area[i2]->frame[i3];
+ f = view[i1]->area[i2]->frame[i3];
f->client->ntag = str2tags(f->client->tag, buf);
}
else
@@ -1296,7 +1296,7 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(buf, fcall->data, fcall->count);
buf[fcall->count] = 0;
if(m->qid.dir_type == FsDclient) {
- f = tag[i1]->area[i2]->frame[i3];
+ f = view[i1]->area[i2]->frame[i3];
blitz_strtorect(&rect, &f->rect, buf);
if(i2)
resize_area(f->client, &f->rect, nil);
@@ -1396,8 +1396,8 @@ xwrite(IXPConn *c, Fcall *fcall)
buf[fcall->count] = 0;
if((i = str2mode(buf)) == -1)
return Ebadvalue;
- tag[i1]->area[i2]->mode = i;
- arrange_area(tag[i1]->area[i2]);
+ view[i1]->area[i2]->mode = i;
+ arrange_area(view[i1]->area[i2]);
break;
case FsFevent:
if(fcall->count > sizeof(buf))
diff --git a/cmd/wm/kb.c b/cmd/wm/kb.c
@@ -182,14 +182,14 @@ emulate_key_press(unsigned long mod, KeyCode key)
}
static Key **
-match_keys(Key **t, unsigned int n, unsigned long mod, KeyCode keycode, Bool next, unsigned int *nres)
+match_keys(Key **keys, unsigned int n, unsigned long mod, KeyCode keycode, Bool next, unsigned int *nres)
{
Key **result = nil;
unsigned int ressz = 0;
unsigned int i = 0;
*nres = 0;
for(i = 0; i < n; i++) {
- Key *k = next ? t[i]->next : t[i];
+ Key *k = next ? keys[i]->next : keys[i];
if(k && (k->mod == mod) && (k->key == keycode)) {
result = (Key **)cext_array_attach((void **)result, k, sizeof(Key *), &ressz);
(*nres)++;
diff --git a/cmd/wm/mouse.c b/cmd/wm/mouse.c
@@ -244,7 +244,7 @@ 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->tag,
+ XRectangle *rects = rectangles(c->frame[c->sel]->area->view,
area2index(c->frame[c->sel]->area) == 0, &num);
XRectangle frect = c->frame[c->sel]->rect;
XPoint pt;
@@ -493,7 +493,7 @@ 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->tag,
+ 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 origin = frect;
diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c
@@ -10,7 +10,7 @@
#include "wm.h"
-static Bool
+Bool
istag(char **tags, unsigned int ntags, char *tag)
{
unsigned int i;
@@ -20,238 +20,28 @@ istag(char **tags, unsigned int ntags, char *tag)
return False;
}
-Tag *
-alloc_tag(char *name)
-{
- static unsigned short id = 1;
- Tag *t = cext_emallocz(sizeof(Tag));
-
- t->id = id++;
- t->ntag = str2tags(t->tag, name);
- alloc_area(t);
- alloc_area(t);
- tag = (Tag **)cext_array_attach((void **)tag, t, sizeof(Tag *), &tagsz);
- ntag++;
- focus_tag(t);
- return t;
-}
-
-static void
-destroy_tag(Tag *t)
-{
- while(t->narea)
- destroy_area(t->area[0]);
-
- cext_array_detach((void **)tag, t, &tagsz);
- ntag--;
- if(sel >= ntag)
- sel = 0;
-
- free(t);
-}
-
-int
-tag2index(Tag *t)
-{
- int i;
- for(i = 0; i < ntag; i++)
- if(t == tag[i])
- return i;
- return -1;
-}
-
-static void
-update_frame_selectors(Tag *t)
-{
- 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->tag == t)
- client[i]->sel = j;
-}
-
-void
-focus_tag(Tag *t)
-{
- char buf[256];
- char name[256];
- unsigned int i;
-
- if(!ntag)
- return;
-
- XGrabServer(dpy);
- sel = tag2index(t);
-
- update_frame_selectors(t);
-
- /* 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];
- if(f->area->tag == t) {
- 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]);
- }
- else
- XMoveWindow(dpy, client[i]->framewin, 2 * rect.width + f->rect.x, f->rect.y);
- }
- tags2str(name, sizeof(name), t->tag, t->ntag);
- snprintf(buf, sizeof(buf), "FocusTag %s\n", name);
- write_event(buf, True);
- XSync(dpy, False);
- XUngrabServer(dpy);
-}
-
-XRectangle *
-rectangles(Tag *t, Bool isfloat, unsigned int *num)
-{
- XRectangle *result = nil;
- unsigned int i;
-
- *num = 0;
- if(isfloat)
- *num = t->area[0]->nframe;
- else {
- for(i = 1; i < t->narea; i++)
- *num += t->area[i]->nframe;
- }
-
- if(*num) {
- result = cext_emallocz(*num * sizeof(XRectangle));
- if(isfloat) {
- for(i = 0; i < *num; i++)
- result[i] = t->area[0]->frame[0]->rect;
- }
- else {
- unsigned int j, n = 0;
- for(i = 1; i < t->narea; i++) {
- for(j = 0; j < t->area[i]->nframe; j++)
- result[n++] = t->area[i]->frame[j]->rect;
- }
- }
- }
- return result;
-}
-
-int
-tid2index(unsigned short id)
-{
- int i;
- for(i = 0; i < ntag; i++)
- if(tag[i]->id == id)
- return i;
- return -1;
-}
-
-Tag *
-get_tag(char *name)
-{
- unsigned int i, j, ntags;
- Tag *t = nil;
- char tname[256];
- char tags[MAX_TAGS][MAX_TAGLEN];
-
- for(i = 0; i < ntag; i++) {
- t = tag[i];
- tags2str(tname, sizeof(tname), t->tag, t->ntag);
- if(!strncmp(tname, name, strlen(name)))
- return t;
- }
-
- ntags = str2tags(tags, name);
- for(i = 0; i < nclient; i++)
- for(j = 0; j < ntags; j++)
- if(clienthastag(client[i], tags[j]))
- goto Createtag;
- return nil;
-
-Createtag:
- t = alloc_tag(name);
- for(i = 0; i < nclient; i++)
- for(j = 0; j < ntags; j++)
- if(clienthastag(client[i], tags[j]) && !clientoftag(t, client[i]))
- attach_totag(t, client[i]);
- return t;
-}
-
-static Bool
-hasclient(Tag *t)
-{
- unsigned int i;
- for(i = 0; i < t->narea; i++)
- if(t->area[i]->nframe)
- return True;
- return False;
-}
-
-void
-select_tag(char *arg)
-{
- int i;
- Client *c;
- Tag *t = get_tag(arg);
-
- if(!t)
- return;
- cext_strlcpy(def.tag, arg, sizeof(def.tag));
- if(!istag(ctag, nctag, arg)) {
- char buf[256];
- ctag = (char **)cext_array_attach((void **)ctag, strdup(arg),
- sizeof(char *), &ctagsz);
- nctag++;
- snprintf(buf, sizeof(buf), "NewTag %s\n", arg);
- write_event(buf, True);
- }
- focus_tag(t);
-
- /* cleanup on select */
- for(i = 0; i < ntag; i++)
- if(!hasclient(tag[i])) {
- destroy_tag(tag[i]);
- i--;
- }
-
- if((c = sel_client_of_tag(t)))
- focus_client(c);
-}
-
-Bool
-clientoftag(Tag *t, Client *c)
-{
- unsigned int i;
- for(i = 0; i < t->narea; i++)
- if(clientofarea(t->area[i], c))
- return True;
- return False;
-}
-
static void
-organize_client(Tag *t, Client *c)
+organize_client(View *v, Client *c)
{
unsigned int i;
Bool hastag = False;
- for(i = 0; i < t->ntag; i++) {
- if(clienthastag(c, t->tag[i]))
+ for(i = 0; i < v->ntag; i++) {
+ if(clienthastag(c, v->tag[i]))
hastag = True;
break;
}
if(hastag) {
- if(!clientoftag(t, c)) {
+ if(!clientoftag(v, c)) {
/*fprintf(stderr, "org attach %s?\n", c->name);*/
- attach_totag(t, c);
+ attach_totag(v, c);
}
}
else {
- if(clientoftag(t, c)) {
+ if(clientoftag(v, c)) {
/*fprintf(stderr, "org detach %s?\n", c->name);*/
- detach_fromtag(t, c);
+ detach_fromtag(v, c);
}
}
}
@@ -276,9 +66,9 @@ update_tags()
}
}
- for(i = 0; i < ntag; i++)
- if(hasclient(tag[i])) {
- tags2str(buf, sizeof(buf), tag[i]->tag, tag[i]->ntag);
+ for(i = 0; i < nview; i++)
+ if(hasclient(view[i])) {
+ tags2str(buf, sizeof(buf), view[i]->tag, view[i]->ntag);
if(!istag(newctag, nnewctag, buf)) {
newctag = (char **)cext_array_attach((void **)newctag, strdup(buf),
sizeof(char *), &newctagsz);
@@ -305,91 +95,20 @@ update_tags()
nctag = nnewctag;
ctagsz = newctagsz;
- for(i = 0; ntag && (i < nclient); i++) {
- for(j = 0; j < ntag; j++) {
- Tag *t = tag[j];
+ for(i = 0; nview && (i < nclient); i++) {
+ for(j = 0; j < nview; j++) {
+ View *v = view[j];
if(j == sel)
continue;
- organize_client(t, client[i]);
+ organize_client(v, client[i]);
}
- organize_client(tag[sel], client[i]);
+ organize_client(view[sel], client[i]);
}
- if(!ntag && nctag)
+ if(!nview && nctag)
select_tag(ctag[0]);
}
-void
-detach_fromtag(Tag *t, Client *c)
-{
- int i;
- Client *cl;
- for(i = 0; i < t->narea; i++) {
- if(clientofarea(t->area[i], c)) {
- detach_fromarea(t->area[i], c);
- XMoveWindow(dpy, c->framewin, 2 * rect.width, 0);
- }
- }
- if((cl = sel_client_of_tag(t)))
- focus_client(cl);
-}
-
-void
-attach_totag(Tag *t, Client *c)
-{
- Area *a;
-
- if(c->trans || clienthastag(c, "~"))
- a = t->area[0];
- else
- a = t->area[t->sel];
-
- attach_toarea(a, c);
- map_client(c);
- XMapWindow(dpy, c->framewin);
- if(t == tag[sel])
- focus_client(c);
-}
-
-Client *
-sel_client_of_tag(Tag *t)
-{
- if(t) {
- Area *a = t->narea ? t->area[t->sel] : nil;
- return (a && a->nframe) ? a->frame[a->sel]->client : nil;
- }
- return nil;
-}
-
-void
-restack_tag(Tag *t)
-{
- unsigned int i, j, n = 0;
- static Window *wins = nil;
- static unsigned int winssz = 0;
-
- if(nclient > winssz) {
- winssz = 2 * nclient;
- free(wins);
- wins = cext_emallocz(sizeof(Window) * winssz);
- }
-
- for(i = 0; i < t->narea; i++) {
- Area *a = t->area[i];
- if(a->nframe) {
- wins[n++] = a->frame[a->sel]->client->framewin;
- for(j = 0; j < a->nframe; j++) {
- if(j == a->sel)
- continue;
- wins[n++] = a->frame[j]->client->framewin;
- }
- }
- }
-
- if(n)
- XRestackWindows(dpy, wins, n);
-}
-
unsigned int
str2tags(char tags[MAX_TAGS][MAX_TAGLEN], const char *stags)
{
diff --git a/cmd/wm/view.c b/cmd/wm/view.c
@@ -0,0 +1,292 @@
+/*
+ * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xatom.h>
+
+#include "wm.h"
+
+View *
+alloc_tag(char *name)
+{
+ static unsigned short id = 1;
+ View *v = cext_emallocz(sizeof(View));
+
+ v->id = id++;
+ v->ntag = str2tags(v->tag, name);
+ alloc_area(v);
+ alloc_area(v);
+ view = (View **)cext_array_attach((void **)view, v, sizeof(View *), &viewsz);
+ nview++;
+ focus_tag(v);
+ return v;
+}
+
+static void
+destroy_tag(View *v)
+{
+ while(v->narea)
+ destroy_area(v->area[0]);
+
+ cext_array_detach((void **)view, v, &viewsz);
+ nview--;
+ if(sel >= nview)
+ sel = 0;
+
+ free(v);
+}
+
+int
+tag2index(View *v)
+{
+ int i;
+ for(i = 0; i < nview; i++)
+ if(v == view[i])
+ return i;
+ return -1;
+}
+
+static void
+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;
+}
+
+void
+focus_tag(View *v)
+{
+ char buf[256];
+ char name[256];
+ unsigned int i;
+
+ if(!nview)
+ return;
+
+ XGrabServer(dpy);
+ sel = tag2index(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];
+ 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]);
+ }
+ else
+ XMoveWindow(dpy, client[i]->framewin, 2 * rect.width + f->rect.x, f->rect.y);
+ }
+ tags2str(name, sizeof(name), v->tag, v->ntag);
+ snprintf(buf, sizeof(buf), "FocusTag %s\n", name);
+ write_event(buf, True);
+ XSync(dpy, False);
+ XUngrabServer(dpy);
+}
+
+XRectangle *
+rectangles(View *v, Bool isfloat, unsigned int *num)
+{
+ XRectangle *result = nil;
+ unsigned int i;
+
+ *num = 0;
+ if(isfloat)
+ *num = v->area[0]->nframe;
+ else {
+ for(i = 1; i < v->narea; i++)
+ *num += v->area[i]->nframe;
+ }
+
+ if(*num) {
+ result = cext_emallocz(*num * sizeof(XRectangle));
+ if(isfloat) {
+ for(i = 0; i < *num; i++)
+ result[i] = v->area[0]->frame[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;
+ }
+ }
+ }
+ return result;
+}
+
+int
+tid2index(unsigned short id)
+{
+ int i;
+ for(i = 0; i < nview; i++)
+ if(view[i]->id == id)
+ return i;
+ return -1;
+}
+
+View *
+get_tag(char *name)
+{
+ unsigned int i, j, ntags;
+ View *v = nil;
+ char vname[256];
+ char tags[MAX_TAGS][MAX_TAGLEN];
+
+ for(i = 0; i < nview; i++) {
+ v = view[i];
+ tags2str(vname, sizeof(vname), v->tag, v->ntag);
+ if(!strncmp(vname, name, strlen(name)))
+ return v;
+ }
+
+ ntags = str2tags(tags, name);
+ for(i = 0; i < nclient; i++)
+ for(j = 0; j < ntags; j++)
+ if(clienthastag(client[i], tags[j]))
+ goto Createtag;
+ return nil;
+
+Createtag:
+ v = alloc_tag(name);
+ for(i = 0; i < nclient; i++)
+ for(j = 0; j < ntags; j++)
+ if(clienthastag(client[i], tags[j]) && !clientoftag(v, client[i]))
+ attach_totag(v, client[i]);
+ return v;
+}
+
+Bool
+hasclient(View *v)
+{
+ unsigned int i;
+ for(i = 0; i < v->narea; i++)
+ if(v->area[i]->nframe)
+ return True;
+ return False;
+}
+
+void
+select_tag(char *arg)
+{
+ int i;
+ Client *c;
+ View *v = get_tag(arg);
+
+ if(!v)
+ return;
+ cext_strlcpy(def.tag, arg, sizeof(def.tag));
+ if(!istag(ctag, nctag, arg)) {
+ char buf[256];
+ ctag = (char **)cext_array_attach((void **)ctag, strdup(arg),
+ sizeof(char *), &ctagsz);
+ nctag++;
+ snprintf(buf, sizeof(buf), "NewTag %s\n", arg);
+ write_event(buf, True);
+ }
+ focus_tag(v);
+
+ /* cleanup on select */
+ for(i = 0; i < nview; i++)
+ if(!hasclient(view[i])) {
+ destroy_tag(view[i]);
+ i--;
+ }
+
+ if((c = sel_client_of_tag(v)))
+ focus_client(c);
+}
+
+Bool
+clientoftag(View *v, Client *c)
+{
+ unsigned int i;
+ for(i = 0; i < v->narea; i++)
+ if(clientofarea(v->area[i], c))
+ return True;
+ return False;
+}
+
+void
+detach_fromtag(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);
+ XMoveWindow(dpy, c->framewin, 2 * rect.width, 0);
+ }
+ }
+ if((cl = sel_client_of_tag(v)))
+ focus_client(cl);
+}
+
+void
+attach_totag(View *v, Client *c)
+{
+ Area *a;
+
+ if(c->trans || clienthastag(c, "~"))
+ a = v->area[0];
+ else
+ a = v->area[v->sel];
+
+ attach_toarea(a, c);
+ map_client(c);
+ XMapWindow(dpy, c->framewin);
+ if(v == view[sel])
+ focus_client(c);
+}
+
+Client *
+sel_client_of_tag(View *v)
+{
+ if(v) {
+ Area *a = v->narea ? v->area[v->sel] : nil;
+ return (a && a->nframe) ? a->frame[a->sel]->client : nil;
+ }
+ return nil;
+}
+
+void
+restack_tag(View *v)
+{
+ unsigned int i, j, n = 0;
+ static Window *wins = nil;
+ static unsigned int winssz = 0;
+
+ if(nclient > winssz) {
+ winssz = 2 * nclient;
+ 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++) {
+ if(j == a->sel)
+ continue;
+ wins[n++] = a->frame[j]->client->framewin;
+ }
+ }
+ }
+
+ if(n)
+ XRestackWindows(dpy, wins, n);
+}
diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c
@@ -296,8 +296,8 @@ main(int argc, char *argv[])
ixp_server_open_conn(&srv, ConnectionNumber(dpy), check_x_event, nil);
init_x_event_handler();
- nctag = ctagsz = ntag = nclient = tagsz = clientsz = sel = 0;
- tag = nil;
+ nctag = ctagsz = nview = nclient = viewsz = clientsz = sel = 0;
+ view = nil;
ctag = nil;
client = nil;
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -75,12 +75,12 @@ enum {
#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask)
#define WM_PROTOCOL_DELWIN 1
-typedef struct Tag Tag;
+typedef struct View View;
typedef struct Area Area;
typedef struct Frame Frame;
typedef struct Client Client;
-struct Tag {
+struct View {
char tag[MAX_TAGS][MAX_TAGLEN];
unsigned int ntag;
unsigned short id;
@@ -94,7 +94,7 @@ struct Tag {
struct Area {
unsigned short id;
Frame **frame;
- Tag *tag;
+ View *view;
unsigned int framesz;
unsigned int sel;
unsigned int nframe;
@@ -166,9 +166,9 @@ typedef struct {
} Default;
/* global variables */
-Tag **tag;
-unsigned int ntag;
-unsigned int tagsz;
+View **view;
+unsigned int nview;
+unsigned int viewsz;
unsigned int sel;
Client **client;
unsigned int nclient;
@@ -205,15 +205,15 @@ Cursor cursor[CurLast];
unsigned int valid_mask, num_lock_mask;
/* area.c */
-Area *alloc_area(Tag *t);
+Area *alloc_area(View *t);
void destroy_area(Area *a);
int area2index(Area *a);
-int aid2index(Tag *t, unsigned short id);
+int aid2index(View *t, unsigned short id);
void select_area(Area *a, char *arg);
void send2area(Area *to, Area *from, Client *c);
void attach_toarea(Area *a, Client *c);
void detach_fromarea(Area *a, Client *c);
-void arrange_tag(Tag *t, Bool updategeometry);
+void arrange_tag(View *t, Bool updategeometry);
void arrange_area(Area *a);
void resize_area(Client *c, XRectangle *r, XPoint *pt);
int str2mode(char *arg);
@@ -284,21 +284,25 @@ void ungrab_mouse(Window w, unsigned long mod, unsigned int button);
void match_tags(Client *c);
/* tag.c */
-Tag *alloc_tag(char *name);
-void focus_tag(Tag *t);
-XRectangle *rectangles(Tag *t, Bool isfloat, unsigned int *num);
-int tid2index(unsigned short id);
-void select_tag(char *arg);
-int tag2index(Tag *t);
-void update_tags();
-Bool clientoftag(Tag *t, Client *c);
-void detach_fromtag(Tag *t, Client *c);
-void attach_totag(Tag *t, Client *c);
-Client *sel_client_of_tag(Tag *t);
-void restack_tag(Tag *t);
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 **tags, unsigned int ntags, char *tag);
+void update_tags();
+
+/* view */
+View *alloc_tag(char *name);
+void focus_tag(View *v);
+XRectangle *rectangles(View *v, Bool isfloat, unsigned int *num);
+int tid2index(unsigned short id);
+void select_tag(char *arg);
+int tag2index(View *v);
+Bool clientoftag(View *v, Client *c);
+void detach_fromtag(View *v, Client *c);
+void attach_totag(View *v, Client *c);
+Client *sel_client_of_tag(View *v);
+void restack_tag(View *v);
+Bool hasclient(View *v);
/* wm.c */
void scan_wins();