Return to repo list

suckless-gf-dmenu

Gentoo-friendly patches for Suckless's dmenu.
Return to HMagellan.com

commit a4496149370ede5cccf574391d8f1b885ab72caa
parent 6137e502ef8095d8a03fa39f5da9f29fa76c7ba0
Author: Erik Letson <hmagellan@hmagellan.com>
Date:   Sun, 23 Aug 2020 13:39:05 -0500

added mousesupport

Diffstat:
MREADME | 2+-
Apatches/mousesupport/USAGE | 39+++++++++++++++++++++++++++++++++++++++
Apatches/mousesupport/mousesupport.patch | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 184 insertions(+), 1 deletion(-)

diff --git a/README b/README @@ -42,7 +42,7 @@ patches! (1). https://tools.suckless.org/dmenu/patches/ - CURRENT PROGRESS: 13/32 patches supported + CURRENT PROGRESS: 14/32 patches supported 3/32 patches unsupported USUPPORTED PATCHES: diff --git a/patches/mousesupport/USAGE b/patches/mousesupport/USAGE @@ -0,0 +1,39 @@ +mousesupport - Add mouse support to dmenu +Source: https://tools.suckless.org/dmenu/patches/mouse-support/dmenu-mousesupport-4.9.diff +Original Author: Hiltjo Posthuma - hiltjo@codemadness.org + Xarchus (for multisel support). + +Description from source: + """ + With this patch dmenu will have basic mouse support. The following features are supported: + + Mouse actions supported: + + Left-mouse click: + On prompt and input field: clear input text and selection. + In horizontal and vertical mode on item: select and output item (same as pressing enter). + In horizontal mode on arrows: change items to show left or right. + Ctrl-left-mouse click: multisel modifier. + Right-mouse click: close. + Middle-mouse click: + Paste current selection. + While holding shift: paste primary selection. + Scroll up: + In horizontal mode: same as left-clicking on left arrow. + In vertical mode: show items above. + Scroll down: + In horizontal mode: same as left-clicking on right arrow. + In vertical mode: show items below. + """ + +== YOU MUST == +(1). Place the patch file in /etc/portage/patches/x11-misc/dmenu/ and run 'emerge dmenu' + +== YOU PROBABLY SHOULD == +No further action is required. + +== PATCH MODIFICATIONS == +No modifications were made to this patch. + +== INCOMPATIBILITIES == +No known specific incompatibilities. diff --git a/patches/mousesupport/mousesupport.patch b/patches/mousesupport/mousesupport.patch @@ -0,0 +1,144 @@ +diff --git a/dmenu.c b/dmenu.c +index 6b8f51b..8c663a9 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -500,6 +500,119 @@ draw: + drawmenu(); + } + ++static void ++buttonpress(XEvent *e) ++{ ++ struct item *item; ++ XButtonPressedEvent *ev = &e->xbutton; ++ int x = 0, y = 0, h = bh, w; ++ ++ if (ev->window != win) ++ return; ++ ++ /* right-click: exit */ ++ if (ev->button == Button3) ++ exit(1); ++ ++ if (prompt && *prompt) ++ x += promptw; ++ ++ /* input field */ ++ w = (lines > 0 || !matches) ? mw - x : inputw; ++ ++ /* left-click on input: clear input, ++ * NOTE: if there is no left-arrow the space for < is reserved so ++ * add that to the input width */ ++ if (ev->button == Button1 && ++ ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + ++ ((!prev || !curr->left) ? TEXTW("<") : 0)) || ++ (lines > 0 && ev->y >= y && ev->y <= y + h))) { ++ insert(NULL, -cursor); ++ drawmenu(); ++ return; ++ } ++ /* middle-mouse click: paste selection */ ++ if (ev->button == Button2) { ++ XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, ++ utf8, utf8, win, CurrentTime); ++ drawmenu(); ++ return; ++ } ++ /* scroll up */ ++ if (ev->button == Button4 && prev) { ++ sel = curr = prev; ++ calcoffsets(); ++ drawmenu(); ++ return; ++ } ++ /* scroll down */ ++ if (ev->button == Button5 && next) { ++ sel = curr = next; ++ calcoffsets(); ++ drawmenu(); ++ return; ++ } ++ if (ev->button != Button1) ++ return; ++ if (ev->state & ~ControlMask) ++ return; ++ if (lines > 0) { ++ /* vertical list: (ctrl)left-click on item */ ++ w = mw - x; ++ for (item = curr; item != next; item = item->right) { ++ y += h; ++ if (ev->y >= y && ev->y <= (y + h)) { ++ puts(item->text); ++ if (!(ev->state & ControlMask)) ++ exit(0); ++ sel = item; ++ if (sel) { ++ sel->out = 1; ++ drawmenu(); ++ } ++ return; ++ } ++ } ++ } else if (matches) { ++ /* left-click on left arrow */ ++ x += inputw; ++ w = TEXTW("<"); ++ if (prev && curr->left) { ++ if (ev->x >= x && ev->x <= x + w) { ++ sel = curr = prev; ++ calcoffsets(); ++ drawmenu(); ++ return; ++ } ++ } ++ /* horizontal list: (ctrl)left-click on item */ ++ for (item = curr; item != next; item = item->right) { ++ x += w; ++ w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); ++ if (ev->x >= x && ev->x <= x + w) { ++ puts(item->text); ++ if (!(ev->state & ControlMask)) ++ exit(0); ++ sel = item; ++ if (sel) { ++ sel->out = 1; ++ drawmenu(); ++ } ++ return; ++ } ++ } ++ /* left-click on right arrow */ ++ w = TEXTW(">"); ++ x = mw - w; ++ if (next && ev->x >= x && ev->x <= x + w) { ++ sel = curr = next; ++ calcoffsets(); ++ drawmenu(); ++ return; ++ } ++ } ++} ++ + static void + paste(void) + { +@@ -556,6 +669,9 @@ run(void) + if (XFilterEvent(&ev, None)) + continue; + switch(ev.type) { ++ case ButtonPress: ++ buttonpress(&ev); ++ break; + case Expose: + if (ev.xexpose.count == 0) + drw_map(drw, win, 0, 0, mw, mh); +@@ -653,7 +769,8 @@ setup(void) + /* create menu window */ + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; +- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; ++ swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | ++ ButtonPressMask; + win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);