diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2024-02-16 23:26:32 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2024-02-16 23:26:32 +0000 |
commit | c51962a648b3f38fc378ad0081b1d1aa037142d5 (patch) | |
tree | 4cf448275064f7ddbd0ac2a429d9fe5449755102 /event.c | |
parent | ab90a480eb5233abc4d7122739c24656dd42cc94 (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.c | 40 |
1 files changed, 36 insertions, 4 deletions
@@ -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; |