spmenu/libs/mouse.c

116 lines
2.4 KiB
C
Raw Normal View History

2023-03-08 17:20:32 +01:00
void
buttonpress(XEvent *e)
{
struct item *item;
XButtonPressedEvent *ev = &e->xbutton;
int x = 0, y = 0, h = bh, w, item_num = 0;
// if incorrect or wrong window, return
2023-03-08 17:20:32 +01:00
if (ev->window != win)
return;
// right-click: exit
2023-03-08 17:20:32 +01:00
if (ev->button == Button3)
exit(1);
if (prompt && *prompt)
x += promptw;
// input field
2023-03-08 17:20:32 +01:00
w = (lines > 0 || !matches) ? mw - x : inputw;
// left-click on input: clear input
2023-03-08 17:20:32 +01:00
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
2023-03-08 17:20:32 +01:00
if (ev->button == Button2) {
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
utf8, utf8, win, CurrentTime);
drawmenu();
return;
}
// scroll up
2023-03-08 17:20:32 +01:00
if (ev->button == Button4 && prev) {
sel = curr = prev;
calcoffsets();
drawmenu();
return;
}
// scroll down
2023-03-08 17:20:32 +01:00
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
2023-03-08 17:20:32 +01:00
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
2023-03-08 17:20:32 +01:00
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
2023-03-08 17:20:32 +01:00
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
2023-03-08 17:20:32 +01:00
w = TEXTW(rightarrow);
x = mw - w;
if (next && ev->x >= x && ev->x <= x + w) {
sel = curr = next;
calcoffsets();
drawmenu();
return;
}
}
}