Skip to content

Commit

Permalink
Support grabbing two keys simultaneously by a single keybinding defin…
Browse files Browse the repository at this point in the history
…ition when both keys are bound to the same keysym.
  • Loading branch information
gijsbers committed Feb 11, 2025
1 parent 63bcffc commit 579fed7
Show file tree
Hide file tree
Showing 19 changed files with 427 additions and 402 deletions.
2 changes: 1 addition & 1 deletion src/icewmbg.cc
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class Cache {
bool verbose;
};

class Background: public YXApplication, private YTimerListener {
class Background: public YXApplication {
public:
Background(int *argc, char ***argv, bool verbose = false);
~Background();
Expand Down
79 changes: 39 additions & 40 deletions src/movesize.cc
Original file line number Diff line number Diff line change
Expand Up @@ -698,85 +698,81 @@ bool YFrameWindow::handleKey(const XKeyEvent &key) {
break;
}
} else if (xapp->AltMask != 0) {
KeySym k = keyCodeToKeySym(key.keycode);
unsigned int m = KEY_MODMASK(key.state);
unsigned int vm = VMod(m);

if (!isRollup() && !isIconic() &&
key.window != handle())
return true;

if (gKeyWinClose.eq(k, vm)) {
if (gKeyWinClose == key) {
actionPerformed(actionClose);
} else if (gKeyWinPrev.eq(k, vm)) {
} else if (gKeyWinPrev == key) {
wmPrevWindow();
} else if (gKeyWinMaximizeVert.eq(k, vm)) {
} else if (gKeyWinMaximizeVert == key) {
actionPerformed(actionMaximizeVert);
} else if (gKeyWinMaximizeHoriz.eq(k, vm)) {
} else if (gKeyWinMaximizeHoriz == key) {
actionPerformed(actionMaximizeHoriz);
} else if (gKeyWinRaise.eq(k, vm)) {
} else if (gKeyWinRaise == key) {
actionPerformed(actionRaise);
} else if (gKeyWinOccupyAll.eq(k, vm)) {
} else if (gKeyWinOccupyAll == key) {
actionPerformed(actionOccupyAllOrCurrent);
} else if (gKeyWinLower.eq(k, vm)) {
} else if (gKeyWinLower == key) {
actionPerformed(actionLower);
} else if (gKeyWinRestore.eq(k, vm)) {
} else if (gKeyWinRestore == key) {
actionPerformed(actionRestore);
} else if (gKeyWinNext.eq(k, vm)) {
} else if (gKeyWinNext == key) {
wmNextWindow();
} else if (gKeyWinMove.eq(k, vm)) {
} else if (gKeyWinMove == key) {
actionPerformed(actionMove);
} else if (gKeyWinSize.eq(k, vm)) {
} else if (gKeyWinSize == key) {
actionPerformed(actionSize);
} else if (gKeyWinMinimize.eq(k, vm)) {
} else if (gKeyWinMinimize == key) {
actionPerformed(actionMinimize);
} else if (gKeyWinMaximize.eq(k, vm)) {
} else if (gKeyWinMaximize == key) {
actionPerformed(actionMaximize);
} else if (gKeyWinHide.eq(k, vm)) {
} else if (gKeyWinHide == key) {
actionPerformed(actionHide);
} else if (gKeyWinRollup.eq(k, vm)) {
} else if (gKeyWinRollup == key) {
actionPerformed(actionRollup);
} else if (gKeyWinFullscreen.eq(k, vm)) {
} else if (gKeyWinFullscreen == key) {
actionPerformed(actionFullscreen);
} else if (gKeyWinMenu.eq(k, vm)) {
} else if (gKeyWinMenu == key) {
popupSystemMenu(this);
} else if (gKeyWinArrangeN.eq(k, vm)) {
} else if (gKeyWinArrangeN == key) {
if (canMove()) wmArrange(waTop, waCenter);
} else if (gKeyWinArrangeNE.eq(k, vm)) {
} else if (gKeyWinArrangeNE == key) {
if (canMove()) wmArrange(waTop, waRight);
} else if (gKeyWinArrangeE.eq(k, vm)) {
} else if (gKeyWinArrangeE == key) {
if (canMove()) wmArrange(waCenter, waRight);
} else if (gKeyWinArrangeSE.eq(k, vm)) {
} else if (gKeyWinArrangeSE == key) {
if (canMove()) wmArrange(waBottom, waRight);
} else if (gKeyWinArrangeS.eq(k, vm)) {
} else if (gKeyWinArrangeS == key) {
if (canMove()) wmArrange(waBottom, waCenter);
} else if (gKeyWinArrangeSW.eq(k, vm)) {
} else if (gKeyWinArrangeSW == key) {
if (canMove()) wmArrange(waBottom, waLeft);
} else if (gKeyWinArrangeW.eq(k, vm)) {
} else if (gKeyWinArrangeW == key) {
if (canMove()) wmArrange(waCenter, waLeft);
} else if (gKeyWinArrangeNW.eq(k, vm)) {
} else if (gKeyWinArrangeNW == key) {
if (canMove()) wmArrange(waTop, waLeft);
} else if (gKeyWinArrangeC.eq(k, vm)) {
} else if (gKeyWinArrangeC == key) {
if (canMove()) wmArrange(waCenter, waCenter);
} else if (gKeyWinTileLeft.eq(k, vm)) {
} else if (gKeyWinTileLeft == key) {
wmTile(actionTileLeft);
} else if (gKeyWinTileRight.eq(k, vm)) {
} else if (gKeyWinTileRight == key) {
wmTile(actionTileRight);
} else if (gKeyWinTileTop.eq(k, vm)) {
} else if (gKeyWinTileTop == key) {
wmTile(actionTileTop);
} else if (gKeyWinTileBottom.eq(k, vm)) {
} else if (gKeyWinTileBottom == key) {
wmTile(actionTileBottom);
} else if (gKeyWinTileTopLeft.eq(k, vm)) {
} else if (gKeyWinTileTopLeft == key) {
wmTile(actionTileTopLeft);
} else if (gKeyWinTileTopRight.eq(k, vm)) {
} else if (gKeyWinTileTopRight == key) {
wmTile(actionTileTopRight);
} else if (gKeyWinTileBottomLeft.eq(k, vm)) {
} else if (gKeyWinTileBottomLeft == key) {
wmTile(actionTileBottomLeft);
} else if (gKeyWinTileBottomRight.eq(k, vm)) {
} else if (gKeyWinTileBottomRight == key) {
wmTile(actionTileBottomRight);
} else if (gKeyWinTileCenter.eq(k, vm)) {
} else if (gKeyWinTileCenter == key) {
wmTile(actionTileCenter);
} else if (gKeyWinSmartPlace.eq(k, vm)) {
} else if (gKeyWinSmartPlace == key) {
if (canMove()) {
int newX = x();
int newY = y();
Expand All @@ -785,6 +781,9 @@ bool YFrameWindow::handleKey(const XKeyEvent &key) {
}
}
} else if (isIconic() || isRollup()) {
KeySym k = keyCodeToKeySym(key.keycode);
unsigned m = KEY_MODMASK(key.state);

if (k == XK_Return || k == XK_KP_Enter) {
if (isMinimized())
wmMinimize();
Expand Down
16 changes: 16 additions & 0 deletions src/wmapp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,9 @@ bool YWMApp::handleTimer(YTimer *timer) {
themeOnlyPath.clear();
pathsTimer = null;
}
else {
return super::handleTimer(timer);
}

return false;
}
Expand Down Expand Up @@ -1246,6 +1249,19 @@ static void showExtensions() {
printf("%-9s unsupported\n", s);
}
}
int ka = XkbMajorVersion, ki = XkbMinorVersion;
if (XkbLibraryVersion(&ka, &ki)) {
ka = XkbMajorVersion, ki = XkbMinorVersion;
int ev = 0, er = 0;
if (XkbQueryExtension(xapp->display(), NULL, &ev, &er, &ka, &ki)) {
printf("%-9s %d.%-2d (%2d, %3d)\n", "xkeyboard", ka, ki, ev, er);
} else {
printf("%-9s unsupported\n", "xkeyboard");
}
} else {
printf("incompatible XKEYBOARD library %d.%d vs. %d.%d!\n",
ka, ki, XkbMajorVersion, XkbMinorVersion);
}
}

static int restartWM(const char* displayName, const char* overrideTheme) {
Expand Down
3 changes: 1 addition & 2 deletions src/wmapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ class YWMApp:
public YSMApplication,
public YActionListener,
public YMsgBoxListener,
public YSMListener,
public YTimerListener
public YSMListener
{
typedef YSMApplication super;

Expand Down
28 changes: 11 additions & 17 deletions src/wmcontainer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,9 @@ void YClientContainer::handleButton(const XButtonEvent &button) {
}

if (clientMouseActions) {
unsigned int k = button.button + XK_Pointer_Button1 - 1;
unsigned int m = KEY_MODMASK(button.state);
unsigned int vm = VMod(m);

if (gMouseWinSize.eq(k, vm)) {
if (gMouseWinSize == button) {
XAllowEvents(xapp->display(), AsyncPointer, CurrentTime);
NOTE(MouseWinSize);

int px = button.x + x();
int py = button.y + y();
Expand Down Expand Up @@ -84,7 +81,7 @@ void YClientContainer::handleButton(const XButtonEvent &button) {
}
return ;
}
else if (gMouseWinMove.eq(k, vm)) {
else if (gMouseWinMove == button) {
XAllowEvents(xapp->display(), AsyncPointer, CurrentTime);

if (getFrame()->canMove()) {
Expand All @@ -96,14 +93,14 @@ void YClientContainer::handleButton(const XButtonEvent &button) {
}
return ;
}
else if (gMouseWinRaise.eq(k, vm)
else if (gMouseWinRaise == button
&& (gMouseWinRaise != gMouseWinLower || getFrame()->canRaise()))
{
XAllowEvents(xapp->display(), AsyncPointer, CurrentTime);
getFrame()->wmRaise();
return ;
}
else if (gMouseWinLower.eq(k, vm)) {
else if (gMouseWinLower == button) {
XAllowEvents(xapp->display(), AsyncPointer, CurrentTime);
getFrame()->wmLower();
return ;
Expand Down Expand Up @@ -170,15 +167,12 @@ void YClientContainer::regrabMouse() {

void YClientContainer::grabActions() {
if (clientMouseActions && fHaveActionGrab == false) {
WMKey grab[] = { gMouseWinMove, gMouseWinSize,
gMouseWinRaise, gMouseWinLower };
const int count = int ACOUNT(grab) - (gMouseWinRaise == gMouseWinLower);
for (int i = 0; i < count; ++i) {
int button = int(grab[i].key) - XK_Pointer_Button1 + Button1;
if (inrange(button, Button1, Button3)) {
grabVButton(button, grab[i].mod);
}
}
const Window win = handle();
gMouseWinMove.grab(win);
gMouseWinSize.grab(win);
gMouseWinRaise.grab(win);
if (gMouseWinLower != gMouseWinRaise)
gMouseWinLower.grab(win);
fHaveActionGrab = true;
}
}
Expand Down
77 changes: 39 additions & 38 deletions src/wmframe.cc
Original file line number Diff line number Diff line change
Expand Up @@ -617,44 +617,45 @@ void YFrameWindow::createPointerWindows() {
}

void YFrameWindow::grabKeys() {
XUngrabKey(xapp->display(), AnyKey, AnyModifier, handle());

grab(gKeyWinRaise);
grab(gKeyWinOccupyAll);
grab(gKeyWinLower);
grab(gKeyWinClose);
grab(gKeyWinRestore);
grab(gKeyWinNext);
grab(gKeyWinPrev);
grab(gKeyWinMove);
grab(gKeyWinSize);
grab(gKeyWinMinimize);
grab(gKeyWinMaximize);
grab(gKeyWinMaximizeVert);
grab(gKeyWinMaximizeHoriz);
grab(gKeyWinHide);
grab(gKeyWinRollup);
grab(gKeyWinFullscreen);
grab(gKeyWinMenu);
grab(gKeyWinArrangeN);
grab(gKeyWinArrangeNE);
grab(gKeyWinArrangeE);
grab(gKeyWinArrangeSE);
grab(gKeyWinArrangeS);
grab(gKeyWinArrangeSW);
grab(gKeyWinArrangeW);
grab(gKeyWinArrangeNW);
grab(gKeyWinArrangeC);
grab(gKeyWinTileLeft);
grab(gKeyWinTileRight);
grab(gKeyWinTileTop);
grab(gKeyWinTileBottom);
grab(gKeyWinTileTopLeft);
grab(gKeyWinTileTopRight);
grab(gKeyWinTileBottomLeft);
grab(gKeyWinTileBottomRight);
grab(gKeyWinTileCenter);
grab(gKeyWinSmartPlace);
const Window win = handle();
XUngrabKey(xapp->display(), AnyKey, AnyModifier, win);

gKeyWinRaise.grab(win);
gKeyWinOccupyAll.grab(win);
gKeyWinLower.grab(win);
gKeyWinClose.grab(win);
gKeyWinRestore.grab(win);
gKeyWinNext.grab(win);
gKeyWinPrev.grab(win);
gKeyWinMove.grab(win);
gKeyWinSize.grab(win);
gKeyWinMinimize.grab(win);
gKeyWinMaximize.grab(win);
gKeyWinMaximizeVert.grab(win);
gKeyWinMaximizeHoriz.grab(win);
gKeyWinHide.grab(win);
gKeyWinRollup.grab(win);
gKeyWinFullscreen.grab(win);
gKeyWinMenu.grab(win);
gKeyWinArrangeN.grab(win);
gKeyWinArrangeNE.grab(win);
gKeyWinArrangeE.grab(win);
gKeyWinArrangeSE.grab(win);
gKeyWinArrangeS.grab(win);
gKeyWinArrangeSW.grab(win);
gKeyWinArrangeW.grab(win);
gKeyWinArrangeNW.grab(win);
gKeyWinArrangeC.grab(win);
gKeyWinTileLeft.grab(win);
gKeyWinTileRight.grab(win);
gKeyWinTileTop.grab(win);
gKeyWinTileBottom.grab(win);
gKeyWinTileTopLeft.grab(win);
gKeyWinTileTopRight.grab(win);
gKeyWinTileBottomLeft.grab(win);
gKeyWinTileBottomRight.grab(win);
gKeyWinTileCenter.grab(win);
gKeyWinSmartPlace.grab(win);

container()->regrabMouse();
}
Expand Down
Loading

0 comments on commit 579fed7

Please sign in to comment.