From 0eb0af3c6f7b6dda01f5de21de11732ab9cb0cc8 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Wed, 21 Feb 2024 20:20:17 +0100 Subject: [PATCH] digraphs/xorg: intermediate map of keysymdef.h names Split code from mkdigraphs-xorg into separate mkxkeysymdef for reuse by upcoming mkkeyboard-xkb-symbols. --- Makefile | 6 +++++- tools/mkdigraphs-xorg | 22 +++++++--------------- tools/mkxkeysymdef | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 16 deletions(-) create mode 100755 tools/mkxkeysymdef diff --git a/Makefile b/Makefile index 806e5be..cccaebf 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,11 @@ data/digraphs-shiar.inc.pl: tools/mkdigraphs-shiar shiar.inc.txt data/xorg-compose: $(download) tools/wget-ifmodified http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre $@ -data/digraphs-xorg.inc.pl: tools/mkdigraphs-xorg data/xorg-compose +data/keysymdef.h: $(download) + tools/wget-ifmodified http://gitlab.freedesktop.org/xorg/proto/xorgproto/-/raw/master/include/X11/$(@F) $@ +data/keysymdef.json: tools/mkxkeysymdef data/keysymdef.h + $(call cmdsave,$^) +data/digraphs-xorg.inc.pl: tools/mkdigraphs-xorg data/xorg-compose data/keysymdef.json $(call cmdsave,$^) data/digraphs-vim.inc.pl: tools/mkdigraphs-vim diff --git a/tools/mkdigraphs-xorg b/tools/mkdigraphs-xorg index c2dd441..b34bef5 100755 --- a/tools/mkdigraphs-xorg +++ b/tools/mkdigraphs-xorg @@ -4,24 +4,16 @@ use warnings; use utf8; use open IO => ':encoding(utf-8)', ':std'; use re '/msx'; +use JSON 'decode_json'; use Data::Dump 'pp'; our $VERSION = '1.01'; -my $keysymh; -open $keysymh, '<', 'data/keysymdef.h' - or open $keysymh, '<', '/usr/include/X11/keysymdef.h' - or die "Could not find keysym definitions: $!\n"; - -my %keysym; -while (readline $keysymh) { - m{ - \A [#]define[ ]XK_ (?[a-zA-Z_0-9]+) - \h+ 0x(?[0-9a-f]+) - \h* [/][*] [\h(] U[+] (?[0-9A-F]{4,6}) - } or next; - $keysym{ $+{name} } = chr hex $+{unicode}; -} +my $symname = eval { + open my $keysymh, '<', 'data/keysymdef.json' or die $!; + local $/; + return decode_json(readline $keysymh); +} or die "Could not read keysym definitions: $@\n"; say "# automatically generated by $0"; say '+{'; @@ -31,7 +23,7 @@ while ($_ = readline) { or next; $chr =~ s/\\(.)/$1/g; $mnem !~ m/]+)> \h?}{$keysym{$1} // die "reference to unknown keysym $1\n"}eg; + $mnem =~ s{<([^>]+)> \h?}{$symname->{$1} // die "reference to unknown keysym $1\n"}eg; $mnem !~ m/[^\x20-\x7F]/ or next; # skip unicode # (state $seen = {})->{$chr}++ and next; printf "%s => %s,\n", pp($mnem), pp($chr); diff --git a/tools/mkxkeysymdef b/tools/mkxkeysymdef new file mode 100755 index 0000000..e7d7690 --- /dev/null +++ b/tools/mkxkeysymdef @@ -0,0 +1,39 @@ +#!/usr/bin/env perl +use 5.014; +use warnings; +use utf8; +use re '/msx'; +use JSON; + +our $VERSION = '1.00'; + +my %keysym; +while (readline) { + m{ + \A [#]define[ ]XK_ (?[a-zA-Z_0-9]+) + \h+ 0x(?[0-9a-fA-F]+) + \h* [/][*] [\h(] U[+] (?[0-9A-F]{4,6}) + } or next; + $keysym{ $+{name} } = chr hex $+{unicode}; +} + +print JSON->new->ascii->canonical->indent->encode(\%keysym); + +__END__ + +=head1 NAME + +mkxkeysymdef - Map Xorg key symbol names to Unicode characters + +=head1 SYNOPSIS + + mkxkeysymdef /usr/incnlude/X11/keysymdef.h >keysymdef.json + +=head1 AUTHOR + +Mischa POSLAWSKY + +=head1 LICENSE + +Licensed under the GNU Affero General Public License version 3. + -- 2.30.0