wmii

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

commit 0e2ce108a70f1e7c635cbd110f0b21def2557372
parent 0a4e4258c8a8c57aecca2e51f8e9ddc3d672201b
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 31 Jan 2006 14:25:23 +0200

proceeded further


Diffstat:
cmd/wm/Makefile | 2+-
cmd/wm/fs.c | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
cmd/wm/wm.h | 20+++++++++++++-------
cmd/wmiibar.c | 1-
4 files changed, 105 insertions(+), 43 deletions(-)

diff --git a/cmd/wm/Makefile b/cmd/wm/Makefile @@ -10,7 +10,7 @@ LDFLAGS += -L../../liblitz -llitz -L../../libixp -lixp \ # Solaris # LDFLAGS += -lsocket -SRC = wm.c client.c event.c mouse.c page.c column.c +SRC = fs.c wm.c client.c event.c mouse.c page.c column.c OBJ = ${SRC:.c=.o} all: wmiiwm diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -18,8 +18,7 @@ #include <X11/Xutil.h> #include <sys/socket.h> -#include "ixp.h" -#include "blitz.h" +#include "wm.h" /* * filesystem specification @@ -44,6 +43,7 @@ * /1/1/name Fname name of client * /1/1/ctl Fctl command interface (client) * /1/col/ Dcolroot + * /1/col/new/ Dcol * /1/col/sel/ Dcol * /1/col/1/ Dcol * /1/col/1/sel/ Dclient @@ -64,7 +64,6 @@ enum { Dcol, Dclient, Ffont, - Fcolor3, Fcolor, Fborder, Fsnap, @@ -88,77 +87,104 @@ static Qid root_qid; /* IXP stuff */ static unsigned long long -mkqpath(unsigned char type, unsigned char level, unsigned short item) +mkqpath(unsigned char type, unsigned short pg, unsigned short col, unsigned short c) { - return ((unsigned long long) item << 16) | ((unsigned long long) level << 8) | (unsigned long long) type; + return ((unsigned long long) type << 48) | ((unsigned long long) pg << 32) + | ((unsigned long long) col << 16) | (unsigned long long) c; } static unsigned char qpath_type(unsigned long long path) { - return path & 0xff; + return (path >> 48) & 0xff; } -static unsigned char -qpath_level(unsigned long long path) +static unsigned short +qpath_page(unsigned long long path) +{ + return (path >> 32) & 0xffff; +} + +static unsigned short +qpath_col(unsigned long long path) { - return (path >> 8) & 0xffff; + return (path >> 16) & 0xffff; } static unsigned short -qpath_item(unsigned long long path) +qpath_client(unsigned long long path) { - return (path >> 16) & 0xffffff; + return path & 0xffff; } static char * qid_to_name(Qid *qid) { unsigned char type = qpath_type(qid->path); - unsigned char level = qpath_level(qid->path); - unsigned short i = qpath_item(qid->path); + unsigned short pg = qpath_page(qid->path); + unsigned short col = qpath_col(qid->path); + unsigned short c = qpath_client(qid->path); static char buf[32]; switch(type) { case Droot: return "/"; break; case Ddefault: return "default"; break; + case Dcolroot: return "col"; break; case Dpage: + if(pg == sel_page) + return "sel"; + if(pg == npage) + return "new"; + snprintf(buf, sizeof(buf), "%u", pg); + return buf; + break; case Dcol: - case Dclient: - if(!level && (i == nitem)) /* only for page */ + if(!npage) + return nil; + if(page[pg]->ncol == col) return "new"; - snprintf(buf, sizeof(buf), "%u", i); + if(page[pg]->sel_col == col) + return "sel"; + snprintf(buf, sizeof(buf), "%u", col); + return buf; + break; + case Dclient: + if(!npage || (!col && !page[pg]->nclient) || (col && !page[pg]->ncol)) + return nil; + if(col) + + snprintf(buf, sizeof(buf), "%u", c); return buf; break; case Fctl: return "ctl"; break; case Ffont: return "font"; break; - case Fcolor3: return "color"; break; case Fcolor: return "color"; break; case Fborder: return "border"; break; case Fsnap: return "border"; break; case Ftitle: return "title"; break; case Fname: return "name"; break; case Fevent: return "event"; break; - case Fcolor: return "color"; break; default: return nil; break; } } static int -name_to_type(char *name, unsigned char level) +name_to_type(char *name, unsigned short ppg, unsigned short pcol, unsigned short pc) { const char *err; unsigned int i; if(!name || !name[0] || !strncmp(name, "/", 2) || !strncmp(name, "..", 3)) return Droot; - if(!strncmp(name, "new", 4)) - return Ditem; + if(!strncmp(name, "new", 4)) { + if(!ppg) + return Dpage; + else if(!pcol) + return Dcol; + } if(!strncmp(name, "ctl", 4)) return Fctl; if(!strncmp(name, "font", 5)) return Ffont; - if(!strncmp(name, "data", 5)) - return Fdata; if(!strncmp(name, "event", 6)) return Fevent; if(!strncmp(name, "color", 6)) @@ -168,17 +194,16 @@ name_to_type(char *name, unsigned char level) if(!strncmp(name, "name", 5)) return Fname; if(!strncmp(name, "border", 7)) - return Fname; + return Fborder; if(!strncmp(name, "title", 6)) - return Fname; + return Ftitle; if(!strncmp(name, "col", 4)) return Dcolroot; if(!strncmp(name, "sel", 4)) - goto dynamic_dir; + return Dsel; i = (unsigned short) cext_strtonum(name, 1, 0xffff, &err); if(err) return -1; -dynamic_dir: switch(level) { case 0: return Dpage; break; case 2: return Dcol; break; @@ -192,8 +217,11 @@ static int mkqid(Qid *dir, char *wname, Qid *new) { const char *err; - int type = name_to_type(wname); - unsigned short i = qpath_item(dir->path); + unsigned char type = qpath_type(dir->path); + unsigned short pg = qpath_page(dir->path); + unsigned short col = qpath_col(dir->path); + unsigned short c = qpath_client(dir->path); + int type = name_to_type(wname, level); if((dir->type != IXP_QTDIR) || (type == -1)) return -1; @@ -201,20 +229,49 @@ mkqid(Qid *dir, char *wname, Qid *new) new->version = 0; switch(type) { case Droot: - new->type = IXP_QTDIR; *new = root_qid; break; - case Ditem: + case Ddefault: + new->type = IXP_QTDIR; + new->path = mkqpath(Ddefault, 0, 0, 0); + break; + case Dsel: + new->type = IXP_QTDIR; + { + Page *p = pagesz ? page[sel_page] : nil; + if(!p) + return -1; + switch(level) { + case 0: new->path = mkqpath(Ddefault, level, sel_page); break; + case 1: new->path = mkqpath(Ddefault, level, p->sel_float); break; + case 2: new->path = mkqpath(Ddefault, level, p->sel_col); break; + case 3: + if(!p->col[p->sel_col]) + return -1; + new->path = mkqpath(Ddefault, level, p->col[p->sel_col]->sel); + break; + } + } + break; + case Dpage: new->type = IXP_QTDIR; if(!strncmp(wname, "new", 4)) - new->path = mkqpath(Ditem, nitem); + new->path = mkqpath(Dpage, 0, npage); else { unsigned short i = cext_strtonum(wname, 1, 0xffff, &err); - if(err || (i >= nitem)) + if(err || (i >= npage)) return -1; - new->path = mkqpath(Ditem, i); + new->path = mkqpath(Dpage, 0, i); } break; + case Dcolroot: + new->type = IXP_QTDIR; + new->path = mkqpath(Dcolroot, 1, i); /* encode associated page == i */ + break; + case Dcol: + new->type = IXP_QTDIR; + new->path = mkqpath(Ddefault, 2, i); + break; case Fdata: /* note, Fdata needs to be before Fcolor, fallthrough */ if(!i) return -1; diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -34,16 +34,19 @@ struct Column { Client **client; size_t clientsz; size_t sel; + size_t nclient; XRectangle rect; }; struct Page { - Client **floating; - Column **column; - size_t floatingsz; - size_t columnsz; + Client **floatc; + Column **col; + size_t floatcsz; + size_t colsz; size_t sel_float; - size_t sel_column; + size_t sel_col; + size_t nfloat; + size_t ncol; Bool is_column; XRectangle rect_column; }; @@ -75,6 +78,7 @@ struct Client { /* global variables */ Page **page; +size_t npage; size_t pagesz; size_t sel_page; Page **aqueue; @@ -104,7 +108,9 @@ typedef struct { unsigned int border; unsigned int title; unsigned int snap; -} Default def; +} Default; + +Default def; Atom wm_state; /* TODO: Maybe replace with wm_atoms[WM_ATOM_COUNT]? */ Atom wm_change_state; @@ -154,7 +160,7 @@ unsigned int border_width(Client *c); /* event.c */ void init_event_hander(); -void check_event(Connection * c); +void check_event(IXPConn *c); /* mouse.c */ void mouse_resize(Client *c, Align align); diff --git a/cmd/wmiibar.c b/cmd/wmiibar.c @@ -334,7 +334,6 @@ mkqid(Qid *dir, char *wname, Qid *new) new->version = 0; switch(type) { case Droot: - new->type = IXP_QTDIR; *new = root_qid; break; case Ditem: