diff options
author | John Ankarström <john@ankarstrom.se> | 2021-07-26 16:28:04 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2021-07-26 16:51:53 +0200 |
commit | 48122df00c55d314fe59eb2d5c32dad8455696ca (patch) | |
tree | 162a112f259cf443566de943d1ad0e98928d3ab4 /src | |
parent | 5809819063c7822ba197297090b304fb905ad89c (diff) | |
download | jwm-48122df00c55d314fe59eb2d5c32dad8455696ca.tar.gz |
Don't keep menu open after release unless arrow keys are set
I am personally partial to this Mac-like behavior, as it avoids
introducing a modality to the user interface, which is almost always
annoying.
If menus are kept open after button release, then the user is left
in a different mode than earlier, in which key presses are not sent
to the active window, but to the active menu.
This is sometimes useful, but more often than not annoying.
Diffstat (limited to 'src')
-rw-r--r-- | src/key.c | 24 | ||||
-rw-r--r-- | src/key.h | 2 | ||||
-rw-r--r-- | src/menu.c | 12 |
3 files changed, 33 insertions, 5 deletions
@@ -485,6 +485,30 @@ ValidateKeys() } +/** Return true if arrow keys are defined. */ +int +HasArrowKeys() +{ + KeyNode *kp; + static int r = -1; + + if(r != -1) { + return r; + } + + for(kp = bindings; kp; kp = kp->next) { + if((kp->key & 0xFF) == KEY_UP + || (kp->key & 0xFF) == KEY_DOWN + || (kp->key & 0xFF) == KEY_RIGHT + || (kp->key & 0xFF) == KEY_LEFT) { + r = 1; + return 1; + } + } + r = 0; + return 0; +} + /** Return true if the key event matches any switching key or its modifiers. */ int Switching(const XKeyEvent *event) @@ -58,6 +58,8 @@ void ShowKeyMenu(const XKeyEvent *event); void ValidateKeys(); +int HasArrowKeys(); + int Switching(const XKeyEvent *event); #endif @@ -281,13 +281,15 @@ MenuLoop(Menu *menu) if(event.xbutton.button == Button5) { break; } - if(!hadMotion) { - break; - } - if(abs(event.xbutton.x_root - pressx) < doubleClickDelta) { - if(abs(event.xbutton.y_root - pressy) < doubleClickDelta) { + if(HasArrowKeys()) { + if(!hadMotion) { break; } + if(abs(event.xbutton.x_root - pressx) < doubleClickDelta) { + if(abs(event.xbutton.y_root - pressy) < doubleClickDelta) { + break; + } + } } if(menu->currentIndex >= 0) { |