commit 1b312231d6d404940017caade450d6b8fed64ab2
parent 829a64e302e9c60860c709aeb03967980159cbab
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Fri, 24 Mar 2006 13:36:35 +0100
finished internalized tag selector for bar
Diffstat:
6 files changed, 107 insertions(+), 56 deletions(-)
diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c
@@ -80,10 +80,9 @@ update_bar_geometry()
void
draw_bar()
{
- unsigned int i = 0;
- unsigned int x = 0, w = 0;
- char name[256];
+ unsigned int i = 0, n = 0, x = 0, w = 0;
Draw d = { 0 };
+ Label *l = nil;
d.align = WEST;
d.gc = bargc;
@@ -95,60 +94,61 @@ draw_bar()
d.color = def.norm;
blitz_drawlabel(dpy, &d);
blitz_drawborder(dpy, &d);
- if(ntag) {
- for(i = 0; i < nview; i++) {
- View *v = view[i];
- tags2str(name, sizeof(name), v->tag, v->ntag);
- d.data = name;
- if(i == sel)
- d.color = def.sel;
- else
- d.color = def.norm;
- d.rect.x = x;
- d.rect.width = brect.height;
- if(strlen(name))
- d.rect.width += XTextWidth(xfont, name, strlen(name));
- blitz_drawlabel(dpy, &d);
- blitz_drawborder(dpy, &d);
- x += d.rect.width;
- }
+
+ if(!nlabel)
+ return;
+ for(i = 0; (i < nlabel) && label[i]->intern; i++) {
+ l = label[i];
+ if(nview && !strncmp(l->data, def.tag, sizeof(l->data)))
+ l->color = def.sel;
+ else
+ l->color = def.norm;
+ l->rect.y = 0;
+ l->rect.x = x;
+ l->rect.width = l->rect.height = brect.height;
+ if(strlen(l->name))
+ l->rect.width += XTextWidth(xfont, l->name, strlen(l->name));
+ x += l->rect.width;
}
- if(nlabel) {
- for(i = 0; i < nlabel; i++) {
- Label *l = label[i];
- l->rect.x = x;
- l->rect.y = 0;
- l->rect.height = brect.height;
- l->rect.width = brect.height;
- if(strlen(l->data))
- l->rect.width += XTextWidth(xfont, l->data, strlen(l->data));
- w += l->rect.width;
- }
+ if(i)
+ n = i;
+ for(; i < nlabel; i++) {
+ l = label[i];
+ l->rect.x = x;
+ l->rect.y = 0;
+ l->rect.height = brect.height;
+ l->rect.width = brect.height;
+ if(strlen(l->data))
+ l->rect.width += XTextWidth(xfont, l->data, strlen(l->data));
+ w += l->rect.width;
+ }
- if(w >= brect.width - x) {
- /* failsafe mode, give all labels same width */
- w = (brect.width - x) / nlabel;
- for(i = 0; i < nlabel; i++) {
- label[i]->rect.x = x + i * w;
- label[i]->rect.width = w;
- }
- i--;
- label[i]->rect.width = brect.width - label[i]->rect.x;
- }
- else {
- label[0]->rect.x = brect.width - w;
- for(i = 1; i < nlabel; i++)
- label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width;
+ if(w >= brect.width - x) {
+ /* failsafe mode, give all labels same width */
+ w = (brect.width - x) / (nlabel - n);
+ for(i = n; i < nlabel; i++) {
+ l = label[i];
+ l->rect.x = x + i * w;
+ l->rect.width = w;
}
+ i--;
+ label[i]->rect.width = brect.width - label[i]->rect.x;
+ }
+ else {
+ label[n]->rect.x = brect.width - w;
+ for(i = n + 1; i < nlabel; i++)
+ label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width;
+ }
- for(i = 0; i < nlabel; i++) {
- d.color = label[i]->color;
- d.rect = label[i]->rect;
- d.data = label[i]->data;
- blitz_drawlabel(dpy, &d);
- blitz_drawborder(dpy, &d);
- }
+ for(i = 0; i < nlabel; i++) {
+ l = label[i];
+ fprintf(stderr, "%d=i %d %d %d %d\n", l->intern, l->rect.x, l->rect.y, l->rect.width, l->rect.height);
+ d.color = l->color;
+ d.rect = l->rect;
+ d.data = l->data;
+ blitz_drawlabel(dpy, &d);
+ blitz_drawborder(dpy, &d);
}
XCopyArea(dpy, barpmap, barwin, bargc, 0, 0, brect.width, brect.height, 0, 0);
XSync(dpy, False);
@@ -186,3 +186,32 @@ name2label(const char *name)
return label[i];
return nil;
}
+
+void
+update_bar_tags()
+{
+ unsigned int i;
+ char vname[256];
+ Label *l = nil;
+
+ for(i = 0; (i < nlabel) && label[i]->intern; i++) {
+ l = label[i];
+ if(!istag(l->name) && !name2view(l->name)) {
+ destroy_label(l);
+ i--;
+ }
+ }
+ for(i = 0; i < ntag; i++) {
+ l = get_label(tag[i]);
+ l->intern = True;
+ cext_strlcpy(l->data, tag[i], sizeof(l->data));
+ }
+ for(i = 0; i < nview; i++) {
+ View *v = view[i];
+ tags2str(vname, sizeof(vname), v->tag, v->ntag);
+ l = get_label(vname);
+ l->intern = True;
+ cext_strlcpy(l->data, vname, sizeof(l->data));
+ }
+ draw_bar();
+}
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -686,6 +686,8 @@ xremove(IXPConn *c, Fcall *fcall)
case FsDlabel:
{
Label *l = label[i1];
+ if(l->intern)
+ return Enoperm;
/* now detach the label */
destroy_label(l);
free(l);
@@ -743,6 +745,7 @@ xread(IXPConn *c, Fcall *fcall)
break;
case FsDbar:
/* jump to offset */
+ len = 0;
for(i = 0; i < nlabel; i++) {
len += type2stat(&stat, label[i]->name, &m->qid);
if(len <= fcall->offset)
diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c
@@ -78,6 +78,8 @@ update_tags()
if(!nview && ntag)
select_view(tag[0]);
+ else
+ update_bar_tags();
}
unsigned int
diff --git a/cmd/wm/view.c b/cmd/wm/view.c
@@ -87,7 +87,7 @@ focus_view(View *v)
XMoveWindow(dpy, client[i]->framewin,
2 * rect.width + f->rect.x, f->rect.y);
}
- draw_bar();
+ update_bar_tags();
XSync(dpy, False);
XUngrabServer(dpy);
}
@@ -134,12 +134,11 @@ vid2index(unsigned short id)
}
View *
-get_view(char *name)
+name2view(char *name)
{
- unsigned int i, j, ntags;
View *v = nil;
char vname[256];
- char tags[MAX_TAGS][MAX_TAGLEN];
+ unsigned int i;
for(i = 0; i < nview; i++) {
v = view[i];
@@ -148,6 +147,19 @@ get_view(char *name)
return v;
}
+ return nil;
+}
+
+View *
+get_view(char *name)
+{
+ unsigned int i, j, ntags;
+ View *v = name2view(name);
+ char tags[MAX_TAGS][MAX_TAGLEN];
+
+ if(v)
+ return v;
+
ntags = str2tags(tags, name);
for(i = 0; i < nclient; i++)
for(j = 0; j < ntags; j++)
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -140,6 +140,7 @@ typedef struct {
char colstr[24];
Color color;
XRectangle rect;
+ Bool intern;
} Label;
/* default values */
@@ -221,6 +222,7 @@ void update_bar_geometry();
unsigned int bar_height();
Label *name2label(const char *name);
int label2index(Label *l);
+void update_bar_tags();
/* client.c */
Client *alloc_client(Window w, XWindowAttributes *wa);
@@ -295,6 +297,7 @@ void attach_toview(View *v, Client *c);
Client *sel_client_of_view(View *v);
void restack_view(View *v);
Bool hasclient(View *v);
+View *name2view(char *name);
/* wm.c */
void scan_wins();
diff --git a/rc/wmiirc b/rc/wmiirc
@@ -95,6 +95,8 @@ do
then
exit
fi;;
+ LabelClick)
+ xwrite /ctl view $1;;
Key)
case "$1" in
$MODKEY-Control-c)