commit 17398f9eeaae5839fe570cddf6c6a47e38b585b1
parent 322fb6d24c81df753e034007373b7a42bd931036
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Fri, 27 Jan 2006 23:04:34 +0200
proceeded with xwrite stuff in bar2
Diffstat:
| cmd/wmiibar2.c | | | 242 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- |
1 file changed, 183 insertions(+), 59 deletions(-)
diff --git a/cmd/wmiibar2.c b/cmd/wmiibar2.c
@@ -55,13 +55,15 @@ struct Map {
typedef struct {
char data[256];
+ char color[24];
unsigned long bg;
unsigned long fg;
unsigned long border;
} Item;
-static size_t nitems = 0;
-static Item **items = 0;
+static size_t nitem = 0;
+static size_t itemsz = 0;
+static Item **item = 0;
static char *sockfile = nil;
static pid_t mypid = 0;
static IXPServer srv = { 0 };
@@ -108,6 +110,36 @@ exit_cleanup()
unlink(sockfile);
}
+static void
+new_item()
+{
+ size_t i;
+ if(!item) {
+ itemsz = 2;
+ item = cext_emallocz(sizeof(Item *) * itemsz);
+ }
+ if(nitem + 1 >= itemsz) {
+ Item **tmp = item;
+ itemsz *= 2;
+ item = cext_emallocz(sizeof(Item *) * itemsz);
+ for(i = 0; tmp[i]; i++)
+ item[i] = tmp[i];
+ free(tmp);
+ }
+ item[nitem++] = cext_emallocz(sizeof(Item));
+}
+
+void
+detach_item(Item *it)
+{
+ size_t i;
+ for(i = 0; item[i] != it; i++);
+ for(; item[i + 1]; i++)
+ item[i] = item[i + 1];
+ item[i] = nil;
+ nitem--;
+}
+
static unsigned long long
mkqpath(unsigned char type, unsigned short item)
{
@@ -173,7 +205,7 @@ name_to_type(char *name)
if(!strncmp(name, "color", 6))
return Fcolor;
i = (unsigned short) cext_strtonum(name, 1, 0xffff, &errstr);
- if(!errstr && i < nitems)
+ if(!errstr && i <= nitem)
return Ditem;
return -1;
}
@@ -271,7 +303,7 @@ xwalk(IXPServer *s, IXPConn *c)
}
static int
-xopen(IXPServer * s, IXPConn * c)
+xopen(IXPServer *s, IXPConn *c)
{
Map *map = fid_to_map(c->aux, s->fcall.fid);
@@ -279,7 +311,8 @@ xopen(IXPServer * s, IXPConn * c)
s->errstr = "invalid fid";
return -1;
}
- if((s->fcall.mode != IXP_OREAD) && (s->fcall.mode != IXP_OWRITE)) {
+ if(!(s->fcall.mode | IXP_OREAD) && !(s->fcall.mode | IXP_OWRITE)) {
+ fprintf(stderr, "got mode 0x%x\n", s->fcall.mode);
s->errstr = "mode not supported";
return -1;
}
@@ -306,63 +339,105 @@ mkstat(Stat *stat, Qid *dir, char *name, unsigned long long length, unsigned int
}
static int
-xread(IXPServer * s, IXPConn * c)
+xread(IXPServer *s, IXPConn *c)
{
Stat stat;
Map *map = fid_to_map(c->aux, s->fcall.fid);
unsigned char *p = s->fcall.data;
- unsigned int i;
+ unsigned short i;
char buf[32];
if(!map) {
s->errstr = "invalid fid";
return -1;
}
+ i = qpath_item(map->qid.path);
s->fcall.id = RREAD;
- switch (qpath_type(map->qid.path)) {
- case Droot:
- if(align == SOUTH || align == NORTH)
- s->fcall.count = mkstat(&stat, &root_qid, "display", 6, 0x0);
- else
- s->fcall.count = mkstat(&stat, &root_qid, "display", 5, 0x0); /* none */
- p = ixp_enc_stat(p, &stat);
- s->fcall.count += mkstat(&stat, &root_qid, "font", strlen(font), 0x0);
- p = ixp_enc_stat(p, &stat);
- s->fcall.count += mkstat(&stat, &root_qid, "new", 0, 0x0);
- p = ixp_enc_stat(p, &stat);
- s->fcall.count += mkstat(&stat, &root_qid, "event", 0, 0x0);
- p = ixp_enc_stat(p, &stat);
- s->fcall.count += mkstat(&stat, &root_qid, "default", 0, DMDIR);
- p = ixp_enc_stat(p, &stat);
- for(i = 0; (i < nitems) && items[i]; i++) {
- snprintf(buf, sizeof(buf), "%u", i + 1);
- s->fcall.count += mkstat(&stat, &root_qid, buf, 0, DMDIR);
- if(s->fcall.count > s->fcall.iounit)
+ s->fcall.count = 0; /* EOF by default */
+ if(!s->fcall.offset) {
+ switch (qpath_type(map->qid.path)) {
+ case Droot:
+ if(align == SOUTH || align == NORTH)
+ s->fcall.count = mkstat(&stat, &root_qid, "display", 6, 0x0);
+ else
+ s->fcall.count = mkstat(&stat, &root_qid, "display", 5, 0x0); /* none */
+ p = ixp_enc_stat(p, &stat);
+ s->fcall.count += mkstat(&stat, &root_qid, "font", strlen(font), 0x0);
+ p = ixp_enc_stat(p, &stat);
+ s->fcall.count += mkstat(&stat, &root_qid, "new", 0, 0x0);
+ p = ixp_enc_stat(p, &stat);
+ s->fcall.count += mkstat(&stat, &root_qid, "event", 0, 0x0);
+ p = ixp_enc_stat(p, &stat);
+ s->fcall.count += mkstat(&stat, &root_qid, "default", 0, DMDIR);
+ p = ixp_enc_stat(p, &stat);
+ for(i = 1; i < nitem; i++) {
+ snprintf(buf, sizeof(buf), "%u", i);
+ s->fcall.count += mkstat(&stat, &root_qid, buf, 0, DMDIR);
+ p = ixp_enc_stat(p, &stat);
+ }
+ break;
+ case Ditem:
+ if(i >= nitem)
+ goto invalid_xread;
+ if(!i) {
+ s->fcall.count = mkstat(&stat, &root_qid, "color", 24, 0x0);
+ p = ixp_enc_stat(p, &stat);
+ }
+ else {
+ Qid dir = {IXP_QTDIR, 0, mkqpath(Ditem, i)};
+ s->fcall.count = mkstat(&stat, &dir, "color", 24, 0x0);
+ p = ixp_enc_stat(p, &stat);
+ s->fcall.count += mkstat(&stat, &dir, "data", strlen(item[i]->data), 0x0);
+ p = ixp_enc_stat(p, &stat);
+ }
+ break;
+ case Fdisplay:
+ switch(align) {
+ case SOUTH:
+ memcpy(p, "south", 5);
+ s->fcall.count = 5;
+ break;
+ case NORTH:
+ memcpy(p, "north", 5);
+ s->fcall.count = 5;
break;
- p = ixp_enc_stat(p, &stat);
+ default:
+ memcpy(p, "none", 4);
+ s->fcall.count = 4;
+ break;
+ }
+ break;
+ case Ffont:
+ if((s->fcall.count = strlen(font)))
+ memcpy(p, font, s->fcall.count);
+ break;
+ case Fnew:
+ snprintf(buf, sizeof(buf), "%u", nitem);
+ new_item(); /* only add new items on first TREAD */
+ s->fcall.count = strlen(buf);
+ memcpy(p, buf, s->fcall.count);
+ break;
+ case Fevent:
+ break;
+ case Fdata:
+ if(i >= nitem)
+ goto invalid_xread;
+ if((s->fcall.count = strlen(item[i]->data)))
+ memcpy(p, item[i]->data, s->fcall.count);
+ break;
+ case Fcolor:
+ if(i >= nitem)
+ goto invalid_xread;
+ if((s->fcall.count = strlen(item[i]->color)))
+ memcpy(p, item[i]->color, s->fcall.count);
+ break;
+invalid_xread:
+ default:
+ s->errstr = "invalid file";
+ return -1;
+ break;
}
- if(s->fcall.offset >= s->fcall.count)
- s->fcall.count = 0; /* EOF */
- break;
- case Ditem:
- break;
- case Fdisplay:
- break;
- case Fnew:
- break;
- case Fdata:
- break;
- case Fevent:
- break;
- case Fcolor:
- break;
- case Ffont:
- break;
- default:
- s->errstr = "invalid file";
- return -1;
- break;
- }
+ }
return 0;
}
@@ -378,7 +453,7 @@ xstat(IXPServer *s, IXPConn *c)
s->errstr = "invalid fid";
return -1;
}
- else if((i = qpath_item(map->qid.path) > nitems)) {
+ else if((i = qpath_item(map->qid.path) >= nitem)) {
s->errstr = "file not found";
return -1;
}
@@ -406,7 +481,7 @@ xstat(IXPServer *s, IXPConn *c)
mkstat(&s->fcall.stat, &root_qid, qid_to_name(&map->qid), strlen(font), 0x0);
break;
case Fdata:
- mkstat(&s->fcall.stat, &dir, qid_to_name(&map->qid), strlen(items[i]->data), 0x0);
+ mkstat(&s->fcall.stat, &dir, qid_to_name(&map->qid), strlen(item[i]->data), 0x0);
break;
case Fcolor:
mkstat(&s->fcall.stat, &dir, qid_to_name(&map->qid), 24, 0x0);
@@ -420,13 +495,64 @@ xstat(IXPServer *s, IXPConn *c)
}
static int
-xwrite(IXPServer * s, IXPConn * c)
+xwrite(IXPServer *s, IXPConn *c)
{
- return -1;
+ char buf[256];
+ Map *map = fid_to_map(c->aux, s->fcall.fid);
+ unsigned short i;
+
+ if(!map) {
+ s->errstr = "invalid fid";
+ return -1;
+ }
+
+ i = qpath_item(map->qid.path);
+ s->fcall.id = RWRITE;
+ switch (qpath_type(map->qid.path)) {
+ case Fdisplay:
+ if(s->fcall.count > 5)
+ goto invalid_xwrite;
+ memcpy(buf, s->fcall.data, s->fcall.count);
+ buf[s->fcall.count] = 0;
+ if(!blitz_strtoalign(&align, buf))
+ goto invalid_xwrite;
+ /* TODO: resize/hide */
+ break;
+ case Ffont:
+ if(font)
+ free(font);
+ font = cext_emallocz(s->fcall.count + 1);
+ memcpy(font, s->fcall.data, s->fcall.count);
+ /* TODO: XQueryFont */
+ break;
+ case Fdata:
+ if(!i || (i >= nitem))
+ goto invalid_xwrite;
+ if(s->fcall.count >= sizeof(item[i]->data))
+ s->fcall.count = sizeof(item[i]->data) - 1;
+ memcpy(item[i]->data, s->fcall.data, s->fcall.count);
+ item[i]->data[s->fcall.count] = 0;
+ /* TODO: redraw */
+ break;
+ case Fcolor:
+ if((i >= nitem) || (s->fcall.count >= 24))
+ goto invalid_xwrite;
+ memcpy(item[i]->color, s->fcall.data, s->fcall.count);
+ item[i]->color[s->fcall.count] = 0;
+ /* TODO: update color */
+ break;
+invalid_xwrite:
+ default:
+ s->errstr = "permission denied";
+ return -1;
+ break;
+ }
+ s->fcall.count = 0;
+ return 0;
}
static int
-xclunk(IXPServer * s, IXPConn * c)
+xclunk(IXPServer *s, IXPConn *c)
{
Map *maps = c->aux;
Map *m, *map = fid_to_map(maps, s->fcall.fid);
@@ -447,11 +573,10 @@ xclunk(IXPServer * s, IXPConn * c)
}
static void
-freeconn(IXPServer * s, IXPConn * c)
+freeconn(IXPServer *s, IXPConn *c)
{
Map *m, *maps = c->aux;
- /*fprintf(stderr, "%s", "freecon\n");*/
while((m = maps)) {
c->aux = maps = maps->next;
free(m);
@@ -474,7 +599,6 @@ int
main(int argc, char *argv[])
{
int i;
- Item *item;
/* command line args */
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
@@ -515,9 +639,9 @@ main(int argc, char *argv[])
atexit(exit_cleanup);
/* default item settings */
- item = cext_emallocz(sizeof(Item));
+ new_item();
- font = "fixed";
+ font = strdup("fixed");
ixp_server_loop(&srv);
if(srv.errstr) {