summaryrefslogtreecommitdiff
path: root/sys/src/cmd/reform
diff options
context:
space:
mode:
authorSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-24 13:45:51 +0000
committerSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-24 13:45:51 +0000
commitcc861074b49c3c5410f335c7e3668c542c2c46fb (patch)
tree0d032c1ac5c56ccd1847df63a93125160e75fd2a /sys/src/cmd/reform
parent6ee1e4bd7898b96abb5c655bc9335df96fafa19f (diff)
reform: add reform/shortcuts
Diffstat (limited to 'sys/src/cmd/reform')
-rw-r--r--sys/src/cmd/reform/mkfile1
-rw-r--r--sys/src/cmd/reform/shortcuts.c105
2 files changed, 106 insertions, 0 deletions
diff --git a/sys/src/cmd/reform/mkfile b/sys/src/cmd/reform/mkfile
index a5a74483e..94b214d4c 100644
--- a/sys/src/cmd/reform/mkfile
+++ b/sys/src/cmd/reform/mkfile
@@ -4,6 +4,7 @@ BIN=/$objtype/bin/reform
TARG=\
audio\
pm\
+ shortcuts\
</sys/src/cmd/mkmany
diff --git a/sys/src/cmd/reform/shortcuts.c b/sys/src/cmd/reform/shortcuts.c
new file mode 100644
index 000000000..8ef34f49f
--- /dev/null
+++ b/sys/src/cmd/reform/shortcuts.c
@@ -0,0 +1,105 @@
+#include <u.h>
+#include <libc.h>
+#include <keyboard.h>
+
+static int lightstep = 5, volstep = 3;
+static int light, vol, mod;
+
+static void
+process(char *s)
+{
+ char b[128], *p;
+ int n, o;
+ 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;
+ }
+
+ if(*s == 'k' && r == Kmod4){
+ mod = 1;
+ }else if(*s == 'K'){
+ if(mod && r >= (KF|1) && r <= (KF|4))
+ continue;
+ if(r == Kmod4)
+ mod = 0;
+ }else if(mod && r >= (KF|1) && r <= (KF|4)){
+ if(*s == 'c'){
+ if(r == (KF|1))
+ fprint(light, "lcd -%d", lightstep);
+ else if(r == (KF|2))
+ fprint(light, "lcd +%d", lightstep);
+ else if(r == (KF|3))
+ fprint(vol, "master -%d", volstep);
+ else if(r == (KF|4))
+ fprint(vol, "master +%d", volstep);
+ }
+ 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: [-l light_step] [-v vol_step] %s\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+ char b[128];
+ int i, j, n;
+
+ ARGBEGIN{
+ case 'l':
+ lightstep = atoi(EARGF(usage()));
+ break;
+ case 'v':
+ volstep = atoi(EARGF(usage()));
+ break;
+ default:
+ usage();
+ }ARGEND
+
+ light = open("/dev/light", OWRITE);
+ vol = open("/dev/volume", OWRITE);
+ 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);
+}