proceeded with tag integration

This commit is contained in:
Anselm R. Garbe 2006-03-05 23:38:50 +01:00
parent 5df09bbf3f
commit 95a2527e11
6 changed files with 85 additions and 29 deletions

View File

@ -158,6 +158,7 @@ detach_fromarea(Client *c)
destroy_area(a);
arrange_tag(t, True);
}
update_ctags();
}
char *
@ -210,7 +211,7 @@ relax_area(Area *a)
Frame *f = a->frame[i];
unsigned int tmp = f->rect.height;
f->rect.height += (a->rect.height - h);
resize_client(f->client, &f->rect, 0, True);
resize_client(f->client, &f->rect, nil, True);
h += (f->rect.height - tmp);
}
}
@ -223,7 +224,7 @@ relax_area(Area *a)
f->rect.y = yoff;
if(a->mode != Colmax)
yoff = f->rect.y + f->rect.height + hdiff;
resize_client(f->client, &f->rect, 0, False);
resize_client(f->client, &f->rect, nil, False);
}
}
@ -248,7 +249,7 @@ arrange_area(Area *a)
else
f->rect.height =
a->rect.height - f->rect.y + a->rect.y;
resize_client(f->client, &f->rect, 0, True);
resize_client(f->client, &f->rect, nil, True);
}
break;
case Colstack:
@ -263,14 +264,14 @@ arrange_area(Area *a)
else
f->rect.height = bar_height();
yoff += f->rect.height;
resize_client(f->client, &f->rect, 0, True);
resize_client(f->client, &f->rect, nil, True);
}
break;
case Colmax:
for(i = 0; i < a->nframe; i++) {
Frame *f = a->frame[i];
f->rect = a->rect;
resize_client(f->client, &f->rect, 0, True);
resize_client(f->client, &f->rect, nil, True);
}
break;
default:

View File

@ -341,8 +341,9 @@ attach_client(Client *c)
}
void
detach_client(Client *c, Bool unmap)
detach_fromtag(Tag *t, Client *c, Bool unmap)
{
/* TODO: later check c->frame's if it is a member of t */
Frame *f = c->frame;
if(f) {
if(!c->destroyed) {
@ -359,6 +360,15 @@ detach_client(Client *c, Bool unmap)
destroy_client(c);
}
void
detach_client(Client *c, Bool unmap)
{
int i;
for(i = 0; i < ntag; i++)
if(is_clientof(tag[i], c))
detach_fromtag(tag[i], client[i], unmap);
}
Client *
sel_client_of_tag(Tag *t)
{
@ -433,7 +443,7 @@ resize_client(Client *c, XRectangle *r, XPoint *pt, Bool ignore_xcall)
int px = sel * rect.width;
if(area2index(f->area) > 0)
if((area2index(f->area) > 0) && pt)
resize_area(c, r, pt);
else
f->rect = *r;

View File

@ -41,7 +41,7 @@ static char Enocommand[] = "command not supported";
* /keys/ FsDkeys
* /keys/foo FsFkey
* /tags/ FsDtags
* /tags/foo FsFtag
* /tags/foo FsFtags
* /bar/ FsDbar
* /bar/expand FsFexpand id of expandable label
* /bar/new/ FsDlabel
@ -1094,6 +1094,7 @@ xwrite(IXPConn *c, Fcall *fcall)
if(fcall->count > sizeof(f->client->tags))
return "tags value too long";
memcpy(f->client->tags, fcall->data, fcall->count);
f->client->tags[fcall->count] = 0;
update_ctags();
break;
case FsFgeom:

View File

@ -42,6 +42,8 @@ destroy_tag(Tag *t)
cext_array_detach((void **)tag, t, &tagsz);
ntag--;
if(sel >= ntag)
sel = 0;
for(i = 0; i < ntag; i++)
XChangeProperty(dpy, root, net_atom[NetNumWS], XA_CARDINAL,
@ -130,20 +132,8 @@ tid2index(unsigned short id)
return -1;
}
void
select_tag(char *arg)
{
Client *c;
Tag *t = ctag2tag(arg);
if(!t)
return;
focus_tag(t);
if((c = sel_client_of_tag(t)))
focus_client(c);
}
Tag *
ctag2tag(char *name)
get_tag(char *name)
{
unsigned int i;
Tag *t;
@ -163,6 +153,18 @@ ctag2tag(char *name)
return t;
}
void
select_tag(char *arg)
{
Client *c;
Tag *t = get_tag(arg);
if(!t)
return;
focus_tag(t);
if((c = sel_client_of_tag(t)))
focus_client(c);
}
Bool
has_ctag(char *tag)
{
@ -173,27 +175,47 @@ has_ctag(char *tag)
return False;
}
Bool
is_clientof(Tag *t, Client *c)
{
unsigned int i, j;
for(i = 0; i < t->narea; i++) {
Area *a = t->area[i];
for(j = 0; j < a->nframe; j++)
if(a->frame[j]->client == c)
return True;
}
return False;
}
void
update_ctags()
{
unsigned int i;
unsigned int i, j, k;
char buf[256];
char *tags[128];
for(i = 0; i < nctag; i++) {
Bool exists = False;
for(j = 0; j < nclient; j++)
if(strstr(client[j]->tags, ctag[i]))
exists = True;
if(!exists) {
for(j = 0; j < ntag; j++)
if(strstr(tag[j]->name, ctag[i])) {
destroy_tag(tag[j]);
j--;
}
}
free(ctag[i]);
ctag[i] = nil;
}
nctag = 0;
for(i = 0; i < nclient; i++) {
unsigned int j, k;
cext_strlcpy(buf, client[i]->tags, sizeof(buf));
fprintf(stderr, "update_ctags: %s\n", buf);
j = cext_tokenize(tags, 128, buf, ' ');
fprintf(stderr, "update_ctags: %d\n", j);
for(k = 0; k < j; k++) {
fprintf(stderr, "update_ctags: tag=%s\n", tags[k]);
if(!has_ctag(tags[k])) {
ctag = (char **)cext_array_attach((void **)ctag, strdup(tags[k]),
sizeof(char *), &ctagsz);
@ -201,6 +223,16 @@ update_ctags()
}
}
}
for(i = 0; i < nctag; i++)
fprintf(stderr, "tag=%s\n", ctag[i]);
for(i = 0; i < nclient; i++)
for(j = 0; j < ntag; j++) {
if(strstr(client[i]->tags, tag[j]->name)) {
if(!is_clientof(tag[j], client[i]))
attach_totag(tag[j], client[i]);
}
else {
if(is_clientof(tag[j], client[i]))
detach_fromtag(tag[j], client[i], False);
}
}
}

View File

@ -251,6 +251,7 @@ void select_client(Client *c, char *arg);
void sendtoarea_client(Client *c, char *arg);
void resize_all_clients();
void focus(Client *c);
void detach_fromtag(Tag *t, Client *c, Bool unmap);
/* event.c */
void init_x_event_handler();
@ -293,7 +294,7 @@ void select_tag(char *arg);
int tag2index(Tag *t);
Bool has_ctag(char *tag);
void update_ctags();
Tag *ctag2tag(char *name);
Bool is_clientof(Tag *t, Client *c);
/* wm.c */
void scan_wins();

View File

@ -70,6 +70,15 @@ $MODKEY-n
$MODKEY-m
$MODKEY-s
$MODKEY-equal
$MODKEY-1
$MODKEY-2
$MODKEY-3
$MODKEY-4
$MODKEY-5
$MODKEY-6
$MODKEY-7
$MODKEY-8
$MODKEY-9
$MODKEY-Shift-1
$MODKEY-Shift-2
$MODKEY-Shift-3
@ -126,6 +135,8 @@ do
xwrite /ws/sel/ctl select next;;
$MODKEY-k)
xwrite /ws/sel/ctl select prev;;
$MODKEY-[0-9])
xwrite /ws/sel/sel/tags `echo $1 | sed 's/.*-//'`;;
$MODKEY-Shift-[0-9])
xwrite /ctl select `echo $1 | sed 's/.*-//'`;;
esac;;