commit 8c5358831b3f2855ab75ed726ccb5ce62cac273c
parent 0e453fb47bba360c923136fbba78a27549d976c1
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Thu, 13 Apr 2006 17:41:58 +0200
readded /tags, Maxi check if this patch fixes your problem
Diffstat:
| cmd/wm/fs.c | | | 84 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- |
| cmd/wm/view.c | | | 26 | +++++++++++++++----------- |
2 files changed, 84 insertions(+), 26 deletions(-)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -40,6 +40,7 @@ enum { WMII_IOUNIT = 2048 };
* /def/rules FsFrules rules
* /def/keys FsFkeys keys
* /def/grabmod FsFgrabmod grab modifier
+ * /tags FsFtags
* /bar/ FsDbars
* /bar/lab/ FsDbar
* /bar/lab/data FsFdata <arbitrary data which gets displayed>
@@ -203,19 +204,23 @@ qid2name(Qid *qid)
return nil;
return "geom";
break;
+ case FsFtags:
+ if((qid->dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1))
+ return nil;
+ else if((qid->dir_type == FsDGclient) && (i1 == -1))
+ return nil;
+ return "tags";
+ break;
case FsFclass:
case FsFname:
- case FsFtags:
if((qid->dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1))
return nil;
else if(i1 == -1)
return nil;
if(type == FsFname)
return "name";
- else if(type == FsFclass)
- return "class";
else
- return "tags";
+ return "class";
break;
case FsFmode:
if(i1 == -1 || i2 == -1)
@@ -403,7 +408,7 @@ mkqid(Qid *dir, char *wname, Qid *new)
if(dir_type == FsDroot)
return -1;
case FsFtags:
- if((dir_type != FsDview) && (dir_type != FsDGclient) && (dir_type != FsDclient))
+ if((dir_type != FsDroot) && (dir_type != FsDview) && (dir_type != FsDGclient) && (dir_type != FsDclient))
return -1;
if((dir_type == FsDclient) && ((dir_i1 == -1 || dir_i2 == -1 || dir_i3 == -1)))
return -1;
@@ -518,12 +523,23 @@ type2stat(Stat *stat, char *wname, Qid *dir)
return mkstat(stat, dir, wname, strlen(client.data[dir_i1]->name), IXP_DMREAD);
break;
case FsFtags:
- if(dir_type == FsDclient) {
+ switch(dir_type) {
+ case FsDclient:
f = view.data[dir_i1]->area.data[dir_i2]->frame.data[dir_i3];
return mkstat(stat, dir, wname, strlen(f->client->tags), IXP_DMREAD | IXP_DMWRITE);
- }
- else if(dir_type == FsDGclient)
+ break;
+ case FsDGclient:
return mkstat(stat, dir, wname, strlen(client.data[dir_i1]->tags), IXP_DMREAD | IXP_DMWRITE);
+ break;
+ default:
+ {
+ unsigned int i, len = 0;
+ for(i = 0; i < view.size; i++)
+ len += strlen(view.data[i]->name) + 1;
+ return mkstat(stat, dir, wname, len, IXP_DMREAD);
+ }
+ break;
+ }
break;
case FsFdata:
return mkstat(stat, dir, wname, (dir_i1 == bar.size) ? 0 : strlen(bar.data[dir_i1]->data),
@@ -725,8 +741,10 @@ xread(IXPConn *c, Fcall *fcall)
len += type2stat(&stat, "bar", &m->qid);
if(client.size)
len += type2stat(&stat, "client", &m->qid);
- if(view.size)
+ if(view.size) {
+ len += type2stat(&stat, "tags", &m->qid);
len += type2stat(&stat, "view", &m->qid);
+ }
for(i = 0; i < view.size; i++) {
len += type2stat(&stat, view.data[i]->name, &m->qid);
if(len <= fcall->offset)
@@ -863,6 +881,26 @@ xread(IXPConn *c, Fcall *fcall)
else if(fcall->count)
memcpy(p, def.rules + fcall->offset, fcall->count);
break;
+ case FsFtags:
+ if(m->qid.dir_type == FsDroot) {
+ len = 0;
+ /* jump to offset */
+ for(i = 0; i < view.size; i++) {
+ len += strlen(view.data[i]->name) + 1;
+ if(len <= fcall->offset)
+ continue;
+ }
+ /* offset found, proceeding */
+ for(; i < view.size; i++) {
+ len = strlen(view.data[i]->name) + 1;
+ if(fcall->count + len > fcall->iounit)
+ break;
+ memcpy(p + fcall->count, view.data[i]->name, len - 1);
+ memcpy(p + fcall->count + len - 1, "\n", 1);
+ fcall->count += len;
+ }
+ }
+ break;
default:
break;
}
@@ -883,6 +921,8 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
}
if(view.size) {
+ fcall->count += type2stat(&stat, "tags", &m->qid);
+ p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "view", &m->qid);
p = ixp_enc_stat(p, &stat);
}
@@ -1042,14 +1082,28 @@ xread(IXPConn *c, Fcall *fcall)
}
break;
case FsFtags:
- if(m->qid.dir_type == FsDclient) {
- Client *c = view.data[i1]->area.data[i2]->frame.data[i3]->client;
- if((fcall->count = strlen(c->tags)))
- memcpy(p, c->tags, fcall->count);
- }
- else if(m->qid.dir_type == FsDGclient) {
+ switch(m->qid.dir_type) {
+ case FsDclient:
+ {
+ Client *c = view.data[i1]->area.data[i2]->frame.data[i3]->client;
+ if((fcall->count = strlen(c->tags)))
+ memcpy(p, c->tags, fcall->count);
+ }
+ break;
+ case FsDGclient:
if((fcall->count = strlen(client.data[i1]->tags)))
memcpy(p, client.data[i1]->tags, fcall->count);
+ break;
+ default:
+ for(i = 0; i < view.size; i++) {
+ len = strlen(view.data[i]->name) + 1;
+ if(fcall->count + len > fcall->iounit)
+ break;
+ memcpy(p + fcall->count, view.data[i]->name, len - 1);
+ memcpy(p + fcall->count + len - 1, "\n", 1);
+ fcall->count += len;
+ }
+ break;
}
break;
case FsFdata:
diff --git a/cmd/wm/view.c b/cmd/wm/view.c
@@ -373,17 +373,21 @@ update_views()
destroy_view(v);
}
- if(old) {
- if(view.data[sel] != old) {
- focus_view(old);
- return;
+ if(view.size) {
+ if(old) {
+ Client *c;
+ if(view.data[sel] != old) {
+ focus_view(old);
+ return;
+ }
+ if((c = sel_client_of_view(old))) {
+ focus_client(c);
+ draw_clients();
+ }
}
- focus_client(sel_client_of_view(old));
- draw_clients();
- }
- else if(view.size) {
- focus_view(view.data[sel]);
- return;
+ else
+ focus_view(view.data[sel]);
}
- update_view_bars();
+ else
+ update_view_bars();
}