wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 2ba3598def53bc8ed4041c6ab942e06165f73d92
parent ee426b367622971ccfb15c4ac6a9bb7918d7d8e8
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Wed, 24 May 2006 09:26:08 +0200

fixed gualteri's bug report


Diffstat:
cmd/wm/fs.c | 157++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
cmd/wm/view.c | 13+++++++++----
cmd/wm/wm.h | 7++++---
cmd/wmiir.c | 3++-
4 files changed, 111 insertions(+), 69 deletions(-)

diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -160,65 +160,66 @@ name_of_qid(Qid wqid[IXP_MAX_WELEM], unsigned short qsel) switch(type) { case FsDroot: return "/"; break; case FsDdef: return "def"; break; - case FsDclients: return "client"; break; - case FsDbars: return "bar"; break; - case FsDview: - if(dir_type != FsDroot) - return nil; - if(i1 == sel) - return "view"; - return view.data[i1]->name; - break; - case FsDbar: - if(i1 == -1) - return nil; - return bar.data[i1]->name; - break; - case FsDarea: - if(i1 == -1 || i2 == -1) - return nil; - if(view.data[i1]->sel == i2) - return "sel"; - snprintf(buf, sizeof(buf), "%u", i2); - return buf; - break; - case FsDGclient: - if(i1 == -1) - return nil; - snprintf(buf, sizeof(buf), "%u", i1); - return buf; - break; - case FsDclient: - if(i1 == -1 || i2 == -1 || i3 == -1) - return nil; - if(view.data[i1]->area.data[i2]->sel == i3) - return "sel"; - snprintf(buf, sizeof(buf), "%u", i3); - return buf; - break; - case FsFselcolors: return "selcolors"; break; - case FsFnormcolors: return "normcolors"; break; - case FsFfont: return "font"; break; - case FsFcolw: return "colwidth"; break; - case FsFgrabmod: return "grabmod"; break; - case FsFrules: return "rules"; break; - case FsFkeys: return "keys"; break; - case FsFcolors: return "colors"; break; - case FsFdata: - if(i1 == -1) - return nil; - return "data"; - break; - case FsFctl: return "ctl"; break; - case FsFborder: return "border"; break; - case FsFgeom: - if((dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1)) - return nil; - else if(i1 == -1) - return nil; - return "geom"; - break; - case FsFtags: + case FsDtag: return "tag"; break; + case FsDclients: return "client"; break; + case FsDbars: return "bar"; break; + case FsDview: + if(dir_type != FsDroot && dir_type != FsDtag) + return nil; + if(i1 == sel) + return "view"; + return view.data[i1]->name; + break; + case FsDbar: + if(i1 == -1) + return nil; + return bar.data[i1]->name; + break; + case FsDarea: + if(i1 == -1 || i2 == -1) + return nil; + if(view.data[i1]->sel == i2) + return "sel"; + snprintf(buf, sizeof(buf), "%u", i2); + return buf; + break; + case FsDGclient: + if(i1 == -1) + return nil; + snprintf(buf, sizeof(buf), "%u", i1); + return buf; + break; + case FsDclient: + if(i1 == -1 || i2 == -1 || i3 == -1) + return nil; + if(view.data[i1]->area.data[i2]->sel == i3) + return "sel"; + snprintf(buf, sizeof(buf), "%u", i3); + return buf; + break; + case FsFselcolors: return "selcolors"; break; + case FsFnormcolors: return "normcolors"; break; + case FsFfont: return "font"; break; + case FsFcolw: return "colwidth"; break; + case FsFgrabmod: return "grabmod"; break; + case FsFrules: return "rules"; break; + case FsFkeys: return "keys"; break; + case FsFcolors: return "colors"; break; + case FsFdata: + if(i1 == -1) + return nil; + return "data"; + break; + case FsFctl: return "ctl"; break; + case FsFborder: return "border"; break; + case FsFgeom: + if((dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1)) + return nil; + else if(i1 == -1) + return nil; + return "geom"; + break; + case FsFtags: if((dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1)) return nil; else if((dir_type == FsDGclient) && (i1 == -1)) @@ -271,6 +272,8 @@ type_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name) if(!name || !name[0] || !strncmp(name, "/", 2)) return FsDroot; + if(!strncmp(name, "tag", 4)) + return FsDtag; if(!strncmp(name, "tags", 5)) return FsFtags; if(!strncmp(name, "client", 7)) @@ -317,7 +320,7 @@ type_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name) return FsFmode; if((dir_type == FsDbars) && bar_of_name(name)) return FsDbar; - if((dir_type == FsDroot) && view_of_name(name)) + if((dir_type == FsDroot || dir_type == FsDtag) && view_of_name(name)) return FsDview; if(!strncmp(name, "sel", 4)) goto dyndir; @@ -349,6 +352,7 @@ qid_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name) new = root_qid; break; case FsDdef: + case FsDtag: case FsDclients: case FsDbars: if(dir_type != FsDroot) @@ -357,7 +361,7 @@ qid_of_name(Qid wqid[IXP_MAX_WELEM], unsigned short qsel, char *name) new.path = pack_qpath(type, 0, 0, 0); break; case FsDview: - if(dir_type != FsDroot || !view.size) + if((dir_type != FsDroot && dir_type != FsDtag) || !view.size) return nil; new.type = IXP_QTDIR; if(!strncmp(name, "view", 5)) @@ -517,6 +521,7 @@ stat_of_name(Stat *stat, char *name, Qid wqid[IXP_MAX_WELEM], unsigned short qse case FsDclients: case FsDbar: case FsDroot: + case FsDtag: return pack_stat(stat, wqid, qsel, name, 0, IXP_DMDIR | IXP_DMREAD | IXP_DMEXEC); break; case FsDbars: @@ -824,6 +829,7 @@ xread(IXPConn *c, Fcall *fcall) len += stat_of_name(&stat, "event", m->wqid, m->sel); len += stat_of_name(&stat, "def", m->wqid, m->sel); len += stat_of_name(&stat, "bar", m->wqid, m->sel); + len += stat_of_name(&stat, "tag", m->wqid, m->sel); if(client.size) len += stat_of_name(&stat, "client", m->wqid, m->sel); if(view.size) { @@ -845,6 +851,24 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_pack_stat(p, &stat); } break; + case FsDtag: + /* jump to offset */ + len = 0; + for(i = 0; i < view.size; i++) { + len += stat_of_name(&stat, view.data[i]->name, m->wqid, m->sel); + if(len <= fcall->offset) + continue; + break; + } + /* offset found, proceeding */ + for(; i < view.size; i++) { + len = stat_of_name(&stat, view.data[i]->name, m->wqid, m->sel); + if(fcall->count + len > fcall->iounit) + break; + fcall->count += len; + p = ixp_pack_stat(p, &stat); + } + break; case FsDclients: /* jump to offset */ len = 0; @@ -1001,6 +1025,8 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_pack_stat(p, &stat); fcall->count += stat_of_name(&stat, "bar", m->wqid, m->sel); p = ixp_pack_stat(p, &stat); + fcall->count += stat_of_name(&stat, "tag", m->wqid, m->sel); + p = ixp_pack_stat(p, &stat); if(client.size) { fcall->count += stat_of_name(&stat, "client", m->wqid, m->sel); p = ixp_pack_stat(p, &stat); @@ -1019,6 +1045,15 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_pack_stat(p, &stat); } break; + case FsDtag: + for(i = 0; i < view.size; i++) { + len = stat_of_name(&stat, view.data[i]->name, m->wqid, m->sel); + if(fcall->count + len > fcall->iounit) + break; + fcall->count += len; + p = ixp_pack_stat(p, &stat); + } + break; case FsDclients: for(i = 0; i < client.size; i++) { snprintf(buf, sizeof(buf), "%u", i); diff --git a/cmd/wm/view.c b/cmd/wm/view.c @@ -23,7 +23,7 @@ comp_view_name(const void *v1, const void *v2) } View * -create_view(char *name) +create_view(const char *name) { static unsigned short id = 1; View *v = cext_emallocz(sizeof(View)); @@ -151,7 +151,7 @@ idx_of_view_id(unsigned short id) } View * -view_of_name(char *name) +view_of_name(const char *name) { unsigned int i; @@ -163,15 +163,20 @@ view_of_name(char *name) } static View * -get_view(char *name) +get_view(const char *name) { View *v = view_of_name(name); return v ? v : create_view(name); } void -select_view(char *arg) +select_view(const char *arg) { + char buf[256]; + cext_strlcpy(buf, arg, sizeof(buf)); + cext_trim(buf, " \t+"); + if(!strlen(buf)) + return; sel = idx_of_view(get_view(arg)); update_views(); /* performs focus_view */ } diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -44,6 +44,7 @@ enum { enum { FsDroot, FsDdef, + FsDtag, FsDview, FsDarea, FsDclients, @@ -292,17 +293,17 @@ Bool permit_tags(const char *tags); /* view.c */ void arrange_view(View *v); void scale_view(View *v, float w); -View *create_view(char *name); +View *create_view(const char *name); void focus_view(View *v); XRectangle *rects_of_view(View *v, Bool isfloat, unsigned int *num); int idx_of_view_id(unsigned short id); -void select_view(char *arg); +void select_view(const char *arg); int idx_of_view(View *v); void detach_from_view(View *v, Client *c); void attach_to_view(View *v, Client *c); Client *sel_client_of_view(View *v); void restack_view(View *v); -View *view_of_name(char *name); +View *view_of_name(const char *name); void destroy_view(View *v); void update_views(); diff --git a/cmd/wmiir.c b/cmd/wmiir.c @@ -208,7 +208,8 @@ xdir(char *file, int details) fprintf(stderr, "wmiir: cannot read directory '%s': %s\n", file, c.errstr); return -1; } - xls(data, offset + count, details); + if(data) + xls(data, offset + count, details); return ixp_client_close(&c, fid); }