summaryrefslogtreecommitdiff
path: root/event.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2024-02-16 23:26:32 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2024-02-16 23:26:32 +0000
commitc51962a648b3f38fc378ad0081b1d1aa037142d5 (patch)
tree4cf448275064f7ddbd0ac2a429d9fe5449755102 /event.c
parentab90a480eb5233abc4d7122739c24656dd42cc94 (diff)
Implement mouse menus
Setup a menu/some menus by writing to an elements props/menus file
Diffstat (limited to 'event.c')
-rw-r--r--event.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/event.c b/event.c
index 878d41a..4182d1c 100644
--- a/event.c
+++ b/event.c
@@ -71,6 +71,9 @@ sendevent(GuiElement *g, Event event)
case Xmousescroll:
s->event = smprint("mousescroll %s\n", e->direction == Up ? "up" : "down");
break;
+ case Xmenuhit:
+ s->event = smprint("menuhit %c %d %s\n", e->hit.button, e->hit.which, e->hit.text);
+ break;
case Xkeyboard:
s->event = smprint("key %C\n", e->r);
break;
@@ -93,19 +96,49 @@ mouseevent(Mouse m)
static GuiElement *lastM = nil;
static GuiElement *lastR = nil;
+ int down = 0;
+
int b = lastbuttons ^ m.buttons;
lastbuttons = m.buttons;
- if(b&4 && m.buttons&4)
+ if(b&4 && m.buttons&4){
lastR = g;
- if(b&2 && m.buttons&2)
+ down = 3;
+ }
+ if(b&2 && m.buttons&2){
lastM = g;
- if(b&1 && m.buttons&1)
+ down = 2;
+ }
+ if(b&1 && m.buttons&1){
lastL = g;
+ down = 1;
+ }
if(!g)
return 0;
wlock(&g->lock);
+ Event e;
+ MenuSpec *ms = getprop(g, Pmenus, 0).menus;
+ if(down >= 1 && down <= 3 && ms->menus[down-1] != nil){
+ int which = menuhit(down, mousectl, ms->menus[down-1], nil);
+ e.type = Xmenuhit;
+ e.hit.button = (down == 1) ? 'L' : (down == 2) ? 'M' : 'R';
+ e.hit.which = which;
+ e.hit.text = ms->menus[down-1]->item[which];
+ if(g->listening && which != -1)
+ sendevent(g, e);
+ wunlock(&g->lock);
+
+ switch(down){
+ case 1: lastL = nil; break;
+ case 2: lastM = nil; break;
+ case 3: lastR = nil; break;
+ }
+ lastbuttons = lastbuttons ^ (1<<(down-1));
+
+ return 1;
+ }
+
if(!g->listening){
wunlock(&g->lock);
return 0;
@@ -114,7 +147,6 @@ mouseevent(Mouse m)
b = g->buttons ^ m.buttons;
g->buttons = m.buttons;
- Event e;
if(b&16 && m.buttons&16){
e.type = Xmousescroll;
e.direction = Down;