From 26751c7bfbd0bf79e2b10b600fbc4b1ec31ecb5b Mon Sep 17 00:00:00 2001 From: Bert Gijsbers Date: Sun, 23 Feb 2025 17:38:40 +0100 Subject: [PATCH] Fix broken modSuperIsCtrlAlt for issue #791. --- src/wmcontainer.cc | 11 ++++++----- src/wmkey.cc | 30 +++++++++++++++++++++++------- src/wmkey.h | 7 ++++--- src/wmprog.cc | 2 +- src/ywindow.h | 2 +- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/wmcontainer.cc b/src/wmcontainer.cc index 45a3e22d3..989771adc 100644 --- a/src/wmcontainer.cc +++ b/src/wmcontainer.cc @@ -92,14 +92,15 @@ void YClientContainer::handleButton(const XButtonEvent &button) { } return ; } - else if (gMouseWinRaise == button - && (gMouseWinRaise != gMouseWinLower || getFrame()->canRaise())) - { + else if (gMouseWinRaise == button) { XAllowEvents(xapp->display(), AsyncPointer, CurrentTime); - getFrame()->wmRaise(); + if (getFrame()->canRaise()) + getFrame()->wmRaise(); + else if (gMouseWinRaise == gMouseWinLower) + getFrame()->wmLower(); return ; } - else if (gMouseWinLower == button) { + else if (gMouseWinLower != gMouseWinRaise && gMouseWinLower == button) { XAllowEvents(xapp->display(), AsyncPointer, CurrentTime); getFrame()->wmLower(); return ; diff --git a/src/wmkey.cc b/src/wmkey.cc index 8a3600210..0031f1c4a 100644 --- a/src/wmkey.cc +++ b/src/wmkey.cc @@ -82,6 +82,9 @@ void WMKey::grab(int handle) { else ok = false; } + if (modSuperIsCtrlAlt && xapp->WinMask && hasbits(mod, kfAlt | kfCtrl)) { + supered = true; + } if (km && ok) { xm[0] = xm[1] = km; } else { @@ -91,8 +94,7 @@ void WMKey::grab(int handle) { if (IS_POINTER(key)) { int button = key - XK_Pointer_Button1 + Button1; if (inrange(button, Button1, Button3)) { - if (hasbits(mod, kfAlt | kfCtrl) && - modSuperIsCtrlAlt && xapp->WinMask) { + if (supered) { xm[1] = xapp->WinMask | (xm[0] & ~(ControlMask | xapp->AltMask)); } unsigned short mods[8]; @@ -149,7 +151,7 @@ void WMKey::grab(int handle) { mods[count++] = xm[k] | xapp->NumLockMask; mods[count++] = xm[k] | LockMask | xapp->NumLockMask; } - if (hasbits(mod, kfAlt | kfCtrl) && modSuperIsCtrlAlt && xapp->WinMask) { + if (supered) { unsigned short wmod = xm[k]; wmod &= ~(ControlMask | xapp->AltMask); wmod |= xapp->WinMask; @@ -168,12 +170,26 @@ void WMKey::grab(int handle) { } bool WMKey::operator==(const XKeyEvent& x) const { - return (x.keycode == kc[0] && KEY_MODMASK(x.state) == xm[0]) - || (x.keycode == kc[1] && KEY_MODMASK(x.state) == xm[1]); + for (int i = 0; i < 2; ++i) { + if (x.keycode == kc[i]) { + const unsigned km = KEY_MODMASK(x.state); + if (km == xm[i]) + return true; + if (supered && hasbit(km, xapp->WinMask)) { + if (((km & ~xapp->WinMask) | ControlMask | xapp->AltMask) == xm[i]) + return true; + } + } + } + return false; } bool WMKey::operator==(const XButtonEvent& b) const { - return (key == b.button - Button1 + XK_Pointer_Button1 - && mod == desktop->VMod(KEY_MODMASK(b.state))); + if (key == b.button - Button1 + XK_Pointer_Button1) { + const unsigned km = KEY_MODMASK(b.state); + if (km == xm[0] || km == xm[1]) + return true; + } + return false; } diff --git a/src/wmkey.h b/src/wmkey.h index 6f4731b84..0b9bfa100 100644 --- a/src/wmkey.h +++ b/src/wmkey.h @@ -9,16 +9,17 @@ struct WMKey { unsigned short mod, xm[2]; unsigned char kc[2]; bool initial; + bool supered; - WMKey() : name(""), key(0), mod(0), initial(true) { + WMKey() : name(""), key(0), mod(0), initial(true), supered(false) { xm[0] = xm[1] = kc[0] = kc[1] = 0; } - WMKey(char* s) : name(s), key(0), mod(0), initial(false) { + WMKey(char* s) : name(s), key(0), mod(0), initial(false), supered(false) { xm[0] = xm[1] = kc[0] = kc[1] = 0; parse(); } WMKey(unsigned k, unsigned short m, const char* s) : - name(s), key(k), mod(m), initial(true) { + name(s), key(k), mod(m), initial(true), supered(false) { xm[0] = xm[1] = kc[0] = kc[1] = 0; } diff --git a/src/wmprog.cc b/src/wmprog.cc index b7d551d2a..14fc15228 100644 --- a/src/wmprog.cc +++ b/src/wmprog.cc @@ -136,7 +136,7 @@ class MenuProgSwitchItems: public ISwitchItems { virtual bool isKey(const XKeyEvent& key) override { KeySym k = xapp->keyCodeToKeySym(key.keycode); unsigned m = KEY_MODMASK(key.state); - unsigned mod = desktop->VMod(m); + unsigned mod = YWindow::VMod(m); return k == this->key && mod == this->mod; } unsigned modifiers() override { diff --git a/src/ywindow.h b/src/ywindow.h index 8806c0cc0..7453d672f 100644 --- a/src/ywindow.h +++ b/src/ywindow.h @@ -162,7 +162,7 @@ class YWindow : protected YWindowList, private YWindowNode { void setPointer(Cursor pointer); void grabKeyM(unsigned key, unsigned modifiers); void grabKey(unsigned key, unsigned modifiers); - unsigned VMod(unsigned modifiers); + static unsigned VMod(unsigned modifiers); void grabButtonM(int button, unsigned modifiers); void grabButton(int button, unsigned modifiers);