dmenu-mousesupportwithgrid-5.0.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dmenu-mousesupportwithgrid-5.0.diff (3584B)
---
1 diff --git a/dmenu.c b/dmenu.c
2 index 76acee6..3588890 100644
3 --- a/dmenu.c
4 +++ b/dmenu.c
5 @@ -546,6 +546,125 @@ draw:
6 drawmenu();
7 }
8
9 +static void
10 +buttonpress(XEvent *e)
11 +{
12 + struct item *item;
13 + XButtonPressedEvent *ev = &e->xbutton;
14 + int x = 0, y = 0, h = bh, w, item_num = 0;
15 +
16 + if (ev->window != win)
17 + return;
18 +
19 + /* right-click: exit */
20 + if (ev->button == Button3)
21 + exit(1);
22 +
23 + if (prompt && *prompt)
24 + x += promptw;
25 +
26 + /* input field */
27 + w = (lines > 0 || !matches) ? mw - x : inputw;
28 +
29 + /* left-click on input: clear input,
30 + * NOTE: if there is no left-arrow the space for < is reserved so
31 + * add that to the input width */
32 + if (ev->button == Button1 &&
33 + ((lines <= 0 && ev->x >= 0 && ev->x <= x + w +
34 + ((!prev || !curr->left) ? TEXTW("<") : 0)) ||
35 + (lines > 0 && ev->y >= y && ev->y <= y + h))) {
36 + insert(NULL, -cursor);
37 + drawmenu();
38 + return;
39 + }
40 + /* middle-mouse click: paste selection */
41 + if (ev->button == Button2) {
42 + XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
43 + utf8, utf8, win, CurrentTime);
44 + drawmenu();
45 + return;
46 + }
47 + /* scroll up */
48 + if (ev->button == Button4 && prev) {
49 + sel = curr = prev;
50 + calcoffsets();
51 + drawmenu();
52 + return;
53 + }
54 + /* scroll down */
55 + if (ev->button == Button5 && next) {
56 + sel = curr = next;
57 + calcoffsets();
58 + drawmenu();
59 + return;
60 + }
61 + if (ev->button != Button1)
62 + return;
63 + if (ev->state & ~ControlMask)
64 + return;
65 + if (lines > 0) {
66 + /* vertical list: (ctrl)left-click on item */
67 + w = mw - x;
68 + for (item = curr; item != next; item = item->right) {
69 + if (item_num++ == lines){
70 + item_num = 1;
71 + x += w / columns;
72 + y = 0;
73 + }
74 + y += h;
75 + if (ev->y >= y && ev->y <= (y + h) &&
76 + ev->x >= x && ev->x <= (x + w / columns)) {
77 + puts(item->text);
78 + if (!(ev->state & ControlMask))
79 + exit(0);
80 + sel = item;
81 + if (sel) {
82 + sel->out = 1;
83 + drawmenu();
84 + }
85 + return;
86 + }
87 + }
88 + } else if (matches) {
89 + /* left-click on left arrow */
90 + x += inputw;
91 + w = TEXTW("<");
92 + if (prev && curr->left) {
93 + if (ev->x >= x && ev->x <= x + w) {
94 + sel = curr = prev;
95 + calcoffsets();
96 + drawmenu();
97 + return;
98 + }
99 + }
100 + /* horizontal list: (ctrl)left-click on item */
101 + for (item = curr; item != next; item = item->right) {
102 + x += w;
103 + w = MIN(TEXTW(item->text), mw - x - TEXTW(">"));
104 + if (ev->x >= x && ev->x <= x + w) {
105 + puts(item->text);
106 + if (!(ev->state & ControlMask))
107 + exit(0);
108 + sel = item;
109 + if (sel) {
110 + sel->out = 1;
111 + drawmenu();
112 + }
113 + return;
114 + }
115 + }
116 + /* left-click on right arrow */
117 + w = TEXTW(">");
118 + x = mw - w;
119 + if (next && ev->x >= x && ev->x <= x + w) {
120 + sel = curr = next;
121 + calcoffsets();
122 + drawmenu();
123 + return;
124 + }
125 + }
126 +}
127 +
128 static void
129 paste(void)
130 {
131 @@ -607,6 +726,9 @@ run(void)
132 break;
133 cleanup();
134 exit(1);
135 + case ButtonPress:
136 + buttonpress(&ev);
137 + break;
138 case Expose:
139 if (ev.xexpose.count == 0)
140 drw_map(drw, win, 0, 0, mw, mh);
141 @@ -704,7 +826,8 @@ setup(void)
142 /* create menu window */
143 swa.override_redirect = True;
144 swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
145 - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
146 + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask |
147 + ButtonPressMask;
148 win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
149 CopyFromParent, CopyFromParent, CopyFromParent,
150 CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);