proceeded with wmiikeys

This commit is contained in:
Anselm R. Garbe 2006-02-06 15:20:25 +01:00
parent 32fc2e2c66
commit e6281f3fc1
11 changed files with 121 additions and 198 deletions

View File

@ -29,7 +29,7 @@ SRC_warp = wmiiwarp.c
OBJ_warp = ${SRC_warp:.c=.o}
#all: wmiibar wmiimenu wmiir wmiifs wmiikeys wmiiplumb wmiiwarp
all: wmiikeys wmiibar wmiir wmiiplumb wmiiwarp
all: wmiibar wmiikeys wmiir wmiiplumb wmiiwarp
@echo built wmii commands
.c.o:

View File

@ -10,13 +10,17 @@
#include "wm.h"
/*
static void max_client(void *obj, char *arg);
*/
/* action table for /?/ namespace */
/*
Action client_acttbl[] = {
{"max", max_client},
{0, 0}
};
*/
Client *
alloc_client(Window w, XWindowAttributes *wa)
@ -495,13 +499,14 @@ resize_client(Client *c, XRectangle *r, XPoint *pt)
configure_client(c);
}
/*
static void
max_client(void *obj, char *arg)
{
Client *c = obj;
if(c->maximized) {
/* XXX: do we really need this ? */ c->frame.rect = c->frame.revert;
c->frame.rect = c->frame.revert;
resize_client(c, &c->frame.revert, nil);
}
else {
@ -512,6 +517,7 @@ max_client(void *obj, char *arg)
}
c->maximized = !c->maximized;
}
*/
int
index_of_client_id(Area *a, unsigned short id)

View File

@ -59,14 +59,7 @@
* /1/1/1/ctl Fctl command interface (client)
*/
static char E9pversion[] = "9P version not supported";
static char Enoperm[] = "permission denied";
static char Enofid[] = "fid not assigned";
static char Enofile[] = "file not found";
static char Enomode[] = "mode not supported";
static char Enofunc[] = "function not supported";
static char Enocommand[] = "command not supported";
Qid root_qid;
const char *err;
/* IXP stuff */

View File

@ -10,12 +10,15 @@
#include "wm.h"
/*
static void select_client(void *obj, char *arg);
static void xexec(void *obj, char *arg);
static void swap_client(void *obj, char *arg);
static void xnew_column(void *obj, char *arg);
*/
/* action table for /?/ namespace */
/*
Action page_acttbl[] = {
{"exec", xexec},
{"swap", swap_client},
@ -23,6 +26,7 @@ Action page_acttbl[] = {
{"select", select_client},
{0, 0}
};
*/
Page *
alloc_page()
@ -135,6 +139,7 @@ rectangles(unsigned int *num)
return result;
}
/*
static void
xexec(void *obj, char *arg)
{
@ -142,7 +147,9 @@ xexec(void *obj, char *arg)
sizeof(Page *), &aqsz);
wmii_spawn(dpy, arg);
}
*/
/*
static void
swap_client(void *obj, char *arg)
{
@ -230,6 +237,7 @@ select_client(void *obj, char *arg)
}
}
}
*/
int
index_of_page_id(unsigned short id)

View File

@ -388,18 +388,6 @@ scan_wins()
XFree(wins);
}
void *
get_func(void *acttbl[][2], int rows, char *fname)
{
int i;
for(i = 0; i < rows; i++) {
if(!strncmp((char *) acttbl[i][0], fname, MAX_BUF)) {
return acttbl[i][1];
}
}
return 0;
}
int
win_proto(Window w)
{

View File

@ -119,7 +119,6 @@ XFontStruct *xfont;
GC gc_xor;
GC gc_transient;
IXPServer srv;
Qid root_qid;
/* default values */
typedef struct {

View File

@ -55,20 +55,11 @@ typedef struct {
XRectangle rect;
} Item;
static char E9pversion[] = "9P version not supported";
static char Enoperm[] = "permission denied";
static char Enofid[] = "fid not assigned";
static char Enofile[] = "file not found";
static char Enomode[] = "mode not supported";
static char Enofunc[] = "function not supported";
static char Enocommand[] = "command not supported";
static size_t nitem = 0;
static size_t itemsz = 0;
static size_t iexpand = 0;
static Item **item = 0;
static IXPServer srv = { 0 };
static Qid root_qid;
static Display *dpy;
static int screen;
static char *font = nil;
@ -79,6 +70,7 @@ static XRectangle brect, rect;
static Pixmap pmap;
static char defcolstr[24];
static Color defcolor;
Qid root_qid;
static void do_pend_fcall(char *event);
@ -366,32 +358,6 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
}
static char *
xversion(IXPConn *c, Fcall *fcall)
{
if(strncmp(fcall->version, IXP_VERSION, strlen(IXP_VERSION)))
return E9pversion;
else if(fcall->maxmsg > IXP_MAX_MSG)
fcall->maxmsg = IXP_MAX_MSG;
fcall->id = RVERSION;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static char *
xattach(IXPConn *c, Fcall *fcall)
{
IXPMap *new = cext_emallocz(sizeof(IXPMap));
new->qid = root_qid;
new->fid = fcall->fid;
c->map = (IXPMap **)cext_array_attach((void **)c->map, new,
sizeof(IXPMap *), &c->mapsz);
fcall->id = RATTACH;
fcall->qid = root_qid;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static char *
xwalk(IXPConn *c, Fcall *fcall)
{
@ -765,20 +731,6 @@ xwrite(IXPConn *c, Fcall *fcall)
return nil;
}
static char *
xclunk(IXPConn *c, Fcall *fcall)
{
IXPMap *m = ixp_server_fid2map(c, fcall->fid);
if(!m)
return Enofid;
cext_array_detach((void **)c->map, m, &c->mapsz);
free(m);
fcall->id = RCLUNK;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static void
do_fcall(IXPConn *c)
{
@ -789,14 +741,14 @@ do_fcall(IXPConn *c)
if((msize = ixp_server_receive_fcall(c, &fcall))) {
/*fprintf(stderr, "fcall=%d\n", fcall.id);*/
switch(fcall.id) {
case TVERSION: errstr = xversion(c, &fcall); break;
case TATTACH: errstr = xattach(c, &fcall); break;
case TVERSION: errstr = wmii_ixp_version(c, &fcall); break;
case TATTACH: errstr = wmii_ixp_attach(c, &fcall); break;
case TWALK: errstr = xwalk(c, &fcall); break;
case TREMOVE: errstr = xremove(c, &fcall); break;
case TOPEN: errstr = xopen(c, &fcall); break;
case TREAD: errstr = xread(c, &fcall); break;
case TWRITE: errstr = xwrite(c, &fcall); break;
case TCLUNK: errstr = xclunk(c, &fcall); break;
case TCLUNK: errstr = wmii_ixp_clunk(c, &fcall); break;
case TSTAT: errstr = xstat(c, &fcall); break;
default: errstr = Enofunc; break;
}

View File

@ -8,6 +8,7 @@
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <time.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
@ -31,7 +32,7 @@
/* 8-bit qid.path.type */
enum {
Droot,
Dshortcut
Dshortcut,
Fctl,
Ffont,
Fcolor,
@ -43,22 +44,13 @@ typedef struct Shortcut Shortcut;
struct Shortcut {
unsigned short id;
char name[MAX_BUF];
char name[256];
char *cmd;
unsigned long mod;
KeyCode key;
Shortcut *next;
};
static char E9pversion[] = "9P version not supported";
static char Enoperm[] = "permission denied";
static char Enofid[] = "fid not assigned";
static char Enofile[] = "file not found";
static char Enomode[] = "mode not supported";
static char Enofunc[] = "function not supported";
static char Enocommand[] = "command not supported";
static IXPServer srv;
static Display *dpy;
static Window win;
@ -73,6 +65,7 @@ static unsigned int num_lock_mask, valid_mask;
static char *font;
static char *colstr;
static Draw box;
Qid root_qid;
static void draw_shortcut_box(char *prefix);
@ -141,7 +134,7 @@ create_shortcut(char *name, char *cmd)
s->next = cext_emallocz(sizeof(Shortcut));
s = s->next;
}
cext_strlcpy(s->name, chain[i], MAX_BUF);
cext_strlcpy(s->name, chain[i], sizeof(s->name));
k = strrchr(chain[i], '-');
if(k)
k++;
@ -319,12 +312,22 @@ dummy_error_handler(Display * dpy, XErrorEvent * err)
return 0;
}
static Shortcut *
shortcut_of_name(char *name)
{
size_t i;
for(i = 0; i < nshortcut; i++)
if(!strncmp(shortcut[i]->name, name, sizeof(shortcut[i]->name)))
return shortcut[i];
return nil;
}
static int
index_of_id(unsigned short id)
{
int i;
for(i = 0; i < nitem; i++)
if(item[i]->id == id)
for(i = 0; i < nshortcut; i++)
if(shortcut[i]->id == id)
return i;
return -1;
}
@ -355,23 +358,17 @@ qid_to_name(Qid *qid)
unsigned char type = qpath_type(qid->path);
unsigned short id = qpath_id(qid->path);
int i;
static char buf[32];
if(id && ((i = index_of_id(id)) == -1))
return nil;
switch(type) {
case Droot: return "/"; break;
case Ditem:
snprintf(buf, sizeof(buf), "%u", i + 1);
return buf;
break;
case Dshortcut: return "shortcut"; break;
case Fctl: return "ctl"; break;
case Ffont: return "font"; break;
case Fdefcolor: return "defcolor"; break;
case Fexpand: return "expand"; break;
case Fdata: return "data"; break;
case Fevent: return "event"; break;
case Fcolor: return "color"; break;
case Freset: return "reset"; break;
case Fshortcut: return shortcut[i]->name; break;
default: return nil; break;
}
}
@ -379,36 +376,26 @@ qid_to_name(Qid *qid)
static int
name_to_type(char *name)
{
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, "shortcut", 4))
return Dshortcut;
if(!strncmp(name, "ctl", 4))
return Fctl;
if(!strncmp(name, "font", 5))
return Ffont;
if(!strncmp(name, "defcolor", 9))
return Fdefcolor;
if(!strncmp(name, "expand", 7))
return Fexpand;
if(!strncmp(name, "data", 5))
return Fdata;
if(!strncmp(name, "event", 6))
return Fevent;
if(!strncmp(name, "color", 6))
return Fcolor;
i = (unsigned short) cext_strtonum(name, 1, 0xffff, &err);
if(!err && (i - 1 <= nitem))
return Ditem;
if(!strncmp(name, "reset", 6))
return Freset;
if(shortcut_of_name(name))
return Fshortcut;
return -1;
}
static int
mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
{
const char *err;
unsigned short id = qpath_id(dir->path);
int i, type = name_to_type(wname);
@ -424,25 +411,12 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
case Droot:
*new = root_qid;
break;
case Ditem:
case Dshortcut:
new->type = IXP_QTDIR;
if(!strncmp(wname, "new", 4)) {
/*fprintf(stderr, "mkqid iswalk=%d, wname=%s\n", iswalk, wname);*/
if(iswalk)
new->path = mkqpath(Ditem, new_item()->id);
else
new->path = mkqpath(Ditem, 0);
}
else {
i = cext_strtonum(wname, 1, 0xffff, &err);
if(err || (i - 1 >= nitem))
return -1;
new->path = mkqpath(Ditem, item[i - 1]->id);
}
new->path = mkqpath(Dshortcut, 0);
break;
case Fdata:
case Fcolor:
if(i >= nitem)
case Fshortcut:
if(i >= nshortcut)
return -1;
default:
new->type = IXP_QTFILE;
@ -452,33 +426,6 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
return 0;
}
static char *
xversion(IXPConn *c, Fcall *fcall)
{
if(strncmp(fcall->version, IXP_VERSION, strlen(IXP_VERSION)))
return E9pversion;
else if(fcall->maxmsg > IXP_MAX_MSG)
fcall->maxmsg = IXP_MAX_MSG;
fcall->id = RVERSION;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static char *
xattach(IXPConn *c, Fcall *fcall)
{
IXPMap *new = cext_emallocz(sizeof(IXPMap));
new->qid = root_qid;
new->fid = fcall->fid;
c->map = (IXPMap **)cext_array_attach((void **)c->map, new,
sizeof(IXPMap *), &c->mapsz);
fcall->id = RATTACH;
fcall->qid = root_qid;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static char *
xwalk(IXPConn *c, Fcall *fcall)
{
@ -552,36 +499,26 @@ type_to_stat(Stat *stat, char *name, Qid *dir)
{
int i, type = name_to_type(name);
unsigned short id = qpath_id(dir->path);
char buf[16];
if(id && ((i = index_of_id(id)) == -1))
return 0;
switch (type) {
case Droot:
case Ditem:
case Dshortcut:
return mkstat(stat, dir, name, 0, DMDIR | DMREAD | DMEXEC);
break;
case Fctl:
case Freset:
return mkstat(stat, dir, name, 0, DMWRITE);
break;
case Fevent:
return mkstat(stat, dir, name, 0, DMREAD);
break;
case Ffont:
return mkstat(stat, dir, name, strlen(font), DMREAD | DMWRITE);
break;
case Fdefcolor:
return mkstat(stat, dir, name, 23, DMREAD | DMWRITE);
break;
case Fexpand:
snprintf(buf, sizeof(buf), "%u", iexpand + 1);
return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE);
break;
case Fdata:
return mkstat(stat, dir, name, (i == nitem) ? 0 : strlen(item[i]->data), DMREAD | DMWRITE);
break;
case Fcolor:
return mkstat(stat, dir, name, 23, DMREAD | DMWRITE);
break;
case Fshortcut:
return mkstat(stat, dir, name, strlen(shortcut[i]->cmd), DMREAD | DMWRITE);
break;
}
return 0;
@ -852,20 +789,6 @@ xwrite(IXPConn *c, Fcall *fcall)
return nil;
}
static char *
xclunk(IXPConn *c, Fcall *fcall)
{
IXPMap *m = ixp_server_fid2map(c, fcall->fid);
if(!m)
return Enofid;
cext_array_detach((void **)c->map, m, &c->mapsz);
free(m);
fcall->id = RCLUNK;
ixp_server_respond_fcall(c, fcall);
return nil;
}
static void
do_fcall(IXPConn *c)
{

View File

@ -6,7 +6,7 @@ include ../config.mk
CFLAGS += -I../liblitz -I../libixp -I../libcext
LDFLAGS += -L../liblitz -llitz -L../libixp -lixp -L../libcext -lcext
SRC = spawn.c wm.c
SRC = ixp.c spawn.c wm.c
OBJ = ${SRC:.c=.o}

50
libwmii/ixp.c Normal file
View File

@ -0,0 +1,50 @@
/*
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <string.h>
#include <stdlib.h>
#include "wmii.h"
/* default handler */
char *
wmii_ixp_version(IXPConn *c, Fcall *fcall)
{
if(strncmp(fcall->version, IXP_VERSION, strlen(IXP_VERSION)))
return E9pversion;
else if(fcall->maxmsg > IXP_MAX_MSG)
fcall->maxmsg = IXP_MAX_MSG;
fcall->id = RVERSION;
ixp_server_respond_fcall(c, fcall);
return nil;
}
char *
wmii_ixp_attach(IXPConn *c, Fcall *fcall)
{
IXPMap *new = cext_emallocz(sizeof(IXPMap));
new->qid = root_qid;
new->fid = fcall->fid;
c->map = (IXPMap **)cext_array_attach((void **)c->map, new,
sizeof(IXPMap *), &c->mapsz);
fcall->id = RATTACH;
fcall->qid = root_qid;
ixp_server_respond_fcall(c, fcall);
return nil;
}
char *
wmii_ixp_clunk(IXPConn *c, Fcall *fcall)
{
IXPMap *m = ixp_server_fid2map(c, fcall->fid);
if(!m)
return Enofid;
cext_array_detach((void **)c->map, m, &c->mapsz);
free(m);
fcall->id = RCLUNK;
ixp_server_respond_fcall(c, fcall);
return nil;
}

View File

@ -6,22 +6,26 @@
#include "ixp.h"
#include "blitz.h"
#define MAX_ID 20
#define MAX_BUF 128
/* ixp.c */
#define E9pversion "9P version not supported"
#define Enoperm "permission denied"
#define Enofid "fid not assigned"
#define Enofile "file not found"
#define Enomode "mode not supported"
#define Enofunc "function not supported"
#define Enocommand "command not supported"
typedef struct Action Action;
struct Action {
char *name;
void (*func) (void *obj, char *);
};
char *wmii_ixp_version(IXPConn *c, Fcall *fcall);
char *wmii_ixp_attach(IXPConn *c, Fcall *fcall);
char *wmii_ixp_clunk(IXPConn *c, Fcall *fcall);
/* spawn.c */
void wmii_spawn(void *dpy, char *cmd);
/* wm.c */
int wmii_property(Display * dpy, Window w, Atom a, Atom t, long l,
unsigned char **prop);
int wmii_property(Display * dpy, Window w, Atom a, Atom t, long l, unsigned char **prop);
void wmii_send_message(Display * dpy, Window w, Atom a, long value);
void wmii_init_lock_modifiers(Display * dpy, unsigned int *valid_mask,
unsigned int *num_lock_mask);
extern Qid root_qid;