all repos — ryudo @ d06638a1ebef732aadf872a3c741984fb06668c8

the floatiling window manager that flows; fork of rio from plan9port

no focus for autostick windows, fix unhide with SHOWSTICK
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmAy6TYACgkQO3+8IhRO
Y5g8XQ/+MCNizfcvcJGy6mZhHKzSPahhUEPRcIzzB/8NrWKJ6qf51jSwNa3PN+D8
D22PYS/TWJ3SSHWWbtjM/ZfatiwF1JjjfsP3GFcpfvdXVJmpDf7tZ//wHXGdt5AB
pLuZdoUeyH0oskniQG9dAbb5Q8We5mCp5J0pIZ5b7qHeHS4s6uQqiZcHUPFoOlyt
AhlIoi/SG8IJfNdWLOs5BYnD8fKyj96CSg5A5CilO7XoLfe9pIEscspbr8ORKZ+U
o+kZVOapCYTmOJDjsL/im5h0MDSMQZNbAKaEZdgOHtDLCvI1v4KIoJEekyd/U8QB
lEl6UKIBL/D6zY1xHeijobw1XiLQTxpLrJjJK/45zrTTTSpCFCjdOXzOrlIIosQR
18kl0me8BouTe9ibYTSA/zdyfEGq26/Y8iX2gkHpuGCGwudDEJAIykI2odWjWO5i
2ikYqhIA6V0fGDVRT01xhlrNZ/1vVirGpNEY+yOFrC5jksRr0m/fx3IBCLMZMjy+
8RB1Kg+s8lMqca1utYC5rEou0dEmVVyUAu09P6F5wtmSxuuOqnfocr8PQHFOTkrZ
awuF8rX9RdqoE4kxSgyGXIz09VMJH01yp+Kw5g81iqO2LtplUqS8nX8ckkPlFReF
QXoANFx6L2nQvdTtCp5RUTq3Y/PSbcPskCTJOUNFNot9ZoTJ570=
=7jn+
-----END PGP SIGNATURE-----
commit

d06638a1ebef732aadf872a3c741984fb06668c8

parent

bb3cc4a2acc58d2a240c86197e899b1364aa59e7

8 files changed, 114 insertions(+), 28 deletions(-)

jump to
M client.cclient.c

@@ -8,6 +8,7 @@ #include <X11/Xlib.h>

#include <X11/Xutil.h> #include "dat.h" #include "fns.h" +#include "config.h" Client *clients; Client *current;

@@ -62,12 +63,17 @@ active(Client *c)

{ Client *cc; + if(c == 0){ fprintf(stderr, "ryudo: active(c==0)\n"); return; } if(c == current) return; +#ifdef AUTOSTICK + if (isautostick(c)) + return; +#endif if(current){ setactive(current, 0); if(current->screen != c->screen)

@@ -254,7 +260,7 @@ void

shuffle(int up) { Client **l, *c; - + if(clients == 0 || clients->next == 0) return; if(!up){

@@ -262,13 +268,18 @@ c = 0;

/*for(c=clients; c->next; c=c->next) */ /* ; */ for(l=&clients; (*l)->next; l=&(*l)->next) +#ifdef AUTOSTICK + if ((*l)->state == 1 && !isautostick(*l)) + c = *l; +#else if ((*l)->state == 1) c = *l; +#endif if (c == 0) return; XMapRaised(dpy, c->parent); - top(c); - active(c); + top(c); + active(c); }else{ c = clients; for(l=&clients; *l; l=&(*l)->next)

@@ -283,3 +294,20 @@ /* top(clients); */

/* active(clients); */ } +#ifdef AUTOSTICK +int +isautostick(Client *c) +{ + static char *autostick[] = AUTOSTICK; + char **a = autostick; + + while(*a){ + if(strstr(c->class, *a)) { + return 1; + } + ++a; + } + return 0; +} +#endif +
M config.hconfig.h

@@ -18,8 +18,22 @@

/* Notify on virtual desktop switch? */ #define VIRTNOTIFY +/* The summary and message to pass to the notifcation daeomon */ +#define VIRTHEADER "virtual" +#define VIRTMSG "[%s]" + +/* Deny focus to autostuck windows? (eg xosview, clock) */ +#define NOFOCUS + /* Modifier key and associated modifier bits; - * See xkb documentation for valid choices here + * Shift = (1<<0) + * Lock = (1<<1) + * Control = (1<<2) + * Mod1 = (1<<3) + * Mod2 = (1<<4) + * Mod3 = (1<<5) + * Mod4 = (1<<6) + * Mod5 = (1<<7) */ #define SHORTCUTMOD Mod4Mask #define MODBITS (1<<6)

@@ -33,6 +47,9 @@ #define MOVE_KEY XK_v

#define RESIZE_KEY XK_r #define DESTROY_KEY XK_d #define STICK_KEY XK_s + +#define STICKYTOFRONT_KEY XK_t +#define STICKYTOBACK_KEY XK_b #define SNAPLEFT_KEY XK_h #define SNAPRIGHT_KEY XK_l

@@ -59,6 +76,7 @@ */

#define AUTOSTICK {\ "XOsview",\ + "XClock",\ 0\ }
M event.cevent.c

@@ -15,6 +15,7 @@ #include <X11/extensions/shape.h>

#include "dat.h" #include "fns.h" #include "patchlevel.h" +#include "config.h" void mainloop(int shape_event)

@@ -23,7 +24,6 @@ XEvent ev;

for(;;){ getevent(&ev); - #ifdef DEBUG_EV if(debug){ ShowEvent(&ev);

@@ -537,10 +537,16 @@ if(e->detail != NotifyNonlinearVirtual)

return; c = getclient(e->window, 0); if(c != 0 && c->window == e->window && c != current){ - /* someone grabbed keyboard or seized focus; make them current */ - XMapRaised(dpy, c->parent); - top(c); - active(c); +#ifdef AUTOSTICK + if (isautostick(c)){ +#endif + /* someone grabbed keyboard or seized focus; make them current */ + XMapRaised(dpy, c->parent); + top(c); + active(c); +#ifdef AUTOSTICK + } +#endif } }
M fns.hfns.h

@@ -65,7 +65,8 @@ /* key.c */

void keypress(); void keyrelease(); void keysetup(); -void quickreshape(); +void quickreshape(Client *c, int x, int y, int dx, int dy); +void stickystack(int); /* menu.c */ void button();

@@ -95,6 +96,7 @@ void rmclient();

void dump_revert(); void dump_clients(); void shuffle(int); +int isautostick(Client* c); /* grab.c */ int menuhit();
M key.ckey.c

@@ -30,7 +30,6 @@ /*static int pgupcode = 0x63; */

/*static int pgdowncode = 0x69; */ static void alttab(int shift); -void quickreshape(Client*c, int x, int y, int dx, int dy); void keysetup(void)

@@ -56,6 +55,10 @@ 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; i<num_screens; i++){ XGrabKey(dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);

@@ -79,6 +82,10 @@ 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); +#ifdef DEVEL + XGrabKey(dpy, tcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync); + XGrabKey(dpy, bcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync); +#endif /* 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); */

@@ -111,7 +118,11 @@ int pcode = XKeysymToKeycode(dpy, SNAPTOPRIGHT_KEY);

int ccode = XKeysymToKeycode(dpy, SNAPCENTER_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 + static XWindowAttributes ra; XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);

@@ -158,6 +169,14 @@ /* center snap */

if (e->keycode == ccode && (e->state&SHORTCUTMOD) == (MODBITS)) quickreshape(current, ra.width/5, ra.height/5, 3*ra.width/5, 3*ra.height/5); +#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)){

@@ -226,3 +245,21 @@ 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
M main.cmain.c

@@ -19,7 +19,7 @@ #include "patchlevel.h"

char *version[] = { - "ryudo version 0.2\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ Cox,\n(c) 2019-2021 Derek Stevens", 0 + "ryudo version 0.3\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ Cox,\n(c) 2019-2021 Derek Stevens", 0 }; Display *dpy;
M manage.cmanage.c

@@ -29,7 +29,6 @@ long msize;

XClassHint class; XWMHints *hints; XSetWindowAttributes attrs; - trace("manage", c, 0); XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask | KeyPressMask);

@@ -40,9 +39,12 @@ c->instance = class.res_name;

c->class = class.res_class; c->is9term = 0; if(isNew){ - c->is9term = strstr(c->class, "term") || strstr(c->class, "Term") || strstr (c->class, "urxvt") || strstr (c->class, "URxvt"); + c->is9term = strstr(c->class, "term") || strstr(c->class, "Term") + || strstr(c->class, "urxvt") || strstr(c->class, "URxvt") + || strstr(c->class, "onsole") || strstr(c->class, "Alacritty"); isNew = 0; } + printf("%s: is9term = %d", c->class, c->is9term); } else { c->instance = 0;