123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- diff --git a/dmenu.c b/dmenu.c
- index 65f25ce..dfa59db 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)
- {
- @@ -561,6 +674,9 @@ run(void)
- break;
- cleanup();
- exit(1);
- + case ButtonPress:
- + buttonpress(&ev);
- + break;
- case Expose:
- if (ev.xexpose.count == 0)
- drw_map(drw, win, 0, 0, mw, mh);
- @@ -658,7 +774,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);
|