abouttreesummaryrefslogcommitdiff
path: root/srcs/compose
diff options
context:
space:
mode:
authorJules Aguillon2024-07-21 23:37:07 +0200
committerGitHub2024-07-21 23:37:07 +0200
commit2696f42144f42b1c4c270555047d40095693d3c4 (patch)
treec72d45eaeb3f517c3450ba134b26d08f5022bb3d /srcs/compose
parent84e10e047012f55d6c2ba2a2c53da93cc9ac00e4 (diff)
downloadunexpected-keyboard-2696f42144f42b1c4c270555047d40095693d3c4.tar.gz
unexpected-keyboard-2696f42144f42b1c4c270555047d40095693d3c4.zip
Allow extending the compose key (#713)
This allows adding more compose sequences without modifying en_US_UTF_8_Compose.pre. This is done by grouping sequences files that should be merged together into a directory. This also allows moving keysymdef.h into that directory.
Diffstat (limited to 'srcs/compose')
-rw-r--r--srcs/compose/README.md4
-rw-r--r--srcs/compose/compile.py36
-rw-r--r--srcs/compose/compose/en_US_UTF_8_Compose.pre (renamed from srcs/compose/en_US_UTF_8_Compose.pre)0
-rw-r--r--srcs/compose/compose/extra.json5
-rw-r--r--srcs/compose/compose/keysymdef.h (renamed from srcs/compose/keysymdef.h)0
5 files changed, 35 insertions, 10 deletions
diff --git a/srcs/compose/README.md b/srcs/compose/README.md
index a3cfdb3..fff4941 100644
--- a/srcs/compose/README.md
+++ b/srcs/compose/README.md
@@ -3,6 +3,8 @@
The `compose.py` program parses the compose sequences found in this directory
and generates `srcs/juloo.keyboard2/ComposeKeyData.java`.
-## `en_US_UTF_8_Compose.pre`
+## `compose/en_US_UTF_8_Compose.pre`
This file is copied from the `xorg` project. Copyright applies.
+
+## `compose/extra.json`
diff --git a/srcs/compose/compile.py b/srcs/compose/compile.py
index 74fee79..fe4fe9f 100644
--- a/srcs/compose/compile.py
+++ b/srcs/compose/compile.py
@@ -12,20 +12,18 @@ from array import array
# Parse symbol names from keysymdef.h. Many compose sequences in
# en_US_UTF_8_Compose.pre reference theses. For example, all the sequences on
# the Greek, Cyrillic and Hebrew scripts need these symbols.
-def parse_keysymdef_h():
- with open(os.path.join(os.path.dirname(__file__), "keysymdef.h"), "r") as inp:
+def parse_keysymdef_h(fname):
+ with open(fname, "r") as inp:
keysym_re = re.compile(r'^#define XK_(\S+)\s+\S+\s*/\*.U\+([0-9a-fA-F]+)\s')
for line in inp:
m = re.match(keysym_re, line)
if m != None:
yield (m.group(1), chr(int(m.group(2), 16)))
-xkb_char_extra_names = dict(parse_keysymdef_h())
-
dropped_sequences = 0
# Parse XKB's Compose.pre files
-def parse_sequences_file_xkb(fname):
+def parse_sequences_file_xkb(fname, xkb_char_extra_names):
# Parse a line of the form:
# <Multi_key> <minus> <space> : "~" asciitilde # TILDE
# Sequences not starting with <Multi_key> are ignored.
@@ -99,13 +97,30 @@ def parse_sequences_file_json(fname):
return list(seqs.items())
# Format of the sequences file is determined by its extension
-def parse_sequences_file(fname):
+def parse_sequences_file(fname, xkb_char_extra_names={}):
if fname.endswith(".pre"):
- return parse_sequences_file_xkb(fname)
+ return parse_sequences_file_xkb(fname, xkb_char_extra_names)
if fname.endswith(".json"):
return parse_sequences_file_json(fname)
raise Exception(fname + ": Unsupported format")
+# A sequence directory can contain several sequence files as well as
+# 'keysymdef.h'.
+def parse_sequences_dir(dname):
+ compose_files = []
+ xkb_char_extra_names = {}
+ # Parse keysymdef.h first if present
+ for fbasename in os.listdir(dname):
+ fname = os.path.join(dname, fbasename)
+ if fbasename == "keysymdef.h":
+ xkb_char_extra_names = dict(parse_keysymdef_h(fname))
+ else:
+ compose_files.append(fname)
+ sequences = []
+ for fname in compose_files:
+ sequences.extend(parse_sequences_file(fname, xkb_char_extra_names))
+ return sequences
+
# Turn a list of sequences into a trie.
def add_sequences_to_trie(seqs, trie):
def add_seq_to_trie(t_, seq, result):
@@ -238,9 +253,12 @@ public final class ComposeKeyData
total_sequences = 0
tries = {} # Orderred dict
-for fname in sys.argv[1:]:
+for fname in sorted(sys.argv[1:]):
tname, _ = os.path.splitext(os.path.basename(fname))
- sequences = parse_sequences_file(fname)
+ if os.path.isdir(fname):
+ sequences = parse_sequences_dir(fname)
+ else:
+ sequences = parse_sequences_file(fname)
add_sequences_to_trie(sequences, tries.setdefault(tname, {}))
total_sequences += len(sequences)
entry_states, automata = make_automata(tries)
diff --git a/srcs/compose/en_US_UTF_8_Compose.pre b/srcs/compose/compose/en_US_UTF_8_Compose.pre
index 680f4fa..680f4fa 100644
--- a/srcs/compose/en_US_UTF_8_Compose.pre
+++ b/srcs/compose/compose/en_US_UTF_8_Compose.pre
diff --git a/srcs/compose/compose/extra.json b/srcs/compose/compose/extra.json
new file mode 100644
index 0000000..26adcdc
--- /dev/null
+++ b/srcs/compose/compose/extra.json
@@ -0,0 +1,5 @@
+{
+ "V": {
+ "s": "Š"
+ }
+}
diff --git a/srcs/compose/keysymdef.h b/srcs/compose/compose/keysymdef.h
index 1965381..1965381 100644
--- a/srcs/compose/keysymdef.h
+++ b/srcs/compose/compose/keysymdef.h