123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 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;
- }
- }
- }
|