/* * Copyright (c) 2019 Derek Stevens, 2005 Russ Cox, 1994-1996 David Hogan * see README for license details */ #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "dat.h" #include "fns.h" #include "patchlevel.h" enum { GrabAltTab, GrabAltAny }; /*static int tabcode = 0x17; */ /*static int altcode = 0x40; */ /*static int pgupcode = 0x63; */ /*static int pgdowncode = 0x69; */ static void alttab(int shift); void keysetup(void) { 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); #ifdef DEVEL int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY); int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY); #endif for(i=0; ikeycode == 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(current, -BORDER, -BORDER, ra.width + 2*BORDER, ra.height + 2*BORDER); else if (e->keycode == scode && (e->state&SHORTCUTMOD) == (MODBITS)) stick(current); /* half snap */ else if (e->keycode == hcode && (e->state&SHORTCUTMOD) == (MODBITS)) quickreshape(current, GAPSZ, GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height - 2*GAPSZ); 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(current, GAPSZ, GAPSZ, ra.width - 2*GAPSZ, ra.height/2 - 1.5*GAPSZ); /* 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); /* center snap */ else if (e->keycode == ccode && (e->state&SHORTCUTMOD) == (MODBITS)) quickreshape(current, ra.width/6, GAPSZ, 2*ra.width/3, ra.height - 2*GAPSZ); #ifdef DEVEL /* manage autostuck windows */ if (e->keycode == tcode && (e->state&SHORTCUTMOD) == (MODBITS)) stickystack(1); if (e->keycode == bcode && (e->state&SHORTCUTMOD) == (MODBITS)) stickystack(0); #endif /* launch */ if (e->keycode == slcode && (e->state&SHORTCUTMOD) == (MODBITS)){ kbLaunch = 1; if(fork() == 0){ 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"); } } /* 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); if (e->keycode == leftcode && (e->state&SHORTCUTMOD) == (MODBITS)) if (numvirtuals >1) if (virt > 0) switch_to(virt - 1); else switch_to(numvirtuals - 1); XAllowEvents(dpy, SyncKeyboard, e->time); } void keyrelease(XKeyEvent *e) { XAllowEvents(dpy, SyncKeyboard, e->time); } void quickreshape(Client *c, int x, int y, int dx, int dy) { if (c == 0) return; 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); } static void alttab(int shift) { shuffle(shift); /* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */ } #ifdef DEVEL void stickystack(int toTop) { Client *c; if(toTop){ for(c = clients; c->next; c = c->next){ if(c && isautostick(c)) top(c); } }else{ for(c = clients; c->next; c = c->next){ if(c && !isautostick(c)) top(c); } } } #endif