Hey all,
In case anyone's interested, here's a patch which adds some basic
mouse support to dmenu.
You can click things, click the paginators ("<" and ">"), and scroll.
cls
diff -r 6e962f2337c2 dmenu.c
--- a/dmenu.c Sun Oct 16 18:26:11 2011 +0100
+++ b/dmenu.c Mon Oct 17 00:55:51 2011 +0100
@@ -24,6 +24,7 @@
};
static void appenditem(Item *item, Item **list, Item **last);
+static void buttonrelease(XButtonEvent *ev);
static void calcoffsets(void);
static char *cistrstr(const char *s, const char *sub);
static void drawmenu(void);
@@ -131,6 +132,62 @@
}
void
+buttonrelease(XButtonEvent *ev)
+{
+ int i;
+ Item *item = curr;
+
+ switch(ev->button) {
+ case Button1:
+ if(ev->y > bh || (ev->x > promptw + inputw + textw(dc, "<") && ev->x < mw - textw(dc, ">"))) {
+ if(lines == 0) {
+ i = promptw + inputw + textw(dc, "<");
+ while(item && (i += textw(dc, item->text)) < ev->x)
+ item = item->right;
+ }
+ else
+ for(i = 1; item && i < ev->y / bh; i++)
+ item = item->right;
+ if(!item || item == next)
+ return;
+ if(item == sel) {
+ puts(sel->text);
+ exit(EXIT_SUCCESS);
+ }
+ else
+ sel = item;
+ }
+ else if(lines == 0 && ev->x > promptw + inputw) {
+ if(ev->x < mw - textw(dc, "<")) {
+ if(!prev)
+ return;
+ sel = curr = prev;
+ }
+ else {
+ if(!next)
+ return;
+ sel = curr = next;
+ }
+ calcoffsets();
+ }
+ break;
+ case Button4: /* scroll up */
+ if(sel && sel->left && (sel = sel->left)->right == curr) {
+ curr = prev;
+ calcoffsets();
+ }
+ break;
+ case Button5: /* scroll down */
+ if(sel && sel->right && (sel = sel->right) == next) {
+ curr = next;
+ calcoffsets();
+ }
+ break;
+ }
+ drawmenu();
+}
+
+void
calcoffsets(void) {
int i, n;
@@ -463,6 +520,9 @@
while(!XNextEvent(dc->dpy, &ev))
switch(ev.type) {
+ case ButtonRelease:
+ buttonrelease(&ev.xbutton);
+ break;
case Expose:
if(ev.xexpose.count == 0)
mapdc(dc, win, mw, mh);
@@ -536,7 +596,7 @@
/* menu window */
swa.override_redirect = True;
swa.background_pixmap = ParentRelative;
- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
+ swa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | VisibilityChangeMask;
win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0,
DefaultDepth(dc->dpy, screen), CopyFromParent,
DefaultVisual(dc->dpy, screen),