commit 55ca4d6c2375cb8e9530ab734014c3eb769770df
parent 63bcb2cd1f746bd573adf2bedf6b6b1b0a84092e
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Sat, 11 Feb 2006 15:22:42 +0100
added button press event handling in wmiirc
Diffstat:
9 files changed, 74 insertions(+), 44 deletions(-)
diff --git a/cmd/wm/area.c b/cmd/wm/area.c
@@ -12,6 +12,7 @@ alloc_area(Page *p)
{
static unsigned short id = 1;
Area *a = cext_emallocz(sizeof(Area));
+ a->page = p;
a->id = id++;
p->area = (Area **)cext_array_attach((void **)p->area, a, sizeof(Area *), &p->areasz);
p->narea++;
@@ -29,9 +30,10 @@ destroy_area(Area *a)
}
int
-area_to_index(Page *p, Area *a)
+area_to_index(Area *a)
{
int i;
+ Page *p = a->page;
for(i = 0; i < p->narea; i++)
if(p->area[i] == a)
return i;
diff --git a/cmd/wm/client.c b/cmd/wm/client.c
@@ -94,7 +94,7 @@ static void
client_name_event(Client *c)
{
char buf[256];
- snprintf(buf, sizeof(buf), "C %s\n", c->name);
+ snprintf(buf, sizeof(buf), "CN %s\n", c->name);
do_pend_fcall(buf);
}
@@ -106,9 +106,9 @@ focus_client(Client *c)
Client *old = sel_client();
/* setup indexes */
- if(c->page != p) {
- focus_page(c->page);
- p = c->page;
+ if(c->area->page != p) {
+ focus_page(c->area->page);
+ p = c->area->page;
}
for(i = 0; i < p->narea; i++) {
Area *a = p->area[i];
@@ -167,7 +167,7 @@ configure_client(Client * c)
e.window = c->win;
e.x = c->rect.x;
e.y = c->rect.y;
- if(c->page) {
+ if(c->area) {
e.x += c->frame.rect.x;
e.y += c->frame.rect.y;
}
@@ -224,7 +224,7 @@ handle_client_property(Client *c, XPropertyEvent *e)
cext_strlcpy(c->name, (char*) name.value, sizeof(c->name));
free(name.value);
}
- if(c->page)
+ if(c->area)
draw_client(c);
client_name_event(c);
break;
@@ -375,7 +375,6 @@ attach_client(Client *c)
p = page[sel];
reparent_client(c, c->frame.win, c->rect.x, c->rect.y);
- c->page = p;
if(p->sel)
attach_column(c);
@@ -384,6 +383,7 @@ attach_client(Client *c)
a->client = (Client **)cext_array_attach((void **)a->client, c,
sizeof(Client *), &a->clientsz);
a->nclient++;
+ c->area = a;
}
resize_client(c, &c->frame.rect, nil);
map_client(c);
@@ -394,16 +394,16 @@ attach_client(Client *c)
void
detach_client(Client *c, Bool unmap)
{
- if(c->page) {
+ if(c->area) {
size_t i;
for(i = 0; i < nclient; i++)
if(client[i]->revert == c)
client[i]->revert = nil;
- if(area_to_index(c->page, c->area) > 0)
+ if(area_to_index(c->area) > 0)
detach_column(c);
else {
- Area *a = c->page->area[0];
+ Area *a = c->area;
cext_array_detach((void **)a->client, c, &a->clientsz);
a->nclient--;
if(!c->destroyed) {
@@ -419,7 +419,7 @@ detach_client(Client *c, Bool unmap)
}
}
}
- c->page = nil;
+ c->area = nil;
if(c->revert)
focus_client(c->revert);
if(c->destroyed)
@@ -511,7 +511,7 @@ resize_client(Client *c, XRectangle *r, XPoint *pt)
unsigned int bh = bar_height(c);
unsigned int bw = c->frame.border;
- if(area_to_index(c->page, c->area) > 0)
+ if(area_to_index(c->area) > 0)
resize_column(c, r, pt);
else
c->frame.rect = *r;
@@ -563,3 +563,13 @@ cid_to_index(Area *a, unsigned short id)
return -1;
}
+int
+client_to_index(Client *c)
+{
+ int i;
+ Area *a = c->area;
+ for(i = 0; i < a->nclient; i++)
+ if(a->client[i] == c)
+ return i;
+ return -1;
+}
diff --git a/cmd/wm/column.c b/cmd/wm/column.c
@@ -81,8 +81,8 @@ update_column_width(Page *p)
void
detach_column(Client *c)
{
- Page *p = c->page;
Area *col = c->area;
+ Page *p = col->page;
cext_array_detach((void **)col->client, c, &col->clientsz);
if(!col->client[0]) {
@@ -111,8 +111,8 @@ match_horiz(Area *col, XRectangle *r)
static void
drop_resize(Client *c, XRectangle *new)
{
- Page *p = c->page;
Area *west = nil, *east = nil, *col = c->area;
+ Page *p = col->page;
Client *north = nil, *south = nil;
size_t i;
@@ -162,8 +162,8 @@ drop_resize(Client *c, XRectangle *new)
static void
drop_moving(Client *c, XRectangle *new, XPoint * pt)
{
- Page *p = c->page;
Area *tgt = nil, *src = c->area;
+ Page *p = src->page;
size_t i;
if(!pt)
@@ -209,8 +209,8 @@ resize_column(Client *c, XRectangle *r, XPoint *pt)
void
select_column(Client *c, char *arg)
{
- Page *p = c->page;
Area *col = c->area;
+ Page *p = col->page;
size_t i;
for(i = 0; (i < col->clientsz) && col->client[i] && (col->client[i] != c); i++);
diff --git a/cmd/wm/event.c b/cmd/wm/event.c
@@ -68,7 +68,7 @@ handle_buttonpress(XEvent *e)
size_t i;
for(i = 0; i < nlabel; i++)
if(blitz_ispointinrect(ev->x, ev->y, &label[i]->rect)) {
- snprintf(buf, sizeof(buf), "L%d B%d\n", i, ev->button);
+ snprintf(buf, sizeof(buf), "LB %d %d\n", i + 1, ev->button);
do_pend_fcall(buf);
}
}
@@ -107,8 +107,8 @@ handle_buttonpress(XEvent *e)
else if(ev->button == Button1)
focus_client(c);
}
- if(c) {
- snprintf(buf, sizeof(buf), "Button%dPress\n", ev->button);
+ if(c && c->area) {
+ snprintf(buf, sizeof(buf), "CB %d %d\n", client_to_index(c) + 1, ev->button);
do_pend_fcall(buf);
}
}
@@ -126,7 +126,7 @@ handle_configurerequest(XEvent *e)
if(c) {
- if(c->page) {
+ if(c->area) {
bw = c->frame.border;
bh = bar_height(c);
}
@@ -146,7 +146,7 @@ handle_configurerequest(XEvent *e)
gravitate(c, bh ? bh : bw, bw, 0);
- if(c->page) {
+ if(c->area) {
c->frame.rect.x = wc.x = c->rect.x - bw;
c->frame.rect.y = wc.y = c->rect.y - (bh ? bh : bw);
c->frame.rect.width = wc.width = c->rect.width + 2 * bw;
@@ -161,7 +161,7 @@ handle_configurerequest(XEvent *e)
wc.x = ev->x;
wc.y = ev->y;
- if(c && c->page) {
+ if(c && c->area) {
/* if so, then bw and bh are already initialized */
wc.x = bw;
wc.y = (bh ? bh : bw);
@@ -245,7 +245,7 @@ handle_maprequest(XEvent *e)
c = win_to_client(ev->window);
if(!c)
c = alloc_client(ev->window, &wa);
- if(!c->page)
+ if(!c->area)
attach_client(c);
}
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -1112,7 +1112,7 @@ xwrite(IXPConn *c, Fcall *fcall)
return "increment value out of range 0, 1";
def.inc = i;
for(i = 0; i < nclient; i++)
- if(client[i]->page)
+ if(client[i]->area)
resize_client(client[i], &client[i]->frame.rect, 0);
break;
case Fgeom:
@@ -1175,7 +1175,7 @@ xwrite(IXPConn *c, Fcall *fcall)
def.selcolor[fcall->count] = 0;
blitz_loadcolor(dpy, screen, def.selcolor, &def.sel);
for(i = 0; i < nclient; i++)
- if(client[i]->page == page[sel])
+ if(client[i]->area->page == page[sel])
draw_client(client[i]);
break;
case Fnormcolors:
@@ -1189,7 +1189,7 @@ xwrite(IXPConn *c, Fcall *fcall)
def.normcolor[fcall->count] = 0;
blitz_loadcolor(dpy, screen, def.normcolor, &def.norm);
for(i = 0; i < nclient; i++)
- if(client[i]->page == page[sel])
+ if(client[i]->area->page == page[sel])
draw_client(client[i]);
break;
case Ffont:
@@ -1200,7 +1200,7 @@ xwrite(IXPConn *c, Fcall *fcall)
XFreeFont(dpy, xfont);
xfont = blitz_getfont(dpy, def.font);
for(i = 0; i < nclient; i++) {
- if(!client[i]->page)
+ if(!client[i]->area->page)
continue;
resize_client(client[i], &client[i]->frame.rect, 0);
}
diff --git a/cmd/wm/page.c b/cmd/wm/page.c
@@ -74,7 +74,7 @@ destroy_page(Page *p)
if(page[sel])
focus_page(page[sel]);
else
- do_pend_fcall("NoPage\n");
+ do_pend_fcall("PN -\n");
}
void
@@ -95,16 +95,16 @@ focus_page(Page *p)
sel = i;
for(i = 0; i < nclient; i++) {
c = client[i];
- if(old && (c->page == old))
+ if(old && (c->area && c->area->page == old))
XMoveWindow(dpy, c->frame.win, 2 * rect.width, 2 * rect.height);
- else if(c->page == p) {
+ else if(c->area && c->area->page == p) {
XMoveWindow(dpy, c->frame.win, c->frame.rect.x, c->frame.rect.y);
draw_client(c);
}
}
if((c = sel_client_of_page(p)))
focus_client(c);
- snprintf(buf, sizeof(buf), "P %d\n", sel + 1);
+ snprintf(buf, sizeof(buf), "PN %d\n", sel + 1);
do_pend_fcall(buf);
XChangeProperty(dpy, root, net_atoms[NET_CURRENT_DESKTOP], XA_CARDINAL,
32, PropModeReplace, (unsigned char *) &sel, 1);
@@ -260,17 +260,17 @@ select_page(char *arg)
if(!npage || !arg)
return;
if(!strncmp(arg, "prev", 5)) {
- if(new > 0)
- for(new = 0; page[new]; new++);
+ if(!new)
+ new = npage;
new--;
} else if(!strncmp(arg, "next", 5)) {
- if(page[new + 1])
+ if(new < npage - 1)
new++;
else
new = 0;
} else {
int idx = cext_strtonum(arg, 0, npage, &err);
- if(idx < npage)
+ if(idx && (idx - 1 < npage))
new = idx;
}
focus_page(page[new]);
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -62,6 +62,7 @@ typedef struct Client Client;
struct Area {
unsigned short id;
Client **client;
+ Page *page;
size_t clientsz;
size_t sel;
size_t nclient;
@@ -84,7 +85,6 @@ struct Client {
unsigned int ignore_unmap;
Bool destroyed;
Bool maximized;
- Page *page;
Area *area;
Window win;
Window trans;
@@ -196,7 +196,7 @@ unsigned int valid_mask, num_lock_mask;
/* area.c */
Area *alloc_area(Page *p);
void destroy_area(Area *a);
-int area_to_index(Page *p, Area *a);
+int area_to_index(Area *a);
int aid_to_index(Page *p, unsigned short id);
/* bar.c */
@@ -226,6 +226,7 @@ Client *win_to_frame(Window w);
void resize_client(Client *c, XRectangle * r, XPoint * pt);
unsigned int bar_height(Client *c);
int cid_to_index(Area *a, unsigned short id);
+int client_to_index(Client *c);
/* event.c */
void init_x_event_handler();
diff --git a/cmd/wmiipsel.c b/cmd/wmiipsel.c
@@ -10,12 +10,12 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
-static char version[] = "wmiiplumb - " VERSION ", (C)opyright MMIV-MMVI Anselm R. Garbe\n";
+static char version[] = "wmiipsel - " VERSION ", (C)opyright MMIV-MMVI Anselm R. Garbe\n";
static void
usage()
{
- fprintf(stderr, "%s\n", "usage: wmiiplumb [-v]\n");
+ fprintf(stderr, "%s\n", "usage: wmiipsel [-v]\n");
exit(1);
}
@@ -59,7 +59,7 @@ main(int argc, char **argv)
}
dpy = XOpenDisplay(0);
if(!dpy) {
- fprintf(stderr, "%s", "wmiiplumb: cannot open display\n");
+ fprintf(stderr, "%s", "wmiipsel: cannot open display\n");
exit(1);
}
xa_clip_string = XInternAtom(dpy, "PLUMB_STRING", False);
diff --git a/rc/wmiirc b/rc/wmiirc
@@ -106,12 +106,29 @@ status &
# EVENT LOOP
wmiir read /event | \
while(event=`{read}) {
- if(~ $event(1) P)
+ if(~ $event(1) PN)
xwrite /bar/1/data $event(2)
- if(~ $event(1) C) {
- text=`{echo $"event | sed 's/^C //g'}
+ if(~ $event(1) CN) {
+ text=`{echo $"event | sed 's/^CN //g'}
xwrite /bar/2/data $"text
}
+ if(~ $event(1) LB) { # label button press
+ switch($event(3)) { # button
+ case 1
+ if(~ $event(2) 1) { # label
+ xwrite /ctl pager
+ }
+ if not {
+ xwrite /ctl 'select next'
+ }
+ case 3
+ xwrite /ctl 'select prev'
+ case 4
+ xwrite /ctl 'select next'
+ case 5
+ xwrite /ctl 'select prev'
+ }
+ }
if(~ $event(1) K) { # key press
switch($event(2)) {
case $MODKEY-Control-c