wmii

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

commit f4ae1968071cbc35646c19dcf97443e448110252
parent aeda40f81aaba02e33ef58ff332f18fe6e18c09c
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue,  7 Feb 2006 00:32:57 +0100

proceeded with wmiifs, still just experimenting 


Diffstat:
cmd/wm/wm.c | 1+
cmd/wmiifs.c | 54++++++++++++++++++++++++++++++++++++++++++++++--------
cmd/wmiir.c | 2+-
libixp/client.c | 28++++++++++++++--------------
libixp/ixp.h | 3++-
liblitz/blitz.h | 1+
liblitz/draw.c | 13+++++++++++--
libwmii/spawn.c | 2+-
8 files changed, 77 insertions(+), 27 deletions(-)

diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -101,6 +101,7 @@ draw_pager() d.drawable = transient; d.gc = gc_transient; d.font = xfont; + d.align = CENTER; i = 0; for(ir = 0; ir < rows; ir++) { for(ic = 0; ic < cols; ic++) { diff --git a/cmd/wmiifs.c b/cmd/wmiifs.c @@ -24,11 +24,20 @@ enum { Fctl }; +typedef struct Bind Bind; +struct Bind { + unsigned int fid; + IXPClient c; +}; + typedef struct Mount Mount; struct Mount { unsigned short id; - char wname[256]; + char wname[IXP_MAX_FLEN]; char address[256]; + Bind **bind; + size_t bindsz; + size_t nbind; }; Qid root_qid; @@ -151,6 +160,7 @@ xwalk(IXPConn *c, Fcall *fcall) unsigned short nwqid = 0; Qid dir = root_qid; IXPMap *m; + Mount *mnt; if(!(m = ixp_server_fid2map(c, fcall->fid))) return Enofid; @@ -158,13 +168,41 @@ xwalk(IXPConn *c, Fcall *fcall) return Enofid; if(fcall->nwname) { dir = m->qid; - for(nwqid = 0; (nwqid < fcall->nwname) - && !mkqid(&dir, fcall->wname[nwqid], &fcall->wqid[nwqid], True); nwqid++) { - /*fprintf(stderr, "wname=%s nwqid=%d\n", fcall->wname[nwqid], nwqid);*/ - dir = fcall->wqid[nwqid]; + if((mnt = mount_of_name(fcall->wname[0])) && (fcall->nwname > 1)) { + Bind *b = cext_emallocz(sizeof(Bind)); + int i; + + mnt->bind = (Bind **)cext_array_attach((void **)mnt->bind, b, sizeof(Bind *), &mnt->bindsz); + mnt->nbind++; + + /* open socket */ + if(ixp_client_init(&b->c, mnt->address, mnt->nbind - 1) == -1) + return Enofile; + + b->c.fcall.id = TWALK; + b->c.fcall.fid = fcall->fid; + b->c.fcall.newfid = fcall->newfid; + b->c.fcall.nwname = fcall->nwname - 1; + for(i = 1; i < fcall->nwname; i++) + cext_strlcpy(b->c.fcall.wname[i - 1], fcall->wname[i], sizeof(b->c.fcall.wname[i - 1])); + + if(ixp_client_do_fcall(&b->c) == -1); + /* TODO: unbind client, also in other cases, THINK */ + + !mkqid(&dir, fcall->wname[0], &fcall->wqid[0], True); + for(i = 0; i < b->c.fcall.nwname; i++) + fcall->wqid[i + 1] = b->c.fcall.wqid[i]; + nwqid = i + 1; + } + else { + for(nwqid = 0; (nwqid < fcall->nwname) + && !mkqid(&dir, fcall->wname[nwqid], &fcall->wqid[nwqid], True); nwqid++) { + /*fprintf(stderr, "wname=%s nwqid=%d\n", fcall->wname[nwqid], nwqid);*/ + dir = fcall->wqid[nwqid]; + } + if(!nwqid) + return Enofile; } - if(!nwqid) - return Enofile; } /* a fid will only be valid, if the walk was complete */ if(nwqid == fcall->nwname) { @@ -229,7 +267,7 @@ type_to_stat(Stat *stat, char *name, Qid *dir) case Dmount: if(!(mnt = mount_of_name(name))) return -1; - return mkstat(stat, dir, name, 0, DMREAD | DMWRITE); + return mkstat(stat, dir, name, 0, DMREAD | DMWRITE | DMMOUNT); break; } return 0; diff --git a/cmd/wmiir.c b/cmd/wmiir.c @@ -220,7 +220,7 @@ main(int argc, char *argv[]) usage(); } /* open socket */ - if(ixp_client_init(&c, address) == -1) { + if(ixp_client_init(&c, address, getpid()) == -1) { fprintf(stderr, "wmiir: %s\n", c.errstr); exit(1); } diff --git a/libixp/client.c b/libixp/client.c @@ -13,11 +13,11 @@ #include "cext.h" #include "ixp.h" -static unsigned char msg[IXP_MAX_MSG]; -static int -do_fcall(IXPClient * c) +int +ixp_client_do_fcall(IXPClient * c) { + static unsigned char msg[IXP_MAX_MSG]; unsigned int msize = ixp_fcall_to_msg(&c->fcall, msg, IXP_MAX_MSG); c->errstr = 0; if(ixp_send_message(c->fd, msg, msize, &c->errstr) != msize) @@ -36,7 +36,7 @@ do_fcall(IXPClient * c) } int -ixp_client_init(IXPClient * c, char *sockfile) +ixp_client_init(IXPClient *c, char *sockfile, unsigned int rootfid) { if((c->fd = ixp_connect_sock(sockfile)) < 0) { c->errstr = "cannot connect server"; @@ -47,7 +47,7 @@ ixp_client_init(IXPClient * c, char *sockfile) c->fcall.tag = IXP_NOTAG; c->fcall.maxmsg = IXP_MAX_MSG; cext_strlcpy(c->fcall.version, IXP_VERSION, sizeof(c->fcall.version)); - if(do_fcall(c) == -1) { + if(ixp_client_do_fcall(c) == -1) { fprintf(stderr, "error: %s\n", c->fcall.errstr); ixp_client_deinit(c); return -1; @@ -58,7 +58,7 @@ ixp_client_init(IXPClient * c, char *sockfile) ixp_client_deinit(c); return -1; /* we cannot handle this version */ } - c->root_fid = getpid(); + c->root_fid = rootfid; /* attach */ c->fcall.id = TATTACH; @@ -67,7 +67,7 @@ ixp_client_init(IXPClient * c, char *sockfile) c->fcall.afid = IXP_NOFID; cext_strlcpy(c->fcall.uname, getenv("USER"), sizeof(c->fcall.uname)); c->fcall.aname[0] = 0; - if(do_fcall(c) == -1) { + if(ixp_client_do_fcall(c) == -1) { fprintf(stderr, "error: %s\n", c->fcall.errstr); ixp_client_deinit(c); return -1; @@ -85,7 +85,7 @@ ixp_client_remove(IXPClient * c, unsigned int newfid, char *filepath) c->fcall.id = TREMOVE; c->fcall.tag = IXP_NOTAG; c->fcall.fid = newfid; - return do_fcall(c); + return ixp_client_do_fcall(c); } int @@ -99,7 +99,7 @@ ixp_client_create(IXPClient * c, unsigned int dirfid, char *name, cext_strlcpy(c->fcall.name, name, sizeof(c->fcall.name)); c->fcall.perm = perm; c->fcall.mode = mode; - return do_fcall(c); + return ixp_client_do_fcall(c); } int @@ -118,7 +118,7 @@ ixp_client_walk(IXPClient * c, unsigned int newfid, char *filepath) for(i = 0; i < c->fcall.nwname; i++) cext_strlcpy(c->fcall.wname[i], wname[i], sizeof(c->fcall.wname[i])); } - return do_fcall(c); + return ixp_client_do_fcall(c); } int @@ -133,7 +133,7 @@ ixp_client_open(IXPClient * c, unsigned int newfid, char *filepath, c->fcall.tag = IXP_NOTAG; c->fcall.fid = newfid; c->fcall.mode = mode; - return do_fcall(c); + return ixp_client_do_fcall(c); } int @@ -148,7 +148,7 @@ ixp_client_read(IXPClient * c, unsigned int fid, unsigned long long offset, c->fcall.fid = fid; c->fcall.offset = offset; c->fcall.count = res_len < bytes ? res_len : bytes; - if(do_fcall(c) == -1) + if(ixp_client_do_fcall(c) == -1) return -1; memcpy(result, c->fcall.data, c->fcall.count); return c->fcall.count; @@ -171,7 +171,7 @@ ixp_client_write(IXPClient * c, unsigned int fid, c->fcall.offset = offset; c->fcall.count = count; memcpy(c->fcall.data, data, count); - if(do_fcall(c) == -1) + if(ixp_client_do_fcall(c) == -1) return -1; return c->fcall.count; } @@ -183,7 +183,7 @@ ixp_client_close(IXPClient * c, unsigned int fid) c->fcall.id = TCLUNK; c->fcall.tag = IXP_NOTAG; c->fcall.fid = fid; - return do_fcall(c); + return ixp_client_do_fcall(c); } void diff --git a/libixp/ixp.h b/libixp/ixp.h @@ -232,7 +232,7 @@ typedef struct { } IXPClient; /* client.c */ -int ixp_client_init(IXPClient *c, char *address); +int ixp_client_init(IXPClient *c, char *address, unsigned int rootfid); void ixp_client_deinit(IXPClient *c); int ixp_client_remove(IXPClient *c, unsigned int newfid, char *filepath); int ixp_client_create(IXPClient *c, unsigned int dirfid, char *name, @@ -247,6 +247,7 @@ int ixp_client_write(IXPClient *c, unsigned int fid, unsigned long long offset, unsigned int count, unsigned char *data); int ixp_client_close(IXPClient *c, unsigned int fid); +int ixp_client_do_fcall(IXPClient * c); /* convert.c */ void *ixp_enc_u8(unsigned char *msg, unsigned char val); diff --git a/liblitz/blitz.h b/liblitz/blitz.h @@ -22,6 +22,7 @@ typedef struct { } Color; typedef struct { + Align align; Drawable drawable; GC gc; Color color; diff --git a/liblitz/draw.c b/liblitz/draw.c @@ -125,8 +125,17 @@ draw_text(Display * dpy, Draw * d) if (len > 1) text[len - 1] = '.'; } - x = d->rect.x + h / 2; - + switch (d->align) { + case EAST: + x = d->rect.x + d->rect.width - (h / 2 + w); + break; + case CENTER: + x = d->rect.x + (d->rect.width - w) / 2; + break; + default: + x = d->rect.x + h / 2; + break; + } XSetBackground(dpy, d->gc, d->color.bg); /* * uncomment, if you want get an shadow effect XSetForeground(dpy, diff --git a/libwmii/spawn.c b/libwmii/spawn.c @@ -29,7 +29,7 @@ spawn_ixp_write(char *cmd) len = strlen(data); fprintf(stderr, "spawn_ixp_write write file=%s data=%s address=%s\n", file, data, address); - if(ixp_client_init(&c, address) == -1) { + if(ixp_client_init(&c, address, getpid()) == -1) { free(address); fprintf(stderr, "libwmii: %s\n", c.errstr); return;