From 25bc6acdfd132a4d67fbba934dc05e5539072a30 Mon Sep 17 00:00:00 2001
From: Přemysl Eric Janouch
Date: Tue, 7 Dec 2021 21:05:07 +0100
Subject: WIP: ht: commit whatever I was trying out
---
ht/gen-keysyms-new.sh | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
create mode 100755 ht/gen-keysyms-new.sh
(limited to 'ht/gen-keysyms-new.sh')
diff --git a/ht/gen-keysyms-new.sh b/ht/gen-keysyms-new.sh
new file mode 100755
index 0000000..388d946
--- /dev/null
+++ b/ht/gen-keysyms-new.sh
@@ -0,0 +1,94 @@
+#!/bin/sh
+gofmt < $hex, ident => $ident, comment => $comment };
+
+ $nametokeysym{$name} = $ident;
+
+ # All but the first name listed should be considered deprecated.
+ $keysymtoname{$ident} = $name unless exists $seen{$hex};
+ $seen{$hex}++;
+
+ # TODO: Try stringer, see
+ # https://eli.thegreenplace.net/2021/a-comprehensive-guide-to-go-generate/
+ END {
+ print "const (";
+ print "$_->{ident} = 0x$_->{hex} // $_->{comment}" for @a;
+ print ")";
+
+ # Very large tables, should be an on-demand package :(
+ #
+ # KeysymToName/NameToKeysym can also be compress/lzw (small code),
+ # that may reduce string data to about 1/3. It's still rather small
+ # (27K -> 8K), I'm not sure where all those bytes come from.
+ #
+ # KeysymToName might be generated from NameToKeysym.
+ # KeysymToName may just be an index into the ntk constant.
+ #
+ # Actually we may just include a $name => $hex table and screw
+ # all else. But the text still begs for compression and the numbers
+ # for filtering and compression.
+ #
+ # Or actually []{$hex, $name}, stable sorted by $hex, and having
+ # the $name be an index into a constant. On construction we keep
+ # a map so that only the first $hex occurrence receives a name.
+ #
+ # My biggest gripe is probably source code size that won't go down
+ # because the constants are just so large (158K).
+
+ my (@ktnK, @ktnV);
+ for (sort keys %keysymtoname) {
+ push @ktnK, $_;
+ push @ktnV, $keysymtoname{$_};
+ }
+ print "var ktnKeys = []xproto.Keysym{${\join \", \", @ktnK}}";
+ print "var ktnValues = \"${\join \" \", @ktnV}\"";
+
+ my (@ntkK, @ntkV);
+ for (sort keys %nametokeysym) {
+ push @ntkK, $_;
+ push @ntkV, $nametokeysym{$_};
+ }
+ print "var ntkKeys = \"${\join \" \", @ntkK}\"";
+ print "var ntkValues = []xproto.Keysym{${\join \", \", @ntkV}}";
+ }
+')
+
+// KeysymToName maps X11 keysym constants to their names.
+var KeysymToName = map[xproto.Keysym]string{}
+
+// NameToKeysym maps X11 keysym names to their constants.
+var NameToKeysym = map[string]xproto.Keysym{}
+
+func init() {
+ x := strings.Split(ktnValues, " ")
+ for i, keysym := range ktnKeys {
+ KeysymToName[keysym] = x[i]
+ }
+ for i, name := range strings.Split(ntkKeys, " ") {
+ NameToKeysym[name] = ntkValues[i]
+ }
+}
+EOF
--
cgit v1.2.3-70-g09d2