2019-12-02 18:23:00 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2019 Derek Stevens, 2005 Russ Cox, 1994-1996 David Hogan
|
|
|
|
* see README for license details
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#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 "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);
|
|
|
|
int dcode = XKeysymToKeycode(dpy, DESTROY_KEY);
|
|
|
|
int icode = XKeysymToKeycode(dpy, ICON_KEY);
|
|
|
|
int ucode = XKeysymToKeycode(dpy, UNHIDE_KEY);
|
|
|
|
int mcode = XKeysymToKeycode(dpy, MAX_KEY);
|
|
|
|
int vcode = XKeysymToKeycode(dpy, MOVE_KEY);
|
|
|
|
int rcode = XKeysymToKeycode(dpy, RESIZE_KEY);
|
|
|
|
int scode = XKeysymToKeycode(dpy, STICK_KEY);
|
|
|
|
int hcode = XKeysymToKeycode(dpy, SNAPLEFT_KEY);
|
|
|
|
int lcode = XKeysymToKeycode(dpy, SNAPRIGHT_KEY);
|
|
|
|
int jcode = XKeysymToKeycode(dpy, SNAPBOTTOM_KEY);
|
|
|
|
int kcode = XKeysymToKeycode(dpy, SNAPTOP_KEY);
|
|
|
|
int qcode = XKeysymToKeycode(dpy, SNAPTOPLEFT_KEY);
|
|
|
|
int wcode = XKeysymToKeycode(dpy, SNAPBOTTOMLEFT_KEY);
|
|
|
|
int ocode = XKeysymToKeycode(dpy, SNAPBOTTOMRIGHT_KEY);
|
|
|
|
int pcode = XKeysymToKeycode(dpy, SNAPTOPRIGHT_KEY);
|
|
|
|
int ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
|
|
|
|
int slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
|
|
|
|
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
|
|
|
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
2021-02-21 23:13:58 +00:00
|
|
|
#ifdef DEVEL
|
2021-02-26 18:01:22 +00:00
|
|
|
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
|
|
|
|
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
|
2021-02-21 23:13:58 +00:00
|
|
|
#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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
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);
|
2021-02-26 22:18:39 +00:00
|
|
|
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);
|
2021-02-26 18:01:22 +00:00
|
|
|
XGrabKey(
|
|
|
|
dpy,
|
|
|
|
leftcode,
|
|
|
|
SHORTCUTMOD,
|
|
|
|
screens[i].root,
|
|
|
|
0,
|
|
|
|
GrabModeSync,
|
|
|
|
GrabModeAsync);
|
|
|
|
XGrabKey(
|
|
|
|
dpy,
|
|
|
|
rightcode,
|
|
|
|
SHORTCUTMOD,
|
|
|
|
screens[i].root,
|
|
|
|
0,
|
|
|
|
GrabModeSync,
|
|
|
|
GrabModeAsync);
|
|
|
|
XGrabKey(
|
|
|
|
dpy,
|
|
|
|
slcode,
|
|
|
|
SHORTCUTMOD,
|
|
|
|
screens[i].root,
|
|
|
|
0,
|
|
|
|
GrabModeSync,
|
|
|
|
GrabModeAsync);
|
|
|
|
XGrabKey(
|
|
|
|
dpy,
|
|
|
|
tabcode,
|
|
|
|
Mod1Mask | ShiftMask,
|
|
|
|
screens[i].root,
|
|
|
|
0,
|
|
|
|
GrabModeSync,
|
|
|
|
GrabModeAsync);
|
2021-02-21 23:13:58 +00:00
|
|
|
#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);
|
2021-02-21 23:13:58 +00:00
|
|
|
#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
|
|
|
|
*/
|
|
|
|
int tabcode = XKeysymToKeycode(dpy, XK_Tab);
|
|
|
|
int dcode = XKeysymToKeycode(dpy, DESTROY_KEY);
|
|
|
|
int icode = XKeysymToKeycode(dpy, ICON_KEY);
|
|
|
|
int ucode = XKeysymToKeycode(dpy, UNHIDE_KEY);
|
|
|
|
int mcode = XKeysymToKeycode(dpy, MAX_KEY);
|
|
|
|
int vcode = XKeysymToKeycode(dpy, MOVE_KEY);
|
|
|
|
int scode = XKeysymToKeycode(dpy, STICK_KEY);
|
|
|
|
int rcode = XKeysymToKeycode(dpy, RESIZE_KEY);
|
|
|
|
int slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
|
|
|
|
int hcode = XKeysymToKeycode(dpy, SNAPLEFT_KEY);
|
|
|
|
int lcode = XKeysymToKeycode(dpy, SNAPRIGHT_KEY);
|
|
|
|
int jcode = XKeysymToKeycode(dpy, SNAPBOTTOM_KEY);
|
|
|
|
int kcode = XKeysymToKeycode(dpy, SNAPTOP_KEY);
|
|
|
|
int qcode = XKeysymToKeycode(dpy, SNAPTOPLEFT_KEY);
|
|
|
|
int wcode = XKeysymToKeycode(dpy, SNAPBOTTOMLEFT_KEY);
|
|
|
|
int ocode = XKeysymToKeycode(dpy, SNAPBOTTOMRIGHT_KEY);
|
|
|
|
int pcode = XKeysymToKeycode(dpy, SNAPTOPRIGHT_KEY);
|
|
|
|
int ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
|
|
|
|
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
|
|
|
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
2021-02-21 23:13:58 +00:00
|
|
|
#ifdef DEVEL
|
2021-02-26 18:01:22 +00:00
|
|
|
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
|
|
|
|
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
|
2021-02-21 23:13:58 +00:00
|
|
|
#endif
|
2019-12-02 18:23:00 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
static XWindowAttributes ra;
|
|
|
|
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
|
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);
|
|
|
|
else if (e->keycode == dcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
delete (current, 0);
|
|
|
|
else if (e->keycode == icode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
hide(current);
|
|
|
|
else if (e->keycode == ucode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
unhide(0, 1);
|
|
|
|
else if (e->keycode == vcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
move(current, Button3);
|
|
|
|
else if (e->keycode == rcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
reshape(current, Button3, sweep, 0);
|
|
|
|
else if (e->keycode == mcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
2021-02-26 19:50:23 +00:00
|
|
|
current,
|
|
|
|
-BORDER,
|
|
|
|
-BORDER,
|
|
|
|
ra.width + 2 * BORDER,
|
|
|
|
ra.height + 2 * BORDER);
|
2021-02-26 18:01:22 +00:00
|
|
|
else if (e->keycode == scode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
stick(current);
|
2019-12-02 18:23:00 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
/* half snap */
|
|
|
|
else if (e->keycode == hcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
2021-02-26 19:50:23 +00:00
|
|
|
current,
|
|
|
|
GAPSZ,
|
|
|
|
GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height - 2 * GAPSZ);
|
2021-02-26 18:01:22 +00:00
|
|
|
else if (e->keycode == lcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
ra.width / 2 + 0.5 * GAPSZ,
|
|
|
|
GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height - 2 * GAPSZ);
|
|
|
|
else if (e->keycode == jcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
GAPSZ,
|
|
|
|
ra.height / 2 + 0.5 * GAPSZ,
|
|
|
|
ra.width - 2 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
|
|
|
else if (e->keycode == kcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
2021-02-26 19:50:23 +00:00
|
|
|
current,
|
|
|
|
GAPSZ,
|
|
|
|
GAPSZ,
|
|
|
|
ra.width - 2 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
2019-12-02 18:23:00 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
/* quarter snap */
|
|
|
|
else if (e->keycode == qcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
GAPSZ,
|
|
|
|
GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
|
|
|
else if (e->keycode == wcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
GAPSZ,
|
|
|
|
ra.height / 2 + 0.5 * GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
|
|
|
else if (e->keycode == ocode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
ra.width / 2 + 0.5 * GAPSZ,
|
|
|
|
ra.height / 2 + 0.5 * GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
|
|
|
else if (e->keycode == pcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
quickreshape(
|
|
|
|
current,
|
|
|
|
ra.width / 2 + 0.5 * GAPSZ,
|
|
|
|
GAPSZ,
|
|
|
|
ra.width / 2 - 1.5 * GAPSZ,
|
|
|
|
ra.height / 2 - 1.5 * GAPSZ);
|
2019-12-02 18:23:00 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
/* center snap */
|
|
|
|
else if (e->keycode == ccode && (e->state & SHORTCUTMOD) == (MODBITS)) {
|
2021-02-26 22:18:39 +00:00
|
|
|
if ((e->state & ShiftMask) == (1 << 0)) {
|
|
|
|
#ifdef CENTERVMAX
|
|
|
|
centerclient(current, ra, 0);
|
|
|
|
#else
|
|
|
|
centerclient(current, ra, 1);
|
|
|
|
#endif
|
|
|
|
} else {
|
|
|
|
#ifdef CENTERVMAX
|
|
|
|
centerclient(current, ra, 1);
|
|
|
|
#else
|
|
|
|
centerclient(current, ra, 0);
|
|
|
|
#endif
|
|
|
|
}
|
2021-02-26 18:01:22 +00:00
|
|
|
}
|
|
|
|
|
2021-02-21 23:13:58 +00:00
|
|
|
#ifdef DEVEL
|
2021-02-26 18:01:22 +00:00
|
|
|
/* manage autostuck windows */
|
|
|
|
if (e->keycode == tcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
2021-02-21 23:13:58 +00:00
|
|
|
stickystack(1);
|
2021-02-26 18:01:22 +00:00
|
|
|
if (e->keycode == bcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
2021-02-21 23:13:58 +00:00
|
|
|
stickystack(0);
|
|
|
|
#endif
|
2019-12-02 18:23:00 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
/* launch */
|
|
|
|
if (e->keycode == slcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
|
|
|
|
kbLaunch = 1;
|
|
|
|
if (fork() == 0) {
|
|
|
|
close(ConnectionNumber(dpy));
|
2021-02-26 19:50:23 +00:00
|
|
|
if (dpy != '\0')
|
|
|
|
putenv(dpy);
|
2021-02-26 18:01:22 +00:00
|
|
|
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");
|
|
|
|
}
|
2019-12-02 18:23:00 +00:00
|
|
|
}
|
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
/* switch virts */
|
|
|
|
if (e->keycode == rightcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
if (numvirtuals > 1)
|
|
|
|
if (virt < numvirtuals - 1)
|
|
|
|
switch_to(virt + 1);
|
|
|
|
else
|
|
|
|
switch_to(0);
|
2020-08-07 03:50:28 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
if (e->keycode == leftcode && (e->state & SHORTCUTMOD) == (MODBITS))
|
|
|
|
if (numvirtuals > 1)
|
|
|
|
if (virt > 0)
|
|
|
|
switch_to(virt - 1);
|
|
|
|
else
|
|
|
|
switch_to(numvirtuals - 1);
|
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
|
|
|
|
2021-02-26 19:50:23 +00:00
|
|
|
void quickreshape(Client* c, int x, int y, int dx, int dy) {
|
|
|
|
if (c == 0)
|
|
|
|
return;
|
2021-02-26 18:01:22 +00:00
|
|
|
XMoveResizeWindow(dpy, c->parent, x, y, dx, dy);
|
|
|
|
c->x = x + BORDER;
|
|
|
|
c->y = y + BORDER;
|
|
|
|
c->dx = dx - 2 * BORDER;
|
|
|
|
c->dy = dy - 2 * BORDER;
|
|
|
|
XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
|
|
|
|
sendconfig(c);
|
2019-12-02 18:23:00 +00:00
|
|
|
}
|
|
|
|
|
2021-02-26 22:18:39 +00:00
|
|
|
void centerclient(Client* c, XWindowAttributes ra, int vmax) {
|
2021-02-26 18:01:22 +00:00
|
|
|
static int centeroffsetnum =
|
|
|
|
CENTERNUM % 2 == 0 ? CENTERDEN - CENTERNUM : (CENTERDEN - CENTERNUM) / 2;
|
2021-02-26 05:36:37 +00:00
|
|
|
|
2021-02-26 18:01:22 +00:00
|
|
|
static int centeroffsetden = CENTERNUM % 2 == 0 ? CENTERDEN * 2 : CENTERDEN;
|
2021-02-26 05:36:37 +00:00
|
|
|
|
2021-02-26 22:18:39 +00:00
|
|
|
if (vmax) {
|
|
|
|
quickreshape(
|
|
|
|
c,
|
|
|
|
centeroffsetnum * ra.width / centeroffsetden,
|
|
|
|
GAPSZ,
|
|
|
|
CENTERNUM * ra.width / CENTERDEN,
|
|
|
|
ra.height - 2 * GAPSZ);
|
|
|
|
} else {
|
|
|
|
quickreshape(
|
|
|
|
c,
|
|
|
|
centeroffsetnum * ra.width / centeroffsetden,
|
|
|
|
centeroffsetnum * ra.height / centeroffsetden,
|
|
|
|
CENTERNUM * ra.width / CENTERDEN,
|
|
|
|
CENTERNUM * ra.height / CENTERDEN);
|
|
|
|
}
|
2021-02-26 05:36:37 +00:00
|
|
|
}
|
|
|
|
|
2021-02-26 19:50:23 +00:00
|
|
|
static void alttab(int shift) {
|
2021-02-26 18:01:22 +00:00
|
|
|
shuffle(shift);
|
|
|
|
/* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */
|
2019-12-02 18:23:00 +00:00
|
|
|
}
|
|
|
|
|
2021-02-21 23:13:58 +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-21 23:13:58 +00:00
|
|
|
}
|
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);
|
2021-02-21 23:13:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|