several changes, adding alloc_area

This commit is contained in:
garbeam 2005-12-05 00:45:59 +02:00
parent c09888f7a1
commit 7a8fe69742
50 changed files with 2343 additions and 2472 deletions

View File

@ -11,64 +11,80 @@
#include <cext.h>
/*static Area zero_area = {0};*/
static Area zero_area = {0};
void
free_area(Area* a)
Area *alloc_area(Page *p, XRectangle * r)
{
char buf[MAX_BUF];
Area *a = (Area *) emalloc(sizeof(Area));
*a = zero_area;
a->rect = *r;
a->page = p;
snprintf(buf, MAX_BUF, "/%s/area/%d", p->files[P_PREFIX]->name, count_items((void **) p->areas));
a->files[A_PREFIX] = ixp_create(ixps, buf);
snprintf(buf, MAX_BUF, "/%s/area/%d/frame/sel", p->files[P_PREFIX]->name, count_items((void **) p->areas));
a->files[A_SEL_FRAME] = ixp_create(ixps, buf);
snprintf(buf, MAX_BUF, "/%s/area/%d/ctl", p->files[P_PREFIX]->name, count_items((void **) p->areas));
a->files[A_CTL] = ixp_create(ixps, buf);
snprintf(buf, MAX_BUF, "/%s/area/%d/geometry", p->files[P_PREFIX]->name, count_items((void **) p->areas));
a->files[A_GEOMETRY] = ixp_create(ixps, buf);
snprintf(buf, MAX_BUF, "/%s/area/%d/layout", p->files[P_PREFIX]->name, count_items((void **) p->areas));
a->files[A_LAYOUT] = ixp_create(ixps, buf);
p->areas =
(Area **) attach_item_end((void **) p->areas, a, sizeof(Area *));
p->sel = index_item((void **) p->areas, a);
return a;
}
void free_area(Area * a)
{
ixp_remove_file(ixps, a->files[A_PREFIX]);
free(a);
}
void
destroy_area(Area *a)
void destroy_area(Area * a)
{
unsigned int i;
a->layout->deinit(a);
for(i = 0; a->frames && a->frames[i]; i++);
destroy_frame(a->frames[i]);
for (i = 0; a->frames && a->frames[i]; i++);
destroy_frame(a->frames[i]);
free(a->frames);
free_area(a);
}
void
focus_area(Area *a, int raise, int up, int down)
void focus_area(Area * a, int raise, int up, int down)
{
Page *p = a->page;
Page *p = a->page;
if (!p)
return;
if (down && a->frames)
focus_frame(a->frames[a->sel], raise, 0, down);
p->sel = index_item((void **)p->areas, a);
p->sel = index_item((void **) p->areas, a);
p->files[P_SEL_AREA]->content = a->files[A_PREFIX]->content;
if (up)
focus_page(p, raise, 0);
}
void
attach_frame_to_area(Area *a, Frame * f)
{
}
void
detach_frame_from_area(Frame * f, int ignore_focus_and_destroy)
void attach_frame_to_area(Area * a, Frame * f)
{
}
void
draw_area(Area *a)
void detach_frame_from_area(Frame * f, int ignore_focus_and_destroy)
{
}
void draw_area(Area * a)
{
}
void
hide_area(Area *a)
void hide_area(Area * a)
{
}
void
show_area(Area *a)
void show_area(Area * a)
{
}

View File

@ -12,16 +12,15 @@
#include <cext.h>
static Client zero_client = {0};
static Client zero_client = { 0 };
Client *
alloc_client(Window w)
Client *alloc_client(Window w)
{
static int id = 0;
char buf[MAX_BUF];
char buf2[MAX_BUF];
XClassHint ch;
Client *c = (Client *) emalloc(sizeof(Client));
static int id = 0;
char buf[MAX_BUF];
char buf2[MAX_BUF];
XClassHint ch;
Client *c = (Client *) emalloc(sizeof(Client));
*c = zero_client;
c->win = w;
@ -42,24 +41,24 @@ alloc_client(Window w)
c->files[C_INSTANCE] = ixp_create(ixps, buf);
}
id++;
clients = (Client **) attach_item_end((void **) clients, c, sizeof(Client *));
clients =
(Client **) attach_item_end((void **) clients, c,
sizeof(Client *));
XSelectInput(dpy, c->win, CLIENT_MASK);
return c;
}
void
set_client_state(Client * c, int state)
void set_client_state(Client * c, int state)
{
long data[2];
long data[2];
data[0] = (long) state;
data[1] = (long) None;
XChangeProperty(dpy, c->win, wm_state, wm_state, 32,
PropModeReplace, (unsigned char *) data, 2);
PropModeReplace, (unsigned char *) data, 2);
}
void
show_client(Client * c)
void show_client(Client * c)
{
XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XMapWindow(dpy, c->win);
@ -69,8 +68,7 @@ show_client(Client * c)
grab_client(c, Mod1Mask, Button3);
}
void
hide_client(Client * c)
void hide_client(Client * c)
{
ungrab_client(c, AnyModifier, AnyButton);
XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
@ -79,34 +77,31 @@ hide_client(Client * c)
set_client_state(c, WithdrawnState);
}
void
reparent_client(Client * c, Window w, int x, int y)
void reparent_client(Client * c, Window w, int x, int y)
{
XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XReparentWindow(dpy, c->win, w, x, y);
XSelectInput(dpy, c->win, CLIENT_MASK);
}
void
grab_client(Client * c, unsigned long mod, unsigned int button)
void grab_client(Client * c, unsigned long mod, unsigned int button)
{
XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XGrabButton(dpy, button, mod, c->win, False,
ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
if ((mod != AnyModifier) && num_lock_mask) {
XGrabButton(dpy, button, mod | num_lock_mask, c->win,
False, ButtonPressMask, GrabModeAsync, GrabModeAsync,
None, None);
False, ButtonPressMask, GrabModeAsync, GrabModeAsync,
None, None);
XGrabButton(dpy, button, mod | num_lock_mask | LockMask,
c->win, False, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None);
c->win, False, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None);
}
XSelectInput(dpy, c->win, CLIENT_MASK);
XSync(dpy, False);
}
void
ungrab_client(Client * c, unsigned long mod, unsigned int button)
void ungrab_client(Client * c, unsigned long mod, unsigned int button)
{
XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XUngrabButton(dpy, button, mod, c->win);
@ -118,8 +113,7 @@ ungrab_client(Client * c, unsigned long mod, unsigned int button)
XSync(dpy, False);
}
void
configure_client(Client * c)
void configure_client(Client * c)
{
XConfigureEvent e;
e.type = ConfigureNotify;
@ -143,8 +137,7 @@ configure_client(Client * c)
XSync(dpy, False);
}
void
close_client(Client * c)
void close_client(Client * c)
{
if (c->proto & PROTO_DEL)
send_message(dpy, c->win, wm_protocols, wm_delete);
@ -152,10 +145,9 @@ close_client(Client * c)
XKillClient(dpy, c->win);
}
void
_init_client(Client * c, XWindowAttributes * wa)
void _init_client(Client * c, XWindowAttributes * wa)
{
long msize;
long msize;
c->rect.x = wa->x;
c->rect.y = wa->y;
c->border = wa->border_width;
@ -167,20 +159,19 @@ _init_client(Client * c, XWindowAttributes * wa)
XGetTransientForHint(dpy, c->win, &c->trans);
/* size hints */
if (!XGetWMNormalHints(dpy, c->win, &c->size, &msize)
|| !c->size.flags)
|| !c->size.flags)
c->size.flags = PSize;
XAddToSaveSet(dpy, c->win);
}
void
handle_client_property(Client * c, XPropertyEvent * e)
void handle_client_property(Client * c, XPropertyEvent * e)
{
char buf[1024];
long msize;
char buf[1024];
long msize;
buf[0] = '\0';
if (e->state == PropertyDelete)
return; /* ignore */
return; /* ignore */
if (e->atom == wm_protocols) {
/* update */
@ -205,18 +196,17 @@ handle_client_property(Client * c, XPropertyEvent * e)
break;
case XA_WM_NORMAL_HINTS:
if (!XGetWMNormalHints(dpy, c->win, &c->size, &msize)
|| !c->size.flags) {
|| !c->size.flags) {
c->size.flags = PSize;
}
break;
}
}
void
free_client(Client * c)
void free_client(Client * c)
{
clients =
(Client **) detach_item((void **) clients, c, sizeof(Client *));
(Client **) detach_item((void **) clients, c, sizeof(Client *));
ixp_remove_file(ixps, c->files[C_PREFIX]);
if (ixps->errstr)
fprintf(stderr, "wmiiwm: free_client(): %s\n", ixps->errstr);
@ -224,13 +214,12 @@ free_client(Client * c)
}
/* speed reasoned function for client property change */
void
draw_client(Client * c)
void draw_client(Client * c)
{
Frame *f = c->frame;
unsigned int tabh = tab_height(f);
int i, size;
int tw;
Frame *f = c->frame;
unsigned int tabh = tab_height(f);
int i, size;
int tw;
if (!tabh)
return;
@ -241,19 +230,19 @@ draw_client(Client * c)
for (i = 0; f->clients[i] && f->clients[i] != c; i++);
if (!f->clients[i + 1])
draw_tab(f, c->files[C_NAME]->content, i * tw, 0, f->rect.width - (i * tw), tabh,
ISSELFRAME(f) && f->clients[f->sel] == c);
draw_tab(f, c->files[C_NAME]->content, i * tw, 0,
f->rect.width - (i * tw), tabh, ISSELFRAME(f)
&& f->clients[f->sel] == c);
else
draw_tab(f, c->files[C_NAME]->content, i * tw, 0, tw, tabh,
ISSELFRAME(f) && f->clients[f->sel] == c);
ISSELFRAME(f) && f->clients[f->sel] == c);
}
void
draw_clients(Frame * f)
void draw_clients(Frame * f)
{
unsigned int tabh = tab_height(f);
int i, size = count_items((void **) f->clients);
int tw = f->rect.width;
unsigned int tabh = tab_height(f);
int i, size = count_items((void **) f->clients);
int tw = f->rect.width;
if (!tabh || !size)
return;
@ -261,36 +250,35 @@ draw_clients(Frame * f)
tw /= size;
for (i = 0; f->clients[i]; i++) {
if (!f->clients[i + 1]) {
int xoff = i * tw;
int xoff = i * tw;
draw_tab(f, f->clients[i]->files[C_NAME]->content,
xoff, 0, f->rect.width - xoff, tabh, ISSELFRAME(f)
&& f->clients[f->sel] == f->clients[i]);
xoff, 0, f->rect.width - xoff, tabh, ISSELFRAME(f)
&& f->clients[f->sel] == f->clients[i]);
break;
} else
draw_tab(f, f->clients[i]->files[C_NAME]->content,
i * tw, 0, tw, tabh, ISSELFRAME(f)
&& f->clients[f->sel] == f->clients[i]);
i * tw, 0, tw, tabh, ISSELFRAME(f)
&& f->clients[f->sel] == f->clients[i]);
}
XSync(dpy, False);
}
int
manage_class_instance(Client * c)
int manage_class_instance(Client * c)
{
char buf[MAX_BUF];
File *f;
char *class = (char *) c->files[C_CLASS]->content;
char *inst = (char *) c->files[C_INSTANCE]->content;
char buf[MAX_BUF];
File *f;
char *class = (char *) c->files[C_CLASS]->content;
char *inst = (char *) c->files[C_INSTANCE]->content;
if (!c->files[C_CLASS]->content || !c->files[C_INSTANCE]->content)
return 1;
snprintf(buf, sizeof(buf), "/default/client/%s:%s/manage",
class ? class : "", inst ? inst : "");
class ? class : "", inst ? inst : "");
f = ixp_walk(ixps, buf);
if (!f) {
snprintf(buf, sizeof(buf), "/default/client/%s:%s/manage",
class ? class : "", "*");
class ? class : "", "*");
f = ixp_walk(ixps, buf);
}
if (f && f->content)
@ -298,11 +286,10 @@ manage_class_instance(Client * c)
return 1;
}
void
gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
{
int dx = 0, dy = 0;
int gravity = NorthWestGravity;
int dx = 0, dy = 0;
int gravity = NorthWestGravity;
if (c->size.flags & PWinGravity) {
gravity = c->size.win_gravity;
@ -325,7 +312,7 @@ gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
case SouthWestGravity:
dy = -c->rect.height;
break;
default: /* don't care */
default: /* don't care */
break;
}
@ -347,7 +334,7 @@ gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
case SouthEastGravity:
dx = -(c->rect.width + bw);
break;
default: /* don't care */
default: /* don't care */
break;
}

View File

@ -12,18 +12,18 @@
#include "wm.h"
static void new_page(void *obj, char *cmd);
static void _select_page(void *obj, char *cmd);
static void _destroy_page(void *obj, char *cmd);
static void quit(void *obj, char *cmd);
static void _attach_client(void *obj, char *cmd);
static void _detach_client(void *obj, char *cmd);
static void _close_client(void *obj, char *cmd);
static void pager(void *obj, char *cmd);
static void icons(void *obj, char *cmd);
static void new_page(void *obj, char *cmd);
static void _select_page(void *obj, char *cmd);
static void _destroy_page(void *obj, char *cmd);
static void quit(void *obj, char *cmd);
static void _attach_client(void *obj, char *cmd);
static void _detach_client(void *obj, char *cmd);
static void _close_client(void *obj, char *cmd);
static void pager(void *obj, char *cmd);
static void icons(void *obj, char *cmd);
/* action table for /ctl namespace */
Action core_acttbl[] = {
Action core_acttbl[] = {
{"new", new_page},
{"destroy", _destroy_page},
{"select", _select_page},
@ -36,11 +36,10 @@ Action core_acttbl[] = {
{0, 0}
};
void
run_action(File * f, void *obj, Action * acttbl)
void run_action(File * f, void *obj, Action * acttbl)
{
int i;
size_t len;
int i;
size_t len;
if (!f->content)
return;
@ -56,25 +55,22 @@ run_action(File * f, void *obj, Action * acttbl)
}
}
fprintf(stderr, "wmiiwm: unknown action '%s'\n"
" or invalid ctl device\n", (char *) f->content);
" or invalid ctl device\n", (char *) f->content);
}
static void
quit(void *obj, char *cmd)
static void quit(void *obj, char *cmd)
{
ixps->runlevel = SHUTDOWN;
}
void
invoke_core_event(File * f)
void invoke_core_event(File * f)
{
if (!f->content)
return;
spawn(dpy, f->content);
}
void
focus_page(Page * p, int raise, int down)
void focus_page(Page * p, int raise, int down)
{
if (!pages)
return;
@ -89,28 +85,26 @@ focus_page(Page * p, int raise, int down)
focus_area(p->areas[p->sel], raise, 0, down);
}
unsigned int
tab_height(Frame *f)
unsigned int tab_height(Frame * f)
{
if (_strtonum(f->files[F_TAB]->content, 0, 1))
return font->ascent + font->descent + 4;
return 0;
}
unsigned int
border_width(Frame *f)
unsigned int border_width(Frame * f)
{
if(_strtonum(f->files[F_BORDER]->content, 0, 1))
if (_strtonum(f->files[F_BORDER]->content, 0, 1))
return BORDER_WIDTH;
return 0;
}
static void
scale_rect(XRectangle * from_dim, XRectangle * to_dim,
XRectangle * src, XRectangle * tgt)
XRectangle * src, XRectangle * tgt)
{
double wfact = (double) to_dim->width / (double) from_dim->width;
double hfact = (double) to_dim->height / (double) from_dim->height;
double wfact = (double) to_dim->width / (double) from_dim->width;
double hfact = (double) to_dim->height / (double) from_dim->height;
tgt->x = to_dim->x + (src->x * wfact);
tgt->y = to_dim->y + (src->y * hfact);
@ -123,59 +117,86 @@ scale_rect(XRectangle * from_dim, XRectangle * to_dim,
tgt->height = 1;
}
static void
draw_pager_page(Page * p, Draw * d)
static void draw_pager_page(Page * p, Draw * d)
{
unsigned int i, j;
XRectangle r = d->rect;
unsigned int i, j;
XRectangle r = d->rect;
char name[4];
if (p == pages[sel]) {
d->bg = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_BG_COLOR]->content);
d->fg = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_FG_COLOR]->content);
d->border = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_BORDER_COLOR]->content);
d->bg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_BG_COLOR]->content);
d->fg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_FG_COLOR]->content);
d->border =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_BORDER_COLOR]->content);
d->font = font;
} else {
d->bg = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_BG_COLOR]->content);
d->fg = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_FG_COLOR]->content);
d->border = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_BORDER_COLOR]->content);
d->bg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_BG_COLOR]->content);
d->fg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_FG_COLOR]->content);
d->border =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_BORDER_COLOR]->content);
d->font = font;
}
snprintf(name, sizeof(name), "%d", index_item((void **)pages, p));
snprintf(name, sizeof(name), "%d", index_item((void **) pages, p));
d->data = name;
blitz_drawlabel(dpy, d);
XSync(dpy, False);
for (i = 0; p->areas[i]; i++) {
for(j = 0; p->areas[i]->frames[j]; j++) {
for (j = 0; p->areas[i]->frames[j]; j++) {
if (i == p->sel && j == p->areas[i]->sel) {
d->bg = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_BG_COLOR]->content);
d->fg = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_FG_COLOR]->content);
d->border = blitz_loadcolor(dpy, screen_num, defaults[WM_SEL_BORDER_COLOR]->content);
d->bg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_BG_COLOR]->content);
d->fg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_FG_COLOR]->content);
d->border =
blitz_loadcolor(dpy, screen_num,
defaults[WM_SEL_BORDER_COLOR]->
content);
d->font = font;
} else {
d->bg = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_BG_COLOR]->content);
d->fg = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_FG_COLOR]->content);
d->border = blitz_loadcolor(dpy, screen_num, defaults[WM_NORM_BORDER_COLOR]->content);
d->bg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_BG_COLOR]->content);
d->fg =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_FG_COLOR]->content);
d->border =
blitz_loadcolor(dpy, screen_num,
defaults[WM_NORM_BORDER_COLOR]->
content);
d->font = font;
}
d->data = p->areas[i]->frames[j]->clients[p->areas[i]->frames[j]->sel]->files[C_NAME]->content;
d->data =
p->areas[i]->frames[j]->clients[p->areas[i]->frames[j]->
sel]->files[C_NAME]->
content;
scale_rect(&rect, &r, &p->areas[i]->rect, &d->rect);
blitz_drawlabel(dpy, d);
XSync(dpy, False); /* do not clear upwards */
XSync(dpy, False); /* do not clear upwards */
}
}
}
static void
draw_pager()
static void draw_pager()
{
unsigned int ic, ir, tw, th, rows, cols, size;
int i = 0;
int dx;
Draw d = {0};
unsigned int ic, ir, tw, th, rows, cols, size;
int i = 0;
int dx;
Draw d = { 0 };
blitz_getbasegeometry((void **) pages, &size, &cols, &rows);
dx = (cols - 1) * GAP; /* GAPpx space */
dx = (cols - 1) * GAP; /* GAPpx space */
tw = (rect.width - dx) / cols;
th = ((double) tw / rect.width) * rect.height;
d.drawable = transient;
@ -197,18 +218,17 @@ draw_pager()
}
}
static Page *
xy_to_pager_page(int x, int y)
static Page *xy_to_pager_page(int x, int y)
{
unsigned int ic, ir, tw, th, rows, cols, size;
int i = 0;
int dx;
XRectangle r;
unsigned int ic, ir, tw, th, rows, cols, size;
int i = 0;
int dx;
XRectangle r;
if (!pages)
return 0;
blitz_getbasegeometry((void **) pages, &size, &cols, &rows);
dx = (cols - 1) * GAP; /* GAPpx space */
dx = (cols - 1) * GAP; /* GAPpx space */
tw = (rect.width - dx) / cols;
th = ((double) tw / rect.width) * rect.height;
@ -231,10 +251,9 @@ xy_to_pager_page(int x, int y)
return 0;
}
static int
handle_kpress(XKeyEvent * e)
static int handle_kpress(XKeyEvent * e)
{
KeySym ksym = XKeycodeToKeysym(dpy, e->keycode, 0);
KeySym ksym = XKeycodeToKeysym(dpy, e->keycode, 0);
if (ksym >= XK_1 && ksym <= XK_9)
return ksym - XK_1;
@ -246,11 +265,10 @@ handle_kpress(XKeyEvent * e)
return -1;
}
static void
pager(void *obj, char *cmd)
static void pager(void *obj, char *cmd)
{
XEvent ev;
int i;
XEvent ev;
int i;
if (!pages)
return;
@ -258,11 +276,14 @@ pager(void *obj, char *cmd)
XClearWindow(dpy, transient);
XMapRaised(dpy, transient);
draw_pager();
while (XGrabKeyboard(dpy, transient, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess)
while (XGrabKeyboard
(dpy, transient, True, GrabModeAsync, GrabModeAsync,
CurrentTime) != GrabSuccess)
usleep(1000);
for (;;) {
while (!XCheckWindowEvent(dpy, transient, ButtonPressMask | KeyPressMask, &ev)) {
while (!XCheckWindowEvent
(dpy, transient, ButtonPressMask | KeyPressMask, &ev)) {
usleep(20000);
continue;
}
@ -279,7 +300,7 @@ pager(void *obj, char *cmd)
case ButtonPress:
XUnmapWindow(dpy, transient);
if (ev.xbutton.button == Button1) {
Page *p = xy_to_pager_page(ev.xbutton.x, ev.xbutton.y);
Page *p = xy_to_pager_page(ev.xbutton.x, ev.xbutton.y);
if (p)
focus_page(p, 0, 1);
}
@ -289,17 +310,16 @@ pager(void *obj, char *cmd)
}
}
static void
draw_icons()
static void draw_icons()
{
unsigned int i, ic, ir, tw, th, rows, cols, size;
int dx, dy;
unsigned int i, ic, ir, tw, th, rows, cols, size;
int dx, dy;
if (!detached)
return;
blitz_getbasegeometry((void **) detached, &size, &cols, &rows);
dx = (cols - 1) * GAP; /* GAPpx space */
dy = (rows - 1) * GAP; /* GAPpx space */
dx = (cols - 1) * GAP; /* GAPpx space */
dy = (rows - 1) * GAP; /* GAPpx space */
tw = (rect.width - dx) / cols;
th = (rect.height - dy) / rows;
@ -308,8 +328,8 @@ draw_icons()
i = 0;
for (ir = 0; ir < rows; ir++) {
for (ic = 0; ic < cols; ic++) {
Client *c = detached[i++];
XRectangle cr;
Client *c = detached[i++];
XRectangle cr;
if (!c)
return;
cr.x = ic * tw + (ic * GAP);
@ -317,7 +337,7 @@ draw_icons()
cr.width = tw;
cr.height = th;
XMoveResizeWindow(dpy, c->win, cr.x, cr.y, cr.width,
cr.height);
cr.height);
configure_client(c);
show_client(c);
XRaiseWindow(dpy, c->win);
@ -328,12 +348,11 @@ draw_icons()
}
static void
icons(void *obj, char *cmd)
static void icons(void *obj, char *cmd)
{
XEvent ev;
int i, n;
Client *c;
XEvent ev;
int i, n;
Client *c;
if (!detached)
return;
@ -341,7 +360,9 @@ icons(void *obj, char *cmd)
XClearWindow(dpy, transient);
XMapRaised(dpy, transient);
draw_icons();
while (XGrabKeyboard(dpy, transient, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess)
while (XGrabKeyboard
(dpy, transient, True, GrabModeAsync, GrabModeAsync,
CurrentTime) != GrabSuccess)
usleep(1000);
for (;;) {
@ -357,8 +378,9 @@ icons(void *obj, char *cmd)
hide_client(detached[i]);
if (n - 1 < i) {
c = detached[n];
detached = (Client **) detach_item((void **) detached, c,
sizeof(Client *));
detached =
(Client **) detach_item((void **) detached, c,
sizeof(Client *));
attach_client(c);
}
} else {
@ -376,7 +398,7 @@ icons(void *obj, char *cmd)
if ((c = win_to_client(ev.xbutton.window))) {
detached =
(Client **) detach_item((void **) detached, c,
sizeof(Client *));
sizeof(Client *));
attach_client(c);
}
XUngrabKeyboard(dpy, CurrentTime);
@ -387,30 +409,27 @@ icons(void *obj, char *cmd)
}
}
static void
_close_client(void *obj, char *cmd)
static void _close_client(void *obj, char *cmd)
{
Frame *f = pages ? SELFRAME(pages[sel]) : 0;
if (f->clients[f->sel])
if (f->clients[f->sel])
close_client(f->clients[f->sel]);
}
static void
_attach_client(void *obj, char *cmd)
static void _attach_client(void *obj, char *cmd)
{
if (detached) {
Client *c = detached[0];
Client *c = detached[0];
detached =
(Client **) detach_item((void **) detached, c,
sizeof(Client *));
sizeof(Client *));
attach_client(c);
}
}
static void
_detach_client(void *obj, char *cmd)
static void _detach_client(void *obj, char *cmd)
{
Frame *f;
Frame *f;
if (!pages)
return;
f = SELFRAME(pages[sel]);
@ -419,8 +438,7 @@ _detach_client(void *obj, char *cmd)
detach_client_from_frame(f->clients[f->sel], 0, 0);
}
static void
_select_page(void *obj, char *cmd)
static void _select_page(void *obj, char *cmd)
{
if (!pages || !cmd)
return;
@ -429,45 +447,42 @@ _select_page(void *obj, char *cmd)
else if (!strncmp(cmd, "next", 5))
sel = index_next_item((void **) pages, pages[sel]);
else
sel = _strtonum(cmd, 0, count_items((void **)pages));
sel = _strtonum(cmd, 0, count_items((void **) pages));
focus_page(pages[sel], 0, 1);
}
void
destroy_page(Page * p)
void destroy_page(Page * p)
{
unsigned int i;
unsigned int i;
for (i = 0; p->areas[i]; i++)
destroy_area(p->areas[i]);
free_page(p);
if (pages) {
show_page(pages[sel]);
defaults[WM_SEL_PAGE]->content = pages[sel]->files[P_PREFIX]->content;
defaults[WM_SEL_PAGE]->content =
pages[sel]->files[P_PREFIX]->content;
focus_page(pages[sel], 0, 1);
invoke_core_event(defaults[WM_EVENT_PAGE_UPDATE]);
}
}
static void
_destroy_page(void *obj, char *cmd)
static void _destroy_page(void *obj, char *cmd)
{
if (!pages)
return;
destroy_page(pages[sel]);
}
static void
new_page(void *obj, char *cmd)
static void new_page(void *obj, char *cmd)
{
if (pages)
hide_page(pages[sel]);
alloc_page("0");
}
Client *
win_to_client(Window w)
Client *win_to_client(Window w)
{
int i;
int i;
for (i = 0; clients && clients[i]; i++)
if (clients[i]->win == w)
@ -475,22 +490,21 @@ win_to_client(Window w)
return 0;
}
void
scan_wins()
void scan_wins()
{
int i;
unsigned int num;
Window *wins;
int i;
unsigned int num;
Window *wins;
XWindowAttributes wa;
Window d1, d2;
Client *c;
Window d1, d2;
Client *c;
if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
for (i = 0; i < num; i++) {
if (!XGetWindowAttributes(dpy, wins[i], &wa))
continue;
if (wa.override_redirect
|| XGetTransientForHint(dpy, wins[i], &d1))
|| XGetTransientForHint(dpy, wins[i], &d1))
continue;
if (wa.map_state == IsViewable) {
c = alloc_client(wins[i]);
@ -503,10 +517,9 @@ scan_wins()
XFree(wins);
}
void *
get_func(void *acttbl[][2], int rows, char *fname)
void *get_func(void *acttbl[][2], int rows, char *fname)
{
int i;
int i;
for (i = 0; i < rows; i++) {
if (!strncmp((char *) acttbl[i][0], fname, MAX_BUF)) {
return acttbl[i][1];
@ -515,16 +528,15 @@ get_func(void *acttbl[][2], int rows, char *fname)
return 0;
}
int
win_proto(Window w)
int win_proto(Window w)
{
Atom *protocols;
long res;
int protos = 0;
int i;
Atom *protocols;
long res;
int protos = 0;
int i;
res = property(dpy, w, wm_protocols, XA_ATOM,
20L, ((unsigned char **) &protocols));
20L, ((unsigned char **) &protocols));
if (res <= 0) {
return protos;
}
@ -537,16 +549,15 @@ win_proto(Window w)
return protos;
}
int
win_state(Window w)
int win_state(Window w)
{
/* state hints */
XWMHints *hints = XGetWMHints(dpy, w);
int res;
XWMHints *hints = XGetWMHints(dpy, w);
int res;
long *prop = 0;
long *prop = 0;
if (property(dpy, w, wm_state, wm_state,
2L, ((unsigned char **) &prop)) > 0) {
2L, ((unsigned char **) &prop)) > 0) {
res = (int) *prop;
free((long *) prop);
} else {
@ -559,18 +570,17 @@ win_state(Window w)
return res;
}
void
handle_after_write(IXPServer * s, File * f)
void handle_after_write(IXPServer * s, File * f)
{
if (f == defaults[WM_CTL])
run_action(f, 0, core_acttbl);
else if (f == defaults[WM_TRANS_COLOR]) {
unsigned long col[1];
unsigned long col[1];
col[0] = xorcolor.pixel;
XFreeColors(dpy, DefaultColormap(dpy, screen_num), col, 1, 0);
XAllocNamedColor(dpy, DefaultColormap(dpy, screen_num),
defaults[WM_TRANS_COLOR]->content,
&xorcolor, &xorcolor);
defaults[WM_TRANS_COLOR]->content,
&xorcolor, &xorcolor);
XSetForeground(dpy, xorgc, xorcolor.pixel);
}
check_event(0);

View File

@ -11,25 +11,24 @@
#include "wm.h"
/* local functions */
static void handle_buttonpress(XEvent * e);
static void handle_configurerequest(XEvent * e);
static void handle_destroynotify(XEvent * e);
static void handle_expose(XEvent * e);
static void handle_maprequest(XEvent * e);
static void handle_motionnotify(XEvent * e);
static void handle_propertynotify(XEvent * e);
static void handle_unmapnotify(XEvent * e);
static void handle_enternotify(XEvent * e);
static void update_ignore_enternotify_hack(XEvent * e);
static void handle_buttonpress(XEvent * e);
static void handle_configurerequest(XEvent * e);
static void handle_destroynotify(XEvent * e);
static void handle_expose(XEvent * e);
static void handle_maprequest(XEvent * e);
static void handle_motionnotify(XEvent * e);
static void handle_propertynotify(XEvent * e);
static void handle_unmapnotify(XEvent * e);
static void handle_enternotify(XEvent * e);
static void update_ignore_enternotify_hack(XEvent * e);
static unsigned int ignore_enternotify_hack = 0;
void (*handler[LASTEvent]) (XEvent *);
void (*handler[LASTEvent]) (XEvent *);
void
init_event_hander()
void init_event_hander()
{
int i;
int i;
/* init event handler */
for (i = 0; i < LASTEvent; i++) {
handler[i] = 0;
@ -48,10 +47,9 @@ init_event_hander()
handler[UnmapNotify] = handle_unmapnotify;
}
void
check_event(Connection * c)
void check_event(Connection * c)
{
XEvent ev;
XEvent ev;
while (XPending(dpy)) {
XNextEvent(dpy, &ev);
/* main evet loop */
@ -62,12 +60,11 @@ check_event(Connection * c)
}
}
static void
handle_buttonpress(XEvent * e)
static void handle_buttonpress(XEvent * e)
{
Client *c;
Client *c;
XButtonPressedEvent *ev = &e->xbutton;
Frame *f = win_to_frame(ev->window);
Frame *f = win_to_frame(ev->window);
if (f) {
handle_frame_buttonpress(ev, f);
return;
@ -88,7 +85,7 @@ handle_buttonpress(XEvent * e)
break;
case Button3:
{
Align align = xy_to_align(&c->rect, ev->x, ev->y);
Align align = xy_to_align(&c->rect, ev->x, ev->y);
if (align == CENTER)
mouse_move(c->frame);
else
@ -103,14 +100,13 @@ handle_buttonpress(XEvent * e)
}
}
static void
handle_configurerequest(XEvent * e)
static void handle_configurerequest(XEvent * e)
{
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
Client *c;
unsigned int bw = 0, tabh = 0;
Frame *f = 0;
XWindowChanges wc;
Client *c;
unsigned int bw = 0, tabh = 0;
Frame *f = 0;
update_ignore_enternotify_hack(e);
/* fprintf(stderr, "%s", "configure request\n"); */
@ -150,7 +146,8 @@ handle_configurerequest(XEvent * e)
f->rect.x = wc.x = c->rect.x - bw;
f->rect.y = wc.y = c->rect.y - (tabh ? tabh : bw);
f->rect.width = wc.width = c->rect.width + 2 * bw;
f->rect.height = wc.height = c->rect.height + bw + (tabh ? tabh : bw);
f->rect.height = wc.height =
c->rect.height + bw + (tabh ? tabh : bw);
wc.border_width = 1;
wc.sibling = None;
wc.stack_mode = ev->detail;
@ -174,7 +171,7 @@ handle_configurerequest(XEvent * e)
ev->value_mask &= ~CWStackMode;
ev->value_mask |= CWBorderWidth;
XConfigureWindow(dpy, e->xconfigurerequest.window, ev->value_mask,
&wc);
&wc);
XSync(dpy, False);
/*
@ -182,11 +179,10 @@ handle_configurerequest(XEvent * e)
*/
}
static void
handle_destroynotify(XEvent * e)
static void handle_destroynotify(XEvent * e)
{
XDestroyWindowEvent *ev = &e->xdestroywindow;
Client *c = win_to_client(ev->window);
Client *c = win_to_client(ev->window);
/* fprintf(stderr, "destroy: client 0x%x\n", (int)ev->window); */
if (!c)
return;
@ -194,14 +190,13 @@ handle_destroynotify(XEvent * e)
detach_client_from_frame(c, 0, 1);
else if (detached && (index_item((void **) detached, c) >= 0))
detached = (Client **) detach_item((void **) detached, c,
sizeof(Client *));
sizeof(Client *));
free_client(c);
}
static void
handle_expose(XEvent * e)
static void handle_expose(XEvent * e)
{
static Frame *f;
static Frame *f;
if (e->xexpose.count == 0) {
f = win_to_frame(e->xbutton.window);
if (f)
@ -209,12 +204,11 @@ handle_expose(XEvent * e)
}
}
static void
handle_maprequest(XEvent * e)
static void handle_maprequest(XEvent * e)
{
XMapRequestEvent *ev = &e->xmaprequest;
static XWindowAttributes wa;
static Client *c;
static Client *c;
/* fprintf(stderr, "map: window 0x%x\n", (int)ev->window); */
if (!XGetWindowAttributes(dpy, ev->window, &wa))
@ -231,13 +225,12 @@ handle_maprequest(XEvent * e)
}
}
static void
handle_motionnotify(XEvent * e)
static void handle_motionnotify(XEvent * e)
{
Frame *f = win_to_frame(e->xmotion.window);
Cursor cursor;
Frame *f = win_to_frame(e->xmotion.window);
Cursor cursor;
if (f) {
Frame *old = SELFRAME(pages[sel]);
Frame *old = SELFRAME(pages[sel]);
if (old != f) {
focus_frame(f, 0, 0, 1);
draw_frame(old);
@ -245,7 +238,7 @@ handle_motionnotify(XEvent * e)
} else if (f->clients) {
/* multihead assumption */
XSetInputFocus(dpy, f->clients[f->sel]->win,
RevertToPointerRoot, CurrentTime);
RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
}
cursor = cursor_for_motion(f, e->xmotion.x, e->xmotion.y);
@ -256,11 +249,10 @@ handle_motionnotify(XEvent * e)
}
}
static void
handle_propertynotify(XEvent * e)
static void handle_propertynotify(XEvent * e)
{
XPropertyEvent *ev = &e->xproperty;
Client *c = win_to_client(ev->window);
Client *c = win_to_client(ev->window);
if (c) {
handle_client_property(c, ev);
@ -268,11 +260,10 @@ handle_propertynotify(XEvent * e)
}
}
static void
handle_unmapnotify(XEvent * e)
static void handle_unmapnotify(XEvent * e)
{
XUnmapEvent *ev = &e->xunmap;
Client *c;
XUnmapEvent *ev = &e->xunmap;
Client *c;
update_ignore_enternotify_hack(e);
if (ev->event == root)
@ -290,11 +281,10 @@ handle_unmapnotify(XEvent * e)
}
}
static void
handle_enternotify(XEvent * e)
static void handle_enternotify(XEvent * e)
{
XCrossingEvent *ev = &e->xcrossing;
Client *c;
Client *c;
if (ev->mode != NotifyNormal)
return;
@ -305,7 +295,7 @@ handle_enternotify(XEvent * e)
c = win_to_client(ev->window);
if (c && c->frame && (ev->serial != ignore_enternotify_hack)) {
Frame *old = SELFRAME(pages[sel]);
Frame *old = SELFRAME(pages[sel]);
XUndefineCursor(dpy, c->frame->win);
if (old != c->frame) {
focus_frame(c->frame, 0, 0, 1);
@ -319,8 +309,7 @@ handle_enternotify(XEvent * e)
}
}
static void
update_ignore_enternotify_hack(XEvent * e)
static void update_ignore_enternotify_hack(XEvent * e)
{
ignore_enternotify_hack = e->xany.serial;
XSync(dpy, False);

View File

@ -12,26 +12,25 @@
#include <cext.h>
static Frame zero_frame = {0};
static Frame zero_frame = { 0 };
static void mouse();
static void select_client(void *obj, char *cmd);
static void handle_after_write_frame(IXPServer * s, File * f);
static void handle_before_read_frame(IXPServer * s, File * f);
static void mouse();
static void select_client(void *obj, char *cmd);
static void handle_after_write_frame(IXPServer * s, File * f);
static void handle_before_read_frame(IXPServer * s, File * f);
/* action table for /frame/?/ namespace */
Action frame_acttbl[] = {
Action frame_acttbl[] = {
{"select", select_client},
{0, 0}
};
Frame *
alloc_frame(XRectangle * r, int add_frame_border, int floating)
Frame *alloc_frame(XRectangle * r, int add_frame_border, int floating)
{
XSetWindowAttributes wa;
static int id = 0;
char buf[MAX_BUF];
Frame *f = (Frame *) emalloc(sizeof(Frame));
static int id = 0;
char buf[MAX_BUF];
Frame *f = (Frame *) emalloc(sizeof(Frame));
*f = zero_frame;
f->rect = *r;
@ -52,36 +51,58 @@ alloc_frame(XRectangle * r, int add_frame_border, int floating)
f->files[F_SIZE]->before_read = handle_before_read_frame;
f->files[F_SIZE]->after_write = handle_after_write_frame;
snprintf(buf, MAX_BUF, "/detached/frame/%d/border", id);
f->files[F_BORDER] = wmii_create_ixpfile(ixps, buf, defaults[WM_BORDER]->content);
f->files[F_BORDER] =
wmii_create_ixpfile(ixps, buf, defaults[WM_BORDER]->content);
f->files[F_BORDER]->after_write = handle_after_write_frame;
snprintf(buf, MAX_BUF, "/detached/frame/%d/tab", id);
f->files[F_TAB] = wmii_create_ixpfile(ixps, buf, defaults[WM_TAB]->content);
f->files[F_TAB] =
wmii_create_ixpfile(ixps, buf, defaults[WM_TAB]->content);
f->files[F_TAB]->after_write = handle_after_write_frame;
snprintf(buf, MAX_BUF, "/detached/frame/%d/handleinc", id);
f->files[F_HANDLE_INC] = wmii_create_ixpfile(ixps, buf, defaults[WM_HANDLE_INC]->content);
f->files[F_HANDLE_INC] =
wmii_create_ixpfile(ixps, buf, defaults[WM_HANDLE_INC]->content);
f->files[F_HANDLE_INC]->after_write = handle_after_write_frame;
snprintf(buf, MAX_BUF, "/detached/frame/%d/locked", id);
f->files[F_LOCKED] = wmii_create_ixpfile(ixps, buf, defaults[WM_LOCKED]->content);
f->files[F_LOCKED] =
wmii_create_ixpfile(ixps, buf, defaults[WM_LOCKED]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/selstyle/bgcolor", id);
f->files[F_SEL_BG_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_SEL_BG_COLOR]->content);
f->files[F_SEL_BG_COLOR] =
wmii_create_ixpfile(ixps, buf, defaults[WM_SEL_BG_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/selstyle/fgcolor", id);
f->files[F_SEL_FG_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_SEL_FG_COLOR]->content);
f->files[F_SEL_FG_COLOR] =
wmii_create_ixpfile(ixps, buf, defaults[WM_SEL_FG_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/selstyle/bordercolor", id);
f->files[F_SEL_BORDER_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_SEL_BORDER_COLOR]->content);
f->files[F_SEL_BORDER_COLOR] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_SEL_BORDER_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/normstyle/bgcolor", id);
f->files[F_NORM_BG_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_NORM_BG_COLOR]->content);
f->files[F_NORM_BG_COLOR] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_NORM_BG_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/normstyle/fgcolor", id);
f->files[F_NORM_FG_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_NORM_FG_COLOR]->content);
f->files[F_NORM_FG_COLOR] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_NORM_FG_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/normstyle/bordercolor", id);
f->files[F_NORM_BORDER_COLOR] = wmii_create_ixpfile(ixps, buf, defaults[WM_NORM_BORDER_COLOR]->content);
f->files[F_NORM_BORDER_COLOR] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_NORM_BORDER_COLOR]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/event/b2press", id);
f->files[F_EVENT_B2PRESS] = wmii_create_ixpfile(ixps, buf, defaults[WM_EVENT_B2PRESS]->content);
f->files[F_EVENT_B2PRESS] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_EVENT_B2PRESS]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/event/b3press", id);
f->files[F_EVENT_B3PRESS] = wmii_create_ixpfile(ixps, buf, defaults[WM_EVENT_B3PRESS]->content);
f->files[F_EVENT_B3PRESS] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_EVENT_B3PRESS]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/event/b4press", id);
f->files[F_EVENT_B4PRESS] = wmii_create_ixpfile(ixps, buf, defaults[WM_EVENT_B4PRESS]->content);
f->files[F_EVENT_B4PRESS] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_EVENT_B4PRESS]->content);
snprintf(buf, MAX_BUF, "/detached/frame/%d/event/b5press", id);
f->files[F_EVENT_B5PRESS] = wmii_create_ixpfile(ixps, buf, defaults[WM_EVENT_B5PRESS]->content);
f->files[F_EVENT_B5PRESS] =
wmii_create_ixpfile(ixps, buf,
defaults[WM_EVENT_B5PRESS]->content);
id++;
wa.override_redirect = 1;
@ -91,17 +112,17 @@ alloc_frame(XRectangle * r, int add_frame_border, int floating)
| SubstructureNotifyMask;
if (add_frame_border) {
int bw = border_width(f);
int th = tab_height(f);
int bw = border_width(f);
int th = tab_height(f);
f->rect.width += 2 * bw;
f->rect.height += bw + (th ? th : bw);
}
f->win =
XCreateWindow(dpy, root, f->rect.x, f->rect.y, f->rect.width, f->rect.height, 0,
DefaultDepth(dpy, screen_num), CopyFromParent,
DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
XCreateWindow(dpy, root, f->rect.x, f->rect.y, f->rect.width,
f->rect.height, 0, DefaultDepth(dpy, screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
XDefineCursor(dpy, f->win, f->cursor);
f->gc = XCreateGC(dpy, f->win, 0, 0);
@ -111,24 +132,22 @@ alloc_frame(XRectangle * r, int add_frame_border, int floating)
return f;
}
void
focus_frame(Frame * f, int raise, int up, int down)
void focus_frame(Frame * f, int raise, int up, int down)
{
Area *a = f->area;
if (down && f->clients)
focus_client(f->clients[f->sel], raise, 0);
a->sel = index_item((void **)a->frames, f);
a->sel = index_item((void **) a->frames, f);
a->files[A_SEL_FRAME]->content = f->files[F_PREFIX]->content;
if (raise && a->page->sel == 0) /* only floating windows are raised */
if (raise && a->page->sel == 0) /* only floating windows are raised */
XRaiseWindow(dpy, f->win);
if (up)
focus_area(a, raise, up, 0);
}
Frame *
win_to_frame(Window w)
Frame *win_to_frame(Window w)
{
int i;
int i;
for (i = 0; frames && frames[i]; i++)
if (frames[i]->win == w)
@ -136,8 +155,7 @@ win_to_frame(Window w)
return 0;
}
void
destroy_frame(Frame * f)
void destroy_frame(Frame * f)
{
frames = (Frame **) detach_item((void **) frames, f, sizeof(Frame *));
XFreeGC(dpy, f->gc);
@ -148,10 +166,9 @@ destroy_frame(Frame * f)
free(f);
}
void
focus_client(Client * c, int raise, int up)
void focus_client(Client * c, int raise, int up)
{
Frame *f = 0;
Frame *f = 0;
/* focus client */
if (c) {
f = c->frame;
@ -167,26 +184,24 @@ focus_client(Client * c, int raise, int up)
focus_frame(f, raise, up, 0);
}
static void
resize_clients(Frame * f, int tabh, int bw)
static void resize_clients(Frame * f, int tabh, int bw)
{
int i;
int i;
for (i = 0; f->clients && f->clients[i]; i++) {
Client *c = f->clients[i];
Client *c = f->clients[i];
c->rect.x = bw;
c->rect.y = tabh ? tabh : bw;
c->rect.width = f->rect.width - 2 * bw;
c->rect.height = f->rect.height - bw - (tabh ? tabh : bw);
XMoveResizeWindow(dpy, c->win, c->rect.x, c->rect.y,
c->rect.width, c->rect.height);
c->rect.width, c->rect.height);
configure_client(c);
}
}
static void
check_dimensions(Frame * f, unsigned int tabh, unsigned int bw)
static void check_dimensions(Frame * f, unsigned int tabh, unsigned int bw)
{
Client *c = f->clients ? f->clients[f->sel] : 0;
Client *c = f->clients ? f->clients[f->sel] : 0;
if (!c)
return;
@ -211,12 +226,12 @@ check_dimensions(Frame * f, unsigned int tabh, unsigned int bw)
static void
resize_incremental(Frame * f, unsigned int tabh, unsigned int bw)
{
Client *c = f->clients ? f->clients[f->sel] : 0;
Client *c = f->clients ? f->clients[f->sel] : 0;
if (!c)
return;
/* increment stuff, see chapter 4.1.2.3 of the ICCCM Manual */
if (c->size.flags & PResizeInc) {
int base_width = 0, base_height = 0;
int base_width = 0, base_height = 0;
if (c->size.flags & PBaseSize) {
base_width = c->size.base_width;
@ -227,19 +242,22 @@ resize_incremental(Frame * f, unsigned int tabh, unsigned int bw)
base_height = c->size.min_height;
}
/* client_width = base_width + i * c->size.width_inc for an integer i */
f->rect.width -= (f->rect.width - 2 * bw - base_width) % c->size.width_inc;
f->rect.height -= (f->rect.height - bw - (tabh ? tabh : bw) - base_height) % c->size.height_inc;
f->rect.width -=
(f->rect.width - 2 * bw - base_width) % c->size.width_inc;
f->rect.height -=
(f->rect.height - bw - (tabh ? tabh : bw) -
base_height) % c->size.height_inc;
}
}
void
resize_frame(Frame * f, XRectangle * r, XPoint * pt, int ignore_layout)
{
unsigned int tabh = tab_height(f);
unsigned int bw = border_width(f);
unsigned int tabh = tab_height(f);
unsigned int bw = border_width(f);
/* do layout stuff if necessary */
if (!ignore_layout) {
Area *a = f->area;
Area *a = f->area;
if (a && a->layout) {
a->layout->resize(f, r, pt);
} else
@ -251,18 +269,18 @@ resize_frame(Frame * f, XRectangle * r, XPoint * pt, int ignore_layout)
check_dimensions(f, tabh, bw);
if (f->files[F_HANDLE_INC]->content
&& ((char *) f->files[F_HANDLE_INC]->content)[0] == '1')
&& ((char *) f->files[F_HANDLE_INC]->content)[0] == '1')
resize_incremental(f, tabh, bw);
XMoveResizeWindow(dpy, f->win, f->rect.x, f->rect.y, f->rect.width, f->rect.height);
XMoveResizeWindow(dpy, f->win, f->rect.x, f->rect.y, f->rect.width,
f->rect.height);
resize_clients(f, (tabh ? tabh : bw), bw);
}
void
draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel)
void draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel)
{
Draw d = {0};
Draw d = { 0 };
d.drawable = f->win;
d.gc = f->gc;
d.rect.x = x;
@ -271,14 +289,26 @@ draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel)
d.rect.height = h;
d.data = text;
if (sel) {
d.bg = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_FG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_BORDER_COLOR]->content);
d.font = font;
} else {
d.bg = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_FG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_BORDER_COLOR]->content);
d.font = font;
}
blitz_drawlabel(dpy, &d);
@ -301,12 +331,11 @@ draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel)
* ./norm-style/bg-color "#RRGGBBAA"
* ./norm-style/border-color "#RRGGBBAA [#RRGGBBAA [#RRGGBBAA [#RRGGBBAA]]]"
*/
void
draw_frame(Frame * f)
void draw_frame(Frame * f)
{
Draw d = {0};
int bw = border_width(f);
XRectangle notch;
Draw d = { 0 };
int bw = border_width(f);
XRectangle notch;
if (bw) {
notch.x = bw;
notch.y = bw;
@ -317,13 +346,25 @@ draw_frame(Frame * f)
/* define ground plate (i = 0) */
if (ISSELFRAME(f)) {
d.bg = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, f->files[F_SEL_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_FG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
f->files[F_SEL_BORDER_COLOR]->content);
} else {
d.bg = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, f->files[F_NORM_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_FG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
f->files[F_NORM_BORDER_COLOR]->content);
}
d.rect = f->rect;
d.rect.x = d.rect.y = 0;
@ -335,12 +376,11 @@ draw_frame(Frame * f)
XSync(dpy, False);
}
void
handle_frame_buttonpress(XButtonEvent * e, Frame * f)
void handle_frame_buttonpress(XButtonEvent * e, Frame * f)
{
int bindex;
int size = count_items((void **) f->clients);
int cindex = e->x / f->rect.width / size;
int bindex;
int size = count_items((void **) f->clients);
int cindex = e->x / f->rect.width / size;
if (!f->area->page->sel)
XRaiseWindow(dpy, f->win);
if (cindex != f->sel) {
@ -359,13 +399,14 @@ handle_frame_buttonpress(XButtonEvent * e, Frame * f)
draw_frame(f);
}
void
attach_client_to_frame(Frame * f, Client * c)
void attach_client_to_frame(Frame * f, Client * c)
{
int size = count_items((void **) f->clients);
int size = count_items((void **) f->clients);
wmii_move_ixpfile(c->files[C_PREFIX], f->files[F_CLIENT_PREFIX]);
f->files[F_SEL_CLIENT]->content = c->files[C_PREFIX]->content;
f->clients = (Client **) attach_item_end((void **) f->clients, c, sizeof(Client *));
f->clients =
(Client **) attach_item_end((void **) f->clients, c,
sizeof(Client *));
f->sel = size;
c->frame = f;
reparent_client(c, f->win, border_width(f), tab_height(f));
@ -374,16 +415,15 @@ attach_client_to_frame(Frame * f, Client * c)
focus_client(c, 1, 1);
}
void
attach_client(Client * c)
void attach_client(Client * c)
{
Page *p = 0;
Frame *f = 0;
Page *p = 0;
Frame *f = 0;
if (!pages)
alloc_page("0");
/* transient stuff */
if (c && c->trans && !f) {
Client *t = win_to_client(c->trans);
Client *t = win_to_client(c->trans);
if (t && t->frame) {
focus_client(t, 1, 1);
f = alloc_frame(&c->rect, 1, 1);
@ -412,10 +452,9 @@ attach_client(Client * c)
invoke_core_event(defaults[WM_EVENT_PAGE_UPDATE]);
}
void
detach_client_from_frame(Client * c, int unmapped, int destroyed)
void detach_client_from_frame(Client * c, int unmapped, int destroyed)
{
Frame *f = c->frame;
Frame *f = c->frame;
wmii_move_ixpfile(c->files[C_PREFIX], defaults[WM_DETACHED_CLIENT]);
c->frame = 0;
f->clients =
@ -429,7 +468,7 @@ detach_client_from_frame(Client * c, int unmapped, int destroyed)
hide_client(c);
detached =
(Client **) attach_item_begin((void **) detached, c,
sizeof(Client *));
sizeof(Client *));
}
reparent_client(c, root, border_width(f), tab_height(f));
}
@ -445,11 +484,10 @@ detach_client_from_frame(Client * c, int unmapped, int destroyed)
invoke_core_event(defaults[WM_EVENT_PAGE_UPDATE]);
}
static void
mouse()
static void mouse()
{
Frame *f;
Align align;
Frame *f;
Align align;
if (!pages)
return;
@ -462,11 +500,10 @@ mouse()
mouse_resize(f, align);
}
static void
select_client(void *obj, char *cmd)
static void select_client(void *obj, char *cmd)
{
Frame *f = obj;
int size = count_items((void **) f->clients);
Frame *f = obj;
int size = count_items((void **) f->clients);
if (!f || !cmd || size == 1)
return;
if (!strncmp(cmd, "prev", 5)) {
@ -484,16 +521,16 @@ select_client(void *obj, char *cmd)
draw_frame(f);
}
static void
handle_before_read_frame(IXPServer * s, File * f)
static void handle_before_read_frame(IXPServer * s, File * f)
{
int i = 0;
int i = 0;
for (i = 0; frames && frames[i]; i++) {
if (f == frames[i]->files[F_SIZE]) {
char buf[64];
snprintf(buf, 64, "%d,%d,%d,%d", frames[i]->rect.x, frames[i]->rect.y,
frames[i]->rect.width, frames[i]->rect.height);
char buf[64];
snprintf(buf, 64, "%d,%d,%d,%d", frames[i]->rect.x,
frames[i]->rect.y, frames[i]->rect.width,
frames[i]->rect.height);
if (f->content)
free(f->content);
f->content = estrdup(buf);
@ -503,10 +540,9 @@ handle_before_read_frame(IXPServer * s, File * f)
}
}
static void
handle_after_write_frame(IXPServer * s, File * f)
static void handle_after_write_frame(IXPServer * s, File * f)
{
int i;
int i;
for (i = 0; frames && frames[i]; i++) {
if (f == frames[i]->files[F_CTL]) {
@ -514,17 +550,17 @@ handle_after_write_frame(IXPServer * s, File * f)
return;
}
if (f == frames[i]->files[F_TAB]
|| f == frames[i]->files[F_BORDER]
|| f == frames[i]->files[F_HANDLE_INC]) {
|| f == frames[i]->files[F_BORDER]
|| f == frames[i]->files[F_HANDLE_INC]) {
if (frames[i]->area) {
frames[i]->area->layout->arrange(frames[i]->area);
draw_page(frames[i]->area->page);
}
return;
} else if (f == frames[i]->files[F_SIZE]) {
char *size = frames[i]->files[F_SIZE]->content;
char *size = frames[i]->files[F_SIZE]->content;
if (size && strrchr(size, ',')) {
XRectangle frect;
XRectangle frect;
blitz_strtorect(dpy, &rect, &frect, size);
resize_frame(frames[i], &frect, 0, 0);
draw_page(frames[i]->area->page);

View File

@ -16,44 +16,44 @@ typedef struct Acme Acme;
typedef struct Column Column;
struct Acme {
int sel;
Column **column;
int sel;
Column **column;
};
struct Column {
int sel;
int refresh;
Frame **frames;
XRectangle rect;
int sel;
int refresh;
Frame **frames;
XRectangle rect;
};
static void init_col(Area *a);
static void deinit_col(Area *a);
static void arrange_col(Area *a);
static void attach_col(Area *a, Client *c);
static void detach_col(Area *a, Client *c, int unmapped, int destroyed);
static void resize_col(Frame *f, XRectangle *new, XPoint * pt);
static void init_col(Area * a);
static void deinit_col(Area * a);
static void arrange_col(Area * a);
static void attach_col(Area * a, Client * c);
static void detach_col(Area * a, Client * c, int unmapped, int destroyed);
static void resize_col(Frame * f, XRectangle * new, XPoint * pt);
static Layout lcol = {"col", init_col, deinit_col, arrange_col, attach_col, detach_col, resize_col};
static Layout lcol =
{ "col", init_col, deinit_col, arrange_col, attach_col, detach_col,
resize_col };
static Column zero_column = {0};
static Acme zero_acme = {0};
static Column zero_column = { 0 };
static Acme zero_acme = { 0 };
void
init_layout_column()
void init_layout_column()
{
layouts =
(Layout **) attach_item_end((void **) layouts, &lcol,
sizeof(Layout *));
(Layout **) attach_item_end((void **) layouts, &lcol,
sizeof(Layout *));
}
static void
arrange_column(Area *a, Column *col)
static void arrange_column(Area * a, Column * col)
{
int i;
int n = count_items((void **) col->frames);
unsigned int height = a->rect.height / n;
int i;
int n = count_items((void **) col->frames);
unsigned int height = a->rect.height / n;
for (i = 0; col->frames && col->frames[i]; i++) {
if (col->refresh) {
col->frames[i]->rect = col->rect;
@ -64,11 +64,10 @@ arrange_column(Area *a, Column *col)
}
}
static void
arrange_col(Area *a)
static void arrange_col(Area * a)
{
Acme *acme = a->aux;
int i;
Acme *acme = a->aux;
int i;
if (!acme) {
fprintf(stderr, "%s", "wmiiwm: fatal, page has no layout\n");
@ -78,29 +77,28 @@ arrange_col(Area *a)
arrange_column(a, acme->column[i]);
}
static void
init_col(Area *a)
static void init_col(Area * a)
{
Acme *acme = emalloc(sizeof(Acme));
int i, j, n, cols = 1;
unsigned int width = 1;
Column *col;
Acme *acme = emalloc(sizeof(Acme));
int i, j, n, cols = 1;
unsigned int width = 1;
Column *col;
*acme = zero_acme;
a->aux = acme;
/* processing argv */
/*
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
switch (argv[i][1]) {
case 'c':
cols = _strtonum(argv[++i], 0, 32);
if (cols < 1)
cols = 1;
break;
}
}
*/
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
switch (argv[i][1]) {
case 'c':
cols = _strtonum(argv[++i], 0, 32);
if (cols < 1)
cols = 1;
break;
}
}
*/
width = a->rect.width / cols;
acme->column = emalloc((cols + 1) * sizeof(Column *));
@ -112,7 +110,7 @@ init_col(Area *a)
acme->column[i]->rect.width = width;
acme->column[i]->refresh = 1;
}
acme->column[cols] = 0; /* null termination of array */
acme->column[cols] = 0; /* null termination of array */
/*
* Frame attaching strategy works as follows: 1. If more clients than
@ -127,7 +125,11 @@ init_col(Area *a)
j = 0;
for (i = 0; i < (cols - 1); i++) {
col = acme->column[i];
col->frames = (Frame **) attach_item_end((void **) col->frames, alloc_frame(&clients[i]->rect, 1, 1), sizeof(Frame *));
col->frames =
(Frame **) attach_item_end((void **) col->frames,
alloc_frame(&clients[i]->rect,
1, 1),
sizeof(Frame *));
col->frames[0]->aux = col;
attach_frame_to_area(a, col->frames[0]);
attach_client_to_frame(col->frames[0], clients[j]);
@ -147,7 +149,11 @@ init_col(Area *a)
j = 0;
for (i = cols - 1; j < n; i--) {
col = acme->column[i];
col->frames = (Frame **) attach_item_end((void **) col->frames, alloc_frame(&clients[i]->rect, 1, 1), sizeof(Frame *));
col->frames =
(Frame **) attach_item_end((void **) col->frames,
alloc_frame(&clients[i]->rect,
1, 1),
sizeof(Frame *));
col->frames[0]->aux = col;
attach_frame_to_area(a, col->frames[0]);
attach_client_to_frame(col->frames[0], clients[j]);
@ -157,17 +163,16 @@ init_col(Area *a)
arrange_col(a);
}
static void
deinit_col(Area *a)
static void deinit_col(Area * a)
{
Acme *acme = a->aux;
int i;
Acme *acme = a->aux;
int i;
for (i = 0; acme->column && acme->column[i]; i++) {
Column *col = acme->column[i];
int j;
Column *col = acme->column[i];
int j;
for (j = 0; col->frames && col->frames[j]; j++) {
Frame *f = col->frames[j];
Frame *f = col->frames[j];
while (f->clients && f->clients[0])
detach_client_from_frame(f->clients[0], 0, 0);
detach_frame_from_area(f, 1);
@ -180,17 +185,16 @@ deinit_col(Area *a)
a->aux = 0;
}
static void
attach_col(Area *a, Client *c)
static void attach_col(Area * a, Client * c)
{
Acme *acme = a->aux;
Column *col;
Frame *f;
Acme *acme = a->aux;
Column *col;
Frame *f;
col = acme->column[acme->sel];
f = alloc_frame(&c->rect, 1, 1);
col->frames = (Frame **) attach_item_end((void **) col->frames, f,
sizeof(Frame *));
sizeof(Frame *));
f->aux = col;
col->refresh = 1;
attach_frame_to_area(a, f);
@ -199,17 +203,16 @@ attach_col(Area *a, Client *c)
arrange_col(a);
}
static void
detach_col(Area *a, Client *c, int unmapped, int destroyed)
static void detach_col(Area * a, Client * c, int unmapped, int destroyed)
{
Frame *f = c->frame;
Column *col = f->aux;
Frame *f = c->frame;
Column *col = f->aux;
if (!col)
return; /* client was not attached, maybe exit(1) in
* such case */
return; /* client was not attached, maybe exit(1) in
* such case */
col->frames = (Frame **) detach_item((void **) col->frames, c->frame,
sizeof(Frame *));
sizeof(Frame *));
col->refresh = 1;
detach_client_from_frame(c, unmapped, destroyed);
detach_frame_from_area(f, 1);
@ -218,16 +221,15 @@ detach_col(Area *a, Client *c, int unmapped, int destroyed)
arrange_col(a);
}
static void
drop_resize(Frame * f, XRectangle * new)
static void drop_resize(Frame * f, XRectangle * new)
{
Column *col = f->aux;
Acme *acme = f->area->aux;
int i, idx, n = 0;
Column *col = f->aux;
Acme *acme = f->area->aux;
int i, idx, n = 0;
if (!col) {
fprintf(stderr, "%s",
"wmii: fatal: frame has no associated column\n");
"wmii: fatal: frame has no associated column\n");
exit(1);
}
for (i = 0; acme->column && acme->column[i]; i++) {
@ -239,19 +241,19 @@ drop_resize(Frame * f, XRectangle * new)
/* horizontal resizals are */
if (new->x < f->rect.x) {
if (idx && new->x > acme->column[idx - 1]->rect.x) {
Column *west = acme->column[idx - 1];
Column *west = acme->column[idx - 1];
west->rect.width = new->x - west->rect.x;
col->rect.width += f->rect.x - new->x;
col->rect.x = new->x;
for (i = 0; west->frames && west->frames[i]; i++) {
Frame *f = west->frames[i];
Frame *f = west->frames[i];
f->rect.x = west->rect.x;
f->rect.width = west->rect.width;
resize_frame(f, &f->rect, 0, 1);
}
for (i = 0; col->frames && col->frames[i]; i++) {
Frame *f = col->frames[i];
Frame *f = col->frames[i];
f->rect.x = col->rect.x;
f->rect.width = col->rect.width;
resize_frame(f, &f->rect, 0, 1);
@ -260,22 +262,22 @@ drop_resize(Frame * f, XRectangle * new)
}
if (new->x + new->width > f->rect.x + f->rect.width) {
if ((idx + 1 < n) &&
(new->x + new->width < acme->column[idx + 1]->rect.x
+ acme->column[idx + 1]->rect.width)) {
Column *east = acme->column[idx + 1];
(new->x + new->width < acme->column[idx + 1]->rect.x
+ acme->column[idx + 1]->rect.width)) {
Column *east = acme->column[idx + 1];
east->rect.width -= new->x + new->width - east->rect.x;
east->rect.x = new->x + new->width;
col->rect.x = new->x;
col->rect.width = new->width;
for (i = 0; col->frames && col->frames[i]; i++) {
Frame *f = col->frames[i];
Frame *f = col->frames[i];
f->rect.x = col->rect.x;
f->rect.width = col->rect.width;
resize_frame(f, &f->rect, 0, 1);
}
for (i = 0; east->frames && east->frames[i]; i++) {
Frame *f = east->frames[i];
Frame *f = east->frames[i];
f->rect.x = east->rect.x;
f->rect.width = east->rect.width;
resize_frame(f, &f->rect, 0, 1);
@ -292,7 +294,7 @@ drop_resize(Frame * f, XRectangle * new)
if (new->y < f->rect.y) {
if (idx && new->y > col->frames[idx - 1]->rect.y) {
Frame *north = col->frames[idx - 1];
Frame *north = col->frames[idx - 1];
north->rect.height = new->y - north->rect.y;
f->rect.width += new->y - north->rect.y;
f->rect.y = new->y;
@ -302,9 +304,9 @@ drop_resize(Frame * f, XRectangle * new)
}
if (new->y + new->height > f->rect.y + f->rect.height) {
if ((idx + 1 < n) &&
(new->y + new->height < col->frames[idx + 1]->rect.y
+ col->frames[idx + 1]->rect.height)) {
Frame *south = col->frames[idx + 1];
(new->y + new->height < col->frames[idx + 1]->rect.y
+ col->frames[idx + 1]->rect.height)) {
Frame *south = col->frames[idx + 1];
south->rect.width -= new->x + new->width - south->rect.x;
south->rect.x = new->x + new->width;
f->rect.x = new->x;
@ -315,20 +317,19 @@ drop_resize(Frame * f, XRectangle * new)
}
}
static void
_drop_move(Frame * f, XRectangle * new, XPoint * pt)
static void _drop_move(Frame * f, XRectangle * new, XPoint * pt)
{
Column *tgt = 0, *src = f->aux;
Acme *acme = f->area->aux;
int i;
Column *tgt = 0, *src = f->aux;
Acme *acme = f->area->aux;
int i;
if (!src) {
fprintf(stderr, "%s",
"wmii: fatal: frame has no associated column\n");
"wmii: fatal: frame has no associated column\n");
exit(1);
}
for (i = 0; acme->column && acme->column[i]; i++) {
Column *colp = acme->column[i];
Column *colp = acme->column[i];
if (blitz_ispointinrect(pt->x, pt->y, &colp->rect)) {
tgt = colp;
break;
@ -339,15 +340,15 @@ _drop_move(Frame * f, XRectangle * new, XPoint * pt)
if (tgt == src) {
/* only change order within column */
for (i = 0; tgt->frames && tgt->frames[i]; i++) {
Frame *fp = tgt->frames[i];
Frame *fp = tgt->frames[i];
if (blitz_ispointinrect(pt->x, pt->y, &fp->rect)) {
if (fp == f)
return; /* just ignore */
return; /* just ignore */
else {
int idxf = index_item((void **) tgt->frames, f);
int idxfp = index_item((void **) tgt->frames, fp);
Frame *tmpf = f;
XRectangle tmpr = f->rect;
int idxf = index_item((void **) tgt->frames, f);
int idxfp = index_item((void **) tgt->frames, fp);
Frame *tmpf = f;
XRectangle tmpr = f->rect;
f->rect = fp->rect;
fp->rect = tmpr;
@ -362,10 +363,10 @@ _drop_move(Frame * f, XRectangle * new, XPoint * pt)
} else {
/* detach, attach and change order in target column */
src->frames = (Frame **) detach_item((void **) src->frames,
f, sizeof(Frame *));
f, sizeof(Frame *));
tgt->frames =
(Frame **) attach_item_end((void **) tgt->frames, f,
sizeof(Frame *));
sizeof(Frame *));
tgt->refresh = 1;
arrange_column(f->area, tgt);
@ -373,11 +374,10 @@ _drop_move(Frame * f, XRectangle * new, XPoint * pt)
}
}
static void
resize_col(Frame * f, XRectangle * new, XPoint * pt)
static void resize_col(Frame * f, XRectangle * new, XPoint * pt)
{
if ((f->rect.width == new->width)
&& (f->rect.height == new->height))
&& (f->rect.height == new->height))
_drop_move(f, new, pt);
else
drop_resize(f, new);

View File

@ -7,11 +7,10 @@
#include "wm.h"
Cursor
cursor_for_motion(Frame * f, int x, int y)
Cursor cursor_for_motion(Frame * f, int x, int y)
{
int n, e, w, s, tn, te, tw, ts;
int tabh, bw;
int n, e, w, s, tn, te, tw, ts;
int tabh, bw;
bw = border_width(f);
tabh = tab_height(f);
@ -50,18 +49,17 @@ cursor_for_motion(Frame * f, int x, int y)
return normal_cursor;
}
Align
xy_to_align(XRectangle * rect, int x, int y)
Align xy_to_align(XRectangle * rect, int x, int y)
{
int w = x <= rect->x + rect->width / 2;
int n = y <= rect->y + rect->height / 2;
int e = x > rect->x + rect->width / 2;
int s = y > rect->y + rect->height / 2;
int nw = w && n;
int ne = e && n;
int sw = w && s;
int se = e && s;
int w = x <= rect->x + rect->width / 2;
int n = y <= rect->y + rect->height / 2;
int e = x > rect->x + rect->width / 2;
int s = y > rect->y + rect->height / 2;
int nw = w && n;
int ne = e && n;
int sw = w && s;
int se = e && s;
if (nw)
return NWEST;
@ -82,8 +80,7 @@ xy_to_align(XRectangle * rect, int x, int y)
return CENTER;
}
Align
cursor_to_align(Cursor cursor)
Align cursor_to_align(Cursor cursor)
{
if (cursor == w_cursor)
return WEST;
@ -101,35 +98,33 @@ cursor_to_align(Cursor cursor)
return SOUTH;
else if (cursor == sw_cursor)
return SWEST;
return CENTER; /* should not happen */
return CENTER; /* should not happen */
}
static int
check_vert_match(XRectangle * r, XRectangle * neighbor)
static int check_vert_match(XRectangle * r, XRectangle * neighbor)
{
/* check if neighbor matches edge */
return (((neighbor->y <= r->y)
&& (neighbor->y + neighbor->height >= r->y))
|| ((neighbor->y >= r->y)
&& (r->y + r->height >= neighbor->y)));
&& (neighbor->y + neighbor->height >= r->y))
|| ((neighbor->y >= r->y)
&& (r->y + r->height >= neighbor->y)));
}
static int
check_horiz_match(XRectangle * r, XRectangle * neighbor)
static int check_horiz_match(XRectangle * r, XRectangle * neighbor)
{
/* check if neighbor matches edge */
return (((neighbor->x <= r->x)
&& (neighbor->x + neighbor->width >= r->x))
|| ((neighbor->x >= r->x)
&& (r->x + r->width >= neighbor->x)));
&& (neighbor->x + neighbor->width >= r->x))
|| ((neighbor->x >= r->x)
&& (r->x + r->width >= neighbor->x)));
}
static void
snap_move(XRectangle * r, XRectangle * rects,
unsigned int num, int snapw, int snaph)
unsigned int num, int snapw, int snaph)
{
int i, j, w = 0, n = 0, e = 0, s = 0;
int i, j, w = 0, n = 0, e = 0, s = 0;
/* snap to other windows */
for (i = 0; i <= snapw && !(w && e); i++) {
@ -281,10 +276,9 @@ snap_move(XRectangle * r, XRectangle * rects,
}
}
static void
draw_pseudo_border(XRectangle * r)
static void draw_pseudo_border(XRectangle * r)
{
XRectangle pseudo = *r;
XRectangle pseudo = *r;
pseudo.x += 2;
pseudo.y += 2;
@ -295,20 +289,23 @@ draw_pseudo_border(XRectangle * r)
}
void
mouse_move(Frame * f)
void mouse_move(Frame * f)
{
int px = 0, py = 0, wex, wey, ex, ey, first = 1, i;
Window dummy;
XEvent ev;
int px = 0, py = 0, wex, wey, ex, ey, first = 1, i;
Window dummy;
XEvent ev;
/* borders */
int snapw = rect.width * _strtonum(defaults[WM_SNAP_VALUE]->content, 0, 1000) / 1000;
int snaph = rect.height * _strtonum(defaults[WM_SNAP_VALUE]->content, 0, 1000) / 1000;
unsigned int num;
unsigned int dmask;
XRectangle *rects = rectangles(&num);
XRectangle frect = f->rect;
XPoint pt;
int snapw =
rect.width * _strtonum(defaults[WM_SNAP_VALUE]->content, 0,
1000) / 1000;
int snaph =
rect.height * _strtonum(defaults[WM_SNAP_VALUE]->content, 0,
1000) / 1000;
unsigned int num;
unsigned int dmask;
XRectangle *rects = rectangles(&num);
XRectangle frect = f->rect;
XPoint pt;
XQueryPointer(dpy, f->win, &dummy, &dummy, &i, &i, &wex, &wey, &dmask);
XTranslateCoordinates(dpy, f->win, root, wex, wey, &ex, &ey, &dummy);
@ -317,11 +314,12 @@ mouse_move(Frame * f)
XSync(dpy, False);
XGrabServer(dpy);
XGrabPointer(dpy, root, False, ButtonMotionMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, move_cursor,
CurrentTime);
GrabModeAsync, GrabModeAsync, None, move_cursor,
CurrentTime);
for (;;) {
while (!XCheckMaskEvent(dpy,
ButtonReleaseMask | ButtonMotionMask, &ev)) {
ButtonReleaseMask | ButtonMotionMask,
&ev)) {
usleep(20000);
continue;
}
@ -343,7 +341,7 @@ mouse_move(Frame * f)
pt.x = ev.xmotion.x;
pt.y = ev.xmotion.y;
XTranslateCoordinates(dpy, f->win, root, ev.xmotion.x,
ev.xmotion.y, &px, &py, &dummy);
ev.xmotion.y, &px, &py, &dummy);
if (first)
first = 0;
else
@ -359,11 +357,11 @@ mouse_move(Frame * f)
static void
snap_resize(XRectangle * r, XRectangle * o, Align align,
XRectangle * rects, unsigned int num, int px, int ox, int py,
int oy, int snapw, int snaph)
XRectangle * rects, unsigned int num, int px, int ox, int py,
int oy, int snapw, int snaph)
{
int i, j, pend = 0;
int w, h;
int i, j, pend = 0;
int w, h;
/* x */
switch (align) {
@ -538,30 +536,34 @@ snap_resize(XRectangle * r, XRectangle * o, Align align,
}
void
mouse_resize(Frame * f, Align align)
void mouse_resize(Frame * f, Align align)
{
int px = 0, py = 0, i, ox, oy, first = 1;
Window dummy;
XEvent ev;
int px = 0, py = 0, i, ox, oy, first = 1;
Window dummy;
XEvent ev;
/* borders */
int snapw = rect.width * _strtonum(defaults[WM_SNAP_VALUE]->content, 0, 1000) / 1000;
int snaph = rect.height * _strtonum(defaults[WM_SNAP_VALUE]->content, 0, 1000) / 1000;
unsigned int dmask;
unsigned int num;
XRectangle *rects = rectangles(&num);
XRectangle frect = f->rect;
XRectangle origin = frect;
int snapw =
rect.width * _strtonum(defaults[WM_SNAP_VALUE]->content, 0,
1000) / 1000;
int snaph =
rect.height * _strtonum(defaults[WM_SNAP_VALUE]->content, 0,
1000) / 1000;
unsigned int dmask;
unsigned int num;
XRectangle *rects = rectangles(&num);
XRectangle frect = f->rect;
XRectangle origin = frect;
XQueryPointer(dpy, f->win, &dummy, &dummy, &i, &i, &ox, &oy, &dmask);
XSync(dpy, False);
XGrabServer(dpy);
XGrabPointer(dpy, f->win, False, ButtonMotionMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, resize_cursor,
CurrentTime);
GrabModeAsync, GrabModeAsync, None, resize_cursor,
CurrentTime);
for (;;) {
while (!XCheckMaskEvent(dpy,
ButtonReleaseMask | ButtonMotionMask, &ev)) {
ButtonReleaseMask | ButtonMotionMask,
&ev)) {
usleep(20000);
continue;
}
@ -569,7 +571,7 @@ mouse_resize(Frame * f, Align align)
switch (ev.type) {
case ButtonRelease:
if (!first) {
XPoint pt;
XPoint pt;
draw_pseudo_border(&frect);
pt.x = px;
pt.y = py;
@ -582,7 +584,7 @@ mouse_resize(Frame * f, Align align)
break;
case MotionNotify:
XTranslateCoordinates(dpy, f->win, root, ev.xmotion.x,
ev.xmotion.y, &px, &py, &dummy);
ev.xmotion.y, &px, &py, &dummy);
if (first)
first = 0;
@ -590,7 +592,7 @@ mouse_resize(Frame * f, Align align)
draw_pseudo_border(&frect);
snap_resize(&frect, &origin, align, rects, num, px,
ox, py, oy, snapw, snaph);
ox, py, oy, snapw, snaph);
draw_pseudo_border(&frect);
break;
}
@ -598,19 +600,19 @@ mouse_resize(Frame * f, Align align)
}
void
drop_move(Frame * f, XRectangle * new, XPoint * pt)
void drop_move(Frame * f, XRectangle * new, XPoint * pt)
{
Area *a = f->area;
int cx, cy;
unsigned int i, idx = index_item((void **) a->frames, f);
Area *a = f->area;
int cx, cy;
unsigned int i, idx = index_item((void **) a->frames, f);
if ((f->rect.x == new->x) && (f->rect.y == new->y))
return;
cx = (pt ? pt->x : new->x + new->width / 2);
cy = (pt ? pt->y : new->y + new->height / 2);
for (i = 0; a->frames[i]; i++) {
if ((a->frames[i] != f) && blitz_ispointinrect(cx, cy, &a->frames[i]->rect)) {
if ((a->frames[i] != f)
&& blitz_ispointinrect(cx, cy, &a->frames[i]->rect)) {
swap((void **) &a->frames[i], (void **) &a->frames[idx]);
a->sel = i;
a->layout->arrange(a);

View File

@ -11,23 +11,22 @@
#include <cext.h>
static Page zero_page = {0};
static Page zero_page = { 0 };
static void select_frame(void *obj, char *cmd);
static void handle_after_write_page(IXPServer * s, File * f);
static void select_frame(void *obj, char *cmd);
static void handle_after_write_page(IXPServer * s, File * f);
/* action table for /page/?/ namespace */
Action page_acttbl[] = {
Action page_acttbl[] = {
{"select", select_frame},
{0, 0}
};
Page *
alloc_page(char *autodestroy)
Page *alloc_page(char *autodestroy)
{
Page *p = emalloc(sizeof(Page));
char buf[MAX_BUF];
int id = count_items((void **) pages) + 1;
Page *p = emalloc(sizeof(Page));
char buf[MAX_BUF];
int id = count_items((void **) pages) + 1;
*p = zero_page;
snprintf(buf, sizeof(buf), "/page/%d", id);
@ -49,8 +48,7 @@ alloc_page(char *autodestroy)
return p;
}
void
free_page(Page * p)
void free_page(Page * p)
{
pages = (Page **) detach_item((void **) pages, p, sizeof(Page *));
if (pages) {
@ -66,25 +64,23 @@ free_page(Page * p)
free(p);
}
void
draw_page(Page * p)
void draw_page(Page * p)
{
int i;
int i;
if (!p)
return;
for (i = 0; p->areas && p->areas[i]; i++)
draw_area(p->areas[i]);
}
XRectangle *
rectangles(unsigned int *num)
XRectangle *rectangles(unsigned int *num)
{
XRectangle *result = 0;
int i, j = 0;
Window d1, d2;
Window *wins;
XRectangle *result = 0;
int i, j = 0;
Window d1, d2;
Window *wins;
XWindowAttributes wa;
XRectangle r;
XRectangle r;
if (XQueryTree(dpy, root, &d1, &d2, &wins, num)) {
result = emalloc(*num * sizeof(XRectangle));
@ -107,13 +103,12 @@ rectangles(unsigned int *num)
return result;
}
static void
center_pointer(Frame * f)
static void center_pointer(Frame * f)
{
Window dummy;
int wex, wey, ex, ey, i;
unsigned int dmask;
Window dummy;
int wex, wey, ex, ey, i;
unsigned int dmask;
if (!f)
return;
XQueryPointer(dpy, f->win, &dummy, &dummy, &i, &i, &wex, &wey, &dmask);
@ -122,19 +117,19 @@ center_pointer(Frame * f)
return;
/* suppress EnterNotify's while mouse warping */
XSelectInput(dpy, root, ROOT_MASK & ~StructureNotifyMask);
XWarpPointer(dpy, None, f->win, 0, 0, 0, 0, f->rect.width / 2, f->rect.height / 2);
XWarpPointer(dpy, None, f->win, 0, 0, 0, 0, f->rect.width / 2,
f->rect.height / 2);
XSync(dpy, False);
XSelectInput(dpy, root, ROOT_MASK);
}
static void
select_frame(void *obj, char *cmd)
static void select_frame(void *obj, char *cmd)
{
int i;
Frame *f, *old;
f = old = pages ? SELFRAME(pages[sel]) : 0;
if(!f || !cmd)
if (!f || !cmd)
return;
if (!strncmp(cmd, "prev", 5)) {
i = index_prev_item((void **) f->area->frames, f);
@ -151,28 +146,25 @@ select_frame(void *obj, char *cmd)
}
}
void
hide_page(Page * p)
void hide_page(Page * p)
{
int i;
int i;
for (i = 0; p->areas && p->areas[i]; i++)
hide_area(p->areas[i]);
}
void
show_page(Page * p)
void show_page(Page * p)
{
int i;
int i;
for (i = 0; p->areas && p->areas[i]; i++)
show_area(p->areas[i]);
}
Layout *
get_layout(char *name)
Layout *get_layout(char *name)
{
int i = 0;
size_t len;
int i = 0;
size_t len;
if (!name)
return 0;
len = strlen(name);
@ -183,76 +175,75 @@ get_layout(char *name)
return 0;
}
static void
handle_after_write_page(IXPServer * s, File * f)
static void handle_after_write_page(IXPServer * s, File * f)
{
int i;
int i;
for (i = 0; pages && pages[i]; i++) {
Page *p = pages[i];
Page *p = pages[i];
if (p->files[P_CTL] == f) {
run_action(f, p, page_acttbl);
return;
}
/*
else if (p->files[P_MANAGED_SIZE] == f) {
/ resize stuff /
blitz_strtorect(dpy, &rect, &p->managed_rect,
p->files[P_MANAGED_SIZE]->content);
if (!p->managed_rect.width)
p->managed_rect.width = 10;
if (!p->managed_rect.height)
p->managed_rect.height = 10;
if (p->layout)
p->layout->arrange(p);
draw_page(p);
return;
} else if (p->files[P_MANAGED_LAYOUT] == f) {
int had_valid_layout = p->layout ? 1 : 0;
if (p->layout)
p->layout->deinit(p);
p->layout = get_layout(p->files[P_MANAGED_LAYOUT]->content);
if (p->layout) {
p->layout->init(p);
p->layout->arrange(p);
if (!had_valid_layout) {
int j;
Frame **tmp = 0;
for (j = 0; p->floating && p->floating[j]; j++) {
if (!p->floating[j]->floating)
tmp =
(Frame **) attach_item_begin((void **) tmp,
p->
floating[j],
sizeof(Frame
*));
}
for (j = 0; tmp && tmp[j]; j++)
toggle_frame(tmp[j]);
free(tmp);
}
}
if (!p->layout) {
/ make all managed clients floating /
int j;
Frame **tmp = 0;
while (p->managed) {
tmp = (Frame **) attach_item_begin((void **) tmp,
p->managed[0],
sizeof(Frame *));
detach_frame_from_page(p->managed[0], 1);
}
for (j = 0; tmp && tmp[j]; j++) {
attach_Frameo_page(p, tmp[j], 0);
resize_frame(tmp[j], rect_of_frame(tmp[j]), 0, 1);
}
free(tmp);
}
draw_page(p);
invoke_core_event(core_files[CORE_EVENT_PAGE_UPDATE]);
return;
}
*/
else if (p->files[P_MANAGED_SIZE] == f) {
/ resize stuff /
blitz_strtorect(dpy, &rect, &p->managed_rect,
p->files[P_MANAGED_SIZE]->content);
if (!p->managed_rect.width)
p->managed_rect.width = 10;
if (!p->managed_rect.height)
p->managed_rect.height = 10;
if (p->layout)
p->layout->arrange(p);
draw_page(p);
return;
} else if (p->files[P_MANAGED_LAYOUT] == f) {
int had_valid_layout = p->layout ? 1 : 0;
if (p->layout)
p->layout->deinit(p);
p->layout = get_layout(p->files[P_MANAGED_LAYOUT]->content);
if (p->layout) {
p->layout->init(p);
p->layout->arrange(p);
if (!had_valid_layout) {
int j;
Frame **tmp = 0;
for (j = 0; p->floating && p->floating[j]; j++) {
if (!p->floating[j]->floating)
tmp =
(Frame **) attach_item_begin((void **) tmp,
p->
floating[j],
sizeof(Frame
*));
}
for (j = 0; tmp && tmp[j]; j++)
toggle_frame(tmp[j]);
free(tmp);
}
}
if (!p->layout) {
/ make all managed clients floating /
int j;
Frame **tmp = 0;
while (p->managed) {
tmp = (Frame **) attach_item_begin((void **) tmp,
p->managed[0],
sizeof(Frame *));
detach_frame_from_page(p->managed[0], 1);
}
for (j = 0; tmp && tmp[j]; j++) {
attach_Frameo_page(p, tmp[j], 0);
resize_frame(tmp[j], rect_of_frame(tmp[j]), 0, 1);
}
free(tmp);
}
draw_page(p);
invoke_core_event(core_files[CORE_EVENT_PAGE_UPDATE]);
return;
}
*/
}
}

View File

@ -13,27 +13,25 @@
#include "wm.h"
static int other_wm_running;
static int (*x_error_handler) (Display *, XErrorEvent *);
static int other_wm_running;
static int (*x_error_handler) (Display *, XErrorEvent *);
char *version[] = {
char *version[] = {
"wmiiwm - window manager improved 2 - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmiiwm -s <socket file> [-c] [-v]\n"
" -s socket file\n"
" -c checks if another WM is already running\n"
" -v version info\n");
"usage: wmiiwm -s <socket file> [-c] [-v]\n"
" -s socket file\n"
" -c checks if another WM is already running\n"
" -v version info\n");
exit(1);
}
static void
init_atoms()
static void init_atoms()
{
wm_state = XInternAtom(dpy, "WM_STATE", False);
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
@ -43,8 +41,7 @@ init_atoms()
net_wm_desktop = XInternAtom(dpy, "_NET_WM_DESKTOP", False);
}
static void
init_cursors()
static void init_cursors()
{
normal_cursor = XCreateFontCursor(dpy, XC_left_ptr);
resize_cursor = XCreateFontCursor(dpy, XC_sizing);
@ -60,47 +57,73 @@ init_cursors()
se_cursor = XCreateFontCursor(dpy, XC_bottom_right_corner);
}
static void
init_defaults()
static void init_defaults()
{
defaults[WM_DETACHED_FRAME] = ixp_create(ixps, "/detached/frame");
defaults[WM_DETACHED_CLIENT] = ixp_create(ixps, "/detached/client");
defaults[WM_TRANS_COLOR] = wmii_create_ixpfile(ixps, "/default/transcolor", BLITZ_SEL_FG_COLOR);
defaults[WM_TRANS_COLOR] =
wmii_create_ixpfile(ixps, "/default/transcolor",
BLITZ_SEL_FG_COLOR);
defaults[WM_TRANS_COLOR]->after_write = handle_after_write;
defaults[WM_SEL_BG_COLOR] = wmii_create_ixpfile(ixps, "/default/selstyle/bgcolor", BLITZ_SEL_BG_COLOR);
defaults[WM_SEL_FG_COLOR] = wmii_create_ixpfile(ixps, "/default/selstyle/fgcolor", BLITZ_SEL_FG_COLOR);
defaults[WM_SEL_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/default/selstyle/fgcolor", BLITZ_SEL_BORDER_COLOR);
defaults[WM_NORM_BG_COLOR] = wmii_create_ixpfile(ixps, "/default/normstyle/bgcolor", BLITZ_NORM_BG_COLOR);
defaults[WM_NORM_FG_COLOR] = wmii_create_ixpfile(ixps, "/default/normstyle/fgcolor", BLITZ_NORM_FG_COLOR);
defaults[WM_NORM_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/default/normstyle/fgcolor", BLITZ_NORM_BORDER_COLOR);
defaults[WM_FONT] = wmii_create_ixpfile(ixps, "/default/font", BLITZ_FONT);
defaults[WM_SEL_BG_COLOR] =
wmii_create_ixpfile(ixps, "/default/selstyle/bgcolor",
BLITZ_SEL_BG_COLOR);
defaults[WM_SEL_FG_COLOR] =
wmii_create_ixpfile(ixps, "/default/selstyle/fgcolor",
BLITZ_SEL_FG_COLOR);
defaults[WM_SEL_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/default/selstyle/fgcolor",
BLITZ_SEL_BORDER_COLOR);
defaults[WM_NORM_BG_COLOR] =
wmii_create_ixpfile(ixps, "/default/normstyle/bgcolor",
BLITZ_NORM_BG_COLOR);
defaults[WM_NORM_FG_COLOR] =
wmii_create_ixpfile(ixps, "/default/normstyle/fgcolor",
BLITZ_NORM_FG_COLOR);
defaults[WM_NORM_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/default/normstyle/fgcolor",
BLITZ_NORM_BORDER_COLOR);
defaults[WM_FONT] =
wmii_create_ixpfile(ixps, "/default/font", BLITZ_FONT);
defaults[WM_FONT]->after_write = handle_after_write;
defaults[WM_PAGE_SIZE] = wmii_create_ixpfile(ixps, "/default/pagesize", "0,0,east,south-16");
defaults[WM_PAGE_SIZE] =
wmii_create_ixpfile(ixps, "/default/pagesize",
"0,0,east,south-16");
defaults[WM_SNAP_VALUE] = wmii_create_ixpfile(ixps, "/default/snapvalue", "20"); /* 0..1000 */
defaults[WM_BORDER] = wmii_create_ixpfile(ixps, "/default/border", "1");
defaults[WM_BORDER] =
wmii_create_ixpfile(ixps, "/default/border", "1");
defaults[WM_TAB] = wmii_create_ixpfile(ixps, "/default/tab", "1");
defaults[WM_HANDLE_INC] = wmii_create_ixpfile(ixps, "/default/handleinc", "1");
defaults[WM_LOCKED] = wmii_create_ixpfile(ixps, "/default/locked", "1");
defaults[WM_LAYOUT] = wmii_create_ixpfile(ixps, "/default/layout", LAYOUT);
defaults[WM_HANDLE_INC] =
wmii_create_ixpfile(ixps, "/default/handleinc", "1");
defaults[WM_LOCKED] =
wmii_create_ixpfile(ixps, "/default/locked", "1");
defaults[WM_LAYOUT] =
wmii_create_ixpfile(ixps, "/default/layout", LAYOUT);
defaults[WM_SEL_PAGE] = ixp_create(ixps, "/page/sel");
defaults[WM_EVENT_PAGE_UPDATE] = ixp_create(ixps, "/default/event/pageupdate");
defaults[WM_EVENT_CLIENT_UPDATE] = ixp_create(ixps, "/default/event/clientupdate");
defaults[WM_EVENT_B1PRESS] = ixp_create(ixps, "/defaults/event/b1press");
defaults[WM_EVENT_B2PRESS] = ixp_create(ixps, "/defaults/event/b2press");
defaults[WM_EVENT_B3PRESS] = ixp_create(ixps, "/defaults/event/b3press");
defaults[WM_EVENT_B4PRESS] = ixp_create(ixps, "/defaults/event/b4press");
defaults[WM_EVENT_B5PRESS] = ixp_create(ixps, "/defaults/event/b5press");
defaults[WM_EVENT_PAGE_UPDATE] =
ixp_create(ixps, "/default/event/pageupdate");
defaults[WM_EVENT_CLIENT_UPDATE] =
ixp_create(ixps, "/default/event/clientupdate");
defaults[WM_EVENT_B1PRESS] =
ixp_create(ixps, "/defaults/event/b1press");
defaults[WM_EVENT_B2PRESS] =
ixp_create(ixps, "/defaults/event/b2press");
defaults[WM_EVENT_B3PRESS] =
ixp_create(ixps, "/defaults/event/b3press");
defaults[WM_EVENT_B4PRESS] =
ixp_create(ixps, "/defaults/event/b4press");
defaults[WM_EVENT_B5PRESS] =
ixp_create(ixps, "/defaults/event/b5press");
}
static void
init_screen()
static void init_screen()
{
XGCValues gcv;
XGCValues gcv;
XSetWindowAttributes wa;
XAllocNamedColor(dpy, DefaultColormap(dpy, screen_num),
defaults[WM_TRANS_COLOR]->content,
&xorcolor, &xorcolor);
defaults[WM_TRANS_COLOR]->content,
&xorcolor, &xorcolor);
gcv.subwindow_mode = IncludeInferiors;
gcv.function = GXxor;
gcv.foreground = xorcolor.pixel;
@ -108,8 +131,8 @@ init_screen()
gcv.plane_mask = AllPlanes;
gcv.graphics_exposures = False;
xorgc = XCreateGC(dpy, root, GCForeground | GCGraphicsExposures
| GCFunction | GCSubwindowMode | GCLineWidth
| GCPlaneMask, &gcv);
| GCFunction | GCSubwindowMode | GCLineWidth
| GCPlaneMask, &gcv);
rect.x = rect.y = 0;
rect.width = DisplayWidth(dpy, screen_num);
rect.height = DisplayHeight(dpy, screen_num);
@ -119,11 +142,11 @@ init_screen()
wa.event_mask = ExposureMask | ButtonPressMask | PointerMotionMask
| SubstructureRedirectMask | SubstructureNotifyMask;
transient = XCreateWindow(dpy, root, 0, 0, rect.width, rect.height,
0, DefaultDepth(dpy, screen_num),
CopyFromParent, DefaultVisual(dpy,
screen_num),
CWOverrideRedirect | CWBackPixmap |
CWEventMask, &wa);
0, DefaultDepth(dpy, screen_num),
CopyFromParent, DefaultVisual(dpy,
screen_num),
CWOverrideRedirect | CWBackPixmap |
CWEventMask, &wa);
XSync(dpy, False);
transient_gc = XCreateGC(dpy, transient, 0, 0);
@ -138,20 +161,19 @@ init_screen()
* Other types of errors call Xlib's default error handler, which
* calls exit().
*/
static int
wmii_error_handler(Display * dpy, XErrorEvent * error)
static int wmii_error_handler(Display * dpy, XErrorEvent * error)
{
if (error->error_code == BadWindow
|| (error->request_code == X_SetInputFocus
&& error->error_code == BadMatch)
|| (error->request_code == X_PolyText8
&& error->error_code == BadDrawable)
|| (error->request_code == X_PolyFillRectangle
&& error->error_code == BadDrawable)
|| (error->request_code == X_PolySegment
&& error->error_code == BadDrawable)
|| (error->request_code == X_ConfigureWindow
&& error->error_code == BadMatch))
|| (error->request_code == X_SetInputFocus
&& error->error_code == BadMatch)
|| (error->request_code == X_PolyText8
&& error->error_code == BadDrawable)
|| (error->request_code == X_PolyFillRectangle
&& error->error_code == BadDrawable)
|| (error->request_code == X_PolySegment
&& error->error_code == BadDrawable)
|| (error->request_code == X_ConfigureWindow
&& error->error_code == BadMatch))
return 0;
fprintf(stderr, "%s", "wmiiwm: fatal error");
return x_error_handler(dpy, error); /* calls exit() */
@ -161,25 +183,24 @@ wmii_error_handler(Display * dpy, XErrorEvent * error)
* Startup Error handler to check if another window manager
* is already running.
*/
static int
startup_error_handler(Display * dpy, XErrorEvent * error)
static int startup_error_handler(Display * dpy, XErrorEvent * error)
{
other_wm_running = 1;
return -1;
}
static void
cleanup()
static void cleanup()
{
int i;
XWindowChanges wc;
int i;
XWindowChanges wc;
for (i = 0; clients && clients[i]; i++) {
Client *c = clients[i];
Frame *f = c->frame;
Client *c = clients[i];
Frame *f = c->frame;
if (f) {
gravitate(c, tab_height(f), border_width(f), 1);
XReparentWindow(dpy, c->win, root, f->rect.x + c->rect.x, f->rect.y + c->rect.y);
XReparentWindow(dpy, c->win, root, f->rect.x + c->rect.x,
f->rect.y + c->rect.y);
wc.border_width = c->border;
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc);
}
@ -187,8 +208,7 @@ cleanup()
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
}
static void
run()
static void run()
{
/* init */
init_event_hander();
@ -217,18 +237,17 @@ run()
/* main event loop */
run_server_with_fd_support(ixps, ConnectionNumber(dpy), check_event,
0);
0);
cleanup();
deinit_server(ixps);
XCloseDisplay(dpy);
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
int i;
int checkwm = 0;
char *sockfile = 0;
int i;
int checkwm = 0;
char *sockfile = 0;
/* command line args */
if (argc > 1) {
@ -269,7 +288,7 @@ main(int argc, char *argv[])
XSync(dpy, False);
if (other_wm_running) {
fprintf(stderr,
"wmiiwm: another window manager is already running\n");
"wmiiwm: another window manager is already running\n");
exit(1);
}
if (checkwm) {

View File

@ -24,7 +24,7 @@ enum {
A_PREFIX,
A_SEL_FRAME,
A_CTL,
A_SIZE,
A_GEOMETRY,
A_LAYOUT,
A_LAST
};
@ -113,177 +113,179 @@ typedef struct Client Client;
*/
struct Page {
Area **areas;
unsigned int sel;
File *files[P_LAST];
Area **areas;
unsigned int sel;
File *files[P_LAST];
};
struct Layout {
char *name;
void (*init) (Area *); /* called when layout is initialized */
void (*deinit) (Area *); /* called when layout is uninitialized */
void (*arrange) (Area *); /* called when area is resized */
void (*attach) (Area *, Client *); /* called on attach */
void (*detach) (Area *, Client *, int, int); /* called on detach */
void (*resize) (Frame *, XRectangle *, XPoint * pt); /* called after resize */
char *name;
void (*init) (Area *); /* called when layout is initialized */
void (*deinit) (Area *); /* called when layout is uninitialized */
void (*arrange) (Area *); /* called when area is resized */
void (*attach) (Area *, Client *); /* called on attach */
void (*detach) (Area *, Client *, int, int); /* called on detach */
void (*resize) (Frame *, XRectangle *, XPoint * pt); /* called after resize */
};
struct Area {
Layout *layout;
Page *page;
Frame **frames;
unsigned int sel;
XRectangle rect;
void *aux; /* free pointer */
File *files[A_LAST];
Layout *layout;
Page *page;
Frame **frames;
unsigned int sel;
XRectangle rect;
void *aux; /* free pointer */
File *files[A_LAST];
};
struct Frame {
Area *area;
Window win;
GC gc;
XRectangle rect;
Cursor cursor;
Client **clients;
int sel;
void *aux; /* free pointer */
File *files[F_LAST];
Area *area;
Window win;
GC gc;
XRectangle rect;
Cursor cursor;
Client **clients;
int sel;
void *aux; /* free pointer */
File *files[F_LAST];
};
struct Client {
int proto;
unsigned int border;
Window win;
Window trans;
XRectangle rect;
XSizeHints size;
Frame *frame;
File *files[C_LAST];
int proto;
unsigned int border;
Window win;
Window trans;
XRectangle rect;
XSizeHints size;
Frame *frame;
File *files[C_LAST];
};
#define SELFRAME(x) (x && x->areas[x->sel]->frames ? x->areas[x->sel]->frames[x->areas[x->sel]->sel] : 0)
#define ISSELFRAME(x) (pages && SELFRAME(pages[sel]) == x)
/* global variables */
Display *dpy;
IXPServer *ixps;
int screen_num;
Window root;
Window transient;
XRectangle rect;
Client **detached;
Page **pages;
unsigned int sel;
Frame **frames;
Client **clients;
XFontStruct *font;
XColor xorcolor;
GC xorgc;
GC transient_gc;
Layout **layouts;
Display *dpy;
IXPServer *ixps;
int screen_num;
Window root;
Window transient;
XRectangle rect;
Client **detached;
Page **pages;
unsigned int sel;
Frame **frames;
Client **clients;
XFontStruct *font;
XColor xorcolor;
GC xorgc;
GC transient_gc;
Layout **layouts;
Atom wm_state;
Atom wm_change_state;
Atom wm_protocols;
Atom wm_delete;
Atom motif_wm_hints;
Atom net_wm_desktop;
Atom wm_state;
Atom wm_change_state;
Atom wm_protocols;
Atom wm_delete;
Atom motif_wm_hints;
Atom net_wm_desktop;
Cursor normal_cursor;
Cursor resize_cursor;
Cursor move_cursor;
Cursor drag_cursor;
Cursor w_cursor;
Cursor e_cursor;
Cursor n_cursor;
Cursor s_cursor;
Cursor nw_cursor;
Cursor ne_cursor;
Cursor sw_cursor;
Cursor se_cursor;
Cursor normal_cursor;
Cursor resize_cursor;
Cursor move_cursor;
Cursor drag_cursor;
Cursor w_cursor;
Cursor e_cursor;
Cursor n_cursor;
Cursor s_cursor;
Cursor nw_cursor;
Cursor ne_cursor;
Cursor sw_cursor;
Cursor se_cursor;
/* default file pointers */
File *defaults[WM_LAST];
File *defaults[WM_LAST];
unsigned int valid_mask, num_lock_mask;
unsigned int valid_mask, num_lock_mask;
/* area.c */
void destroy_area(Area *a);
void free_area(Area *a);
void attach_frame_to_area(Area *a, Frame * f);
void detach_frame_from_area(Frame * f, int ignore_focus_and_destroy);
void draw_area(Area *a);
void hide_area(Area *a);
void show_area(Area *a);
Area *alloc_area(Page *p, XRectangle * r);
void destroy_area(Area * a);
void free_area(Area * a);
void attach_frame_to_area(Area * a, Frame * f);
void detach_frame_from_area(Frame * f, int ignore_focus_and_destroy);
void draw_area(Area * a);
void hide_area(Area * a);
void show_area(Area * a);
/* client.c */
Client *alloc_client(Window w);
void _init_client(Client * c, XWindowAttributes * wa);
void free_client(Client * c);
void configure_client(Client * c);
void handle_client_property(Client * c, XPropertyEvent * e);
void close_client(Client * c);
void draw_client(Client * c);
void draw_clients(Frame * f);
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert);
int manage_class_instance(Client * c);
void grab_client(Client * c, unsigned long mod, unsigned int button);
void ungrab_client(Client * c, unsigned long mod, unsigned int button);
void hide_client(Client * c);
void show_client(Client * c);
void reparent_client(Client * c, Window w, int x, int y);
Client *alloc_client(Window w);
void _init_client(Client * c, XWindowAttributes * wa);
void free_client(Client * c);
void configure_client(Client * c);
void handle_client_property(Client * c, XPropertyEvent * e);
void close_client(Client * c);
void draw_client(Client * c);
void draw_clients(Frame * f);
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert);
int manage_class_instance(Client * c);
void grab_client(Client * c, unsigned long mod, unsigned int button);
void ungrab_client(Client * c, unsigned long mod, unsigned int button);
void hide_client(Client * c);
void show_client(Client * c);
void reparent_client(Client * c, Window w, int x, int y);
/* core.c */
unsigned int tab_height(Frame *f);
unsigned int border_width(Frame *f);
void invoke_core_event(File * f);
void run_action(File * f, void *obj, Action * acttbl);
void scan_wins();
Client *win_to_client(Window w);
int win_proto(Window w);
int win_state(Window w);
void handle_after_write(IXPServer * s, File * f);
void focus_page(Page * p, int raise, int down);
void detach(Frame * f, int client_destroyed);
void destroy_page(Page * p);
void set_client_state(Client * c, int state);
unsigned int tab_height(Frame * f);
unsigned int border_width(Frame * f);
void invoke_core_event(File * f);
void run_action(File * f, void *obj, Action * acttbl);
void scan_wins();
Client *win_to_client(Window w);
int win_proto(Window w);
int win_state(Window w);
void handle_after_write(IXPServer * s, File * f);
void focus_page(Page * p, int raise, int down);
void detach(Frame * f, int client_destroyed);
void destroy_page(Page * p);
void set_client_state(Client * c, int state);
/* frame.c */
void focus_frame(Frame * f, int raise, int up, int down);
Frame *win_to_frame(Window w);
Frame *alloc_frame(XRectangle * r, int add_frame_border, int floating);
void destroy_frame(Frame * f);
void resize_frame(Frame * f, XRectangle * r, XPoint * pt, int ignore_layout);
void draw_frame(Frame * f);
void handle_frame_buttonpress(XButtonEvent * e, Frame * f);
void attach_client(Client * c);
void attach_client_to_frame(Frame * f, Client * c);
void detach_client_from_frame(Client * c, int unmapped, int destroyed);
void draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel);
void focus_client(Client * c, int raise, int up);
void focus_frame(Frame * f, int raise, int up, int down);
Frame *win_to_frame(Window w);
Frame *alloc_frame(XRectangle * r, int add_frame_border, int floating);
void destroy_frame(Frame * f);
void resize_frame(Frame * f, XRectangle * r, XPoint * pt,
int ignore_layout);
void draw_frame(Frame * f);
void handle_frame_buttonpress(XButtonEvent * e, Frame * f);
void attach_client(Client * c);
void attach_client_to_frame(Frame * f, Client * c);
void detach_client_from_frame(Client * c, int unmapped, int destroyed);
void draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel);
void focus_client(Client * c, int raise, int up);
/* event.c */
void init_event_hander();
void check_event(Connection * c);
void init_event_hander();
void check_event(Connection * c);
/* mouse.c */
void mouse_resize(Frame * f, Align align);
void mouse_move(Frame * f);
Cursor cursor_for_motion(Frame * f, int x, int y);
Align cursor_to_align(Cursor cursor);
Align xy_to_align(XRectangle * rect, int x, int y);
void drop_move(Frame * f, XRectangle * new, XPoint * pt);
void mouse_resize(Frame * f, Align align);
void mouse_move(Frame * f);
Cursor cursor_for_motion(Frame * f, int x, int y);
Align cursor_to_align(Cursor cursor);
Align xy_to_align(XRectangle * rect, int x, int y);
void drop_move(Frame * f, XRectangle * new, XPoint * pt);
/* page.c */
Page *alloc_page(char *autodestroy);
void free_page(Page * p);
void focus_area(Area *a, int raise, int up, int down);
XRectangle *rectangles(unsigned int *num);
void hide_page(Page * p);
void show_page(Page * p);
void draw_page(Page * p);
Layout *get_layout(char *name);
Frame *select_floating(Page * p, Frame * f, char *what);
Page *alloc_page(char *autodestroy);
void free_page(Page * p);
void focus_area(Area * a, int raise, int up, int down);
XRectangle *rectangles(unsigned int *num);
void hide_page(Page * p);
void show_page(Page * p);
void draw_page(Page * p);
Layout *get_layout(char *name);
Frame *select_floating(Page * p, Frame * f, char *what);
/* layout.c */
void init_layouts();
void init_layouts();

View File

@ -29,37 +29,37 @@ typedef enum {
B_BORDER_COLOR,
B_BG_COLOR,
B_LAST
} BarIndexes;
} BarIndexes;
typedef struct {
File *root;
Draw d;
} Item;
File *root;
Draw d;
} Item;
static IXPServer *ixps = 0;
static Display *dpy;
static GC gc;
static Window win;
static GC gc;
static Window win;
static XRectangle rect;
static XRectangle brect;
static int screen_num;
static int displayed = 0;
static char *sockfile = 0;
static File *files[B_LAST];
static Item **items = 0;
static int screen_num;
static int displayed = 0;
static char *sockfile = 0;
static File *files[B_LAST];
static Item **items = 0;
static unsigned int id = 0;
static Pixmap pmap;
static Pixmap pmap;
static Draw zero_draw = {0};
static Draw zero_draw = { 0 };
static void draw_bar(void *obj, char *arg);
static void quit(void *obj, char *arg);
static void display(void *obj, char *arg);
static void reset(void *obj, char *arg);
static void _destroy(void *obj, char *arg);
static void handle_after_write(IXPServer * s, File * f);
static void draw_bar(void *obj, char *arg);
static void quit(void *obj, char *arg);
static void display(void *obj, char *arg);
static void reset(void *obj, char *arg);
static void _destroy(void *obj, char *arg);
static void handle_after_write(IXPServer * s, File * f);
static Action acttbl[] = {
static Action acttbl[] = {
{"quit", quit},
{"display", display},
{"update", draw_bar},
@ -68,17 +68,16 @@ static Action acttbl[] = {
{0, 0}
};
static char *version[] = {
static char *version[] = {
"wmibar - window manager improved bar - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmibar -s <socket file> [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file\n" " -v version info\n");
"usage: wmibar -s <socket file> [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file\n" " -v version info\n");
exit(1);
}
@ -93,12 +92,11 @@ usage()
* <path>/b4press "<command>"
* <path>/b5press "<command>"
*/
static void
create_label(char *path)
static void create_label(char *path)
{
File *f;
char file[MAX_BUF];
int i;
File *f;
char file[MAX_BUF];
int i;
snprintf(file, MAX_BUF, "%s/data", path);
f = ixp_create(ixps, file);
@ -115,10 +113,9 @@ create_label(char *path)
}
}
static void
_destroy(void *obj, char *arg)
static void _destroy(void *obj, char *arg)
{
char buf[512];
char buf[512];
if (!arg)
return;
snprintf(buf, sizeof(buf), "/%s", arg);
@ -126,11 +123,10 @@ _destroy(void *obj, char *arg)
draw_bar(0, 0);
}
static void
reset(void *obj, char *arg)
static void reset(void *obj, char *arg)
{
int i;
char buf[512];
int i;
char buf[512];
for (i = 0; i < id; i++) {
snprintf(buf, sizeof(buf), "/%d", i + 1);
ixps->remove(ixps, buf);
@ -139,14 +135,12 @@ reset(void *obj, char *arg)
draw_bar(0, 0);
}
static void
quit(void *obj, char *arg)
static void quit(void *obj, char *arg)
{
ixps->runlevel = SHUTDOWN;
}
static void
display(void *obj, char *arg)
static void display(void *obj, char *arg)
{
if (!arg)
return;
@ -160,11 +154,10 @@ display(void *obj, char *arg)
}
}
static void
init_draw_label(char *path, Draw * d)
static void init_draw_label(char *path, Draw * d)
{
char buf[MAX_BUF];
File *f;
char buf[MAX_BUF];
File *f;
/* text stuff */
snprintf(buf, MAX_BUF, "%s/data", path);
@ -182,8 +175,7 @@ init_draw_label(char *path, Draw * d)
d->border = blitz_loadcolor(dpy, screen_num, f->content);
}
static void
init_item(char *path, Item * i)
static void init_item(char *path, Item * i)
{
i->d = zero_draw;
i->root = ixp_walk(ixps, path);
@ -194,19 +186,17 @@ init_item(char *path, Item * i)
init_draw_label(path, &i->d);
}
static int
comp_str(const void *s1, const void *s2)
static int comp_str(const void *s1, const void *s2)
{
return strcmp(*(char **) s1, *(char **) s2);
}
static void
draw()
static void draw()
{
unsigned int n = 0, i, w, xoff = 0;
XFontStruct *font;
unsigned expandable = 0;
char buf[32];
unsigned int n = 0, i, w, xoff = 0;
XFontStruct *font;
unsigned expandable = 0;
char buf[32];
if (!items)
return;
@ -229,7 +219,8 @@ draw()
items[i]->d.rect.width = brect.height / 2;
else
items[i]->d.rect.width +=
XTextWidth(font, items[i]->d.data, strlen(items[i]->d.data));
XTextWidth(font, items[i]->d.data,
strlen(items[i]->d.data));
}
w += items[i]->d.rect.width;
}
@ -256,13 +247,12 @@ draw()
XFreeFont(dpy, font);
}
static void
draw_bar(void *obj, char *arg)
static void draw_bar(void *obj, char *arg)
{
File *label = 0;
unsigned int i = 0, n = 0;
Item *item;
char buf[512];
File *label = 0;
unsigned int i = 0, n = 0;
Item *item;
char buf[512];
if (!displayed)
return;
@ -276,19 +266,23 @@ draw_bar(void *obj, char *arg)
snprintf(buf, sizeof(buf), "%s", "/1");
label = ixp_walk(ixps, buf);
if (!label) {
Draw d = {0};
Draw d = { 0 };
/* default stuff */
d.gc = gc;
d.drawable = pmap;
d.rect.width = brect.width;
d.rect.height = brect.height;
d.bg = blitz_loadcolor(dpy, screen_num, files[B_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, files[B_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, files[B_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num, files[B_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num, files[B_FG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
files[B_BORDER_COLOR]->content);
blitz_drawlabelnoborder(dpy, &d);
} else {
File *f;
char **paths = 0;
File *f;
char **paths = 0;
/*
* take order into account, directory names are used in
* alphabetical order
@ -304,7 +298,9 @@ draw_bar(void *obj, char *arg)
for (i = 0; i < n; i++) {
snprintf(buf, sizeof(buf), "/%s", paths[i]);
item = emalloc(sizeof(Item));
items = (Item **) attach_item_end((void **) items, item, sizeof(Item *));
items =
(Item **) attach_item_end((void **) items, item,
sizeof(Item *));
init_item(buf, item);
}
draw();
@ -312,23 +308,21 @@ draw_bar(void *obj, char *arg)
}
}
static Item *
get_item_for_file(File * f)
static Item *get_item_for_file(File * f)
{
int i;
int i;
for (i = 0; items && items[i]; i++)
if (items[i]->root == f)
return items[i];
return 0;
}
static void
handle_buttonpress(XButtonPressedEvent * e)
static void handle_buttonpress(XButtonPressedEvent * e)
{
File *p;
char buf[MAX_BUF];
char path[512];
int i;
File *p;
char buf[MAX_BUF];
char path[512];
int i;
for (i = 0; items && items[i]; i++) {
if (blitz_ispointinrect(e->x, e->y, &items[i]->d.rect)) {
@ -343,10 +337,9 @@ handle_buttonpress(XButtonPressedEvent * e)
}
}
static void
check_event(Connection * e)
static void check_event(Connection * e)
{
XEvent ev;
XEvent ev;
while (XPending(dpy)) {
XNextEvent(dpy, &ev);
@ -366,8 +359,7 @@ check_event(Connection * e)
}
}
static void
update_geometry(char *size)
static void update_geometry(char *size)
{
blitz_strtorect(dpy, &rect, &brect, size);
if (!brect.width)
@ -376,13 +368,12 @@ update_geometry(char *size)
brect.height = 20;
}
static void
handle_after_write(IXPServer * s, File * f)
static void handle_after_write(IXPServer * s, File * f)
{
int i;
size_t len;
Item *item;
char buf[512];
int i;
size_t len;
Item *item;
char buf[512];
buf[0] = '\0';
if (!strncmp(f->name, "data", 5)) {
@ -392,14 +383,14 @@ handle_after_write(IXPServer * s, File * f)
draw();
}
} else if (files[B_GEOMETRY] == f) {
char *geom = files[B_GEOMETRY]->content;
char *geom = files[B_GEOMETRY]->content;
if (geom && strrchr(geom, ',')) {
update_geometry(geom);
XMoveResizeWindow(dpy, win, brect.x, brect.y,
brect.width, brect.height);
brect.width, brect.height);
XSync(dpy, False);
pmap = XCreatePixmap(dpy, win, brect.width, brect.height,
DefaultDepth(dpy, screen_num));
DefaultDepth(dpy, screen_num));
XSync(dpy, False);
draw_bar(0, 0);
}
@ -419,13 +410,12 @@ handle_after_write(IXPServer * s, File * f)
check_event(0);
}
static void
handle_before_read(IXPServer * s, File * f)
static void handle_before_read(IXPServer * s, File * f)
{
char buf[64];
char buf[64];
if (f == files[B_GEOMETRY]) {
snprintf(buf, sizeof(buf), "%d,%d,%d,%d", brect.x, brect.y,
brect.width, brect.height);
brect.width, brect.height);
if (f->content)
free(f->content);
f->content = strdup(buf);
@ -441,11 +431,10 @@ handle_before_read(IXPServer * s, File * f)
}
}
static void
run(char *geom)
static void run(char *geom)
{
XSetWindowAttributes wa;
XGCValues gcv;
XGCValues gcv;
/* init */
if (!(files[B_CTL] = ixp_create(ixps, "/ctl"))) {
@ -456,9 +445,12 @@ run(char *geom)
files[B_NEW] = ixp_create(ixps, "/new");
files[B_NEW]->before_read = handle_before_read;
files[B_FONT] = wmii_create_ixpfile(ixps, "/font", BLITZ_FONT);
files[B_BG_COLOR] = wmii_create_ixpfile(ixps, "/bgcolor", BLITZ_NORM_BG_COLOR);
files[B_FG_COLOR] = wmii_create_ixpfile(ixps, "/fgcolor", BLITZ_NORM_FG_COLOR);
files[B_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/bordercolor", BLITZ_NORM_BORDER_COLOR);
files[B_BG_COLOR] =
wmii_create_ixpfile(ixps, "/bgcolor", BLITZ_NORM_BG_COLOR);
files[B_FG_COLOR] =
wmii_create_ixpfile(ixps, "/fgcolor", BLITZ_NORM_FG_COLOR);
files[B_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/bordercolor", BLITZ_NORM_BORDER_COLOR);
files[B_GEOMETRY] = ixp_create(ixps, "/geometry");
files[B_GEOMETRY]->before_read = handle_before_read;
files[B_GEOMETRY]->after_write = handle_after_write;
@ -466,7 +458,9 @@ run(char *geom)
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ExposureMask | ButtonPressMask | SubstructureRedirectMask | SubstructureNotifyMask;
wa.event_mask =
ExposureMask | ButtonPressMask | SubstructureRedirectMask |
SubstructureNotifyMask;
brect.x = brect.y = brect.width = brect.height = 0;
rect.x = rect.y = 0;
@ -475,11 +469,11 @@ run(char *geom)
update_geometry(geom);
win = XCreateWindow(dpy, RootWindow(dpy, screen_num), brect.x, brect.y,
brect.width, brect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
brect.width, brect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_left_ptr));
XSync(dpy, False);
@ -489,28 +483,26 @@ run(char *geom)
pmap =
XCreatePixmap(dpy, win, brect.width, brect.height,
DefaultDepth(dpy, screen_num));
DefaultDepth(dpy, screen_num));
/* main event loop */
run_server_with_fd_support(ixps, ConnectionNumber(dpy),
check_event, 0);
check_event, 0);
deinit_server(ixps);
XFreePixmap(dpy, pmap);
XFreeGC(dpy, gc);
XCloseDisplay(dpy);
}
static int
dummy_error_handler(Display * dpy, XErrorEvent * err)
static int dummy_error_handler(Display * dpy, XErrorEvent * err)
{
return 0;
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
char geom[64];
int i;
char geom[64];
int i;
/* command line args */
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {

View File

@ -39,12 +39,12 @@
* /1/fgcolor Fcolor <#RRGGBB, #RGB>
* /1/bordercolor Fcolor <#RRGGBB, #RGB> ...
*/
enum { /* 8-bit qid.path.type */
enum { /* 8-bit qid.path.type */
Droot,
Ditem,
Fdisplay,
Fnew,
Fdata, /* data to display */
Fdata, /* data to display */
Fevent,
Fcolor,
Ffont
@ -53,11 +53,11 @@ enum { /* 8-bit qid.path.type */
#define NONE (u16)0xffff
typedef struct {
char *name;
u8 type;
} QFile;
char *name;
u8 type;
} QFile;
static QFile qfilelist[] = {
static QFile qfilelist[] = {
{"display", Fdisplay},
{"font", Ffont},
{"new", Fnew},
@ -74,30 +74,30 @@ static QFile qfilelist[] = {
};
typedef struct {
u32 fid;
Qid qid;
} Map;
u32 fid;
Qid qid;
} Map;
typedef struct {
int id;
char text[256];
int value;
unsigned long bg;
unsigned long fg;
unsigned long border[4];
XFontStruct *font;
char event[5][256];
} Item;
int id;
char text[256];
int value;
unsigned long bg;
unsigned long fg;
unsigned long border[4];
XFontStruct *font;
char event[5][256];
} Item;
static Item **items = 0;
static char *sockfile = 0;
static pid_t mypid = 0;
static IXPServer srv = {0};
static Qid root_qid;
static Item **items = 0;
static char *sockfile = 0;
static pid_t mypid = 0;
static IXPServer srv = { 0 };
static Qid root_qid;
static Display *dpy;
static int screen_num;
static char *align = 0;
static char *font = 0;
static int screen_num;
static char *align = 0;
static char *font = 0;
/*
static GC gc;
static Window win;
@ -108,48 +108,42 @@ static Pixmap pmap;
static Draw zero_draw = { 0 };
*/
static char *version[] = {
static char *version[] = {
"wmibar - window manager improved bar - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s %d",
"usage: wmibar -s <socket file> [-v]\n"
" -s socket file\n" " -v version info\n",
NONE);
"usage: wmibar -s <socket file> [-v]\n"
" -s socket file\n" " -v version info\n",
NONE);
exit(1);
}
static int
dummy_error_handler(Display * dpy, XErrorEvent * err)
static int dummy_error_handler(Display * dpy, XErrorEvent * err)
{
return 0;
}
static void
exit_cleanup()
static void exit_cleanup()
{
if (mypid == getpid())
unlink(sockfile);
}
static u64
make_qpath(u8 type, u16 item, u16 file)
static u64 make_qpath(u8 type, u16 item, u16 file)
{
return ((u64) file << 24) | ((u64) item << 8) | (u64) type;
}
static u8
qpath_type(u64 path)
static u8 qpath_type(u64 path)
{
return path & 0xff;
}
static u16
qpath_item(u64 path)
static u16 qpath_item(u64 path)
{
return (path >> 8) & 0xffff;
}
@ -162,20 +156,18 @@ qpath_file(u64 path)
}
*/
static Map *
fid_to_map(Map ** maps, u32 fid)
static Map *fid_to_map(Map ** maps, u32 fid)
{
u32 i;
u32 i;
for (i = 0; maps && maps[i]; i++)
if (maps[i]->fid == fid)
return maps[i];
return nil;
}
static int
qfile_index(char *name, u16 * index)
static int qfile_index(char *name, u16 * index)
{
int i;
int i;
for (i = 0; qfilelist[i].name; i++)
if (!strncmp(name, qfilelist[i].name, strlen(qfilelist[i].name))) {
*index = i;
@ -184,11 +176,10 @@ qfile_index(char *name, u16 * index)
return FALSE;
}
static int
make_qid(Qid * dir, char *wname, Qid * new)
static int make_qid(Qid * dir, char *wname, Qid * new)
{
u16 idx;
const char *errstr;
u16 idx;
const char *errstr;
if (dir->type != IXP_QTDIR)
return FALSE;
new->version = 0;
@ -215,25 +206,25 @@ make_qid(Qid * dir, char *wname, Qid * new)
return TRUE;
}
static int
attach(IXPServer * s, IXPConn * c)
static int attach(IXPServer * s, IXPConn * c)
{
Map *map = emalloc(sizeof(Map));
fprintf(stderr, "attaching %d %s %s\n", s->fcall.afid, s->fcall.uname, s->fcall.aname);
Map *map = emalloc(sizeof(Map));
fprintf(stderr, "attaching %d %s %s\n", s->fcall.afid, s->fcall.uname,
s->fcall.aname);
map->qid = root_qid;
map->fid = s->fcall.fid;
c->aux = (Map **) attach_item_begin((void **) c->aux, map, sizeof(Map *));
c->aux =
(Map **) attach_item_begin((void **) c->aux, map, sizeof(Map *));
s->fcall.id = RATTACH;
s->fcall.qid = root_qid;
return TRUE;
}
static int
walk(IXPServer * s, IXPConn * c)
static int walk(IXPServer * s, IXPConn * c)
{
u16 nwqid = 0;
Qid qid;
Map *map;
u16 nwqid = 0;
Qid qid;
Map *map;
fprintf(stderr, "%s", "walking\n");
if (!(map = fid_to_map(c->aux, s->fcall.fid))) {
@ -241,15 +232,15 @@ walk(IXPServer * s, IXPConn * c)
return FALSE;
}
if (s->fcall.fid != s->fcall.newfid
&& (fid_to_map(c->aux, s->fcall.newfid))) {
&& (fid_to_map(c->aux, s->fcall.newfid))) {
s->errstr = "fid alreay in use";
return FALSE;
}
if (s->fcall.nwname) {
qid = map->qid;
for (nwqid = 0; (nwqid < s->fcall.nwname)
&& make_qid(&qid, s->fcall.wname[nwqid],
&s->fcall.wqid[nwqid]); nwqid++)
&& make_qid(&qid, s->fcall.wname[nwqid],
&s->fcall.wqid[nwqid]); nwqid++)
qid = s->fcall.wqid[nwqid];
if (!nwqid) {
s->errstr = "file not found";
@ -271,17 +262,16 @@ walk(IXPServer * s, IXPConn * c)
map->fid = s->fcall.newfid;
c->aux =
(Map **) attach_item_begin((void **) c->aux, map,
sizeof(Map *));
sizeof(Map *));
}
s->fcall.id = RWALK;
s->fcall.nwqid = nwqid;
return TRUE;
}
static int
_open(IXPServer * s, IXPConn * c)
static int _open(IXPServer * s, IXPConn * c)
{
Map *map = fid_to_map(c->aux, s->fcall.fid);
Map *map = fid_to_map(c->aux, s->fcall.fid);
fprintf(stderr, "%s", "opening\n");
if (!map) {
@ -299,12 +289,11 @@ _open(IXPServer * s, IXPConn * c)
return TRUE;
}
static int
_read(IXPServer * s, IXPConn * c)
static int _read(IXPServer * s, IXPConn * c)
{
Map *map = fid_to_map(c->aux, s->fcall.fid);
Stat stat = {0};
u8 *p;
Map *map = fid_to_map(c->aux, s->fcall.fid);
Stat stat = { 0 };
u8 *p;
fprintf(stderr, "%s", "reading\n");
if (!map) {
@ -362,18 +351,16 @@ _read(IXPServer * s, IXPConn * c)
return TRUE;
}
static int
_write(IXPServer * s, IXPConn * c)
static int _write(IXPServer * s, IXPConn * c)
{
return FALSE;
}
static int
clunk(IXPServer * s, IXPConn * c)
static int clunk(IXPServer * s, IXPConn * c)
{
Map *map = fid_to_map(c->aux, s->fcall.fid);
Map *map = fid_to_map(c->aux, s->fcall.fid);
if (!map) {
s->errstr = "invalid fid";
@ -385,12 +372,11 @@ clunk(IXPServer * s, IXPConn * c)
return TRUE;
}
static void
freeconn(IXPServer * s, IXPConn * c)
static void freeconn(IXPServer * s, IXPConn * c)
{
Map **maps = c->aux;
Map **maps = c->aux;
if (maps) {
int i;
int i;
for (i = 0; maps[i]; i++)
free(maps[i]);
free(maps);
@ -408,11 +394,10 @@ static IXPTFunc funcs[] = {
{0, 0}
};
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
int i;
Item *item;
int i;
Item *item;
/* command line args */
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {

View File

@ -15,66 +15,64 @@
typedef enum {
F_CTL,
F_LAST
} FsIndexes;
} FsIndexes;
typedef struct Route Route;
struct Route {
File dest;
int src;
File dest;
int src;
};
typedef struct Bind Bind;
struct Bind {
IXPClient *client;
Route route[MAX_CONN * MAX_OPEN_FILES];
File *mount;
char *prefix;
IXPClient *client;
Route route[MAX_CONN * MAX_OPEN_FILES];
File *mount;
char *prefix;
};
static Bind zero_bind = {0};
static Bind zero_bind = { 0 };
static Display *dpy;
static IXPServer *ixps;
static char *sockfile = 0;
static File *files[F_LAST];
static Bind **bindings = 0;
static char *sockfile = 0;
static File *files[F_LAST];
static Bind **bindings = 0;
static void quit(void *obj, char *arg);
static void bind(void *obj, char *arg);
static void unbind(void *obj, char *arg);
static Bind *path_to_bind(char *path);
static void quit(void *obj, char *arg);
static void bind(void *obj, char *arg);
static void unbind(void *obj, char *arg);
static Bind *path_to_bind(char *path);
static Action acttbl[] = {
static Action acttbl[] = {
{"quit", quit},
{"unbind", unbind},
{"bind", bind},
{0, 0}
};
static char *version[] = {
static char *version[] = {
"wmifs - window manager improved filesystem - " VERSION "\n"
" (C)opyright MMV Anselm R. Garbe\n", 0
" (C)opyright MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr,
"usage: wmifs -s <socket file> [-v]\n"
" -s socket file\n" " -v version info\n");
"usage: wmifs -s <socket file> [-v]\n"
" -s socket file\n" " -v version info\n");
exit(1);
}
static void
quit(void *obj, char *arg)
static void quit(void *obj, char *arg)
{
int i;
int i;
for (i = 0; bindings && bindings[i]; i++) {
if (bindings[i]->mount) {
bindings[i]->mount->content = 0;
ixp_remove(ixps, bindings[i]->prefix);
if (ixps->errstr)
fprintf(stderr, "wmifs: error on quit: remove %s: %s\n",
bindings[i]->prefix, ixps->errstr);
bindings[i]->prefix, ixps->errstr);
}
/* free stuff */
if (bindings[i]->prefix)
@ -86,18 +84,17 @@ quit(void *obj, char *arg)
ixps->runlevel = SHUTDOWN;
}
static void
_unbind(Bind * b)
static void _unbind(Bind * b)
{
bindings =
(Bind **) detach_item((void **) bindings, b, sizeof(Bind *));
(Bind **) detach_item((void **) bindings, b, sizeof(Bind *));
if (b->mount) {
b->mount->content = 0;
ixp_remove(ixps, b->prefix);
if (ixps->errstr)
fprintf(stderr, "wmifs: error on _unbind: remove %s: %s\n",
b->prefix, ixps->errstr);
b->prefix, ixps->errstr);
}
/* free stuff */
deinit_client(b->client);
@ -105,10 +102,9 @@ _unbind(Bind * b)
free(b);
}
static void
unbind(void *obj, char *arg)
static void unbind(void *obj, char *arg)
{
Bind *b = path_to_bind(arg);
Bind *b = path_to_bind(arg);
if (!b) {
fprintf(stderr, "wmifs: unbind: '%s' no such path\n", arg);
@ -117,12 +113,11 @@ unbind(void *obj, char *arg)
_unbind(b);
}
static void
bind(void *obj, char *arg)
static void bind(void *obj, char *arg)
{
Bind *b = 0;
char cmd[1024];
char *sfile;
Bind *b = 0;
char cmd[1024];
char *sfile;
if (!arg)
return;
@ -130,17 +125,17 @@ bind(void *obj, char *arg)
sfile = strchr(cmd, ' ');
if (!sfile) {
fprintf(stderr,
"wmifs: bind: '%s' without socket argument, ignoring\n",
arg);
return; /* shortcut with empty argument */
"wmifs: bind: '%s' without socket argument, ignoring\n",
arg);
return; /* shortcut with empty argument */
}
*sfile = '\0';
sfile++;
if (*sfile == '\0') {
fprintf(stderr,
"wmifs: bind: '%s' without socket argument, ignoring\n",
arg);
return; /* shortcut with empty argument */
"wmifs: bind: '%s' without socket argument, ignoring\n",
arg);
return; /* shortcut with empty argument */
}
b = emalloc(sizeof(Bind));
*b = zero_bind;
@ -149,8 +144,8 @@ bind(void *obj, char *arg)
if (!b->client) {
fprintf(stderr,
"wmifs: bind: cannot connect to server '%s', ignoring\n",
sfile);
"wmifs: bind: cannot connect to server '%s', ignoring\n",
sfile);
free(b);
return;
}
@ -162,11 +157,10 @@ bind(void *obj, char *arg)
(Bind **) attach_item_end((void **) bindings, b, sizeof(Bind *));
}
static void
handle_after_write(IXPServer * s, File * f)
static void handle_after_write(IXPServer * s, File * f)
{
int i;
size_t len;
int i;
size_t len;
for (i = 0; acttbl[i].name; i++) {
len = strlen(acttbl[i].name);
@ -181,22 +175,20 @@ handle_after_write(IXPServer * s, File * f)
}
}
static Bind *
path_to_bind(char *path)
static Bind *path_to_bind(char *path)
{
int i;
int i;
for (i = 0; bindings && bindings[i]; i++)
if (!strncmp
(bindings[i]->prefix, path, strlen(bindings[i]->prefix)))
(bindings[i]->prefix, path, strlen(bindings[i]->prefix)))
return bindings[i];
return 0;
}
static Bind *
fd_to_bind(int fd, int *client_fd)
static Bind *fd_to_bind(int fd, int *client_fd)
{
File *f = fd_to_file(ixps, fd);
int i, j;
File *f = fd_to_file(ixps, fd);
int i, j;
if (!f)
return 0;
@ -211,14 +203,13 @@ fd_to_bind(int fd, int *client_fd)
return 0;
}
static File *
fixp_create(IXPServer * s, char *path)
static File *fixp_create(IXPServer * s, char *path)
{
Bind *b = path_to_bind(path);
size_t len;
Bind *b = path_to_bind(path);
size_t len;
if (!b) {
File *f = ixp_create(s, path);
File *f = ixp_create(s, path);
return f;
}
/* route to b */
@ -231,15 +222,14 @@ fixp_create(IXPServer * s, char *path)
return 0;
}
static File *
fixp_open(IXPServer * s, char *path)
static File *fixp_open(IXPServer * s, char *path)
{
Bind *b = path_to_bind(path);
int fd;
size_t len;
Bind *b = path_to_bind(path);
int fd;
size_t len;
if (!b) {
File *f = ixp_open(s, path);
File *f = ixp_open(s, path);
return f;
}
/* route to b */
@ -255,13 +245,13 @@ fixp_open(IXPServer * s, char *path)
return &b->route[fd].dest;
}
static size_t
static size_t
fixp_read(IXPServer * s, int fd, size_t offset, void *out_buf,
size_t out_buf_len)
size_t out_buf_len)
{
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
size_t result;
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
size_t result;
if (!b) {
result = ixp_read(s, fd, offset, out_buf, out_buf_len);
@ -279,10 +269,10 @@ fixp_read(IXPServer * s, int fd, size_t offset, void *out_buf,
static void
fixp_write(IXPServer * s, int fd, size_t offset, void *content,
size_t in_len)
size_t in_len)
{
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
if (!b) {
ixp_write(s, fd, offset, content, in_len);
@ -297,11 +287,10 @@ fixp_write(IXPServer * s, int fd, size_t offset, void *content,
}
}
static void
fixp_close(IXPServer * s, int fd)
static void fixp_close(IXPServer * s, int fd)
{
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
int cfd;
Bind *b = fd_to_bind(fd, &cfd);
if (!b) {
ixp_close(s, fd);
@ -316,11 +305,10 @@ fixp_close(IXPServer * s, int fd)
}
}
static void
fixp_remove(IXPServer * s, char *path)
static void fixp_remove(IXPServer * s, char *path)
{
Bind *b = path_to_bind(path);
size_t len;
Bind *b = path_to_bind(path);
size_t len;
if (!b) {
ixp_remove(s, path);
@ -336,10 +324,9 @@ fixp_remove(IXPServer * s, char *path)
}
}
static void
check_event(Connection * e)
static void check_event(Connection * e)
{
XEvent ev;
XEvent ev;
while (XPending(dpy)) {
/*
* wmifs isn't interested in any X events, so just drop them
@ -350,8 +337,7 @@ check_event(Connection * e)
/* why check them? because X won't kill wmifs when X dies */
}
static void
run()
static void run()
{
if (!(files[F_CTL] = ixp_create(ixps, "/ctl"))) {
perror("wmifs: cannot connect IXP server");
@ -369,15 +355,14 @@ run()
/* main event loop */
run_server_with_fd_support(ixps, ConnectionNumber(dpy),
check_event, 0);
check_event, 0);
deinit_server(ixps);
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
int i;
int i;
/* command line args */
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
@ -400,7 +385,7 @@ main(int argc, char *argv[])
if (!getenv("HOME")) {
fprintf(stderr, "%s",
"wmifs: $HOME environment variable is not set\n");
"wmifs: $HOME environment variable is not set\n");
usage();
}
/* just for the case X crashes/gets quit */

View File

@ -29,78 +29,75 @@ typedef enum {
K_BG_COLOR,
K_BORDER_COLOR,
K_LAST
} KeyIndexes;
} KeyIndexes;
typedef struct Shortcut Shortcut;
struct Shortcut {
char name[MAX_BUF];
unsigned long mod;
KeyCode key;
Shortcut *next;
File *cmdfile;
char name[MAX_BUF];
unsigned long mod;
KeyCode key;
Shortcut *next;
File *cmdfile;
};
static IXPServer *ixps = 0;
static Display *dpy;
static GC gc;
static Window win;
static Window root;
static GC gc;
static Window win;
static Window root;
static XRectangle krect;
static XRectangle rect;
static int screen_num;
static char *sockfile = 0;
static int screen_num;
static char *sockfile = 0;
static Shortcut **shortcuts = 0;
static File *files[K_LAST];
static int grabkb = 0;
static File *files[K_LAST];
static int grabkb = 0;
static unsigned int num_lock_mask, valid_mask;
static char buf[MAX_BUF];
static char buf[MAX_BUF];
static Shortcut zero_shortcut = {"", 0, 0, 0, 0};
static Shortcut zero_shortcut = { "", 0, 0, 0, 0 };
static void grab_shortcut(Shortcut * s);
static void ungrab_shortcut(Shortcut * s);
static void draw_shortcut_box(char *text);
static void quit(void *obj, char *arg);
static void grab_shortcut(Shortcut * s);
static void ungrab_shortcut(Shortcut * s);
static void draw_shortcut_box(char *text);
static void quit(void *obj, char *arg);
static Action acttbl[] = {
static Action acttbl[] = {
{"quit", quit},
{0, 0}
};
static char *version[] = {
static char *version[] = {
"wmikeys - window manager improved keys - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
center()
static void center()
{
krect.x = rect.width / 2 - krect.width / 2;
krect.y = rect.height / 2 - krect.height / 2;
}
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmikeys [-s <socket file>] [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file (default: /tmp/.ixp-$USER/wmikeys-$WMII_IDENT)\n"
" -v version info\n");
"usage: wmikeys [-s <socket file>] [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file (default: /tmp/.ixp-$USER/wmikeys-$WMII_IDENT)\n"
" -v version info\n");
exit(1);
}
/* grabs shortcut on all screens */
static void
grab_shortcut(Shortcut * s)
static void grab_shortcut(Shortcut * s)
{
XGrabKey(dpy, s->key, s->mod, root,
True, GrabModeAsync, GrabModeAsync);
True, GrabModeAsync, GrabModeAsync);
if (num_lock_mask) {
XGrabKey(dpy, s->key, s->mod | num_lock_mask, root,
True, GrabModeAsync, GrabModeAsync);
True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, s->key, s->mod | num_lock_mask | LockMask, root,
True, GrabModeAsync, GrabModeAsync);
True, GrabModeAsync, GrabModeAsync);
}
XSync(dpy, False);
}
@ -109,25 +106,22 @@ grab_shortcut(Shortcut * s)
* don't handle evil keys anymore, just define more shortcuts if you cannot
* live without evil key handling
*/
static void
ungrab_shortcut(Shortcut * s)
static void ungrab_shortcut(Shortcut * s)
{
XUngrabKey(dpy, s->key, s->mod, root);
if (num_lock_mask) {
XUngrabKey(dpy, s->key, s->mod | num_lock_mask, root);
XUngrabKey(dpy, s->key, s->mod | num_lock_mask |
LockMask, root);
XUngrabKey(dpy, s->key, s->mod | num_lock_mask | LockMask, root);
}
XSync(dpy, False);
}
static void
create_shortcut(File * f)
static void create_shortcut(File * f)
{
static char *chain[8];
char *k;
size_t i, toks;
Shortcut *s = 0, *r = 0;
static char *chain[8];
char *k;
size_t i, toks;
Shortcut *s = 0, *r = 0;
_strlcpy(buf, f->name, sizeof(buf));
toks = tokenize(chain, 8, buf, ',');
@ -151,13 +145,14 @@ create_shortcut(File * f)
}
if (r) {
s->cmdfile = f;
shortcuts = (Shortcut **) attach_item_end((void **) shortcuts, r, sizeof(Shortcut *));
shortcuts =
(Shortcut **) attach_item_end((void **) shortcuts, r,
sizeof(Shortcut *));
grab_shortcut(r);
}
}
static void
destroy_shortcut(Shortcut * s, int ungrab)
static void destroy_shortcut(Shortcut * s, int ungrab)
{
if (s->next)
destroy_shortcut(s->next, 0);
@ -166,11 +161,10 @@ destroy_shortcut(Shortcut * s, int ungrab)
free(s);
}
static void
next_keystroke(unsigned long *mod, KeyCode * key)
static void next_keystroke(unsigned long *mod, KeyCode * key)
{
XEvent e;
KeySym sym;
XEvent e;
KeySym sym;
*mod = 0;
do {
XMaskEvent(dpy, KeyPressMask, &e);
@ -180,12 +174,11 @@ next_keystroke(unsigned long *mod, KeyCode * key)
} while (IsModifierKey(sym));
}
static void
emulate_key_press(unsigned long mod, KeyCode key)
static void emulate_key_press(unsigned long mod, KeyCode key)
{
XEvent e;
Window client_win;
int revert;
XEvent e;
Window client_win;
int revert;
XGetInputFocus(dpy, &client_win, &revert);
@ -202,15 +195,16 @@ emulate_key_press(unsigned long mod, KeyCode key)
}
static void
handle_shortcut_chain(Window w, Shortcut * processed, char *prefix, int grab)
handle_shortcut_chain(Window w, Shortcut * processed, char *prefix,
int grab)
{
unsigned long mod;
KeyCode key;
Shortcut *s = processed->next;
unsigned long mod;
KeyCode key;
Shortcut *s = processed->next;
if (grab) {
XGrabKeyboard(dpy, w, True, GrabModeAsync,
GrabModeAsync, CurrentTime);
GrabModeAsync, CurrentTime);
XMapRaised(dpy, win);
}
draw_shortcut_box(prefix);
@ -234,11 +228,10 @@ handle_shortcut_chain(Window w, Shortcut * processed, char *prefix, int grab)
}
}
static void
handle_shortcut_gkb(Window w, unsigned long mod, KeyCode key)
static void handle_shortcut_gkb(Window w, unsigned long mod, KeyCode key)
{
int i;
Shortcut *s;
int i;
Shortcut *s;
if (!files[K_LOOKUP]->content)
return;
for (i = 0; shortcuts && shortcuts[i]; i++) {
@ -252,11 +245,10 @@ handle_shortcut_gkb(Window w, unsigned long mod, KeyCode key)
XBell(dpy, 0);
}
static void
handle_shortcut(Window w, unsigned long mod, KeyCode key)
static void handle_shortcut(Window w, unsigned long mod, KeyCode key)
{
int i;
Shortcut *s;
int i;
Shortcut *s;
if (!files[K_LOOKUP]->content)
return;
for (i = 0; shortcuts && shortcuts[i]; i++) {
@ -273,24 +265,22 @@ handle_shortcut(Window w, unsigned long mod, KeyCode key)
handle_shortcut_chain(w, s, s->name, 1);
}
static void
quit(void *obj, char *arg)
static void quit(void *obj, char *arg)
{
ixps->runlevel = SHUTDOWN;
}
static void
update()
static void update()
{
int i;
File *f, *p;
int i;
File *f, *p;
if (!files[K_LOOKUP]->content)
return;
f = ixp_walk(ixps, files[K_LOOKUP]->content);
if (!f || !is_directory(f))
return; /* cannot update */
return; /* cannot update */
/* destroy existing shortcuts if any */
for (i = 0; shortcuts && shortcuts[i]; i++)
@ -300,7 +290,7 @@ update()
if (grabkb) {
XGrabKeyboard(dpy, root, True, GrabModeAsync,
GrabModeAsync, CurrentTime);
GrabModeAsync, CurrentTime);
return;
}
/* create new shortcuts */
@ -316,16 +306,15 @@ update()
* /box/style/text-color "#RRGGBBAA"
* /box/style/bg-color "#RRGGBBAA"
*/
static void
draw_shortcut_box(char *text)
static void draw_shortcut_box(char *text)
{
Draw d = {0};
Draw d = { 0 };
d.font = blitz_getfont(dpy, files[K_TEXT_FONT]->content);
krect.width = XTextWidth(d.font, text, strlen(text)) + krect.height;
center();
XMoveResizeWindow(dpy, win, krect.x, krect.y, krect.width,
krect.height);
krect.height);
/* default stuff */
d.gc = gc;
@ -341,10 +330,9 @@ draw_shortcut_box(char *text)
blitz_drawlabel(dpy, &d);
}
static void
check_event(Connection * c)
static void check_event(Connection * c)
{
XEvent ev;
XEvent ev;
while (XPending(dpy)) {
XNextEvent(dpy, &ev);
@ -353,10 +341,10 @@ check_event(Connection * c)
ev.xkey.state &= valid_mask;
if (grabkb)
handle_shortcut_gkb(root, ev.xkey.state,
(KeyCode) ev.xkey.keycode);
(KeyCode) ev.xkey.keycode);
else
handle_shortcut(root, ev.xkey.state,
(KeyCode) ev.xkey.keycode);
(KeyCode) ev.xkey.keycode);
break;
case KeymapNotify:
update();
@ -367,11 +355,10 @@ check_event(Connection * c)
}
}
static void
handle_after_write(IXPServer * s, File * f)
static void handle_after_write(IXPServer * s, File * f)
{
int i;
size_t len;
int i;
size_t len;
if (f == files[K_CTL]) {
for (i = 0; acttbl[i].name; i++) {
@ -386,7 +373,7 @@ handle_after_write(IXPServer * s, File * f)
}
}
} else if (files[K_SIZE] == f) {
char *size = files[K_SIZE]->content;
char *size = files[K_SIZE]->content;
if (size && strrchr(size, ','))
blitz_strtorect(dpy, &rect, &krect, size);
} else if (f == files[K_GRAB_KB]) {
@ -403,24 +390,22 @@ handle_after_write(IXPServer * s, File * f)
check_event(0);
}
static void
handle_before_read(IXPServer * s, File * f)
static void handle_before_read(IXPServer * s, File * f)
{
if (f != files[K_SIZE])
return;
snprintf(buf, sizeof(buf), "%d,%d,%d,%d", krect.x, krect.y,
krect.width, krect.height);
krect.width, krect.height);
if (f->content)
free(f->content);
f->content = strdup(buf);
f->size = strlen(buf);
}
static void
run(char *size)
static void run(char *size)
{
XSetWindowAttributes wa;
XGCValues gcv;
XGCValues gcv;
/* init */
if (!(files[K_CTL] = ixp_create(ixps, "/ctl"))) {
@ -435,10 +420,17 @@ run(char *size)
files[K_SIZE]->after_write = handle_after_write;
files[K_GRAB_KB] = wmii_create_ixpfile(ixps, "/grab-keyb", "0");
files[K_GRAB_KB]->after_write = handle_after_write;
files[K_TEXT_FONT] = wmii_create_ixpfile(ixps, "/box/style/text-font", BLITZ_FONT);
files[K_TEXT_COLOR] = wmii_create_ixpfile(ixps, "/box/style/text-color", BLITZ_SEL_FG_COLOR);
files[K_BG_COLOR] = wmii_create_ixpfile(ixps, "/box/style/bg-color", BLITZ_SEL_BG_COLOR);
files[K_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/box/style/border-color", BLITZ_SEL_BORDER_COLOR);
files[K_TEXT_FONT] =
wmii_create_ixpfile(ixps, "/box/style/text-font", BLITZ_FONT);
files[K_TEXT_COLOR] =
wmii_create_ixpfile(ixps, "/box/style/text-color",
BLITZ_SEL_FG_COLOR);
files[K_BG_COLOR] =
wmii_create_ixpfile(ixps, "/box/style/bg-color",
BLITZ_SEL_BG_COLOR);
files[K_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/box/style/border-color",
BLITZ_SEL_BORDER_COLOR);
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
@ -464,11 +456,11 @@ run(char *size)
init_lock_modifiers(dpy, &valid_mask, &num_lock_mask);
win = XCreateWindow(dpy, RootWindow(dpy, screen_num), krect.x, krect.y,
krect.width, krect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
krect.width, krect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_left_ptr));
XSync(dpy, False);
@ -479,23 +471,21 @@ run(char *size)
/* main event loop */
run_server_with_fd_support(ixps, ConnectionNumber(dpy),
check_event, 0);
check_event, 0);
deinit_server(ixps);
XFreeGC(dpy, gc);
XCloseDisplay(dpy);
}
static int
dummy_error_handler(Display * dpy, XErrorEvent * err)
static int dummy_error_handler(Display * dpy, XErrorEvent * err)
{
return 0;
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
char size[64];
int i;
char size[64];
int i;
/* command line args */
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {

View File

@ -37,7 +37,7 @@ typedef enum {
M_NORMAL_BORDER_COLOR,
M_RETARDED,
M_LAST
} InputIndexes;
} InputIndexes;
enum {
OFF_NEXT, OFF_PREV, OFF_CURR, OFF_LAST
@ -45,66 +45,63 @@ enum {
static IXPServer *ixps = 0;
static Display *dpy;
static GC gc;
static Window win;
static GC gc;
static Window win;
static XRectangle rect;
static XRectangle mrect;
static int screen_num;
static char *sockfile = 0;
static File *files[M_LAST];
static File **items = 0;
static size_t item_size = 0;
static int item = 0;
static int offset[OFF_LAST];
static int screen_num;
static char *sockfile = 0;
static File *files[M_LAST];
static File **items = 0;
static size_t item_size = 0;
static int item = 0;
static int offset[OFF_LAST];
static unsigned int cmdw = 0;
static File **history = 0;
static int sel_history = 0;
static Pixmap pmap;
static const int seek = 30; /* 30px */
static File **history = 0;
static int sel_history = 0;
static Pixmap pmap;
static const int seek = 30; /* 30px */
static void check_event(Connection * c);
static void draw_menu(void);
static void handle_kpress(XKeyEvent * e);
static void set_text(char *text);
static void quit(void *obj, char *arg);
static void display(void *obj, char *arg);
static int update_items(char *prefix);
static void check_event(Connection * c);
static void draw_menu(void);
static void handle_kpress(XKeyEvent * e);
static void set_text(char *text);
static void quit(void *obj, char *arg);
static void display(void *obj, char *arg);
static int update_items(char *prefix);
static Action acttbl[2] = {
static Action acttbl[2] = {
{"quit", quit},
{"display", display}
};
static char *version[] = {
static char *version[] = {
"wmimenu - window manager improved menu - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmimenu [-s <socket file>] [-r] [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file (default: /tmp/.ixp-$USER/wmimenu-%s-%s)\n"
" -v version info\n");
"usage: wmimenu [-s <socket file>] [-r] [-v] [<x>,<y>,<width>,<height>]\n"
" -s socket file (default: /tmp/.ixp-$USER/wmimenu-%s-%s)\n"
" -v version info\n");
exit(1);
}
static void
add_history(char *cmd)
static void add_history(char *cmd)
{
char buf[MAX_BUF];
char buf[MAX_BUF];
snprintf(buf, MAX_BUF, "/history/%ld", (long) time(0));
history = (File **) attach_item_begin((void **) history,
wmii_create_ixpfile(ixps, buf,
cmd),
sizeof(File *));
wmii_create_ixpfile(ixps, buf,
cmd),
sizeof(File *));
}
static void
_exec(char *cmd)
static void _exec(char *cmd)
{
char *rc = cmd;
char *rc = cmd;
if (!cmd || cmd[0] == '\0')
return;
@ -117,10 +114,10 @@ _exec(char *cmd)
}
add_history(cmd);
if (files[M_PRE_COMMAND]->content) {
size_t len = strlen(cmd) + files[M_PRE_COMMAND]->size + 2;
size_t len = strlen(cmd) + files[M_PRE_COMMAND]->size + 2;
rc = emalloc(len);
snprintf(rc, len, "%s %s", (char *) files[M_PRE_COMMAND]->content,
cmd);
cmd);
}
/* fallback */
spawn(dpy, rc);
@ -129,14 +126,12 @@ _exec(char *cmd)
free(rc);
}
static void
quit(void *obj, char *arg)
static void quit(void *obj, char *arg)
{
ixps->runlevel = SHUTDOWN;
}
static void
show()
static void show()
{
set_text(0);
XMapRaised(dpy, win);
@ -144,21 +139,19 @@ show()
update_items(files[M_COMMAND]->content);
draw_menu();
while (XGrabKeyboard
(dpy, RootWindow(dpy, screen_num), True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
(dpy, RootWindow(dpy, screen_num), True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
usleep(1000);
}
static void
hide()
static void hide()
{
XUngrabKeyboard(dpy, CurrentTime);
XUnmapWindow(dpy, win);
XSync(dpy, False);
}
static void
display(void *obj, char *arg)
static void display(void *obj, char *arg)
{
if (!arg)
return;
@ -169,8 +162,7 @@ display(void *obj, char *arg)
check_event(0);
}
void
set_text(char *text)
void set_text(char *text)
{
if (files[M_COMMAND]->content) {
free(files[M_COMMAND]->content);
@ -183,12 +175,11 @@ set_text(char *text)
}
}
static void
update_offsets()
static void update_offsets()
{
int i;
XFontStruct *font;
unsigned int w = cmdw + 2 * seek;
int i;
XFontStruct *font;
unsigned int w = cmdw + 2 * seek;
if (!items)
return;
@ -197,7 +188,8 @@ update_offsets()
/* calc next offset */
for (i = offset[OFF_CURR]; items[i]; i++) {
w += XTextWidth(font, items[i]->content, strlen(items[i]->content)) + mrect.height;
w += XTextWidth(font, items[i]->content,
strlen(items[i]->content)) + mrect.height;
if (w > mrect.width)
break;
}
@ -206,7 +198,8 @@ update_offsets()
w = cmdw + 2 * seek;
for (i = offset[OFF_CURR] - 1; i >= 0; i--) {
w += XTextWidth(font, items[i]->content, strlen(items[i]->content)) + mrect.height;
w += XTextWidth(font, items[i]->content,
strlen(items[i]->content)) + mrect.height;
if (w > mrect.width)
break;
}
@ -214,14 +207,12 @@ update_offsets()
XFreeFont(dpy, font);
}
static int
update_items(char *pattern)
static int update_items(char *pattern)
{
size_t plen = pattern ? strlen(pattern) : 0, size = 0, max = 0,
len;
int matched = pattern ? plen == 0 : 1;
XFontStruct *font;
File *f, *p, *maxitem = 0;
size_t plen = pattern ? strlen(pattern) : 0, size = 0, max = 0, len;
int matched = pattern ? plen == 0 : 1;
XFontStruct *font;
File *f, *p, *maxitem = 0;
cmdw = 0;
item = -1;
@ -265,20 +256,20 @@ update_items(char *pattern)
for (p = f->content; p; p = p->next) {
if (!p->content)
continue; /* ignore bogus files */
continue; /* ignore bogus files */
if (matched || !strncmp(pattern, p->name, plen)) {
items[size++] = p;
p->parent = 0; /* HACK to prevent doubled items */
p->parent = 0; /* HACK to prevent doubled items */
}
}
for (p = f->content; p; p = p->next) {
if (!p->content)
continue; /* ignore bogus files */
continue; /* ignore bogus files */
if (p->parent && strstr(p->name, pattern))
items[size++] = p;
else
p->parent = f; /* restore HACK */
p->parent = f; /* restore HACK */
}
items[size] = 0;
update_offsets();
@ -287,27 +278,32 @@ update_items(char *pattern)
}
/* creates draw structs for menu mode drawing */
static void
draw_menu()
static void draw_menu()
{
Draw d = {0};
unsigned int offx = 0;
int i = 0;
XFontStruct *font = blitz_getfont(dpy, files[M_TEXT_FONT]->content);
Draw d = { 0 };
unsigned int offx = 0;
int i = 0;
XFontStruct *font = blitz_getfont(dpy, files[M_TEXT_FONT]->content);
d.gc = gc;
d.drawable = pmap;
d.rect = mrect;
d.rect.x = 0;
d.rect.y = 0;
d.bg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BG_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BORDER_COLOR]->content);
blitz_drawlabelnoborder(dpy, &d);
/* print command */
d.align = WEST;
d.font = font;
d.fg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_TEXT_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_TEXT_COLOR]->content);
d.data = files[M_COMMAND]->content;
if (cmdw && items && items[0])
d.rect.width = cmdw;
@ -316,8 +312,12 @@ draw_menu()
d.align = CENTER;
if (items && items[0]) {
d.bg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_TEXT_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_TEXT_COLOR]->content);
d.data = offset[OFF_CURR] ? "<" : 0;
d.rect.x = offx;
d.rect.width = seek;
@ -328,29 +328,54 @@ draw_menu()
for (i = offset[OFF_CURR]; items[i] && (i < offset[OFF_NEXT]); i++) {
d.data = items[i]->name;
d.rect.x = offx;
d.rect.width = XTextWidth(d.font, d.data, strlen(d.data)) + mrect.height;
d.rect.width =
XTextWidth(d.font, d.data, strlen(d.data)) + mrect.height;
offx += d.rect.width;
if (i == item) {
d.bg = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_TEXT_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_TEXT_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_BORDER_COLOR]->
content);
blitz_drawlabel(dpy, &d);
} else if (!i && item == -1) {
/* fg and bg are inverted */
d.fg = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_BG_COLOR]->content);
d.bg = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_TEXT_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, files[M_SELECTED_BORDER_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_BG_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_TEXT_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
files[M_SELECTED_BORDER_COLOR]->
content);
blitz_drawlabel(dpy, &d);
} else {
d.bg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_TEXT_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BORDER_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_TEXT_COLOR]->content);
d.border =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BORDER_COLOR]->content);
blitz_drawlabelnoborder(dpy, &d);
}
}
d.bg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, files[M_NORMAL_TEXT_COLOR]->content);
d.bg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_BG_COLOR]->content);
d.fg =
blitz_loadcolor(dpy, screen_num,
files[M_NORMAL_TEXT_COLOR]->content);
d.data = items[i] ? ">" : 0;
d.rect.x = mrect.width - seek;
d.rect.width = seek;
@ -361,14 +386,13 @@ draw_menu()
XFreeFont(dpy, font);
}
static void
handle_kpress(XKeyEvent * e)
static void handle_kpress(XKeyEvent * e)
{
KeySym ksym;
char buf[32];
int idx, num;
static char text[4096];
size_t len = 0;
KeySym ksym;
char buf[32];
int idx, num;
static char text[4096];
size_t len = 0;
text[0] = '\0';
if (files[M_COMMAND]->content) {
@ -379,8 +403,8 @@ handle_kpress(XKeyEvent * e)
num = XLookupString(e, buf, sizeof(buf), &ksym, 0);
if (IsFunctionKey(ksym) || IsKeypadKey(ksym)
|| IsMiscFunctionKey(ksym) || IsPFKey(ksym)
|| IsPrivateKeypadKey(ksym))
|| IsMiscFunctionKey(ksym) || IsPFKey(ksym)
|| IsPrivateKeypadKey(ksym))
return;
/* first check if a control mask is omitted */
@ -408,7 +432,7 @@ handle_kpress(XKeyEvent * e)
draw_menu();
return;
break;
default: /* ignore other control sequences */
default: /* ignore other control sequences */
return;
break;
}
@ -464,8 +488,8 @@ handle_kpress(XKeyEvent * e)
break;
case XK_BackSpace:
if (len) {
int size = 0;
size_t i = len;
int size = 0;
size_t i = len;
for (size = 0; items && items[size]; size++);
if (i) {
do
@ -499,10 +523,9 @@ handle_kpress(XKeyEvent * e)
draw_menu();
}
static void
check_event(Connection * c)
static void check_event(Connection * c)
{
XEvent ev;
XEvent ev;
while (XPending(dpy)) {
XNextEvent(dpy, &ev);
@ -521,11 +544,10 @@ check_event(Connection * c)
}
}
static void
handle_after_write(IXPServer * s, File * f)
static void handle_after_write(IXPServer * s, File * f)
{
int i;
size_t len;
int i;
size_t len;
if (files[M_CTL] == f) {
for (i = 0; i < 2; i++) {
@ -540,15 +562,15 @@ handle_after_write(IXPServer * s, File * f)
}
}
} else if (files[M_SIZE] == f) {
char *size = files[M_SIZE]->content;
char *size = files[M_SIZE]->content;
if (size && strrchr(size, ',')) {
blitz_strtorect(dpy, &rect, &mrect, size);
XFreePixmap(dpy, pmap);
XMoveResizeWindow(dpy, win, mrect.x, mrect.y,
mrect.width, mrect.height);
mrect.width, mrect.height);
XSync(dpy, False);
pmap = XCreatePixmap(dpy, win, mrect.width, mrect.height,
DefaultDepth(dpy, screen_num));
DefaultDepth(dpy, screen_num));
XSync(dpy, False);
draw_menu();
}
@ -559,25 +581,23 @@ handle_after_write(IXPServer * s, File * f)
check_event(0);
}
static void
handle_before_read(IXPServer * s, File * f)
static void handle_before_read(IXPServer * s, File * f)
{
char buf[64];
char buf[64];
if (f != files[M_SIZE])
return;
snprintf(buf, sizeof(buf), "%d,%d,%d,%d", mrect.x, mrect.y,
mrect.width, mrect.height);
mrect.width, mrect.height);
if (f->content)
free(f->content);
f->content = strdup(buf);
f->size = strlen(buf);
}
static void
run(char *size)
static void run(char *size)
{
XSetWindowAttributes wa;
XGCValues gcv;
XGCValues gcv;
/* init */
if (!(files[M_CTL] = ixp_create(ixps, "/ctl"))) {
@ -594,13 +614,26 @@ run(char *size)
files[M_HISTORY] = ixp_create(ixps, "/history");
add_history("");
files[M_LOOKUP] = ixp_create(ixps, "/lookup");
files[M_TEXT_FONT] = wmii_create_ixpfile(ixps, "/style/text-font", BLITZ_FONT);
files[M_SELECTED_BG_COLOR] = wmii_create_ixpfile(ixps, "/sel-style/bg-color", BLITZ_SEL_BG_COLOR);
files[M_SELECTED_TEXT_COLOR] = wmii_create_ixpfile(ixps, "/sel-style/text-color", BLITZ_SEL_FG_COLOR);
files[M_SELECTED_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/sel-style/border-color", BLITZ_SEL_BORDER_COLOR);
files[M_NORMAL_BG_COLOR] = wmii_create_ixpfile(ixps, "/norm-style/bg-color", BLITZ_NORM_BG_COLOR);
files[M_NORMAL_TEXT_COLOR] = wmii_create_ixpfile(ixps, "/norm-style/text-color", BLITZ_NORM_FG_COLOR);
files[M_NORMAL_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/norm-style/border-color", BLITZ_NORM_BORDER_COLOR);
files[M_TEXT_FONT] =
wmii_create_ixpfile(ixps, "/style/text-font", BLITZ_FONT);
files[M_SELECTED_BG_COLOR] =
wmii_create_ixpfile(ixps, "/sel-style/bg-color",
BLITZ_SEL_BG_COLOR);
files[M_SELECTED_TEXT_COLOR] =
wmii_create_ixpfile(ixps, "/sel-style/text-color",
BLITZ_SEL_FG_COLOR);
files[M_SELECTED_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/sel-style/border-color",
BLITZ_SEL_BORDER_COLOR);
files[M_NORMAL_BG_COLOR] =
wmii_create_ixpfile(ixps, "/norm-style/bg-color",
BLITZ_NORM_BG_COLOR);
files[M_NORMAL_TEXT_COLOR] =
wmii_create_ixpfile(ixps, "/norm-style/text-color",
BLITZ_NORM_FG_COLOR);
files[M_NORMAL_BORDER_COLOR] =
wmii_create_ixpfile(ixps, "/norm-style/border-color",
BLITZ_NORM_BORDER_COLOR);
files[M_RETARDED] = ixp_create(ixps, "/retarded");
wa.override_redirect = 1;
@ -618,11 +651,11 @@ run(char *size)
mrect.height = 40;
win = XCreateWindow(dpy, RootWindow(dpy, screen_num), mrect.x, mrect.y,
mrect.width, mrect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
mrect.width, mrect.height, 0, DefaultDepth(dpy,
screen_num),
CopyFromParent, DefaultVisual(dpy, screen_num),
CWOverrideRedirect | CWBackPixmap | CWEventMask,
&wa);
XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_xterm));
XSync(dpy, False);
@ -633,22 +666,21 @@ run(char *size)
gc = XCreateGC(dpy, win, 0, 0);
pmap =
XCreatePixmap(dpy, win, mrect.width, mrect.height,
DefaultDepth(dpy, screen_num));
DefaultDepth(dpy, screen_num));
/* main event loop */
run_server_with_fd_support(ixps, ConnectionNumber(dpy),
check_event, 0);
check_event, 0);
deinit_server(ixps);
XFreePixmap(dpy, pmap);
XFreeGC(dpy, gc);
XCloseDisplay(dpy);
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
char size[64];
int i;
char size[64];
int i;
/* command line args */
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {

View File

@ -10,32 +10,30 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
static char *version[] = {
static char *version[] = {
"wmiplumb - window manager improved plumb - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s\n",
"usage: wmiplumb [-v]\n" " -v version info\n");
"usage: wmiplumb [-v]\n" " -v version info\n");
exit(1);
}
static void
print_sel(Display * dpy, Window w, XSelectionEvent * e)
static void print_sel(Display * dpy, Window w, XSelectionEvent * e)
{
Atom typeret;
int format;
unsigned long nitems, bytesleft;
unsigned char *data;
Atom typeret;
int format;
unsigned long nitems, bytesleft;
unsigned char *data;
XGetWindowProperty(dpy, w, e->property, 0L, 4096L, False,
AnyPropertyType, &typeret, &format,
&nitems, &bytesleft, &data);
AnyPropertyType, &typeret, &format,
&nitems, &bytesleft, &data);
if (format == 8) {
int i;
int i;
for (i = 0; i < nitems; i++)
putchar(data[i]);
putchar('\n');
@ -43,14 +41,13 @@ print_sel(Display * dpy, Window w, XSelectionEvent * e)
XDeleteProperty(dpy, w, e->property);
}
int
main(int argc, char **argv)
int main(int argc, char **argv)
{
Display *dpy;
Atom xa_clip_string;
Window w;
XEvent ev;
int pdone = 0;
Display *dpy;
Atom xa_clip_string;
Window w;
XEvent ev;
int pdone = 0;
/* command line args */
@ -68,10 +65,10 @@ main(int argc, char **argv)
}
xa_clip_string = XInternAtom(dpy, "PLUMB_STRING", False);
w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 200, 200,
1, CopyFromParent, CopyFromParent);
1, CopyFromParent, CopyFromParent);
while (1 && !pdone) {
XConvertSelection(dpy, XA_PRIMARY, XA_STRING, xa_clip_string,
w, CurrentTime);
w, CurrentTime);
XFlush(dpy);
XNextEvent(dpy, &ev);
switch (ev.type) {

View File

@ -10,35 +10,33 @@
#include "ixp.h"
static IXPClient *c;
static int exit_code = 0;
static int exit_code = 0;
static char *version[] = {
static char *version[] = {
"wmir - window manager improved remote - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmir [-s <socket file>] [-v] <action> <action_arg> [...]\n"
" -s socket file (default: $WMIR_SOCKET)\n"
" -f read actions from stdin\n"
" -v version info\n"
"actions:\n"
" create <file> [<content>] -- creates and optionally writes content to a file\n"
" write <file> <content> -- writes content to a file\n"
" read <directory/file> -- reads file or directory contents\n"
" remove <directory/file> -- removes file or directory, use with care!\n");
"usage: wmir [-s <socket file>] [-v] <action> <action_arg> [...]\n"
" -s socket file (default: $WMIR_SOCKET)\n"
" -f read actions from stdin\n"
" -v version info\n"
"actions:\n"
" create <file> [<content>] -- creates and optionally writes content to a file\n"
" write <file> <content> -- writes content to a file\n"
" read <directory/file> -- reads file or directory contents\n"
" remove <directory/file> -- removes file or directory, use with care!\n");
exit(1);
}
static void
perform(char *action, char *file, char *content)
static void perform(char *action, char *file, char *content)
{
size_t out_len = 0;
char output[2050];
int crt, fd = -1;
size_t out_len = 0;
char output[2050];
int crt, fd = -1;
if (!action)
return;
@ -52,7 +50,7 @@ perform(char *action, char *file, char *content)
c->create(c, file);
if (c->errstr) {
fprintf(stderr, "wmir: error: create %s: %s\n", file,
c->errstr);
c->errstr);
exit_code = 1;
return;
}
@ -68,7 +66,7 @@ perform(char *action, char *file, char *content)
c->write(c, fd, content, strlen(content));
if (c->errstr) {
fprintf(stderr, "wmir: error: write %s: %s\n", file,
c->errstr);
c->errstr);
exit_code = 1;
if (!strncmp(c->errstr, DEAD_SERVER, strlen(DEAD_SERVER) + 1))
return;
@ -86,10 +84,10 @@ perform(char *action, char *file, char *content)
out_len = c->read(c, fd, output, 2048);
if (c->errstr) {
fprintf(stderr, "wmir: error: read %s: %s\n", file,
c->errstr);
c->errstr);
exit_code = 1;
if (!strncmp
(c->errstr, DEAD_SERVER, strlen(DEAD_SERVER) + 1))
(c->errstr, DEAD_SERVER, strlen(DEAD_SERVER) + 1))
return;
break;
}
@ -104,7 +102,7 @@ perform(char *action, char *file, char *content)
c->remove(c, file);
if (c->errstr) {
fprintf(stderr, "wmir: error: remove %s: %s\n", file,
c->errstr);
c->errstr);
exit_code = 1;
return;
}
@ -113,19 +111,18 @@ perform(char *action, char *file, char *content)
c->close(c, fd);
if (c->errstr) {
fprintf(stderr, "wmir: error: close %s: %s\n", file,
c->errstr);
c->errstr);
exit_code = 1;
return;
}
}
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
int i = 0, read_stdin = 0;
char line[4096], *p;
char *sockfile = getenv("WMIR_SOCKET");
int i = 0, read_stdin = 0;
char line[4096], *p;
char *sockfile = getenv("WMIR_SOCKET");
/* command line args */
if (argc > 1) {
@ -160,7 +157,7 @@ main(int argc, char *argv[])
}
if (!sockfile) {
fprintf(stderr, "%s",
"wmir: error: WMIR_SOCKET environment not set\n");
"wmir: error: WMIR_SOCKET environment not set\n");
usage();
}
/* open socket */
@ -170,29 +167,29 @@ main(int argc, char *argv[])
}
if (read_stdin) {
/* simple shell */
char *action, *file, *content;
char *action, *file, *content;
while (fgets(line, 4096, stdin)) {
p = line;
while (*p != '\0' && (*p == ' ' || *p == '\t'))
p++;
if (*p == '\0')
continue; /* empty line */
continue; /* empty line */
if (strncmp(p, "create ", 7) &&
strncmp(p, "write ", 6) &&
strncmp(p, "read ", 5) && strncmp(p, "remove ", 7))
strncmp(p, "write ", 6) &&
strncmp(p, "read ", 5) && strncmp(p, "remove ", 7))
continue;
action = p;
while (*p != '\0' && *p != ' ' && *p != '\t' && *p != '\n')
p++;
if (*p == '\0' || *p == '\n')
continue; /* ignore bogus command */
continue; /* ignore bogus command */
*p = '\0';
p++;
while (*p != '\0' && (*p == ' ' || *p == '\t'))
p++;
if (*p == '\0')
continue; /* ignore bogus command */
continue; /* ignore bogus command */
file = p;
while (*p != '\0' && *p != ' ' && *p != '\t' && *p != '\n')
p++;
@ -207,14 +204,14 @@ main(int argc, char *argv[])
if (file[0] == '\0')
continue;
if (content) {
static size_t len;
static size_t len;
if ((len = strlen(content)))
content[len - 1] = '\0';
}
perform(action, file, content);
if (c->errstr)
fprintf(stderr, "wmir: error: read %s: %s\n", file,
c->errstr);
c->errstr);
}
} else {
perform(argv[i], argv[i + 1], (i + 2) < argc ? argv[i + 2] : 0);

View File

@ -12,49 +12,47 @@
#include <cext.h>
typedef struct {
char *name;
int (*cmd) (char **argv);
int min_argc;
} Command;
char *name;
int (*cmd) (char **argv);
int min_argc;
} Command;
static int xcreate(char **argv);
static int xread(char **argv);
static int xwrite(char **argv);
static int xremove(char **argv);
static Command cmds[] = {
static int xcreate(char **argv);
static int xread(char **argv);
static int xwrite(char **argv);
static int xremove(char **argv);
static Command cmds[] = {
{"create", xcreate, 2},
{"read", xread, 1},
{"write", xwrite, 2},
{"remove", xremove, 1},
{0, 0}
};
static IXPClient c = {0};
static IXPClient c = { 0 };
static char *version[] = {
static char *version[] = {
"wmir - window manager improved remote - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr, "%s",
"usage: wmir [-s <socket file>] [-v] <command> <args> [...]\n"
" -s socket file (default: $WMIR_SOCKET)\n"
" -f read commands from stdin\n"
" -v version info\n"
"commands:\n"
" create <file> <content> -- creates file\n"
" read <file/directory> -- reads file/directory contents\n"
" write <file> <content> -- writes content to a file\n"
" remove <file/directory> -- removes file\n");
"usage: wmir [-s <socket file>] [-v] <command> <args> [...]\n"
" -s socket file (default: $WMIR_SOCKET)\n"
" -f read commands from stdin\n"
" -v version info\n"
"commands:\n"
" create <file> <content> -- creates file\n"
" read <file/directory> -- reads file/directory contents\n"
" write <file> <content> -- writes content to a file\n"
" remove <file/directory> -- removes file\n");
exit(1);
}
static u32
write_data(u32 fid, u8 * data, u32 count)
static u32 write_data(u32 fid, u8 * data, u32 count)
{
u32 len, i, runs = count / c.fcall.iounit;
u32 len, i, runs = count / c.fcall.iounit;
for (i = 0; i <= runs; i++) {
/* write */
@ -62,8 +60,8 @@ write_data(u32 fid, u8 * data, u32 count)
if (len > c.fcall.iounit)
len = c.fcall.iounit;
if (ixp_client_write
(&c, fid, i * c.fcall.iounit, len,
&data[i * c.fcall.iounit]) != count) {
(&c, fid, i * c.fcall.iounit, len,
&data[i * c.fcall.iounit]) != count) {
fprintf(stderr, "wmir: cannot write file: %s\n", c.errstr);
return 0;
}
@ -71,18 +69,17 @@ write_data(u32 fid, u8 * data, u32 count)
return count;
}
static int
xcreate(char **argv)
static int xcreate(char **argv)
{
u32 fid;
char *p = strrchr(argv[0], '/');
u32 fid;
char *p = strrchr(argv[0], '/');
fid = c.root_fid << 2;
/* walk to bottom-most directory */
*p = 0;
if (!ixp_client_walk(&c, fid, argv[0])) {
fprintf(stderr, "wmir: cannot walk to %s: %s\n", argv[0],
c.errstr);
c.errstr);
return 1;
}
/* create */
@ -95,11 +92,10 @@ xcreate(char **argv)
return !ixp_client_close(&c, fid);
}
static int
xwrite(char **argv)
static int xwrite(char **argv)
{
/* open */
u32 fid = c.root_fid << 2;
u32 fid = c.root_fid << 2;
if (!ixp_client_open(&c, fid, argv[0], IXP_OWRITE)) {
fprintf(stderr, "wmir: cannot open file: %s\n", c.errstr);
return 1;
@ -108,12 +104,11 @@ xwrite(char **argv)
return !ixp_client_close(&c, fid);
}
static void
print_directory(void *result, u32 msize)
static void print_directory(void *result, u32 msize)
{
void *p = result;
static Stat stat, zerostat = {0};
u32 len = 0;
void *p = result;
static Stat stat, zerostat = { 0 };
u32 len = 0;
do {
p = ixp_dec_stat(p, &stat);
len += stat.size + sizeof(u16);
@ -126,12 +121,11 @@ print_directory(void *result, u32 msize)
while (len < msize);
}
static int
xread(char **argv)
static int xread(char **argv)
{
u32 count, fid = c.root_fid << 2;
int is_directory = FALSE;
static u8 result[IXP_MAX_MSG];
u32 count, fid = c.root_fid << 2;
int is_directory = FALSE;
static u8 result[IXP_MAX_MSG];
/* open */
if (!ixp_client_open(&c, fid, argv[0], IXP_OREAD)) {
@ -141,7 +135,7 @@ xread(char **argv)
is_directory = !c.fcall.nwqid || (c.fcall.qid.type == IXP_QTDIR);
/* read */
if (!(count = ixp_client_read(&c, fid, 0, result, IXP_MAX_MSG))
&& c.errstr) {
&& c.errstr) {
fprintf(stderr, "wmir: cannot read file: %s\n", c.errstr);
return 1;
}
@ -149,7 +143,7 @@ xread(char **argv)
if (is_directory)
print_directory(result, count);
else {
u32 i;
u32 i;
for (i = 0; i < count; i++)
putchar(result[i]);
}
@ -157,10 +151,9 @@ xread(char **argv)
return !ixp_client_close(&c, fid);
}
static int
xremove(char **argv)
static int xremove(char **argv)
{
u32 fid;
u32 fid;
/* remove */
fid = c.root_fid << 2;
@ -171,10 +164,9 @@ xremove(char **argv)
return 0;
}
static int
perform_cmd(int argc, char **argv)
static int perform_cmd(int argc, char **argv)
{
int i;
int i;
for (i = 0; cmds[i].name; i++)
if (!strncmp(cmds[i].name, argv[0], strlen(cmds[i].name))) {
if (cmds[i].min_argc <= argc)
@ -186,12 +178,11 @@ perform_cmd(int argc, char **argv)
return 1;
}
int
main(int argc, char *argv[])
int main(int argc, char *argv[])
{
int i = 0, ret, read_stdin = 0;
char line[4096];
char *sockfile = getenv("WMIR_SOCKET");
int i = 0, ret, read_stdin = 0;
char line[4096];
char *sockfile = getenv("WMIR_SOCKET");
/* command line args */
if (argc > 1) {
@ -225,7 +216,7 @@ main(int argc, char *argv[])
}
if (!sockfile) {
fprintf(stderr, "%s",
"wmir: error: WMIR_SOCKET environment not set\n");
"wmir: error: WMIR_SOCKET environment not set\n");
usage();
}
/* open socket */
@ -235,8 +226,8 @@ main(int argc, char *argv[])
}
/* wether perform directly or read from stdin */
if (read_stdin) {
char *_argv[3];
int _argc;
char *_argv[3];
int _argc;
while (fgets(line, 4096, stdin))
if ((_argc = tokenize(_argv, 3, line, ' '))) {
if ((ret = perform_cmd(_argc, _argv)))

View File

@ -10,24 +10,22 @@
#include <X11/Xutil.h>
#include <X11/Xatom.h>
static char *version[] = {
static char *version[] = {
"wmiwarp - window manager improved warp - " VERSION "\n"
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
" (C)opyright MMIV-MMV Anselm R. Garbe\n", 0
};
static void
usage()
static void usage()
{
fprintf(stderr,
"usage: wmiwarp [-v] <x>,<y>\n" " -v version info\n");
"usage: wmiwarp [-v] <x>,<y>\n" " -v version info\n");
exit(1);
}
int
main(int argc, char **argv)
int main(int argc, char **argv)
{
Display *dpy;
int x, y;
Display *dpy;
int x, y;
/* command line args */
if (argc != 2)
@ -49,7 +47,7 @@ main(int argc, char **argv)
usage();
}
XWarpPointer(dpy, None, RootWindow(dpy, DefaultScreen(dpy)),
0, 0, 0, 0, x, y);
0, 0, 0, 0, x, y);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XCloseDisplay(dpy);
return 0;

View File

@ -7,11 +7,10 @@
#include "cext.h"
void **
attach_item_begin(void **old, void *item, size_t size_item)
void **attach_item_begin(void **old, void *item, size_t size_item)
{
int i, size_old;
void **result = 0;
int i, size_old;
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
result = emalloc(size_item * (size_old + 2));
result[0] = item;
@ -23,11 +22,10 @@ attach_item_begin(void **old, void *item, size_t size_item)
return result;
}
void **
attach_item_end(void **old, void *item, size_t size_item)
void **attach_item_end(void **old, void *item, size_t size_item)
{
int i, size_old;
void **result = 0;
int i, size_old;
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
result = emalloc(size_item * (size_old + 2));
for (i = 0; old && old[i]; i++)
@ -39,11 +37,10 @@ attach_item_end(void **old, void *item, size_t size_item)
return result;
}
void **
detach_item(void **old, void *item, size_t size_item)
void **detach_item(void **old, void *item, size_t size_item)
{
int size_old, i, j = 0;
void **result = 0;
int size_old, i, j = 0;
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
if (size_old != 1) {
result = emalloc(size_item * size_old);
@ -57,26 +54,23 @@ detach_item(void **old, void *item, size_t size_item)
return result;
}
int
index_item(void **items, void *item)
int index_item(void **items, void *item)
{
int i = 0;
int i = 0;
for (i = 0; items && items[i] && (items[i] != item); i++);
return items[i] ? i : -1;
}
int
count_items(void **items)
int count_items(void **items)
{
int i;
int i;
for (i = 0; items && items[i]; i++);
return i;
}
int
index_next_item(void **items, void *item)
int index_next_item(void **items, void *item)
{
int idx = index_item(items, item);
int idx = index_item(items, item);
if (idx == -1)
return idx;
if (idx == count_items(items) - 1)
@ -85,10 +79,9 @@ index_next_item(void **items, void *item)
return idx + 1;
}
int
index_prev_item(void **items, void *item)
int index_prev_item(void **items, void *item)
{
int idx = index_item(items, item);
int idx = index_item(items, item);
if (idx == -1)
return idx;
if (idx == 0)

View File

@ -16,30 +16,30 @@
#endif
/* array.c */
void **attach_item_end(void **old, void *item, size_t size_item);
void **attach_item_begin(void **old, void *item, size_t size_item);
void **detach_item(void **old, void *item, size_t size_item);
int index_item(void **items, void *item);
int index_next_item(void **items, void *item);
int index_prev_item(void **items, void *item);
int count_items(void **items);
void **attach_item_end(void **old, void *item, size_t size_item);
void **attach_item_begin(void **old, void *item, size_t size_item);
void **detach_item(void **old, void *item, size_t size_item);
int index_item(void **items, void *item);
int index_next_item(void **items, void *item);
int index_prev_item(void **items, void *item);
int count_items(void **items);
/* emalloc.c */
void *emalloc(size_t size);
void *emalloc(size_t size);
/* estrdup.c */
char *estrdup(const char *s);
char *estrdup(const char *s);
/* strlcat.c */
size_t _strlcat(char *dst, const char *src, size_t siz);
size_t _strlcat(char *dst, const char *src, size_t siz);
/* strlcpy.c */
size_t _strlcpy(char *dst, const char *src, size_t siz);
size_t _strlcpy(char *dst, const char *src, size_t siz);
/* strtonum.c */
long long
long long
__strtonum(const char *numstr, long long minval,
long long maxval, const char **errstrp);
long long maxval, const char **errstrp);
/* tokenize.c */
size_t tokenize(char **result, size_t reslen, char *str, char delim);
size_t tokenize(char **result, size_t reslen, char *str, char delim);

View File

@ -8,14 +8,13 @@
#include "cext.h"
void *
emalloc(size_t size)
void *emalloc(size_t size)
{
void *res = malloc(size);
void *res = malloc(size);
if (!res) {
fprintf(stderr, "fatal: could not malloc() %d bytes\n",
(int) size);
(int) size);
exit(1);
}
return res;

View File

@ -9,10 +9,9 @@
#include "cext.h"
char *
estrdup(const char *s)
char *estrdup(const char *s)
{
char *tmp;
char *tmp;
tmp = (char *) emalloc(strlen(s) + 1);
strcpy(tmp, (char *) s);

View File

@ -26,13 +26,12 @@
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
* If retval >= siz, truncation occurred.
*/
size_t
_strlcat(char *dst, const char *src, size_t siz)
size_t _strlcat(char *dst, const char *src, size_t siz)
{
register char *d = dst;
register char *d = dst;
register const char *s = src;
register size_t n = siz;
size_t dlen;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')

View File

@ -23,10 +23,9 @@
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t
_strlcpy(char *dst, const char *src, size_t siz)
size_t _strlcpy(char *dst, const char *src, size_t siz)
{
register char *d = dst;
register char *d = dst;
register const char *s = src;
register size_t n = siz;
@ -40,8 +39,8 @@ _strlcpy(char *dst, const char *src, size_t siz)
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
if (siz != 0)
*d = '\0'; /* NUL-terminate dst */
*d = '\0'; /* NUL-terminate dst */
while (*s++);
}
return (s - src - 1); /* count does not include NUL */
return (s - src - 1); /* count does not include NUL */
}

View File

@ -25,25 +25,20 @@
long long
__strtonum(const char *numstr, long long minval, long long maxval,
const char **errstrp)
const char **errstrp)
{
long long ll = 0;
char *ep;
int error = 0;
long long ll = 0;
char *ep;
int error = 0;
struct errval {
const char *errstr;
int err;
} ev[4] = {
const char *errstr;
int err;
} ev[4] = {
{
NULL, 0
}, {
"invalid", EINVAL
}, {
"too small", ERANGE
}, {
"too large", ERANGE
},
};
NULL, 0}, {
"invalid", EINVAL}, {
"too small", ERANGE}, {
"too large", ERANGE},};
ev[0].err = errno;
errno = 0;

View File

@ -7,11 +7,10 @@
#include "cext.h"
size_t
tokenize(char **result, size_t reslen, char *str, char delim)
size_t tokenize(char **result, size_t reslen, char *str, char delim)
{
char *p, *n;
size_t i = 0;
char *p, *n;
size_t i = 0;
if (!str)
return 0;
@ -30,5 +29,5 @@ tokenize(char **result, size_t reslen, char *str, char delim)
}
if (strlen(p))
result[i++] = p;
return i; /* number of tokens */
return i; /* number of tokens */
}

View File

@ -16,13 +16,12 @@
#include <cext.h>
static IXPClient zero_client = {0};
static size_t offsets[MAX_CONN * MAX_OPEN_FILES][2]; /* set of possible fd's */
static IXPClient zero_client = { 0 };
static size_t offsets[MAX_CONN * MAX_OPEN_FILES][2]; /* set of possible fd's */
static void
check_error(IXPClient * c, void *msg)
static void check_error(IXPClient * c, void *msg)
{
ResHeader h;
ResHeader h;
if (c->errstr)
free(c->errstr);
@ -33,8 +32,7 @@ check_error(IXPClient * c, void *msg)
c->errstr = strdup((char *) msg + sizeof(ResHeader));
}
static void
handle_dead_server(IXPClient * c)
static void handle_dead_server(IXPClient * c)
{
if (c->errstr)
free(c->errstr);
@ -46,13 +44,12 @@ handle_dead_server(IXPClient * c)
c->fd = -1;
}
static void *
poll_server(IXPClient * c, void *request, size_t req_len,
size_t * out_len)
static void *poll_server(IXPClient * c, void *request, size_t req_len,
size_t * out_len)
{
size_t num = 0;
void *result = 0;
int r, header = 0;
size_t num = 0;
void *result = 0;
int r, header = 0;
if (c->errstr)
free(c->errstr);
@ -94,7 +91,7 @@ poll_server(IXPClient * c, void *request, size_t req_len,
num += r;
}
}
free(request); /* cleanup */
free(request); /* cleanup */
num = 0;
header = 0;
@ -146,13 +143,12 @@ poll_server(IXPClient * c, void *request, size_t req_len,
return result;
}
static void
cixp_create(IXPClient * c, char *path)
static void cixp_create(IXPClient * c, char *path)
{
ResHeader h;
size_t req_len, res_len;
void *req = tcreate_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = tcreate_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return;
@ -160,13 +156,12 @@ cixp_create(IXPClient * c, char *path)
free(result);
}
static int
cixp_open(IXPClient * c, char *path)
static int cixp_open(IXPClient * c, char *path)
{
ResHeader h;
size_t req_len, res_len;
void *req = topen_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = topen_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return -1;
@ -176,10 +171,10 @@ cixp_open(IXPClient * c, char *path)
return h.fd;
}
static size_t
static size_t
cixp_read(IXPClient * c, int fd, void *out_buf, size_t out_buf_len)
{
size_t len;
size_t len;
len = seek_read(c, fd, offsets[fd][0], out_buf, out_buf_len);
if (c->errstr)
@ -191,12 +186,12 @@ cixp_read(IXPClient * c, int fd, void *out_buf, size_t out_buf_len)
size_t
seek_read(IXPClient * c, int fd, size_t offset,
void *out_buf, size_t out_buf_len)
void *out_buf, size_t out_buf_len)
{
ResHeader h;
size_t req_len, res_len;
void *req = tread_message(fd, offset, out_buf_len, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = tread_message(fd, offset, out_buf_len, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return -1;
@ -206,8 +201,7 @@ seek_read(IXPClient * c, int fd, size_t offset,
return h.buf_len;
}
static void
cixp_write(IXPClient * c, int fd, void *content, size_t in_len)
static void cixp_write(IXPClient * c, int fd, void *content, size_t in_len)
{
seek_write(c, fd, offsets[fd][1], content, in_len);
if (!c->errstr)
@ -216,12 +210,12 @@ cixp_write(IXPClient * c, int fd, void *content, size_t in_len)
void
seek_write(IXPClient * c, int fd, size_t offset, void *content,
size_t in_len)
size_t in_len)
{
ResHeader h;
size_t req_len, res_len;
void *req = twrite_message(fd, offset, content, in_len, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = twrite_message(fd, offset, content, in_len, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return;
@ -229,13 +223,12 @@ seek_write(IXPClient * c, int fd, size_t offset, void *content,
free(result);
}
static void
cixp_close(IXPClient * c, int fd)
static void cixp_close(IXPClient * c, int fd)
{
ResHeader h;
size_t req_len, res_len;
void *req = tclose_message(fd, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = tclose_message(fd, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return;
@ -244,13 +237,12 @@ cixp_close(IXPClient * c, int fd)
offsets[fd][0] = offsets[fd][1] = 0;
}
static void
cixp_remove(IXPClient * c, char *path)
static void cixp_remove(IXPClient * c, char *path)
{
ResHeader h;
size_t req_len, res_len;
void *req = tremove_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
ResHeader h;
size_t req_len, res_len;
void *req = tremove_message(path, &req_len);
void *result = poll_server(c, req, req_len, &res_len);
if (!result)
return;
@ -258,14 +250,13 @@ cixp_remove(IXPClient * c, char *path)
free(result);
}
IXPClient *
init_client(char *sockfile)
IXPClient *init_client(char *sockfile)
{
struct sockaddr_un addr = {0};
socklen_t su_len;
struct sockaddr_un addr = { 0 };
socklen_t su_len;
/* init */
IXPClient *c = (IXPClient *) emalloc(sizeof(IXPClient));
IXPClient *c = (IXPClient *) emalloc(sizeof(IXPClient));
*c = zero_client;
c->create = cixp_create;
c->open = cixp_open;
@ -282,7 +273,7 @@ init_client(char *sockfile)
free(c);
return 0;
}
if (connect(c->fd, (struct sockaddr *) & addr, su_len)) {
if (connect(c->fd, (struct sockaddr *) &addr, su_len)) {
close(c->fd);
free(c);
return 0;
@ -290,8 +281,7 @@ init_client(char *sockfile)
return c;
}
void
deinit_client(IXPClient * c)
void deinit_client(IXPClient * c)
{
if (c->fd) {
shutdown(c->fd, SHUT_RDWR);

View File

@ -52,137 +52,135 @@ typedef struct Connection Connection;
typedef struct File File;
typedef struct IXPClient IXPClient;
typedef struct IXPServer IXPServer;
typedef int IXPRequest;
typedef int IXPResponse;
typedef int IXPRequest;
typedef int IXPResponse;
typedef enum {
HALT, SHUTDOWN, RUNNING
} IXPRunlevel;
} IXPRunlevel;
struct ReqHeader {
IXPRequest req;
int fd;
size_t offset;
size_t buf_len;
IXPRequest req;
int fd;
size_t offset;
size_t buf_len;
};
struct ResHeader {
IXPResponse res;
int fd;
size_t buf_len;
IXPResponse res;
int fd;
size_t buf_len;
};
/** Definition of a connection to IXP */
struct Connection {
IXPServer *s; /* !< server for this connection */
int index; /* !< index inside server */
int fd; /* !< file descriptor */
int mode; /* 0 for reading, 1 for writing */
int header;
void *data;
size_t len;
size_t remain;
void (*read) (Connection *);
void (*write) (Connection *);
File *files[MAX_OPEN_FILES];
int seen[MAX_OPEN_FILES];
IXPServer *s; /* !< server for this connection */
int index; /* !< index inside server */
int fd; /* !< file descriptor */
int mode; /* 0 for reading, 1 for writing */
int header;
void *data;
size_t len;
size_t remain;
void (*read) (Connection *);
void (*write) (Connection *);
File *files[MAX_OPEN_FILES];
int seen[MAX_OPEN_FILES];
};
struct File {
char *name;
void *content;
size_t size;
int lock;
int bind;
File *parent;
File *next;
char *name;
void *content;
size_t size;
int lock;
int bind;
File *parent;
File *next;
/* introduced IXPServer in signature for IXPServer->errstr */
void (*after_write) (IXPServer * s, File *);
void (*before_read) (IXPServer * s, File *);
void (*after_write) (IXPServer * s, File *);
void (*before_read) (IXPServer * s, File *);
};
struct IXPClient {
int fd;
fd_set rd, wr;
char *errstr; /* 0 if succes, CHECK AFTER EACH of following
* operations */
int fd;
fd_set rd, wr;
char *errstr; /* 0 if succes, CHECK AFTER EACH of following
* operations */
/* returns fd if path exists */
void (*create) (IXPClient *, char *path);
void (*remove) (IXPClient *, char *path);
int (*open) (IXPClient *, char *path);
void (*close) (IXPClient *, int fd);
size_t(*read) (IXPClient *, int fd, void *out_buf,
size_t out_buf_len);
void (*write) (IXPClient *, int fd, void *content, size_t in_len);
void (*create) (IXPClient *, char *path);
void (*remove) (IXPClient *, char *path);
int (*open) (IXPClient *, char *path);
void (*close) (IXPClient *, int fd);
size_t(*read) (IXPClient *, int fd, void *out_buf,
size_t out_buf_len);
void (*write) (IXPClient *, int fd, void *content, size_t in_len);
};
struct IXPServer {
char *sockfile;
IXPRunlevel runlevel;
Connection conn[MAX_CONN];
fd_set rd, wr; /* socks to wakeup while select() */
int nfds; /* number of file descriptors */
File *root;
char *errstr; /* 0 if succes, CHECK AFTER EACH of following
* operations */
File *(*create) (IXPServer *, char *);
File *(*open) (IXPServer *, char *);
size_t(*read) (IXPServer *, int, size_t, void *, size_t);
void (*write) (IXPServer *, int, size_t, void *, size_t);
void (*close) (IXPServer *, int);
void (*remove) (IXPServer *, char *);
char *sockfile;
IXPRunlevel runlevel;
Connection conn[MAX_CONN];
fd_set rd, wr; /* socks to wakeup while select() */
int nfds; /* number of file descriptors */
File *root;
char *errstr; /* 0 if succes, CHECK AFTER EACH of following
* operations */
File *(*create) (IXPServer *, char *);
File *(*open) (IXPServer *, char *);
size_t(*read) (IXPServer *, int, size_t, void *, size_t);
void (*write) (IXPServer *, int, size_t, void *, size_t);
void (*close) (IXPServer *, int);
void (*remove) (IXPServer *, char *);
};
/* client.c, implements client stub functions for fs access */
IXPClient *init_client(char *sockfile);
void deinit_client(IXPClient * c);
size_t
IXPClient *init_client(char *sockfile);
void deinit_client(IXPClient * c);
size_t
seek_read(IXPClient * c, int fd, size_t offset, void *out_buf,
size_t out_buf_len);
void
size_t out_buf_len);
void
seek_write(IXPClient * c, int fd, size_t offset,
void *content, size_t in_len);
void *content, size_t in_len);
/* message.c */
void *tcreate_message(char *path, size_t * msg_len);
void *topen_message(char *path, size_t * msg_len);
void *
tread_message(int fd, size_t offset, size_t buf_len,
size_t * msg_len);
void *
twrite_message(int fd, size_t offset, void *msg, size_t in_len,
size_t * msg_len);
void *tclose_message(int fd, size_t * msg_len);
void *tremove_message(char *path, size_t * msg_len);
void *rcreate_message(size_t * msg_len);
void *ropen_message(int fd, size_t * msg_len);
void *rread_message(void *content, size_t content_len, size_t * msg_len);
void *rwrite_message(size_t * msg_len);
void *rclose_message(size_t * msg_len);
void *rremove_message(size_t * msg_len);
void *rerror_message(char *errstr, size_t * msg_len);
void *tcreate_message(char *path, size_t * msg_len);
void *topen_message(char *path, size_t * msg_len);
void *tread_message(int fd, size_t offset, size_t buf_len,
size_t * msg_len);
void *twrite_message(int fd, size_t offset, void *msg, size_t in_len,
size_t * msg_len);
void *tclose_message(int fd, size_t * msg_len);
void *tremove_message(char *path, size_t * msg_len);
void *rcreate_message(size_t * msg_len);
void *ropen_message(int fd, size_t * msg_len);
void *rread_message(void *content, size_t content_len, size_t * msg_len);
void *rwrite_message(size_t * msg_len);
void *rclose_message(size_t * msg_len);
void *rremove_message(size_t * msg_len);
void *rerror_message(char *errstr, size_t * msg_len);
/* ramfs.c */
int is_directory(File * f);
File *ixp_walk(IXPServer * s, char *path);
File *ixp_create(IXPServer * s, char *path);
File *ixp_open(IXPServer * s, char *path);
size_t
int is_directory(File * f);
File *ixp_walk(IXPServer * s, char *path);
File *ixp_create(IXPServer * s, char *path);
File *ixp_open(IXPServer * s, char *path);
size_t
ixp_read(IXPServer * s, int fd, size_t offset, void *out_buf,
size_t out_buf_len);
void
size_t out_buf_len);
void
ixp_write(IXPServer * s, int fd, size_t offset,
void *content, size_t in_len);
void ixp_close(IXPServer * s, int fd);
void ixp_remove(IXPServer * s, char *path);
void ixp_remove_file(IXPServer * s, File * f);
void *content, size_t in_len);
void ixp_close(IXPServer * s, int fd);
void ixp_remove(IXPServer * s, char *path);
void ixp_remove_file(IXPServer * s, File * f);
/* server.c, uses fs directly for manipulation */
IXPServer *init_server(char *sockfile, void (*cleanup) (void));
void deinit_server(IXPServer * s);
File *fd_to_file(IXPServer * s, int fd);
void run_server(IXPServer * s);
void run_server_with_fd_support(IXPServer * s, int fd, void (*fd_read) (Connection *), /* callback for read on
* fd */
void (*fd_write) (Connection *)); /* callback for write on
* fd */
void set_error(IXPServer * s, char *errstr);
IXPServer *init_server(char *sockfile, void (*cleanup) (void));
void deinit_server(IXPServer * s);
File *fd_to_file(IXPServer * s, int fd);
void run_server(IXPServer * s);
void run_server_with_fd_support(IXPServer * s, int fd, void (*fd_read) (Connection *), /* callback for read on
* fd */
void (*fd_write) (Connection *)); /* callback for write on
* fd */
void set_error(IXPServer * s, char *errstr);

View File

@ -12,11 +12,10 @@
/* request messages ------------------------------------------------ */
void *
tcreate_message(char *path, size_t * msg_len)
void *tcreate_message(char *path, size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader) + strlen(path) + 1;
msg = emalloc(*msg_len);
h.req = TCREATE;
@ -25,11 +24,10 @@ tcreate_message(char *path, size_t * msg_len)
return msg;
}
void *
topen_message(char *path, size_t * msg_len)
void *topen_message(char *path, size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader) + strlen(path) + 1;
msg = emalloc(*msg_len);
h.req = TOPEN;
@ -38,12 +36,11 @@ topen_message(char *path, size_t * msg_len)
return msg;
}
void *
tread_message(int fd, size_t offset, size_t buf_len,
size_t * msg_len)
void *tread_message(int fd, size_t offset, size_t buf_len,
size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader);
msg = emalloc(*msg_len);
h.req = TREAD;
@ -54,12 +51,11 @@ tread_message(int fd, size_t offset, size_t buf_len,
return msg;
}
void *
twrite_message(int fd, size_t offset, void *content,
size_t content_len, size_t * msg_len)
void *twrite_message(int fd, size_t offset, void *content,
size_t content_len, size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader) + content_len;
msg = emalloc(*msg_len);
h.req = TWRITE;
@ -71,11 +67,10 @@ twrite_message(int fd, size_t offset, void *content,
return msg;
}
void *
tclose_message(int fd, size_t * msg_len)
void *tclose_message(int fd, size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader);
msg = emalloc(*msg_len);
h.req = TCLUNK;
@ -84,11 +79,10 @@ tclose_message(int fd, size_t * msg_len)
return msg;
}
void *
tremove_message(char *path, size_t * msg_len)
void *tremove_message(char *path, size_t * msg_len)
{
char *msg;
ReqHeader h;
char *msg;
ReqHeader h;
*msg_len = sizeof(ReqHeader) + strlen(path) + 1;
msg = emalloc(*msg_len);
h.req = TREMOVE;
@ -99,11 +93,10 @@ tremove_message(char *path, size_t * msg_len)
/* response messages ----------------------------------------------- */
void *
rcreate_message(size_t * msg_len)
void *rcreate_message(size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader);
msg = emalloc(*msg_len);
h.res = RCREATE;
@ -111,11 +104,10 @@ rcreate_message(size_t * msg_len)
return msg;
}
void *
ropen_message(int fd, size_t * msg_len)
void *ropen_message(int fd, size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader);
msg = emalloc(*msg_len);
h.res = ROPEN;
@ -124,11 +116,10 @@ ropen_message(int fd, size_t * msg_len)
return msg;
}
void *
rread_message(void *content, size_t content_len, size_t * msg_len)
void *rread_message(void *content, size_t content_len, size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader) + content_len;
msg = emalloc(*msg_len);
h.res = RREAD;
@ -138,11 +129,10 @@ rread_message(void *content, size_t content_len, size_t * msg_len)
return msg;
}
void *
rwrite_message(size_t * msg_len)
void *rwrite_message(size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader);
msg = emalloc(*msg_len);
h.res = RWRITE;
@ -150,11 +140,10 @@ rwrite_message(size_t * msg_len)
return msg;
}
void *
rclose_message(size_t * msg_len)
void *rclose_message(size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader);
msg = emalloc(*msg_len);
h.res = RCLUNK;
@ -162,11 +151,10 @@ rclose_message(size_t * msg_len)
return msg;
}
void *
rremove_message(size_t * msg_len)
void *rremove_message(size_t * msg_len)
{
char *msg;
ResHeader h;
char *msg;
ResHeader h;
*msg_len = sizeof(ResHeader);
msg = emalloc(*msg_len);
h.res = RREMOVE;
@ -174,12 +162,11 @@ rremove_message(size_t * msg_len)
return msg;
}
void *
rerror_message(char *errstr, size_t * msg_len)
void *rerror_message(char *errstr, size_t * msg_len)
{
char *msg;
size_t len = strlen(errstr) + 1;
ResHeader h;
char *msg;
size_t len = strlen(errstr) + 1;
ResHeader h;
*msg_len = sizeof(ResHeader) + len;
msg = emalloc(*msg_len);
h.res = RERROR;

View File

@ -11,20 +11,18 @@
#include <cext.h>
static File zero_file = {0};
static File zero_file = { 0 };
int
is_directory(File * f)
int is_directory(File * f)
{
return !f->size && f->content;
}
File *
ixp_create(IXPServer * s, char *path)
File *ixp_create(IXPServer * s, char *path)
{
File *f, *p;
char *buf = strdup(path);
char *tok, *tok_ptr;
File *f, *p;
char *buf = strdup(path);
char *tok, *tok_ptr;
if (!path)
return 0;
@ -50,8 +48,8 @@ ixp_create(IXPServer * s, char *path)
}
if (p->size && tok) {
free(buf);
return 0; /* cannot create subdirectory, if file has
* content */
return 0; /* cannot create subdirectory, if file has
* content */
}
/* only create missing parts, if file is directory */
while (tok) {
@ -75,22 +73,20 @@ ixp_create(IXPServer * s, char *path)
return f;
}
static int
comp_file_name(const void *f1, const void *f2)
static int comp_file_name(const void *f1, const void *f2)
{
File *f = (File *) f1;
File *p = (File *) f2;
File *f = (File *) f1;
File *p = (File *) f2;
return strcmp(*(char **) f->name, *(char **) p->name);
}
static char *
_ls(File * f)
static char *_ls(File * f)
{
File *p;
char *result = 0;
size_t size = 1; /* for \n */
int num = 0, i;
File **tmp;
File *p;
char *result = 0;
size_t size = 1; /* for \n */
int num = 0, i;
File **tmp;
for (p = f; p; p = p->next)
num++;
@ -116,10 +112,9 @@ _ls(File * f)
return result;
}
File *
ixp_open(IXPServer * s, char *path)
File *ixp_open(IXPServer * s, char *path)
{
File *f;
File *f;
f = ixp_walk(s, path);
if (!f) {
@ -130,10 +125,9 @@ ixp_open(IXPServer * s, char *path)
return f;
}
void
ixp_close(IXPServer * s, int fd)
void ixp_close(IXPServer * s, int fd)
{
File *f = fd_to_file(s, fd);
File *f = fd_to_file(s, fd);
if (!f)
set_error(s, "invalid file descriptor");
else if (f->lock > 0)
@ -142,11 +136,11 @@ ixp_close(IXPServer * s, int fd)
size_t
ixp_read(IXPServer * s, int fd, size_t offset, void *out_buf,
size_t out_buf_len)
size_t out_buf_len)
{
File *f = fd_to_file(s, fd);
void *result = 0;
size_t len = 0, res_len = 0;
File *f = fd_to_file(s, fd);
void *result = 0;
size_t len = 0, res_len = 0;
if (!f) {
set_error(s, "invalid file descriptor");
@ -181,9 +175,9 @@ ixp_read(IXPServer * s, int fd, size_t offset, void *out_buf,
void
ixp_write(IXPServer * s, int fd, size_t offset, void *content,
size_t in_len)
size_t in_len)
{
File *f = fd_to_file(s, fd);
File *f = fd_to_file(s, fd);
if (!f) {
set_error(s, "invalid file descriptor");
@ -215,8 +209,7 @@ ixp_write(IXPServer * s, int fd, size_t offset, void *content,
f->after_write(s, f);
}
static void
_ixp_remove(IXPServer * s, File * f)
static void _ixp_remove(IXPServer * s, File * f)
{
if (!f)
return;
@ -227,7 +220,7 @@ _ixp_remove(IXPServer * s, File * f)
}
if (f->lock) {
set_error(s, "cannot remove opened file");
return; /* a file is opened, so stop removing tree */
return; /* a file is opened, so stop removing tree */
}
if (!f->bind && is_directory(f)) {
_ixp_remove(s, f->content);
@ -245,10 +238,9 @@ _ixp_remove(IXPServer * s, File * f)
}
}
void
ixp_remove_file(IXPServer * s, File * f)
void ixp_remove_file(IXPServer * s, File * f)
{
File *p, *n;
File *p, *n;
set_error(s, 0);
if (!f) {
set_error(s, "file does not exist");
@ -278,19 +270,17 @@ ixp_remove_file(IXPServer * s, File * f)
}
void
ixp_remove(IXPServer * s, char *path)
void ixp_remove(IXPServer * s, char *path)
{
ixp_remove_file(s, ixp_walk(s, path));
}
File *
ixp_walk(IXPServer * s, char *path)
File *ixp_walk(IXPServer * s, char *path)
{
File *f = 0;
File *n;
char *buf;
char *tok, *tok_ptr;
File *f = 0;
File *n;
char *buf;
char *tok, *tok_ptr;
if (!path) {
return 0;

View File

@ -17,13 +17,12 @@
#include <cext.h>
static File zero_file = {0};
static IXPServer zero_server = {0};
static Connection zero_conn = {0};
static int user_fd = -1;
static File zero_file = { 0 };
static IXPServer zero_server = { 0 };
static Connection zero_conn = { 0 };
static int user_fd = -1;
void
set_error(IXPServer * s, char *errstr)
void set_error(IXPServer * s, char *errstr)
{
if (s->errstr)
free(s->errstr);
@ -33,17 +32,15 @@ set_error(IXPServer * s, char *errstr)
s->errstr = 0;
}
File *
fd_to_file(IXPServer * s, int fd)
File *fd_to_file(IXPServer * s, int fd)
{
int cidx = fd / MAX_CONN;
int fidx = fd - (cidx * MAX_CONN);
int cidx = fd / MAX_CONN;
int fidx = fd - (cidx * MAX_CONN);
return s->conn[cidx].files[fidx];
}
static void
handle_ixp_create(Connection * c)
static void handle_ixp_create(Connection * c)
{
c->s->create(c->s, ((char *) c->data) + sizeof(ReqHeader));
free(c->data);
@ -52,20 +49,19 @@ handle_ixp_create(Connection * c)
c->remain = c->len;
}
static void
handle_ixp_open(Connection * c)
static void handle_ixp_open(Connection * c)
{
int i;
int i;
/* seek next free slot */
for (i = 0; (i < MAX_OPEN_FILES) && c->files[i]; i++);
if (i == MAX_OPEN_FILES) {
fprintf(stderr, "%s",
"ixp: server: maximum of open files, try again later.\n");
"ixp: server: maximum of open files, try again later.\n");
free(c->data);
c->data =
rerror_message("maximum open files reached, close files first",
&c->len);
&c->len);
c->remain = c->len;
return;
}
@ -74,17 +70,16 @@ handle_ixp_open(Connection * c)
free(c->data);
c->data = c->s->errstr ?
rerror_message(c->s->errstr,
&c->len) : ropen_message(i + MAX_CONN * c->index,
&c->len);
&c->len) : ropen_message(i + MAX_CONN * c->index,
&c->len);
c->remain = c->len;
}
static void
handle_ixp_read(Connection * c, ReqHeader * h)
static void handle_ixp_read(Connection * c, ReqHeader * h)
{
int fidx = h->fd - (c->index * MAX_CONN);
void *data = 0;
size_t out_len;
int fidx = h->fd - (c->index * MAX_CONN);
void *data = 0;
size_t out_len;
data = emalloc(h->buf_len);
out_len = c->s->read(c->s, h->fd, h->offset, data, h->buf_len);
@ -100,12 +95,11 @@ handle_ixp_read(Connection * c, ReqHeader * h)
free(data);
}
static void
handle_ixp_write(Connection * c, ReqHeader * h)
static void handle_ixp_write(Connection * c, ReqHeader * h)
{
int fidx = h->fd - (c->index * MAX_CONN);
int fidx = h->fd - (c->index * MAX_CONN);
c->s->write(c->s, h->fd, h->offset,
((char *) c->data) + sizeof(ReqHeader), h->buf_len);
((char *) c->data) + sizeof(ReqHeader), h->buf_len);
free(c->data);
if (c->s->errstr) {
c->data = rerror_message(c->s->errstr, &c->len);
@ -117,10 +111,9 @@ handle_ixp_write(Connection * c, ReqHeader * h)
c->remain = c->len;
}
static void
handle_ixp_close(Connection * c, ReqHeader * h)
static void handle_ixp_close(Connection * c, ReqHeader * h)
{
int fidx = h->fd - (c->index * MAX_CONN);
int fidx = h->fd - (c->index * MAX_CONN);
c->s->close(c->s, h->fd);
c->files[fidx] = 0;
@ -135,8 +128,7 @@ handle_ixp_close(Connection * c, ReqHeader * h)
c->remain = c->len;
}
static void
handle_ixp_remove(Connection * c)
static void handle_ixp_remove(Connection * c)
{
c->s->remove(c->s, ((char *) c->data) + sizeof(ReqHeader));
free(c->data);
@ -145,10 +137,9 @@ handle_ixp_remove(Connection * c)
c->remain = c->len;
}
static void
check_ixp_request(Connection * c)
static void check_ixp_request(Connection * c)
{
ReqHeader h;
ReqHeader h;
/* check pending request */
if (c->s->errstr)
set_error(c->s, 0);
@ -180,10 +171,9 @@ check_ixp_request(Connection * c)
}
}
static void
update_conns(IXPServer * s)
static void update_conns(IXPServer * s)
{
int i;
int i;
FD_ZERO(&s->rd);
FD_ZERO(&s->wr);
@ -191,7 +181,7 @@ update_conns(IXPServer * s)
if (s->conn[i].fd >= 0) {
s->nfds = _MAX(s->nfds, s->conn[i].fd);
if (s->conn[i].read && !s->conn[i].mode
&& (!s->conn[i].len || s->conn[i].remain)) {
&& (!s->conn[i].len || s->conn[i].remain)) {
FD_SET(s->conn[i].fd, &s->rd);
}
if (s->conn[i].write && s->conn[i].mode && s->conn[i].remain) {
@ -201,10 +191,9 @@ update_conns(IXPServer * s)
}
}
static void
close_conn(Connection * c)
static void close_conn(Connection * c)
{
int i;
int i;
/* shutdown connection and cleanup open files */
shutdown(c->fd, SHUT_RDWR);
close(c->fd);
@ -219,10 +208,9 @@ close_conn(Connection * c)
}
}
static void
read_conn(Connection * c)
static void read_conn(Connection * c)
{
size_t r;
size_t r;
if (!c->header) {
r = read(c->fd, &c->len, sizeof(size_t));
@ -243,16 +231,15 @@ read_conn(Connection * c)
if (c->remain == 0) {
/* check IXP request */
c->mode = 1; /* next mode is response */
c->mode = 1; /* next mode is response */
check_ixp_request(c);
c->header = 0;
}
}
static void
write_conn(Connection * c)
static void write_conn(Connection * c)
{
size_t r;
size_t r;
if (!c->header) {
r = write(c->fd, &c->len, sizeof(size_t));
@ -275,21 +262,20 @@ write_conn(Connection * c)
}
}
static void
new_conn(Connection * c)
static void new_conn(Connection * c)
{
int r, i;
socklen_t l;
struct sockaddr_un name = {0};
int r, i;
socklen_t l;
struct sockaddr_un name = { 0 };
l = sizeof(name);
if ((r = accept(c->fd, (struct sockaddr *) & name, &l)) < 0) {
if ((r = accept(c->fd, (struct sockaddr *) &name, &l)) < 0) {
perror("ixp: server: cannot accept connection");
return;
}
if (c->s->runlevel == SHUTDOWN) {
fprintf(stderr, "%s",
"ixp: server: connection refused, server is shutting down.\n");
"ixp: server: connection refused, server is shutting down.\n");
close(r);
return;
}
@ -307,16 +293,15 @@ new_conn(Connection * c)
if (i == MAX_CONN) {
fprintf(stderr, "%s",
"ixp: server: connection refused, try again later.\n");
"ixp: server: connection refused, try again later.\n");
close(r);
}
}
static int
check_open_files(Connection * c)
static int check_open_files(Connection * c)
{
int i;
int i;
for (i = 0; i < MAX_OPEN_FILES; i++) {
if (c->files[i] && c->seen[i]) {
c->seen[i]--;
@ -326,10 +311,9 @@ check_open_files(Connection * c)
return 0;
}
static void
handle_socks(IXPServer * s)
static void handle_socks(IXPServer * s)
{
int i, now = 1;
int i, now = 1;
for (i = 0; i < MAX_CONN; i++) {
if (s->conn[i].fd >= 0) {
if (FD_ISSET(s->conn[i].fd, &s->rd) && s->conn[i].read) {
@ -344,31 +328,30 @@ handle_socks(IXPServer * s)
* still responses are sent or still opened files
*/
if ((s->runlevel == SHUTDOWN)
&& (check_open_files(&s->conn[i])
|| (s->conn[i].remain > 0)
|| s->conn[i].mode))
&& (check_open_files(&s->conn[i])
|| (s->conn[i].remain > 0)
|| s->conn[i].mode))
now = 0;
}
}
if ((s->runlevel == SHUTDOWN) && now)
s->runlevel = HALT; /* real stop */
s->runlevel = HALT; /* real stop */
}
IXPServer *
init_server(char *sockfile, void (*cleanup) (void))
IXPServer *init_server(char *sockfile, void (*cleanup) (void))
{
int i;
struct sockaddr_un addr = {0};
int yes = 1;
socklen_t su_len;
IXPServer *s;
int i;
struct sockaddr_un addr = { 0 };
int yes = 1;
socklen_t su_len;
IXPServer *s;
/* init */
s = (IXPServer *) emalloc(sizeof(IXPServer));
*s = zero_server;
s->sockfile = sockfile;
s->root = (File *) emalloc(sizeof(File));
s->runlevel = HALT; /* initially server is not running */
s->runlevel = HALT; /* initially server is not running */
s->create = ixp_create;
s->remove = ixp_remove;
s->open = ixp_open;
@ -390,7 +373,7 @@ init_server(char *sockfile, void (*cleanup) (void))
return 0;
}
if (setsockopt(s->conn[0].fd, SOL_SOCKET, SO_REUSEADDR,
(char *) &yes, sizeof(yes)) < 0) {
(char *) &yes, sizeof(yes)) < 0) {
perror("ixp: server: setsockopt");
close(s->conn[0].fd);
free(s);
@ -400,7 +383,7 @@ init_server(char *sockfile, void (*cleanup) (void))
strncpy(addr.sun_path, sockfile, sizeof(addr.sun_path));
su_len = sizeof(struct sockaddr) + strlen(addr.sun_path);
if (bind(s->conn[0].fd, (struct sockaddr *) & addr, su_len) < 0) {
if (bind(s->conn[0].fd, (struct sockaddr *) &addr, su_len) < 0) {
perror("ixp: server: cannot bind socket");
close(s->conn[0].fd);
free(s);
@ -425,8 +408,8 @@ init_server(char *sockfile, void (*cleanup) (void))
void
run_server_with_fd_support(IXPServer * s, int fd,
void (*fd_read) (Connection *),
void (*fd_write) (Connection *))
void (*fd_read) (Connection *),
void (*fd_write) (Connection *))
{
s->conn[1] = zero_conn;
s->conn[1].index = 1;
@ -437,10 +420,9 @@ run_server_with_fd_support(IXPServer * s, int fd,
run_server(s);
}
void
run_server(IXPServer * s)
void run_server(IXPServer * s)
{
int r, i;
int r, i;
s->runlevel = RUNNING;
/* main loop */
@ -453,7 +435,7 @@ run_server(IXPServer * s)
continue;
if (r < 0) {
perror("ixp: server: select");
break; /* allow cleanups in IXP using app */
break; /* allow cleanups in IXP using app */
} else if (r > 0) {
handle_socks(s);
}
@ -466,8 +448,7 @@ run_server(IXPServer * s)
}
}
void
deinit_server(IXPServer * s)
void deinit_server(IXPServer * s)
{
unlink(s->sockfile);
ixp_remove(s, "/");

View File

@ -13,12 +13,11 @@
#include "cext.h"
#include "ixp.h"
static u8 msg[IXP_MAX_MSG];
static u8 msg[IXP_MAX_MSG];
static int
do_fcall(IXPClient * c)
static int do_fcall(IXPClient * c)
{
u32 msize = ixp_fcall_to_msg(&c->fcall, msg, IXP_MAX_MSG);
u32 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)
return FALSE;
@ -35,8 +34,7 @@ do_fcall(IXPClient * c)
return TRUE;
}
int
ixp_client_init(IXPClient * c, char *sockfile)
int ixp_client_init(IXPClient * c, char *sockfile)
{
if ((c->fd = ixp_connect_sock(sockfile)) < 0) {
c->errstr = "cannot connect server";
@ -54,7 +52,7 @@ ixp_client_init(IXPClient * c, char *sockfile)
if (strncmp(c->fcall.version, IXP_VERSION, strlen(IXP_VERSION))) {
c->errstr = "9P versions differ";
ixp_client_deinit(c);
return FALSE; /* we cannot handle this version */
return FALSE; /* we cannot handle this version */
}
c->root_fid = getpid();
@ -73,8 +71,7 @@ ixp_client_init(IXPClient * c, char *sockfile)
return TRUE;
}
int
ixp_client_remove(IXPClient * c, u32 newfid, char *filepath)
int ixp_client_remove(IXPClient * c, u32 newfid, char *filepath)
{
if (!ixp_client_walk(c, newfid, filepath))
return FALSE;
@ -85,9 +82,8 @@ ixp_client_remove(IXPClient * c, u32 newfid, char *filepath)
return do_fcall(c);
}
int
ixp_client_create(IXPClient * c, u32 dirfid, char *name, u32 perm,
u8 mode)
int
ixp_client_create(IXPClient * c, u32 dirfid, char *name, u32 perm, u8 mode)
{
/* create */
c->fcall.id = TCREATE;
@ -99,8 +95,7 @@ ixp_client_create(IXPClient * c, u32 dirfid, char *name, u32 perm,
return do_fcall(c);
}
int
ixp_client_walk(IXPClient * c, u32 newfid, char *filepath)
int ixp_client_walk(IXPClient * c, u32 newfid, char *filepath)
{
/* walk */
c->fcall.id = TWALK;
@ -110,13 +105,12 @@ ixp_client_walk(IXPClient * c, u32 newfid, char *filepath)
_strlcpy(c->fcall.name, filepath, sizeof(c->fcall.name));
c->fcall.nwname =
tokenize((char **) c->fcall.wname, IXP_MAX_WELEM,
c->fcall.name, '/');
c->fcall.name, '/');
}
return do_fcall(c);
}
int
ixp_client_open(IXPClient * c, u32 newfid, char *filepath, u8 mode)
int ixp_client_open(IXPClient * c, u32 newfid, char *filepath, u8 mode)
{
if (!ixp_client_walk(c, newfid, filepath))
return FALSE;
@ -129,13 +123,13 @@ ixp_client_open(IXPClient * c, u32 newfid, char *filepath, u8 mode)
return do_fcall(c);
}
u32
u32
ixp_client_read(IXPClient * c, u32 fid, u64 offset, void *result,
u32 res_len)
u32 res_len)
{
u32 bytes =
c->fcall.maxmsg - (sizeof(u8) + sizeof(u16) + 2 * sizeof(u32) +
sizeof(u64));
u32 bytes =
c->fcall.maxmsg - (sizeof(u8) + sizeof(u16) + 2 * sizeof(u32) +
sizeof(u64));
/* read */
c->fcall.id = TREAD;
c->fcall.tag = IXP_NOTAG;
@ -148,13 +142,12 @@ ixp_client_read(IXPClient * c, u32 fid, u64 offset, void *result,
return c->fcall.count;
}
u32
ixp_client_write(IXPClient * c, u32 fid, u64 offset, u32 count,
u8 * data)
u32
ixp_client_write(IXPClient * c, u32 fid, u64 offset, u32 count, u8 * data)
{
if (count >
c->fcall.maxmsg - (sizeof(u8) + sizeof(u16) + 2 * sizeof(u32) +
sizeof(u64))) {
c->fcall.maxmsg - (sizeof(u8) + sizeof(u16) + 2 * sizeof(u32) +
sizeof(u64))) {
c->errstr = "message size exceeds buffer size";
return 0;
}
@ -170,8 +163,7 @@ ixp_client_write(IXPClient * c, u32 fid, u64 offset, u32 count,
return c->fcall.count;
}
int
ixp_client_close(IXPClient * c, u32 fid)
int ixp_client_close(IXPClient * c, u32 fid)
{
/* clunk */
c->fcall.id = TCLUNK;
@ -180,8 +172,7 @@ ixp_client_close(IXPClient * c, u32 fid)
return do_fcall(c);
}
void
ixp_client_deinit(IXPClient * c)
void ixp_client_deinit(IXPClient * c)
{
/* session finished, now shutdown */
if (c->fd) {

View File

@ -9,37 +9,32 @@
/* encode/decode stuff */
void *
ixp_enc_u8(u8 * msg, u8 val)
void *ixp_enc_u8(u8 * msg, u8 val)
{
msg[0] = val;
return &msg[1];
}
void *
ixp_dec_u8(u8 * msg, u8 * val)
void *ixp_dec_u8(u8 * msg, u8 * val)
{
*val = msg[0];
return &msg[1];
}
void *
ixp_enc_u16(u8 * msg, u16 val)
void *ixp_enc_u16(u8 * msg, u16 val)
{
msg[0] = val;
msg[1] = val >> 8;
return &msg[2];
}
void *
ixp_dec_u16(u8 * msg, u16 * val)
void *ixp_dec_u16(u8 * msg, u16 * val)
{
*val = msg[0] | (msg[1] << 8);
return &msg[2];
}
void *
ixp_enc_u32(u8 * msg, u32 val)
void *ixp_enc_u32(u8 * msg, u32 val)
{
msg[0] = val;
msg[1] = val >> 8;
@ -48,15 +43,13 @@ ixp_enc_u32(u8 * msg, u32 val)
return &msg[4];
}
void *
ixp_dec_u32(u8 * msg, u32 * val)
void *ixp_dec_u32(u8 * msg, u32 * val)
{
*val = msg[0] | (msg[1] << 8) | (msg[2] << 16) | (msg[3] << 24);
return &msg[4];
}
void *
ixp_enc_u64(u8 * msg, u64 val)
void *ixp_enc_u64(u8 * msg, u64 val)
{
msg[0] = val;
msg[1] = val >> 8;
@ -69,28 +62,25 @@ ixp_enc_u64(u8 * msg, u64 val)
return &msg[8];
}
void *
ixp_dec_u64(u8 * msg, u64 * val)
void *ixp_dec_u64(u8 * msg, u64 * val)
{
*val = (u64) msg[0] | ((u64) msg[1] << 8) |
((u64) msg[2] << 16) | ((u64) msg[3] << 24) |
((u64) msg[4] << 32) | ((u64) msg[5] << 40) |
((u64) msg[6] << 48) | ((u64) msg[7] << 56);
((u64) msg[2] << 16) | ((u64) msg[3] << 24) |
((u64) msg[4] << 32) | ((u64) msg[5] << 40) |
((u64) msg[6] << 48) | ((u64) msg[7] << 56);
return &msg[8];
}
void *
ixp_enc_string(u8 * msg, const char *s)
void *ixp_enc_string(u8 * msg, const char *s)
{
u16 len = s ? strlen(s) : 0;
u16 len = s ? strlen(s) : 0;
msg = ixp_enc_u16(msg, len);
if (s)
memcpy(msg, s, len);
return &msg[len];
}
void *
ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len)
void *ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len)
{
msg = ixp_dec_u16(msg, len);
if (!(*len))
@ -105,54 +95,47 @@ ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len)
return &msg[*len];
}
void *
ixp_enc_data(u8 * msg, u8 * data, u32 datalen)
void *ixp_enc_data(u8 * msg, u8 * data, u32 datalen)
{
memcpy(msg, data, datalen);
return &msg[datalen];
}
void *
ixp_dec_data(u8 * msg, u8 * data, u32 datalen)
void *ixp_dec_data(u8 * msg, u8 * data, u32 datalen)
{
memcpy(data, msg, datalen);
return &msg[datalen];
}
void *
ixp_enc_prefix(u8 * msg, u32 size, u8 id, u16 tag)
void *ixp_enc_prefix(u8 * msg, u32 size, u8 id, u16 tag)
{
msg = ixp_enc_u32(msg, size);
msg = ixp_enc_u8(msg, id);
return ixp_enc_u16(msg, tag);
}
void *
ixp_dec_prefix(u8 * msg, u32 * size, u8 * id, u16 * tag)
void *ixp_dec_prefix(u8 * msg, u32 * size, u8 * id, u16 * tag)
{
msg = ixp_dec_u32(msg, size);
msg = ixp_dec_u8(msg, id);
return ixp_dec_u16(msg, tag);
}
void *
ixp_enc_qid(u8 * msg, Qid * qid)
void *ixp_enc_qid(u8 * msg, Qid * qid)
{
msg = ixp_enc_u8(msg, qid->type);
msg = ixp_enc_u32(msg, qid->version);
return ixp_enc_u64(msg, qid->path);
}
void *
ixp_dec_qid(u8 * msg, Qid * qid)
void *ixp_dec_qid(u8 * msg, Qid * qid)
{
msg = ixp_dec_u8(msg, &qid->type);
msg = ixp_dec_u32(msg, &qid->version);
return ixp_dec_u64(msg, &qid->path);
}
void *
ixp_enc_stat(u8 * msg, Stat * stat)
void *ixp_enc_stat(u8 * msg, Stat * stat)
{
msg = ixp_enc_u16(msg, stat->size);
msg = ixp_enc_u16(msg, stat->type);
@ -168,10 +151,9 @@ ixp_enc_stat(u8 * msg, Stat * stat)
return ixp_enc_string(msg, stat->muid);
}
void *
ixp_dec_stat(u8 * msg, Stat * stat)
void *ixp_dec_stat(u8 * msg, Stat * stat)
{
u16 len;
u16 len;
msg = ixp_dec_u16(msg, &stat->size);
msg = ixp_dec_u16(msg, &stat->type);
msg = ixp_dec_u32(msg, &stat->dev);

View File

@ -23,7 +23,7 @@
#define IXP_MAX_FLEN 128
#define IXP_MAX_ULEN 32
#define IXP_MAX_STAT 64
#define IXP_MAX_WELEM 16 /* MAXWELEM */
#define IXP_MAX_WELEM 16 /* MAXWELEM */
#define IXP_MAX_TFUNCS 14
/* 9P message types */
@ -93,149 +93,147 @@ typedef unsigned long long u64;
#define IXP_NOFID (u32)~0 /* No auth */
typedef struct {
u8 type;
u32 version;
u64 path;
} Qid;
u8 type;
u32 version;
u64 path;
} Qid;
/* stat structure */
typedef struct {
u16 size;
u16 type;
u32 dev;
Qid qid;
u32 mode;
u32 atime;
u32 mtime;
u64 length;
char name[IXP_MAX_FLEN];
char uid[IXP_MAX_ULEN];
char gid[IXP_MAX_ULEN];
char muid[IXP_MAX_ULEN];
} Stat;
u16 size;
u16 type;
u32 dev;
Qid qid;
u32 mode;
u32 atime;
u32 mtime;
u64 length;
char name[IXP_MAX_FLEN];
char uid[IXP_MAX_ULEN];
char gid[IXP_MAX_ULEN];
char muid[IXP_MAX_ULEN];
} Stat;
typedef struct {
u8 id;
u16 tag;
u32 fid;
u32 maxmsg; /* Tversion, Rversion */
char version[IXP_MAX_VERSION]; /* Tversion, Rversion */
u16 oldtag; /* Tflush */
char errstr[IXP_MAX_ERROR]; /* Rerror */
Qid qid; /* Rattach, Ropen, Rcreate */
u32 iounit; /* Ropen, Rcreate */
Qid aqid; /* Rauth */
u32 afid; /* Tauth, Tattach */
char uname[IXP_MAX_ULEN]; /* Tauth, Tattach */
char aname[IXP_MAX_FLEN]; /* Tauth, Tattach */
u32 perm; /* Tcreate */
char name[IXP_MAX_FLEN]; /* Tcreate */
u8 mode; /* Tcreate, Topen */
u32 newfid; /* Twalk */
u16 nwname; /* Twalk */
char *wname[IXP_MAX_WELEM]; /* Twalk */
u16 nwqid; /* Rwalk */
Qid wqid[IXP_MAX_WELEM]; /* Rwalk */
u64 offset; /* Tread, Twrite */
u32 count; /* Tread, Twrite, Rread */
Stat stat; /* Rstat */
u16 nstat; /* Twstat, Rstat */
u8 data[IXP_MAX_MSG]; /* Twrite, Rread, Twstat,
* Rstat */
} Fcall;
u8 id;
u16 tag;
u32 fid;
u32 maxmsg; /* Tversion, Rversion */
char version[IXP_MAX_VERSION]; /* Tversion, Rversion */
u16 oldtag; /* Tflush */
char errstr[IXP_MAX_ERROR]; /* Rerror */
Qid qid; /* Rattach, Ropen, Rcreate */
u32 iounit; /* Ropen, Rcreate */
Qid aqid; /* Rauth */
u32 afid; /* Tauth, Tattach */
char uname[IXP_MAX_ULEN]; /* Tauth, Tattach */
char aname[IXP_MAX_FLEN]; /* Tauth, Tattach */
u32 perm; /* Tcreate */
char name[IXP_MAX_FLEN]; /* Tcreate */
u8 mode; /* Tcreate, Topen */
u32 newfid; /* Twalk */
u16 nwname; /* Twalk */
char *wname[IXP_MAX_WELEM]; /* Twalk */
u16 nwqid; /* Rwalk */
Qid wqid[IXP_MAX_WELEM]; /* Rwalk */
u64 offset; /* Tread, Twrite */
u32 count; /* Tread, Twrite, Rread */
Stat stat; /* Rstat */
u16 nstat; /* Twstat, Rstat */
u8 data[IXP_MAX_MSG]; /* Twrite, Rread, Twstat,
* Rstat */
} Fcall;
typedef struct IXPServer IXPServer;
typedef struct IXPConn IXPConn;
typedef struct {
u8 id;
int (*tfunc) (IXPServer *, IXPConn *);
} IXPTFunc;
u8 id;
int (*tfunc) (IXPServer *, IXPConn *);
} IXPTFunc;
struct IXPConn {
int fd;
int dont_close;
void (*read) (IXPServer *, IXPConn *);
void *aux;
int fd;
int dont_close;
void (*read) (IXPServer *, IXPConn *);
void *aux;
};
struct IXPServer {
int running;
IXPConn conn[IXP_MAX_CONN];
void (*freeconn) (IXPServer *, IXPConn *);
int maxfd;
fd_set rd;
IXPTFunc *funcs;
Fcall fcall;
char *errstr;
int running;
IXPConn conn[IXP_MAX_CONN];
void (*freeconn) (IXPServer *, IXPConn *);
int maxfd;
fd_set rd;
IXPTFunc *funcs;
Fcall fcall;
char *errstr;
};
typedef struct {
int fd;
u32 root_fid;
Qid root_qid;
Fcall fcall;
char *errstr;
} IXPClient;
int fd;
u32 root_fid;
Qid root_qid;
Fcall fcall;
char *errstr;
} IXPClient;
/* client.c */
int ixp_client_init(IXPClient * c, char *sockfile);
void ixp_client_deinit(IXPClient * c);
int ixp_client_remove(IXPClient * c, u32 newfid, char *filepath);
int
int ixp_client_init(IXPClient * c, char *sockfile);
void ixp_client_deinit(IXPClient * c);
int ixp_client_remove(IXPClient * c, u32 newfid, char *filepath);
int
ixp_client_create(IXPClient * c, u32 dirfid, char *name, u32 perm,
u8 mode);
int ixp_client_walk(IXPClient * c, u32 newfid, char *filepath);
int ixp_client_open(IXPClient * c, u32 newfid, char *filepath, u8 mode);
u32
u8 mode);
int ixp_client_walk(IXPClient * c, u32 newfid, char *filepath);
int ixp_client_open(IXPClient * c, u32 newfid, char *filepath, u8 mode);
u32
ixp_client_read(IXPClient * c, u32 fid, u64 offset, void *result,
u32 res_len);
u32
ixp_client_write(IXPClient * c, u32 fid, u64 offset, u32 count,
u8 * data);
int ixp_client_close(IXPClient * c, u32 fid);
u32 res_len);
u32
ixp_client_write(IXPClient * c, u32 fid, u64 offset, u32 count, u8 * data);
int ixp_client_close(IXPClient * c, u32 fid);
/* convert.c */
void *ixp_enc_u8(u8 * msg, u8 val);
void *ixp_dec_u8(u8 * msg, u8 * val);
void *ixp_enc_u16(u8 * msg, u16 val);
void *ixp_dec_u16(u8 * msg, u16 * val);
void *ixp_enc_u32(u8 * msg, u32 val);
void *ixp_dec_u32(u8 * msg, u32 * val);
void *ixp_enc_u64(u8 * msg, u64 val);
void *ixp_dec_u64(u8 * msg, u64 * val);
void *ixp_enc_string(u8 * msg, const char *s);
void *ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len);
void *ixp_enc_data(u8 * msg, u8 * data, u32 datalen);
void *ixp_dec_data(u8 * msg, u8 * data, u32 datalen);
void *ixp_enc_prefix(u8 * msg, u32 size, u8 id, u16 tag);
void *ixp_dec_prefix(u8 * msg, u32 * size, u8 * id, u16 * tag);
void *ixp_enc_qid(u8 * msg, Qid * qid);
void *ixp_dec_qid(u8 * msg, Qid * qid);
void *ixp_enc_stat(u8 * msg, Stat * stat);
void *ixp_dec_stat(u8 * msg, Stat * stat);
void *ixp_enc_u8(u8 * msg, u8 val);
void *ixp_dec_u8(u8 * msg, u8 * val);
void *ixp_enc_u16(u8 * msg, u16 val);
void *ixp_dec_u16(u8 * msg, u16 * val);
void *ixp_enc_u32(u8 * msg, u32 val);
void *ixp_dec_u32(u8 * msg, u32 * val);
void *ixp_enc_u64(u8 * msg, u64 val);
void *ixp_dec_u64(u8 * msg, u64 * val);
void *ixp_enc_string(u8 * msg, const char *s);
void *ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len);
void *ixp_enc_data(u8 * msg, u8 * data, u32 datalen);
void *ixp_dec_data(u8 * msg, u8 * data, u32 datalen);
void *ixp_enc_prefix(u8 * msg, u32 size, u8 id, u16 tag);
void *ixp_dec_prefix(u8 * msg, u32 * size, u8 * id, u16 * tag);
void *ixp_enc_qid(u8 * msg, Qid * qid);
void *ixp_dec_qid(u8 * msg, Qid * qid);
void *ixp_enc_stat(u8 * msg, Stat * stat);
void *ixp_dec_stat(u8 * msg, Stat * stat);
/* message.c */
u16 ixp_sizeof_stat(Stat * stat);
u32 ixp_fcall_to_msg(Fcall * fcall, void *msg, u32 msglen);
u32 ixp_msg_to_fcall(void *msg, u32 msglen, Fcall * fcall);
u16 ixp_sizeof_stat(Stat * stat);
u32 ixp_fcall_to_msg(Fcall * fcall, void *msg, u32 msglen);
u32 ixp_msg_to_fcall(void *msg, u32 msglen, Fcall * fcall);
/* server.c */
IXPConn *
ixp_server_add_conn(IXPServer * s, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *));
int ixp_server_tversion(IXPServer *, IXPConn * c);
void ixp_server_rm_conn(IXPServer * s, IXPConn * c);
void ixp_server_loop(IXPServer * s);
int ixp_server_init(IXPServer * s, char *sockfile, IXPTFunc * funcs,
void (*freeconn) (IXPServer *, IXPConn *));
void ixp_server_deinit(IXPServer * s);
IXPConn *ixp_server_add_conn(IXPServer * s, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *));
int ixp_server_tversion(IXPServer *, IXPConn * c);
void ixp_server_rm_conn(IXPServer * s, IXPConn * c);
void ixp_server_loop(IXPServer * s);
int ixp_server_init(IXPServer * s, char *sockfile, IXPTFunc * funcs,
void (*freeconn) (IXPServer *, IXPConn *));
void ixp_server_deinit(IXPServer * s);
/* socket.c */
int ixp_connect_sock(char *sockfile);
int ixp_accept_sock(int fd);
int ixp_create_sock(char *sockfile, char **errstr);
int ixp_connect_sock(char *sockfile);
int ixp_accept_sock(int fd);
int ixp_create_sock(char *sockfile, char **errstr);
/* transport.c */
u32 ixp_send_message(int fd, void *msg, u32 msize, char **errstr);
u32 ixp_recv_message(int fd, void *msg, u32 msglen, char **errstr);
u32 ixp_send_message(int fd, void *msg, u32 msize, char **errstr);
u32 ixp_recv_message(int fd, void *msg, u32 msglen, char **errstr);

View File

@ -7,30 +7,27 @@
#include <string.h>
#include "ixp.h"
static u16
sizeof_string(const char *s)
static u16 sizeof_string(const char *s)
{
return sizeof(u16) + strlen(s);
}
u16
ixp_sizeof_stat(Stat * stat)
u16 ixp_sizeof_stat(Stat * stat)
{
return sizeof(Qid)
+ 2 * sizeof(u16)
+ 4 * sizeof(u32)
+ sizeof(u64)
+ sizeof_string(stat->name)
+ sizeof_string(stat->uid)
+ sizeof_string(stat->gid)
+ sizeof_string(stat->muid);
+ 2 * sizeof(u16)
+ 4 * sizeof(u32)
+ sizeof(u64)
+ sizeof_string(stat->name)
+ sizeof_string(stat->uid)
+ sizeof_string(stat->gid)
+ sizeof_string(stat->muid);
}
u32
ixp_fcall_to_msg(Fcall * fcall, void *msg, u32 msglen)
u32 ixp_fcall_to_msg(Fcall * fcall, void *msg, u32 msglen)
{
u32 i, msize = sizeof(u8) + sizeof(u16) + sizeof(u32);
void *p = msg;
u32 i, msize = sizeof(u8) + sizeof(u16) + sizeof(u32);
void *p = msg;
switch (fcall->id) {
case TVERSION:
@ -192,14 +189,13 @@ ixp_fcall_to_msg(Fcall * fcall, void *msg, u32 msglen)
return msize;
}
u32
ixp_msg_to_fcall(void *msg, u32 msglen, Fcall * fcall)
u32 ixp_msg_to_fcall(void *msg, u32 msglen, Fcall * fcall)
{
u32 i, msize;
u16 len;
void *p = ixp_dec_prefix(msg, &msize, &fcall->id, &fcall->tag);
u32 i, msize;
u16 len;
void *p = ixp_dec_prefix(msg, &msize, &fcall->id, &fcall->tag);
if (msize > msglen) /* bad message */
if (msize > msglen) /* bad message */
return 0;
switch (fcall->id) {
@ -207,7 +203,7 @@ ixp_msg_to_fcall(void *msg, u32 msglen, Fcall * fcall)
case RVERSION:
p = ixp_dec_u32(p, &fcall->maxmsg);
p = ixp_dec_string(p, fcall->version, sizeof(fcall->version),
&len);
&len);
break;
case TAUTH:
p = ixp_dec_u32(p, &fcall->afid);

View File

@ -17,23 +17,21 @@
#include "ixp.h"
#include "cext.h"
static IXPConn zero_conn = {-1, 0, 0, 0};
static u8 msg[IXP_MAX_MSG];
static IXPConn zero_conn = { -1, 0, 0, 0 };
static u8 msg[IXP_MAX_MSG];
static IXPConn *
next_free_conn(IXPServer * s)
static IXPConn *next_free_conn(IXPServer * s)
{
int i;
int i;
for (i = 0; i < IXP_MAX_CONN; i++)
if (s->conn[i].fd < 0)
return &s->conn[i];
return nil;
}
static void
prepare_select(IXPServer * s)
static void prepare_select(IXPServer * s)
{
int i;
int i;
FD_ZERO(&s->rd);
for (i = 0; i < IXP_MAX_CONN; i++) {
if (s->conn[i].fd >= 0) {
@ -45,8 +43,7 @@ prepare_select(IXPServer * s)
}
}
void
ixp_server_rm_conn(IXPServer * s, IXPConn * c)
void ixp_server_rm_conn(IXPServer * s, IXPConn * c)
{
if (!c->dont_close) {
shutdown(c->fd, SHUT_RDWR);
@ -57,9 +54,8 @@ ixp_server_rm_conn(IXPServer * s, IXPConn * c)
*c = zero_conn;
}
static IXPConn *
init_conn(IXPConn * c, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *))
static IXPConn *init_conn(IXPConn * c, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *))
{
*c = zero_conn;
c->fd = fd;
@ -68,20 +64,18 @@ init_conn(IXPConn * c, int fd, int dont_close,
return c;
}
IXPConn *
ixp_server_add_conn(IXPServer * s, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *))
IXPConn *ixp_server_add_conn(IXPServer * s, int fd, int dont_close,
void (*read) (IXPServer *, IXPConn *))
{
IXPConn *c = next_free_conn(s);
IXPConn *c = next_free_conn(s);
if (!c)
return nil;
return init_conn(c, fd, dont_close, read);
}
static void
handle_conns(IXPServer * s)
static void handle_conns(IXPServer * s)
{
int i;
int i;
for (i = 0; i < IXP_MAX_CONN; i++) {
if (s->conn[i].fd >= 0) {
if (FD_ISSET(s->conn[i].fd, &s->rd) && s->conn[i].read)
@ -91,10 +85,9 @@ handle_conns(IXPServer * s)
}
}
static void
server_client_read(IXPServer * s, IXPConn * c)
static void server_client_read(IXPServer * s, IXPConn * c)
{
u32 i, msize;
u32 i, msize;
s->errstr = 0;
if (!(msize = ixp_recv_message(c->fd, msg, IXP_MAX_MSG, &s->errstr))) {
ixp_server_rm_conn(s, c);
@ -108,7 +101,8 @@ server_client_read(IXPServer * s, IXPConn * c)
break;
msize = ixp_fcall_to_msg(&s->fcall, msg, s->fcall.maxmsg);
fprintf(stderr, "msize=%d\n", msize);
if (ixp_send_message(c->fd, msg, msize, &s->errstr) != msize)
if (ixp_send_message(c->fd, msg, msize, &s->errstr) !=
msize)
break;
return;
}
@ -123,19 +117,17 @@ server_client_read(IXPServer * s, IXPConn * c)
ixp_server_rm_conn(s, c);
}
static void
server_read(IXPServer * s, IXPConn * c)
static void server_read(IXPServer * s, IXPConn * c)
{
int fd;
IXPConn *new = next_free_conn(s);
int fd;
IXPConn *new = next_free_conn(s);
if (new && ((fd = ixp_accept_sock(c->fd)) >= 0))
init_conn(new, fd, 0, server_client_read);
}
void
ixp_server_loop(IXPServer * s)
void ixp_server_loop(IXPServer * s)
{
int r;
int r;
s->running = TRUE;
s->errstr = 0;
@ -149,32 +141,30 @@ ixp_server_loop(IXPServer * s)
continue;
if (r < 0) {
s->errstr = "fatal select error";
break; /* allow cleanups in IXP using app */
break; /* allow cleanups in IXP using app */
} else if (r > 0)
handle_conns(s);
}
}
int
ixp_server_tversion(IXPServer * s, IXPConn * c)
int ixp_server_tversion(IXPServer * s, IXPConn * c)
{
fprintf(stderr, "got version %s (%s) %d (%d)\n", s->fcall.version, IXP_VERSION,
s->fcall.maxmsg, IXP_MAX_MSG);
fprintf(stderr, "got version %s (%s) %d (%d)\n", s->fcall.version,
IXP_VERSION, s->fcall.maxmsg, IXP_MAX_MSG);
if (strncmp(s->fcall.version, IXP_VERSION, strlen(IXP_VERSION))) {
s->errstr = "9P versions differ";
return FALSE;
}
else if (s->fcall.maxmsg > IXP_MAX_MSG)
} else if (s->fcall.maxmsg > IXP_MAX_MSG)
s->fcall.maxmsg = IXP_MAX_MSG;
s->fcall.id = RVERSION;
return TRUE;
}
int
int
ixp_server_init(IXPServer * s, char *sockfile, IXPTFunc * funcs,
void (*freeconn) (IXPServer *, IXPConn *))
void (*freeconn) (IXPServer *, IXPConn *))
{
int fd, i;
int fd, i;
s->funcs = funcs;
s->freeconn = freeconn;
s->errstr = 0;
@ -190,10 +180,9 @@ ixp_server_init(IXPServer * s, char *sockfile, IXPTFunc * funcs,
return TRUE;
}
void
ixp_server_deinit(IXPServer * s)
void ixp_server_deinit(IXPServer * s)
{
int i;
int i;
/* shut down server */
for (i = 0; i < IXP_MAX_CONN; i++)
if (s->conn[i].fd >= 0)

View File

@ -16,12 +16,11 @@
#include "cext.h"
#include "ixp.h"
int
ixp_connect_sock(char *sockfile)
int ixp_connect_sock(char *sockfile)
{
int fd = 0;
struct sockaddr_un addr = {0};
socklen_t su_len;
int fd = 0;
struct sockaddr_un addr = { 0 };
socklen_t su_len;
/* init */
addr.sun_family = AF_UNIX;
@ -30,30 +29,28 @@ ixp_connect_sock(char *sockfile)
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
return -1;
if (connect(fd, (struct sockaddr *) & addr, su_len)) {
if (connect(fd, (struct sockaddr *) &addr, su_len)) {
close(fd);
return -1;
}
return fd;
}
int
ixp_accept_sock(int fd)
int ixp_accept_sock(int fd)
{
socklen_t su_len;
struct sockaddr_un addr = {0};
socklen_t su_len;
struct sockaddr_un addr = { 0 };
su_len = sizeof(struct sockaddr);
return accept(fd, (struct sockaddr *) & addr, &su_len);
return accept(fd, (struct sockaddr *) &addr, &su_len);
}
int
ixp_create_sock(char *sockfile, char **errstr)
int ixp_create_sock(char *sockfile, char **errstr)
{
int fd;
int yes = 1;
struct sockaddr_un addr = {0};
socklen_t su_len;
int fd;
int yes = 1;
struct sockaddr_un addr = { 0 };
socklen_t su_len;
signal(SIGPIPE, SIG_IGN);
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
@ -61,7 +58,7 @@ ixp_create_sock(char *sockfile, char **errstr)
return -1;
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
(char *) &yes, sizeof(yes)) < 0) {
(char *) &yes, sizeof(yes)) < 0) {
*errstr = "cannot set socket options";
close(fd);
return -1;
@ -70,7 +67,7 @@ ixp_create_sock(char *sockfile, char **errstr)
strncpy(addr.sun_path, sockfile, sizeof(addr.sun_path));
su_len = sizeof(struct sockaddr) + strlen(addr.sun_path);
if (bind(fd, (struct sockaddr *) & addr, su_len) < 0) {
if (bind(fd, (struct sockaddr *) &addr, su_len) < 0) {
*errstr = "cannot bind socket";
close(fd);
return -1;

View File

@ -17,11 +17,10 @@
#include <cext.h>
u32
ixp_send_message(int fd, void *msg, u32 msize, char **errstr)
u32 ixp_send_message(int fd, void *msg, u32 msize, char **errstr)
{
u32 num = 0;
int r;
u32 num = 0;
int r;
/* send message */
while (num < msize) {
@ -37,11 +36,10 @@ ixp_send_message(int fd, void *msg, u32 msize, char **errstr)
return num;
}
static u32
ixp_recv_data(int fd, void *msg, u32 msize, char **errstr)
static u32 ixp_recv_data(int fd, void *msg, u32 msize, char **errstr)
{
u32 num = 0;
int r = 0;
u32 num = 0;
int r = 0;
/* receive data */
while (num < msize) {
@ -57,10 +55,9 @@ ixp_recv_data(int fd, void *msg, u32 msize, char **errstr)
return num;
}
u32
ixp_recv_message(int fd, void *msg, u32 msglen, char **errstr)
u32 ixp_recv_message(int fd, void *msg, u32 msglen, char **errstr)
{
u32 msize;
u32 msize;
/* receive header */
if (ixp_recv_data(fd, msg, sizeof(u32), errstr) != sizeof(u32))
@ -72,7 +69,7 @@ ixp_recv_message(int fd, void *msg, u32 msglen, char **errstr)
}
/* receive message */
if (ixp_recv_data(fd, msg + sizeof(u32), msize - sizeof(u32), errstr)
!= msize - sizeof(u32))
!= msize - sizeof(u32))
return 0;
return msize;
}

View File

@ -16,49 +16,48 @@
typedef enum {
CENTER, WEST, NWEST, NORTH, NEAST, EAST,
SEAST, SOUTH, SWEST
} Align;
} Align;
typedef struct Draw Draw;
struct Draw {
Drawable drawable;
GC gc;
unsigned long bg;
unsigned long fg;
unsigned long border;
Align align;
XFontStruct *font;
XRectangle rect; /* relative rect */
XRectangle *notch; /* relative notch rect */
char *data;
Drawable drawable;
GC gc;
unsigned long bg;
unsigned long fg;
unsigned long border;
Align align;
XFontStruct *font;
XRectangle rect; /* relative rect */
XRectangle *notch; /* relative notch rect */
char *data;
};
/* draw.c */
XFontStruct *blitz_getfont(Display * dpy, char *fontstr);
unsigned long blitz_loadcolor(Display * dpy, int mon, char *colstr);
void blitz_drawlabel(Display * dpy, Draw * r);
void blitz_drawmeter(Display * dpy, Draw * r);
void blitz_drawlabelnoborder(Display * dpy, Draw * r);
XFontStruct *blitz_getfont(Display * dpy, char *fontstr);
unsigned long blitz_loadcolor(Display * dpy, int mon, char *colstr);
void blitz_drawlabel(Display * dpy, Draw * r);
void blitz_drawmeter(Display * dpy, Draw * r);
void blitz_drawlabelnoborder(Display * dpy, Draw * r);
/* geometry.c */
int
int
blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
char *val);
int blitz_ispointinrect(int x, int y, XRectangle * r);
int blitz_distance(XRectangle * origin, XRectangle * target);
void
char *val);
int blitz_ispointinrect(int x, int y, XRectangle * r);
int blitz_distance(XRectangle * origin, XRectangle * target);
void
blitz_getbasegeometry(void **items, unsigned int *size,
unsigned int *cols, unsigned int *rows);
unsigned int *cols, unsigned int *rows);
/* mouse.c */
char *blitz_buttontostr(unsigned int button);
unsigned int blitz_strtobutton(char *val);
char *blitz_buttontostr(unsigned int button);
unsigned int blitz_strtobutton(char *val);
/* kb.c */
char *blitz_modtostr(unsigned long mod);
unsigned long blitz_strtomod(char *val);
char *blitz_modtostr(unsigned long mod);
unsigned long blitz_strtomod(char *val);
/* util.c */
long long
_strtonum(const char *numstr, long long minval,
long long maxval);
long long
_strtonum(const char *numstr, long long minval, long long maxval);

View File

@ -9,10 +9,9 @@
#include <cext.h>
XFontStruct *
blitz_getfont(Display * dpy, char *fontstr)
XFontStruct *blitz_getfont(Display * dpy, char *fontstr)
{
XFontStruct *font;
XFontStruct *font;
font = XLoadQueryFont(dpy, fontstr);
if (!font) {
font = XLoadQueryFont(dpy, "fixed");
@ -24,11 +23,10 @@ blitz_getfont(Display * dpy, char *fontstr)
return font;
}
unsigned long
blitz_loadcolor(Display * dpy, int mon, char *colstr)
unsigned long blitz_loadcolor(Display * dpy, int mon, char *colstr)
{
XColor color;
char col[8];
XColor color;
char col[8];
_strlcpy(col, colstr, sizeof(col));
col[7] = '\0';
@ -36,10 +34,9 @@ blitz_loadcolor(Display * dpy, int mon, char *colstr)
return color.pixel;
}
static void
draw_bg(Display * dpy, Draw * d)
static void draw_bg(Display * dpy, Draw * d)
{
XRectangle rect[4];
XRectangle rect[4];
XSetForeground(dpy, d->gc, d->bg);
if (!d->notch) {
XFillRectangles(dpy, d->drawable, d->gc, &d->rect, 1);
@ -61,10 +58,9 @@ draw_bg(Display * dpy, Draw * d)
XFillRectangles(dpy, d->drawable, d->gc, rect, 4);
}
static void
_draw_border(Display * dpy, Draw * d)
static void _draw_border(Display * dpy, Draw * d)
{
XPoint points[5];
XPoint points[5];
XSetLineAttributes(dpy, d->gc, 1, LineSolid, CapButt, JoinMiter);
XSetForeground(dpy, d->gc, d->border);
@ -81,12 +77,11 @@ _draw_border(Display * dpy, Draw * d)
XDrawLines(dpy, d->drawable, d->gc, points, 5, CoordModePrevious);
}
static void
draw_text(Display * dpy, Draw * d)
static void draw_text(Display * dpy, Draw * d)
{
unsigned int x, y, w, h, shortened = FALSE;
size_t len = 0;
static char text[2048];
unsigned int x, y, w, h, shortened = FALSE;
size_t len = 0;
static char text[2048];
if (!d->data)
return;
@ -123,7 +118,7 @@ draw_text(Display * dpy, Draw * d)
case EAST:
x = d->rect.x + d->rect.width - (h / 2 + w);
break;
default: /* CENTER */
default: /* CENTER */
x = d->rect.x + (d->rect.width - w) / 2;
break;
}
@ -139,10 +134,9 @@ draw_text(Display * dpy, Draw * d)
}
/* draws meter */
void
blitz_drawmeter(Display * dpy, Draw * d)
void blitz_drawmeter(Display * dpy, Draw * d)
{
unsigned int offy, mh, val, w = d->rect.width - 4;
unsigned int offy, mh, val, w = d->rect.width - 4;
if (!d->data || strncmp(d->data, "%m:", 3))
return;
@ -158,8 +152,7 @@ blitz_drawmeter(Display * dpy, Draw * d)
XFillRectangle(dpy, d->drawable, d->gc, d->rect.x + 2, offy, w, mh);
}
static void
_draw_label(Display * dpy, Draw * d)
static void _draw_label(Display * dpy, Draw * d)
{
draw_bg(dpy, d);
if (d->data)
@ -167,15 +160,13 @@ _draw_label(Display * dpy, Draw * d)
}
/* draws label */
void
blitz_drawlabel(Display * dpy, Draw * d)
void blitz_drawlabel(Display * dpy, Draw * d)
{
_draw_label(dpy, d);
_draw_border(dpy, d);
}
void
blitz_drawlabelnoborder(Display * dpy, Draw * d)
void blitz_drawlabelnoborder(Display * dpy, Draw * d)
{
_draw_label(dpy, d);
}

View File

@ -10,8 +10,7 @@
#include "blitz.h"
#include <cext.h>
static int
strtoalign(Align * result, char *val)
static int strtoalign(Align * result, char *val)
{
/*
* note, resize allows syntax like "east-20", this we cannot do
@ -47,14 +46,14 @@ strtoalign(Align * result, char *val)
* Each component can be of following format:
* <...> = [+|-]0..n|<alignment>[[+|-]0..n]
*/
int
int
blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
char *val)
char *val)
{
char buf[64];
char *x, *y, *w, *h;
char *p;
int sx, sy, sw, sh;
char buf[64];
char *x, *y, *w, *h;
char *p;
int sx, sy, sw, sh;
if (!val)
return FALSE;
@ -82,8 +81,8 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
r->height = _strtonum(h, 0, 65535);
if (!sx && !sw && x && w
&& x[0] != '-' && x[0] != '+' && w[0] != '-' && w[0] != '+') {
Align ax, aw;
&& x[0] != '-' && x[0] != '+' && w[0] != '-' && w[0] != '+') {
Align ax, aw;
strtoalign(&ax, x);
strtoalign(&aw, w);
if ((ax == CENTER) && (aw == EAST)) {
@ -98,7 +97,7 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
}
}
} else if (!sx && x && x[0] != '-' && x[0] != '+') {
Align ax;
Align ax;
strtoalign(&ax, x);
if (ax == CENTER) {
r->x = root->x + (root->width / 2) - (r->width / 2);
@ -108,7 +107,7 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
r->x = root->x;
}
} else if (!sw && w && w[0] != '-' && w[0] != '+') {
Align aw;
Align aw;
strtoalign(&aw, w);
if (aw == CENTER) {
r->width = (root->width / 2) - r->x;
@ -117,8 +116,8 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
}
}
if (!sy && !sh && y && h
&& y[0] != '-' && y[0] != '+' && h[0] != '-' && h[0] != '+') {
Align ay, ah;
&& y[0] != '-' && y[0] != '+' && h[0] != '-' && h[0] != '+') {
Align ay, ah;
strtoalign(&ay, y);
strtoalign(&ah, h);
if ((ay == CENTER) && (ah == SOUTH)) {
@ -133,7 +132,7 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
}
}
} else if (!sy && y && y[0] != '-' && y[0] != '+') {
Align ay;
Align ay;
strtoalign(&ay, y);
if (ay == CENTER) {
r->y = root->y + (root->height / 2) - (r->height / 2);
@ -143,7 +142,7 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
r->y = root->y;
}
} else if (!sh && h && h[0] != '-' && h[0] != '+') {
Align ah;
Align ah;
strtoalign(&ah, h);
if (ah == CENTER) {
r->height = (root->height / 2) - r->y;
@ -187,30 +186,28 @@ blitz_strtorect(Display * dpy, XRectangle * root, XRectangle * r,
return TRUE;
}
int
blitz_ispointinrect(int x, int y, XRectangle * r)
int blitz_ispointinrect(int x, int y, XRectangle * r)
{
return (x >= r->x) && (x <= r->x + r->width)
&& (y >= r->y) && (y <= r->y + r->height);
&& (y >= r->y) && (y <= r->y + r->height);
}
int
blitz_distance(XRectangle * origin, XRectangle * target)
int blitz_distance(XRectangle * origin, XRectangle * target)
{
int ox = origin->x + origin->width / 2;
int oy = origin->y + origin->height / 2;
int tx = target->x + target->width / 2;
int ty = target->y + target->height / 2;
int ox = origin->x + origin->width / 2;
int oy = origin->y + origin->height / 2;
int tx = target->x + target->width / 2;
int ty = target->y + target->height / 2;
return (int) sqrt((double) (((ox - tx) * (ox - tx)) +
((oy - ty) * (oy - ty))));
((oy - ty) * (oy - ty))));
}
void
void
blitz_getbasegeometry(void **items, unsigned int *size,
unsigned int *cols, unsigned int *rows)
unsigned int *cols, unsigned int *rows)
{
float sq, dummy;
float sq, dummy;
*size = count_items((void **) items);
sq = sqrt(*size);

View File

@ -10,10 +10,9 @@
#include <cext.h>
/* free the result manually! */
char *
blitz_modtostr(unsigned long mod)
char *blitz_modtostr(unsigned long mod)
{
char result[60];
char result[60];
result[0] = '\0';
if (mod & ShiftMask)
@ -33,10 +32,9 @@ blitz_modtostr(unsigned long mod)
return estrdup(result);
}
unsigned long
blitz_strtomod(char *val)
unsigned long blitz_strtomod(char *val)
{
unsigned long mod = 0;
unsigned long mod = 0;
if (strstr(val, "S-"))
mod |= ShiftMask;
if (strstr(val, "C-"))

View File

@ -12,19 +12,17 @@
#include <cext.h>
/* free the result manually! */
char *
blitz_buttontostr(unsigned int button)
char *blitz_buttontostr(unsigned int button)
{
char result[8];
char result[8];
result[0] = '\0';
snprintf(result, 8, "Button%ud", button - Button1);
return estrdup(result);
}
unsigned int
blitz_strtobutton(char *val)
unsigned int blitz_strtobutton(char *val)
{
unsigned int res = 0;
unsigned int res = 0;
if (val && strlen(val) > 6 && !strncmp(val, "Button", 6))
res = _strtonum(&val[6], 1, 5) + Button1;
return res;

View File

@ -8,14 +8,13 @@
#include "cext.h"
#include "blitz.h"
long long
_strtonum(const char *numstr, long long minval, long long maxval)
long long _strtonum(const char *numstr, long long minval, long long maxval)
{
const char *errstr;
long long ret = __strtonum(numstr, minval, maxval, &errstr);
const char *errstr;
long long ret = __strtonum(numstr, minval, maxval, &errstr);
if (errstr)
fprintf(stderr,
"liblitz: cannot convert '%s' into integer: %s\n",
numstr, errstr);
"liblitz: cannot convert '%s' into integer: %s\n",
numstr, errstr);
return ret;
}

View File

@ -14,17 +14,16 @@
#include <cext.h>
static pid_t mypid;
static char *mysockfile;
static pid_t mypid;
static char *mysockfile;
/* convenience stuff ----------------------------------------------- */
File *
wmii_create_ixpfile(IXPServer * s, char *key, char *val)
File *wmii_create_ixpfile(IXPServer * s, char *key, char *val)
{
File *f = ixp_create(s, key);
File *f = ixp_create(s, key);
if (f && !is_directory(f)) {
size_t l = val ? strlen(val) : 0;
size_t l = val ? strlen(val) : 0;
f->content = l ? strdup(val) : 0;
f->size = l;
return f;
@ -33,10 +32,9 @@ wmii_create_ixpfile(IXPServer * s, char *key, char *val)
return 0;
}
void
wmii_get_ixppath(File * f, char *path, size_t size)
void wmii_get_ixppath(File * f, char *path, size_t size)
{
char buf[512];
char buf[512];
buf[0] = '\0';
if (path)
@ -48,11 +46,10 @@ wmii_get_ixppath(File * f, char *path, size_t size)
wmii_get_ixppath(f->parent, path, size);
}
void
wmii_move_ixpfile(File * f, File * to_parent)
void wmii_move_ixpfile(File * f, File * to_parent)
{
File *p = f->parent;
File *fil = p->content;
File *p = f->parent;
File *fil = p->content;
/* detach */
if (p->content == f)
@ -75,17 +72,15 @@ wmii_move_ixpfile(File * f, File * to_parent)
f->parent = to_parent;
}
static void
exit_cleanup()
static void exit_cleanup()
{
if (mypid == getpid())
unlink(mysockfile);
}
IXPServer *
wmii_setup_server(char *sockfile)
IXPServer *wmii_setup_server(char *sockfile)
{
IXPServer *s;
IXPServer *s;
if (!sockfile) {
fprintf(stderr, "%s\n", "libwmii: no socket file provided");

View File

@ -13,8 +13,7 @@
#include <cext.h>
void
spawn(void *dpy, char *cmd)
void spawn(void *dpy, char *cmd)
{
/* the questionable double-fork is done to catch all zombies */
if (fork() == 0) {

View File

@ -5,10 +5,9 @@
#include "wmii.h"
void
swap(void **p1, void **p2)
void swap(void **p1, void **p2)
{
void *tmp = *p1;
void *tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}

View File

@ -17,15 +17,15 @@
int
property(Display * dpy, Window w, Atom a, Atom t, long l,
unsigned char **prop)
unsigned char **prop)
{
Atom real;
int format;
unsigned long res, extra;
int status;
Atom real;
int format;
unsigned long res, extra;
int status;
status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format,
&res, &extra, prop);
&res, &extra, prop);
if (status != Success || *prop == 0) {
return 0;
@ -36,10 +36,9 @@ property(Display * dpy, Window w, Atom a, Atom t, long l,
return res;
}
void
win_prop(Display * dpy, Window w, Atom a, char *res, int len)
void win_prop(Display * dpy, Window w, Atom a, char *res, int len)
{
unsigned char *prop;
unsigned char *prop;
if (property(dpy, w, a, XA_STRING, 100L, &prop)) {
_strlcpy(res, (char *) prop, len);
@ -49,10 +48,9 @@ win_prop(Display * dpy, Window w, Atom a, char *res, int len)
XSync(dpy, False);
}
void
send_message(Display * dpy, Window w, Atom a, long value)
void send_message(Display * dpy, Window w, Atom a, long value)
{
XEvent e;
XEvent e;
e.type = ClientMessage;
e.xclient.window = w;
e.xclient.message_type = a;
@ -67,22 +65,22 @@ send_message(Display * dpy, Window w, Atom a, long value)
#define NUM_MASKS 8
void
init_lock_modifiers(Display * dpy, unsigned int *valid_mask,
unsigned int *num_lock_mask)
unsigned int *num_lock_mask)
{
XModifierKeymap *modmap;
KeyCode num_lock;
static int masks[NUM_MASKS] = {
KeyCode num_lock;
static int masks[NUM_MASKS] = {
ShiftMask, LockMask, ControlMask, Mod1Mask,
Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
};
int i;
int i;
*num_lock_mask = 0;
modmap = XGetModifierMapping(dpy);
num_lock = XKeysymToKeycode(dpy, XStringToKeysym("Num_Lock"));
if (modmap && modmap->max_keypermod > 0) {
int max = NUM_MASKS * modmap->max_keypermod;
int max = NUM_MASKS * modmap->max_keypermod;
for (i = 0; i < max; i++) {
if (num_lock && (modmap->modifiermap[i] == num_lock)) {
*num_lock_mask = masks[i / modmap->max_keypermod];

View File

@ -12,28 +12,28 @@
typedef struct Action Action;
struct Action {
char *name;
void (*func) (void *obj, char *);
char *name;
void (*func) (void *obj, char *);
};
/* ixputil.c */
File *wmii_create_ixpfile(IXPServer * s, char *key, char *val);
void wmii_get_ixppath(File * f, char *path, size_t size);
void wmii_move_ixpfile(File * f, File * to_parent);
IXPServer *wmii_setup_server(char *sockfile);
File *wmii_create_ixpfile(IXPServer * s, char *key, char *val);
void wmii_get_ixppath(File * f, char *path, size_t size);
void wmii_move_ixpfile(File * f, File * to_parent);
IXPServer *wmii_setup_server(char *sockfile);
/* spawn.c */
void spawn(void *dpy, char *cmd);
void spawn(void *dpy, char *cmd);
/* util.c */
void swap(void **p1, void **p2);
void swap(void **p1, void **p2);
/* wm.c */
int
int
property(Display * dpy, Window w, Atom a, Atom t, long l,
unsigned char **prop);
void win_prop(Display * dpy, Window w, Atom a, char *res, int len);
void send_message(Display * dpy, Window w, Atom a, long value);
void
unsigned char **prop);
void win_prop(Display * dpy, Window w, Atom a, char *res, int len);
void send_message(Display * dpy, Window w, Atom a, long value);
void
init_lock_modifiers(Display * dpy, unsigned int *valid_mask,
unsigned int *num_lock_mask);
unsigned int *num_lock_mask);