ryudo/key.c

1021 lines
21 KiB
C
Raw Normal View History

2019-12-02 18:23:00 +00:00
/*
* Copyright (c) 2019 Iris Lightshard, 2005 Russ Cox, 1994-1996 David Hogan
2019-12-02 18:23:00 +00:00
* see README for license details
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
2022-01-18 23:29:16 +00:00
#include <sys/wait.h>
2019-12-02 18:23:00 +00:00
#include <X11/X.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <X11/extensions/shape.h>
#include <X11/extensions/Xrandr.h>
2019-12-02 18:23:00 +00:00
#include "config.h"
#include "dat.h"
#include "fns.h"
#include "patchlevel.h"
2021-02-26 18:01:22 +00:00
enum { GrabAltTab, GrabAltAny };
2019-12-02 18:23:00 +00:00
/*static int tabcode = 0x17; */
/*static int altcode = 0x40; */
/*static int pgupcode = 0x63; */
/*static int pgdowncode = 0x69; */
static void alttab(int shift);
2021-02-26 19:50:23 +00:00
void keysetup(void) {
2021-02-26 18:01:22 +00:00
int i;
int tabcode = XKeysymToKeycode(dpy, XK_Tab);
#ifdef DESTROY_KEY
2021-02-26 18:01:22 +00:00
int dcode = XKeysymToKeycode(dpy, DESTROY_KEY);
#endif
#ifdef ICON_KEY
2021-02-26 18:01:22 +00:00
int icode = XKeysymToKeycode(dpy, ICON_KEY);
#endif
#ifdef UNHIDE_KEY
2021-02-26 18:01:22 +00:00
int ucode = XKeysymToKeycode(dpy, UNHIDE_KEY);
#endif
#ifdef MAX_KEY
2021-02-26 18:01:22 +00:00
int mcode = XKeysymToKeycode(dpy, MAX_KEY);
#endif
#ifdef MOVE_KEY
2021-02-26 18:01:22 +00:00
int vcode = XKeysymToKeycode(dpy, MOVE_KEY);
#endif
#ifdef RESIZE_KEY
2021-02-26 18:01:22 +00:00
int rcode = XKeysymToKeycode(dpy, RESIZE_KEY);
#endif
#ifdef STICK_KEY
2021-02-26 18:01:22 +00:00
int scode = XKeysymToKeycode(dpy, STICK_KEY);
#endif
#ifdef WRANGLE_KEY
int acode = XKeysymToKeycode(dpy, WRANGLE_KEY);
#endif
#ifdef SNAPLEFT_KEY
2021-02-26 18:01:22 +00:00
int hcode = XKeysymToKeycode(dpy, SNAPLEFT_KEY);
#endif
#ifdef SNAPRIGHT_KEY
2021-02-26 18:01:22 +00:00
int lcode = XKeysymToKeycode(dpy, SNAPRIGHT_KEY);
#endif
#ifdef SNAPBOTTOM_KEY
2021-02-26 18:01:22 +00:00
int jcode = XKeysymToKeycode(dpy, SNAPBOTTOM_KEY);
#endif
#ifdef SNAPTOP_KEY
2021-02-26 18:01:22 +00:00
int kcode = XKeysymToKeycode(dpy, SNAPTOP_KEY);
#endif
#ifdef SNAPTOPLEFT_KEY
2021-02-26 18:01:22 +00:00
int qcode = XKeysymToKeycode(dpy, SNAPTOPLEFT_KEY);
#endif
#ifdef SNAPBOTTOMLEFT_KEY
2021-02-26 18:01:22 +00:00
int wcode = XKeysymToKeycode(dpy, SNAPBOTTOMLEFT_KEY);
#endif
#ifdef SNAPBOTTOMRIGHT_KEY
2021-02-26 18:01:22 +00:00
int ocode = XKeysymToKeycode(dpy, SNAPBOTTOMRIGHT_KEY);
#endif
#ifdef SNAPTOPRIGHT_KEY
2021-02-26 18:01:22 +00:00
int pcode = XKeysymToKeycode(dpy, SNAPTOPRIGHT_KEY);
#endif
#ifdef SNAPCENTER_KEY
2021-02-26 18:01:22 +00:00
int ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
#endif
#ifdef LAUNCH_KEY
2021-02-26 18:01:22 +00:00
int slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
#endif
#ifdef ZOOM_KEY
int zcode = XKeysymToKeycode(dpy, ZOOM_KEY);
#endif
#ifdef NEXTVIRT_KEY
2021-02-26 18:01:22 +00:00
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
#endif
#ifdef PREVVIRT_KEY
2021-02-26 18:01:22 +00:00
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
#endif
#ifdef DEVEL
2021-02-26 18:01:22 +00:00
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
#endif
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
for (i = 0; i < num_screens; i++) {
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
tabcode,
Mod1Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
tabcode,
Mod1Mask | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#ifdef DESTROY_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
dcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
dcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef ICON_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
icode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
icode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef UNHIDE_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
ucode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
ucode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef RESIZE_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
rcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
rcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef MOVE_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
vcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
vcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef MAX_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
mcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
mcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef STICK_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
scode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
scode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef WRANGLE_KEY
XGrabKey(
dpy,
acode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
acode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPLEFT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
hcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
hcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPRIGHT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
lcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
lcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPBOTTOM_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
jcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
jcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPTOP_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
kcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
kcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPTOPLEFT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
qcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
qcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPBOTTOMLEFT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
wcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
wcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPBOTTOMRIGHT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
ocode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
ocode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPTOPRIGHT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
pcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
pcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef SNAPCENTER_KEY
XGrabKey(
dpy,
ccode,
ShiftMask | SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
ccode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
ccode,
ShiftMask | SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
ccode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef PREVVIRT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
dpy,
leftcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
leftcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef NEXTVIRT_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
dpy,
rightcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
rightcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef LAUNCH_KEY
2021-02-26 18:01:22 +00:00
XGrabKey(
dpy,
slcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
slcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
#ifdef ZOOM_KEY
XGrabKey(
dpy,
zcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
zcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
2021-02-26 18:01:22 +00:00
XGrabKey(
dpy,
tabcode,
Mod1Mask | ShiftMask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
tabcode,
Mod1Mask | ShiftMask | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#ifdef DEVEL
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
tcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
2021-02-26 18:01:22 +00:00
XGrabKey(
2021-02-26 19:50:23 +00:00
dpy,
bcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
tcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
bcode,
SHORTCUTMOD | Mod2Mask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#endif
2021-02-26 18:01:22 +00:00
/* XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
/* XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
/* XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
}
2019-12-02 18:23:00 +00:00
}
2021-02-26 19:50:23 +00:00
void keypress(XKeyEvent* e) {
2021-02-26 18:01:22 +00:00
/*
* process key press here
*/
static int m;
static XRRMonitorInfo monitor;
static int tabcode;
#ifdef DESTROY_KEY
static int dcode;
#endif
#ifdef ICON_KEY
static int icode;
#endif
#ifdef UNHIDE_KEY
static int ucode;
#endif
#ifdef MAX_KEY
static int mcode;
#endif
#ifdef MOVE_KEY
static int vcode;
#endif
#ifdef STICK_KEY
static int scode;
#endif
#ifdef WRANGLE_KEY
static int acode;
#endif
#ifdef RESIZE_KEY
static int rcode;
#endif
#ifdef LAUNCH_KEY
static int slcode;
#endif
#ifdef ZOOM_KEY
static int zcode;
#endif
#ifdef SNAPLEFT_KEY
static int hcode;
#endif
#ifdef SNAPRIGHT_KEY
static int lcode;
#endif
#ifdef SNAPBOTTOM_KEY
static int jcode;
#endif
#ifdef SNAPTOP_KEY
int kcode;
#endif
#ifdef SNAPTOPLEFT_KEY
static int qcode;
#endif
#ifdef SNAPBOTTOMLEFT_KEY
static int wcode;
#endif
#ifdef SNAPBOTTOMRIGHT_KEY
static int ocode;
#endif
#ifdef SNAPTOPRIGHT_KEY
static int pcode;
#endif
#ifdef SNAPCENTER_KEY
static int ccode;
#endif
#ifdef NEXTVIRT_KEY
static int rightcode;
#endif
#ifdef PREVVIRT_KEY
static int leftcode;
#endif
tabcode = XKeysymToKeycode(dpy, XK_Tab);
#ifdef DESTROY_KEY
dcode = XKeysymToKeycode(dpy, DESTROY_KEY);
#endif
#ifdef ICON_KEY
icode = XKeysymToKeycode(dpy, ICON_KEY);
#endif
#ifdef UNHIDE_KEY
ucode = XKeysymToKeycode(dpy, UNHIDE_KEY);
#endif
#ifdef MAX_KEY
mcode = XKeysymToKeycode(dpy, MAX_KEY);
#endif
#ifdef MOVE_KEY
vcode = XKeysymToKeycode(dpy, MOVE_KEY);
#endif
#ifdef STICK_KEY
scode = XKeysymToKeycode(dpy, STICK_KEY);
#endif
#ifdef WRANGLE_KEY
acode = XKeysymToKeycode(dpy, WRANGLE_KEY);
#endif
#ifdef RESIZE_KEY
rcode = XKeysymToKeycode(dpy, RESIZE_KEY);
#endif
#ifdef LAUNCH_KEY
slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
#endif
#ifdef ZOOM_KEY
zcode = XKeysymToKeycode(dpy, ZOOM_KEY);
#endif
#ifdef SNAPLEFT_KEY
hcode = XKeysymToKeycode(dpy, SNAPLEFT_KEY);
#endif
#ifdef SNAPRIGHT_KEY
lcode = XKeysymToKeycode(dpy, SNAPRIGHT_KEY);
#endif
#ifdef SNAPBOTTOM_KEY
jcode = XKeysymToKeycode(dpy, SNAPBOTTOM_KEY);
#endif
#ifdef SNAPTOP_KEY
kcode = XKeysymToKeycode(dpy, SNAPTOP_KEY);
#endif
#ifdef SNAPTOPLEFT_KEY
qcode = XKeysymToKeycode(dpy, SNAPTOPLEFT_KEY);
#endif
#ifdef SNAPBOTTOMLEFT_KEY
wcode = XKeysymToKeycode(dpy, SNAPBOTTOMLEFT_KEY);
#endif
#ifdef SNAPBOTTOMRIGHT_KEY
ocode = XKeysymToKeycode(dpy, SNAPBOTTOMRIGHT_KEY);
#endif
#ifdef SNAPTOPRIGHT_KEY
pcode = XKeysymToKeycode(dpy, SNAPTOPRIGHT_KEY);
#endif
#ifdef SNAPCENTER_KEY
ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
#endif
#ifdef NEXTVIRT_KEY
rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
#endif
#ifdef PREVVIRT_KEY
leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
#endif
#ifdef DEVEL
2021-02-26 18:01:22 +00:00
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
#endif
2019-12-02 18:23:00 +00:00
m = current ? getmonitorbyclient(current) : getmonitorbymouse();
monitor = monitorinfo[m];
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
/* basic wm functionality */
if (e->keycode == tabcode && (e->state & Mod1Mask) == (1 << 3))
alttab(e->state & ShiftMask);
#ifdef DESTROY_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == dcode && (e->state & SHORTCUTMOD) == (MODBITS))
delete (current, 0);
#endif
#ifdef ICON_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == icode && (e->state & SHORTCUTMOD) == (MODBITS))
hide(current);
#endif
#ifdef UNHIDE_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == ucode && (e->state & SHORTCUTMOD) == (MODBITS))
unhide(0, 1);
#endif
#ifdef MOVE_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == vcode && (e->state & SHORTCUTMOD) == (MODBITS))
move(current, Button3);
#endif
#ifdef RESIZE_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == rcode && (e->state & SHORTCUTMOD) == (MODBITS))
reshape(current, Button3, sweep, 0);
#endif
#ifdef MAX_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == mcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
2021-02-26 19:50:23 +00:00
current,
monitor.x,
monitor.y,
monitor.width,
monitor.height,
1);
#endif
#ifdef STICK_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == scode && (e->state & SHORTCUTMOD) == (MODBITS))
stick(current);
2021-05-27 04:43:57 +00:00
#endif
/* move to another monitor */
#ifdef WRANGLE_KEY
else if (e->keycode == acode && (e->state & SHORTCUTMOD) == (MODBITS)) {
wrangle(current, m < nmonitors - 1 ? monitorinfo[++m] : monitorinfo[0]);
}
#endif
/* toggle zoom mode */
#ifdef ZOOM_KEY
2021-03-10 05:22:21 +00:00
else if (e->keycode == zcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
zoom = !zoom;
2021-03-10 05:22:21 +00:00
if (zoom) {
quickreshape(
current,
monitor.x,
monitor.y,
monitor.width,
monitor.height,
1);
2021-03-10 05:22:21 +00:00
}
}
#endif
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
/* half snap */
#ifdef SNAPLEFT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == hcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
2021-02-26 19:50:23 +00:00
current,
monitor.x + GAPSZ,
monitor.y + GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height - 2 * GAPSZ,
0);
#endif
#ifdef SNAPRIGHT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == lcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + monitor.width / 2 + 0.5 * GAPSZ,
monitor.y + GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height - 2 * GAPSZ,
0);
#endif
#ifdef SNAPBOTTOM_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == jcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + GAPSZ,
monitor.y + monitor.height / 2 + 0.5 * GAPSZ,
monitor.width - 2 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
#ifdef SNAPTOP_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == kcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
2021-02-26 19:50:23 +00:00
current,
monitor.x + GAPSZ,
monitor.y + GAPSZ,
monitor.width - 2 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
2019-12-02 18:23:00 +00:00
/* quarter snap */
#ifdef SNAPTOPLEFT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == qcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + GAPSZ,
monitor.y + GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
#ifdef SNAPBOTTOMLEFT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == wcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + GAPSZ,
monitor.y + monitor.height / 2 + 0.5 * GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
#ifdef SNAPBOTTOMRIGHT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == ocode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + monitor.width / 2 + 0.5 * GAPSZ,
monitor.y + monitor.height / 2 + 0.5 * GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
#ifdef SNAPTOPRIGHT_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == pcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
monitor.x + monitor.width / 2 + 0.5 * GAPSZ,
monitor.y + GAPSZ,
monitor.width / 2 - 1.5 * GAPSZ,
monitor.height / 2 - 1.5 * GAPSZ,
0);
#endif
2019-12-02 18:23:00 +00:00
/* center snap */
#ifdef SNAPCENTER_KEY
2021-02-26 18:01:22 +00:00
else if (e->keycode == ccode && (e->state & SHORTCUTMOD) == (MODBITS)) {
if ((e->state & ShiftMask) == (1 << 0)) {
#ifdef CENTERVMAX
centerclient(current, monitor, 0);
#else
centerclient(current, monitor, 1);
#endif
} else {
#ifdef CENTERVMAX
centerclient(current, monitor, 1);
#else
centerclient(current, monitor, 0);
#endif
}
2021-02-26 18:01:22 +00:00
}
#endif
2021-02-26 18:01:22 +00:00
#ifdef DEVEL
2021-02-26 18:01:22 +00:00
/* manage autostuck windows */
if (e->keycode == tcode && (e->state & SHORTCUTMOD) == (MODBITS))
stickystack(1);
2021-02-26 18:01:22 +00:00
if (e->keycode == bcode && (e->state & SHORTCUTMOD) == (MODBITS))
stickystack(0);
#endif
2019-12-02 18:23:00 +00:00
/* launch */
#ifdef LAUNCH_KEY
else if (e->keycode == slcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
2021-02-26 18:01:22 +00:00
kbLaunch = 1;
if (fork() == 0) {
2022-01-18 23:29:16 +00:00
if (fork() == 0) {
// this code doesn't seem necessary
// close(ConnectionNumber(dpy));
// if (dpy != '\0')
// putenv(dpy);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGHUP, SIG_DFL);
if (termprog != NULL) {
execl(shell, shell, "-c", termprog, (char*)0);
fprintf(stderr, "ryudo: exec %s", shell);
perror(" failed");
}
execlp("urxvt", "urxvt", (char*)0);
execlp("9term", "9term", scrolling ? "-ws" : "-w", (char*)0);
execlp("xterm", "xterm", "-ut", (char*)0);
perror("ryudo: exec urxvt/9term/xterm failed");
exit(1);
2021-02-26 18:01:22 +00:00
}
2022-01-18 23:29:16 +00:00
exit(0);
2021-02-26 18:01:22 +00:00
}
2022-01-18 23:29:16 +00:00
wait((int*)0);
2019-12-02 18:23:00 +00:00
}
#endif
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
/* switch virts */
#ifdef NEXTVIRT_KEY
else if (e->keycode == rightcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
2021-02-26 18:01:22 +00:00
if (numvirtuals > 1)
if (virt < numvirtuals - 1)
switch_to(virt + 1);
else
switch_to(0);
}
#endif
#ifdef PREVVIRT_KEY
else if (e->keycode == leftcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
2021-02-26 18:01:22 +00:00
if (numvirtuals > 1)
if (virt > 0)
switch_to(virt - 1);
else
switch_to(numvirtuals - 1);
}
#endif
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
XAllowEvents(dpy, SyncKeyboard, e->time);
2019-12-02 18:23:00 +00:00
}
2021-02-26 19:50:23 +00:00
void keyrelease(XKeyEvent* e) { XAllowEvents(dpy, SyncKeyboard, e->time); }
2019-12-02 18:23:00 +00:00
void quickreshape(Client* c, int x, int y, int dx, int dy, int max) {
2021-02-26 19:50:23 +00:00
if (c == 0)
return;
2021-02-26 18:01:22 +00:00
XMoveResizeWindow(dpy, c->parent, x, y, dx, dy);
if (max)
c->border = 0;
else
c->border = BORDER;
c->x = x + c->border;
c->y = y + c->border;
c->dx = dx - 2 * c->border;
c->dy = dy - 2 * c->border;
XMoveResizeWindow(dpy, c->window, c->border, c->border, c->dx, c->dy);
2021-02-26 18:01:22 +00:00
sendconfig(c);
2019-12-02 18:23:00 +00:00
}
void centerclient(Client* c, XRRMonitorInfo monitor, int vmax) {
2021-02-26 18:01:22 +00:00
static int centeroffsetnum =
CENTERNUM % 2 == 0 ? CENTERDEN - CENTERNUM : (CENTERDEN - CENTERNUM) / 2;
2021-02-26 18:01:22 +00:00
static int centeroffsetden = CENTERNUM % 2 == 0 ? CENTERDEN * 2 : CENTERDEN;
if (vmax) {
quickreshape(
c,
monitor.x + centeroffsetnum * monitor.width / centeroffsetden,
monitor.y + GAPSZ,
CENTERNUM * monitor.width / CENTERDEN,
monitor.height - 2 * GAPSZ,
0);
} else {
quickreshape(
c,
monitor.x + centeroffsetnum * monitor.width / centeroffsetden,
monitor.y + centeroffsetnum * monitor.height / centeroffsetden,
CENTERNUM * monitor.width / CENTERDEN,
CENTERNUM * monitor.height / CENTERDEN,
0);
}
}
2021-02-26 19:50:23 +00:00
static void alttab(int shift) {
static int monitor;
if (!shift) {
shuffle(0);
} else {
monitor = getmonitorbyclient(current);
if (monitor == nmonitors - 1) {
monitor = 0;
} else {
monitor++;
}
shuffleonmonitor(monitor);
}
2019-12-02 18:23:00 +00:00
}
#ifdef DEVEL
2021-02-26 19:50:23 +00:00
void stickystack(int toTop) {
2021-02-26 18:01:22 +00:00
Client* c;
if (toTop) {
for (c = clients; c->next; c = c->next) {
2021-02-26 19:50:23 +00:00
if (c && isautostick(c))
top(c);
}
2021-02-26 18:01:22 +00:00
} else {
for (c = clients; c->next; c = c->next) {
2021-02-26 19:50:23 +00:00
if (c && !isautostick(c))
top(c);
}
}
}
#endif