void buttonpress(XEvent *e) { struct item *item; XButtonPressedEvent *ev = &e->xbutton; int x = 0, y = 0, h = bh, w, item_num = 0; int xpad = 0; if (!hidepowerline) { x = xpad = plw; } // if incorrect or wrong window, return if (ev->window != win) return; // right-click: exit if (ev->button == Button3) exit(1); if (prompt && *prompt) x += promptw + plw; // input field w = (lines > 0 || !matches) ? mw - x : inputw; // left-click on input: clear input if (ev->button == Button1 && ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + ((!prev || !curr->left) ? TEXTW(leftarrow) : 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) { if (item_num++ == lines){ item_num = 1; x += w / columns; y = 0; } y += h; if (ev->y >= y && ev->y <= (y + h) && ev->x >= x && ev->x <= (x + w / columns)) { puts(item->text); if (!(ev->state & ControlMask)) exit(0); sel = item; if (sel) { drawmenu(); } return; } } } else if (matches) { // left-click on left arrow x += inputw; w = TEXTW(leftarrow); 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(rightarrow)); if (ev->x >= x && ev->x <= x + w) { puts(item->text); if (!(ev->state & ControlMask)) exit(0); sel = item; if (sel) { drawmenu(); } return; } } // left-click on right arrow w = TEXTW(rightarrow); x = mw - w; if (next && ev->x >= x && ev->x <= x + w) { sel = curr = next; calcoffsets(); drawmenu(); return; } } }