hlfw.ca

9hkd

Download patch

ref: 4b4eadc9db54ec0f15708ac9a6902725e27ff1af
parent: 61bacd1980b3b12703ee30ffd0752da1520ceeaa
author: Michael Misch <michaelmisch1985@gmail.com>
date: Tue Jul 18 05:59:04 PDT 2023

"Remove

--- a/riow.c
+++ /dev/null
@@ -1,433 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include <keyboard.h>
-
-typedef struct W W;
-
-enum {
-	Mmod4 = 1<<0,
-	Mctl = 1<<1,
-	Mshift = 1<<2,
-
-	Step = 16,
-	Stepbig = 64,
-
-	Fvisible = 1<<0,
-	Fcurrent = 1<<1,
-	Fsticky = 1<<2,
-	Ffullscreen = 1<<3,
-};
-
-struct W {
-	int id;
-	Rectangle r;
-	int vd;
-	int flags;
-};
-
-static int vd = 1; /* current virtual desktop */
-static int wsys; /* rios /dev/wsys fd */
-static int mod;
-static W *ws, *wcur;
-static int wsn;
-static int vd2wcur[10] = {-1};
-
-static char *sticky[32] = {
-	"bar",
-	"cat clock",
-	"clock",
-	"faces",
-	"kbmap",
-	"stats",
-	"winwatch",
-	nil,
-};
-
-static int
-wwctl(int id, int mode)
-{
-	char s[64];
-
-	snprint(s, sizeof(s), "/dev/wsys/%d/wctl", id);
-
-	return open(s, mode);
-}
-
-static void
-wsupdate(void)
-{
-	int i, k, n, f, seen, tn, dsn;
-	char s[256], *t[8];
-	W *newws, *w;
-	Dir *ds, *d;
-
-	seek(wsys, 0, 0);
-	if((dsn = dirreadall(wsys, &ds)) < 0)
-		sysfatal("/dev/wsys: %r");
-
-	newws = malloc(sizeof(W)*dsn);
-	wcur = nil;
-	for(i = 0, d = ds, w = newws; i < dsn; i++, d++){
-		if((f = wwctl(atoi(d->name), OREAD)) < 0)
-			continue;
-		n = read(f, s, sizeof(s)-1);
-		close(f);
-		if(n < 12)
-			continue;
-		s[n] = 0;
-		if((tn = tokenize(s, t, nelem(t))) < 6)
-			continue;
-
-		w->id = atoi(d->name);
-		w->r.min.x = atoi(t[0]);
-		w->r.min.y = atoi(t[1]);
-		w->r.max.x = atoi(t[2]);
-		w->r.max.y = atoi(t[3]);
-		w->vd = -1;
-		w->flags = 0;
-
-		/* move over the current state of the window */
-		for(k = 0, seen = 0; k < wsn; k++){
-			if(ws[k].id == w->id){
-				w->vd = ws[k].vd;
-				w->flags = ws[k].flags & ~(Fvisible|Fcurrent);
-				if(w->flags & Ffullscreen)
-					w->r = ws[k].r;
-				seen = 1;
-				break;
-			}
-		}
-
-		/* update current state */
-		for(k = 4; k < tn; k++){
-			if(strcmp(t[k], "current") == 0){
-				w->flags |= Fcurrent;
-				wcur = w;
-				w->vd = vd;
-			}else if(strcmp(t[k], "visible") == 0){
-				w->flags |= Fvisible;
-				w->vd = vd;
-			}
-		}
-
-		if(!seen){
-			/* not seen previously - set the new state for it */
-			w->vd = vd;
-		}
-
-		/* because a different program can run in any window we have to re-read */
-		snprint(s, sizeof(s), "/dev/wsys/%d/label", w->id);
-		w->flags &= ~Fsticky;
-		if((f = open(s, OREAD)) >= 0){
-			n = read(f, s, sizeof(s)-1);
-			close(f);
-			if(n > 0){
-				s[n] = 0;
-				for(k = 0; k < nelem(sticky) && sticky[k] != nil; k++){
-					if(strcmp(sticky[k], s) == 0){
-						w->flags |= Fsticky;
-						break;
-					}
-				}
-			}
-		}
-		w++;
-	}
-
-	free(ds);
-	free(ws);
-	ws = newws;
-	wsn = w - newws;
-}
-
-static void
-spawn(char *s)
-{
-	if(rfork(RFPROC|RFNOWAIT|RFNAMEG|RFENVG|RFCFDG|RFREND) == 0)
-		execl("/bin/rc", "rc", s, nil);
-}
-
-static void
-togglefullscreen(void)
-{
-	int f;
-
-	if(wcur == nil || (f = wwctl(wcur->id, OWRITE)) < 0)
-		return;
-	wcur->flags ^= Ffullscreen;
-	if(wcur->flags & Ffullscreen)
-		fprint(f, "resize -r 0 0 9999 9999");
-	else
-		fprint(f, "resize -r %d %d %d %d", wcur->r.min.x, wcur->r.min.y, wcur->r.max.x, wcur->r.max.y);
-	close(f);
-}
-
-static void
-togglesticky(void)
-{
-	if(wcur != nil)
-		wcur->flags ^= Fsticky;
-}
-
-static void
-vdaction(int nvd)
-{
-	int f, wcurf;
-	W *w;
-
-	if(mod == Mmod4){
-		wcur = nil;
-		wcurf = -1;
-		vd2wcur[vd] = -1;
-		for(w = ws; w < ws+wsn; w++){
-			if((f = wwctl(w->id, OWRITE)) < 0)
-				continue;
-
-			if(w->flags & Fvisible)
-				w->vd = vd;
-			else if(w->vd == vd)
-				w->vd = -1;
-
-			if(w->flags & Fcurrent)
-				vd2wcur[vd] = w->id;
-
-			if(w->vd != nvd && (w->flags & Fsticky) == 0){
-				fprint(f, "hide");
-			}else{
-				fprint(f, "unhide");
-				if(vd2wcur[nvd] == w->id && wcurf < 0){
-					wcur = w;
-					wcurf = f;
-					f = -1;
-				}
-			}
-			if(f >= 0)
-				close(f);
-		}
-		if(wcur != nil){
-			fprint(wcurf, "top");
-			fprint(wcurf, "current");
-			close(wcurf);
-		}
-		vd = nvd;
-		fprint(3, "%d\n", vd);
-	}else if(mod == (Mmod4 | Mshift) && wcur != nil && wcur->vd != nvd){
-		if((f = wwctl(wcur->id, OWRITE)) >= 0){
-			fprint(f, "hide");
-			wcur->vd = nvd;
-			vd2wcur[nvd] = wcur->id; /* bring to the top */
-			wcur = nil;
-			close(f);
-		}
-	}
-}
-
-static void
-arrowaction(int x, int y)
-{
-	int f;
-
-	if(wcur == nil || (f = wwctl(wcur->id, OWRITE)) < 0)
-		return;
-
-	x *= (mod & Mctl) ? Stepbig : Step;
-	y *= (mod & Mctl) ? Stepbig : Step;
-	if((mod & Mshift) == 0)
-		fprint(f, "move -minx %+d -miny %+d", x, y);
-	else
-		fprint(f, "resize -maxx %+d -maxy %+d -minx %+d -miny %+d", x, y, -x, -y);
-	close(f);
-}
-
-static struct {
-	int x, y;
-}cyclectx;
-
-static int
-cyclecmp(void *a_, void *b_)
-{
-	W *a = a_, *b = b_;
-
-	return cyclectx.x*(a->r.min.x - b->r.min.x) + cyclectx.y*(a->r.min.y - b->r.min.y);
-}
-
-static void
-cycleaction(int x, int y)
-{
-	int wcurid, i, f;
-	W *w, *w₀;
-
-	wcurid = wcur == nil ? -1 : wcur->id;
-	cyclectx.x = x;
-	cyclectx.y = y;
-	qsort(ws, wsn, sizeof(*ws), cyclecmp);
-	w₀ = nil;
-	wcur = nil;
-	for(i = 0, w = ws; i < wsn; i++, w++){
-		if(w->id == wcurid){
-			wcur = w;
-			continue;
-		}
-		if((w->flags & Fsticky) != 0 || w->vd != vd)
-			continue;
-		if(w₀ == nil)
-			w₀ = w;
-		if(wcur != nil)
-			break;
-	}
-	if(i >= wsn)
-		w = w₀;
-	if(w == nil || (f = wwctl(w->id, OWRITE)) < 0)
-		return;
-	fprint(f, "top");
-	fprint(f, "current");
-	close(f);
-	wcur = w;
-}
-
-static void
-keyevent(Rune r)
-{
-	wsupdate();
-
-	if(r == '\n')
-		spawn("window");
-	else if(r == 'f')
-		togglefullscreen();
-	else if(r == 's')
-		togglesticky();
-	else if(r >= '0' && r <= '9')
-		vdaction(r - '0');
-	else if(r == Kup)
-		arrowaction(0, -1);
-	else if(r == Kdown)
-		arrowaction(0, 1);
-	else if(r == Kleft)
-		arrowaction(-1, 0);
-	else if(r == Kright)
-		arrowaction(1, 0);
-	else if(r == 'h')
-		cycleaction(-1, 0);
-	else if(r == 'l')
-		cycleaction(1, 0);
-	else if(r == 'j')
-		cycleaction(0, 1);
-	else if(r == 'k')
-		cycleaction(0, -1);
-}
-
-static void
-process(char *s)
-{
-	int n, o, oldmod;
-	char b[128], *p;
-	Rune r;
-
-	if(*s == 'K' && s[1] == 0)
-		mod = 0;
-
-	o = 0;
-	b[o++] = *s;
-	for(p = s+1; *p != 0; p += n){
-		if((n = chartorune(&r, p)) == 1 && r == Runeerror){
-			/* bail out */
-			n = strlen(p);
-			memmove(b+o, p, n);
-			o += n;
-			p += n;
-			break;
-		}
-
-		oldmod = mod;
-
-		if(*s == 'c' && (mod & Mmod4) != 0){
-			keyevent(r);
-			continue;
-		}
-
-		if(*s == 'k'){
-			if(r == Kmod4)
-				mod |= Mmod4;
-			else if(r == Kctl)
-				mod |= Mctl;
-			else if(r == Kshift)
-				mod |= Mshift;
-			else if(r >= '0' && r <= '9' && (mod & (Mshift|Mmod4)) == (Mshift|Mmod4))
-				keyevent(r);
-		}else if(*s == 'K'){
-			if(r == Kmod4)
-				mod &= ~Mmod4;
-			else if(r == Kctl)
-				mod &= ~Mctl;
-			else if(r == Kshift)
-				mod &= ~Mshift;
-		}
-
-		if((oldmod | mod) & Mmod4)
-			continue;
-
-		memmove(b+o, p, n);
-		o += n;
-	}
-
-	/* all runes filtered out - ignore completely */
-	if(o == 1 && p-s > 1)
-		return;
-
-	b[o++] = 0;
-	if(write(1, b, o) != o)
-		exits(nil);
-}
-
-static void
-usage(void)
-{
-	fprint(2, "usage: %s [-s label]\n", argv0);
-	exits("usage");
-}
-
-void
-main(int argc, char **argv)
-{
-	char b[128];
-	int i, j, n;
-
-	for(n = 0; sticky[n] != nil; n++)
-		;
-
-	ARGBEGIN{
-	case 's':
-		if(n >= nelem(sticky))
-			sysfatal("ewwww");
-		sticky[n++] = EARGF(usage());
-		break;
-	default:
-		usage();
-	}ARGEND
-
-	if((wsys = open("/dev/wsys", OREAD)) < 0)
-		sysfatal("%r");
-
-	/* initial state */
-	wsupdate();
-	for(i = 0; i < wsn; i++)
-		ws[i].vd = vd;
-	fprint(3, "%d\n", vd);
-
-	for(i = 0;;){
-		if((n = read(0, b+i, sizeof(b)-i)) <= 0)
-			break;
-		n += i;
-		for(j = 0; j < n; j++){
-			if(b[j] == 0){
-				process(b+i);
-				i = j+1;
-			}
-		}
-		memmove(b, b+i, j-i);
-		i -= j;
-	}
-
-	exits(nil);
-}
--- a/riow.man
+++ /dev/null
@@ -1,78 +1,0 @@
-.TH RIOW 1
-.SH NAME
-riow \- keyboard-controller for rio(1)
-.SH SYNOPSIS
-.B riow
-[
-.I -s label
-]
-.SH DESCRIPTION
-.I riow
-provides keyboard controlling for
-.I rio(1)
-in the manner of
-.IR i3 ,
-.I sway
-and so on.  It does so by working with
-.I /dev/kbdtap
-(see \fIrio\fR(4)) and
-.IR /dev/wsys .
-.SS Running
-.I riow
-filters all key combinations that include
-.B Kmod4
-modifier, so it has to be placed
-.I last
-in the chain of programs using
-.IR /dev/kbdtap :
-.EX
-	</dev/kbdtap ktrans | \\
-		reform/shortcuts | \\
-		riow >/dev/kbdtap |[3] bar
-.EE
-Note that the current desktop number is printed to fd
-.IR 3 .
-.SS Keyboard shortcuts
-.TP
-.B Kmod4+0…9
-Switches to the specified virtual desktops. There are ten in total.
-.TP
-.B Kmod4+Shift+0…9
-Moves the current window to the specified virtual desktop.
-.TP
-.B Kmod4+f
-Toggle between fullscreen and normal mode for the current window.
-.TP
-.B Kmod4+s
-Toggle "sticky" mode for the current window. In this mode the window is staying
-while the user is switching between desktops. By default, programs like
-.IR winwatch ,
-.IR catclock ,
-.IR kbmap ,
-etc are in sticky mode. Additional programs can be added to that list on startup by
-specifying their labels with
-.I -s
-option.
-.TP
-.B Kmod4+enter
-Spawn a new
-.IR window(1) .
-.TP
-.B Kmod4+h/j/k/l
-Focus left/down/up/right.
-.TP
-.B Kmod4+arrows
-Move the current window in the specified direction.
-.TP
-.B Kmod4+control+arrows
-Same, but in bigger steps.
-.TP
-.B Kmod4+shift+arrows
-Resize the current window.
-.TP
-.B Kmod4+shift+control+arrows
-Same, but in bigger steps.
-.SH SOURCE
-https://git.sr.ht/~ft/riow
-.SH BUGS
-Yes.