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:
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;