summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/hci/keymap/keymap_al.c5
-rw-r--r--src/hci/keymap/keymap_cf.c1
-rw-r--r--src/hci/keymap/keymap_cz.c8
-rw-r--r--src/hci/keymap/keymap_de.c5
-rw-r--r--src/hci/keymap/keymap_dk.c7
-rw-r--r--src/hci/keymap/keymap_es.c13
-rw-r--r--src/hci/keymap/keymap_et.c10
-rw-r--r--src/hci/keymap/keymap_fi.c6
-rw-r--r--src/hci/keymap/keymap_fr.c6
-rw-r--r--src/hci/keymap/keymap_hu.c18
-rw-r--r--src/hci/keymap/keymap_it.c6
-rw-r--r--src/hci/keymap/keymap_lt.c4
-rw-r--r--src/hci/keymap/keymap_mt.c5
-rw-r--r--src/hci/keymap/keymap_no-latin1.c5
-rw-r--r--src/hci/keymap/keymap_no.c7
-rw-r--r--src/hci/keymap/keymap_pt.c1
-rw-r--r--src/hci/keymap/keymap_se.c5
-rw-r--r--src/hci/keymap/keymap_sg.c2
-rwxr-xr-xsrc/util/genkeymap.py46
19 files changed, 137 insertions, 23 deletions
diff --git a/src/hci/keymap/keymap_al.c b/src/hci/keymap/keymap_al.c
index 4d279171f..6e14395a5 100644
--- a/src/hci/keymap/keymap_al.c
+++ b/src/hci/keymap/keymap_al.c
@@ -37,10 +37,15 @@ static struct keymap_key al_basic[] = {
/** "al" AltGr remapping */
static struct keymap_key al_altgr[] = {
+ { 0x21, 0x7e }, /* '!' => '~' */
+ { 0x26, 0x60 }, /* '&' => '`' */
{ 0x30, 0x7e }, /* '0' => '~' */
{ 0x31, 0x7e }, /* '1' => '~' */
{ 0x34, 0x7e }, /* '4' => '~' */
{ 0x37, 0x60 }, /* '7' => '`' */
+ { 0x3a, 0x7e }, /* ':' => '~' */
+ { 0x56, 0x60 }, /* 'V' => '`' */
+ { 0x7c, 0x7e }, /* '|' => '~' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_cf.c b/src/hci/keymap/keymap_cf.c
index 434e3383c..55bbfc1a4 100644
--- a/src/hci/keymap/keymap_cf.c
+++ b/src/hci/keymap/keymap_cf.c
@@ -33,6 +33,7 @@ static struct keymap_key cf_altgr[] = {
{ 0x27, 0x7b }, /* '\'' => '{' */
{ 0x32, 0x40 }, /* '2' => '@' */
{ 0x3b, 0x7e }, /* ';' => '~' */
+ { 0x5c, 0x7d }, /* '\\' => '}' */
{ 0x60, 0x5c }, /* '`' => '\\' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_cz.c b/src/hci/keymap/keymap_cz.c
index fb072b117..08e9638e1 100644
--- a/src/hci/keymap/keymap_cz.c
+++ b/src/hci/keymap/keymap_cz.c
@@ -50,6 +50,9 @@ static struct keymap_key cz_basic[] = {
/** "cz" AltGr remapping */
static struct keymap_key cz_altgr[] = {
+ { 0x21, 0x7e }, /* '!' => '~' */
+ { 0x24, 0x7e }, /* '$' => '~' */
+ { 0x29, 0x7e }, /* ')' => '~' */
{ 0x2c, 0x3c }, /* ',' => '<' */
{ 0x2e, 0x3e }, /* '.' => '>' */
{ 0x2f, 0x2a }, /* '/' => '*' */
@@ -60,10 +63,15 @@ static struct keymap_key cz_altgr[] = {
{ 0x37, 0x26 }, /* '7' => '&' */
{ 0x38, 0x2a }, /* '8' => '*' */
{ 0x39, 0x7b }, /* '9' => '{' */
+ { 0x3a, 0x7e }, /* ':' => '~' */
{ 0x3b, 0x24 }, /* ';' => '$' */
+ { 0x4b, 0x26 }, /* 'K' => '&' */
+ { 0x58, 0x3e }, /* 'X' => '>' */
+ { 0x5a, 0x3c }, /* 'Z' => '<' */
{ 0x61, 0x7e }, /* 'a' => '~' */
{ 0x62, 0x7b }, /* 'b' => '{' */
{ 0x63, 0x26 }, /* 'c' => '&' */
+ { 0x66, 0x5b }, /* 'f' => '[' */
{ 0x67, 0x5d }, /* 'g' => ']' */
{ 0x6e, 0x7d }, /* 'n' => '}' */
{ 0x76, 0x40 }, /* 'v' => '@' */
diff --git a/src/hci/keymap/keymap_de.c b/src/hci/keymap/keymap_de.c
index bbd39520f..ca5e4a9a9 100644
--- a/src/hci/keymap/keymap_de.c
+++ b/src/hci/keymap/keymap_de.c
@@ -47,8 +47,13 @@ static struct keymap_key de_basic[] = {
static struct keymap_key de_altgr[] = {
{ 0x2d, 0x5c }, /* '-' => '\\' */
{ 0x30, 0x7d }, /* '0' => '}' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
{ 0x39, 0x5d }, /* '9' => ']' */
+ { 0x3b, 0x7e }, /* ';' => '~' */
+ { 0x5d, 0x7e }, /* ']' => '~' */
{ 0x71, 0x40 }, /* 'q' => '@' */
+ { 0x7c, 0x7e }, /* '|' => '~' */
{ 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_dk.c b/src/hci/keymap/keymap_dk.c
index 6d2e60aca..5b229024a 100644
--- a/src/hci/keymap/keymap_dk.c
+++ b/src/hci/keymap/keymap_dk.c
@@ -39,7 +39,14 @@ static struct keymap_key dk_basic[] = {
static struct keymap_key dk_altgr[] = {
{ 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x34, 0x24 }, /* '4' => '$' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x3a, 0x7e }, /* ':' => '~' */
{ 0x3d, 0x7c }, /* '=' => '|' */
+ { 0x5c, 0x7e }, /* '\\' => '~' */
+ { 0x5d, 0x7e }, /* ']' => '~' */
{ 0x71, 0x40 }, /* 'q' => '@' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_es.c b/src/hci/keymap/keymap_es.c
index 614ca7b8b..93d87f2a0 100644
--- a/src/hci/keymap/keymap_es.c
+++ b/src/hci/keymap/keymap_es.c
@@ -37,14 +37,27 @@ static struct keymap_key es_basic[] = {
/** "es" AltGr remapping */
static struct keymap_key es_altgr[] = {
+ { 0x22, 0x7b }, /* '"' => '{' */
{ 0x27, 0x7b }, /* '\'' => '{' */
+ { 0x2b, 0x7e }, /* '+' => '~' */
+ { 0x2d, 0x5c }, /* '-' => '\\' */
{ 0x30, 0x7d }, /* '0' => '}' */
+ { 0x31, 0x7c }, /* '1' => '|' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x33, 0x23 }, /* '3' => '#' */
+ { 0x34, 0x7e }, /* '4' => '~' */
{ 0x37, 0x7b }, /* '7' => '{' */
{ 0x38, 0x5b }, /* '8' => '[' */
{ 0x39, 0x5d }, /* '9' => ']' */
+ { 0x3a, 0x7e }, /* ':' => '~' */
+ { 0x3b, 0x7e }, /* ';' => '~' */
+ { 0x3d, 0x7e }, /* '=' => '~' */
{ 0x5c, 0x7d }, /* '\\' => '}' */
+ { 0x60, 0x5c }, /* '`' => '\\' */
{ 0x71, 0x40 }, /* 'q' => '@' */
+ { 0x7c, 0x7e }, /* '|' => '~' */
+ { 0x7e, 0x5c }, /* '~' => '\\' */
+ { 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_et.c b/src/hci/keymap/keymap_et.c
index f3eb02eab..4d763266f 100644
--- a/src/hci/keymap/keymap_et.c
+++ b/src/hci/keymap/keymap_et.c
@@ -35,8 +35,18 @@ static struct keymap_key et_basic[] = {
/** "et" AltGr remapping */
static struct keymap_key et_altgr[] = {
+ { 0x26, 0x7b }, /* '&' => '{' */
+ { 0x28, 0x5d }, /* '(' => ']' */
+ { 0x29, 0x7d }, /* ')' => '}' */
+ { 0x2a, 0x5b }, /* '*' => '[' */
{ 0x2d, 0x5c }, /* '-' => '\\' */
+ { 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x34, 0x24 }, /* '4' => '$' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x5f, 0x5c }, /* '_' => '\\' */
{ 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_fi.c b/src/hci/keymap/keymap_fi.c
index 622f06252..ac69813e8 100644
--- a/src/hci/keymap/keymap_fi.c
+++ b/src/hci/keymap/keymap_fi.c
@@ -38,6 +38,12 @@ static struct keymap_key fi_altgr[] = {
{ 0x2d, 0x5c }, /* '-' => '\\' */
{ 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x34, 0x24 }, /* '4' => '$' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x49, 0x7c }, /* 'I' => '|' */
+ { 0x5d, 0x7e }, /* ']' => '~' */
{ 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_fr.c b/src/hci/keymap/keymap_fr.c
index c002bf95a..ad797f876 100644
--- a/src/hci/keymap/keymap_fr.c
+++ b/src/hci/keymap/keymap_fr.c
@@ -68,9 +68,15 @@ static struct keymap_key fr_altgr[] = {
{ 0x2d, 0x5d }, /* '-' => ']' */
{ 0x30, 0x40 }, /* '0' => '@' */
{ 0x33, 0x23 }, /* '3' => '#' */
+ { 0x34, 0x7b }, /* '4' => '{' */
{ 0x35, 0x5b }, /* '5' => '[' */
+ { 0x36, 0x7c }, /* '6' => '|' */
+ { 0x37, 0x60 }, /* '7' => '`' */
{ 0x38, 0x5c }, /* '8' => '\\' */
+ { 0x3d, 0x7d }, /* '=' => '}' */
+ { 0x5c, 0x60 }, /* '\\' => '`' */
{ 0x61, 0x40 }, /* 'a' => '@' */
+ { 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_hu.c b/src/hci/keymap/keymap_hu.c
index 8f2d70aac..d64baaebf 100644
--- a/src/hci/keymap/keymap_hu.c
+++ b/src/hci/keymap/keymap_hu.c
@@ -37,18 +37,36 @@ static struct keymap_key hu_basic[] = {
/** "hu" AltGr remapping */
static struct keymap_key hu_altgr[] = {
+ { 0x21, 0x7e }, /* '!' => '~' */
+ { 0x23, 0x5e }, /* '#' => '^' */
+ { 0x26, 0x60 }, /* '&' => '`' */
+ { 0x2c, 0x3b }, /* ',' => ';' */
{ 0x2e, 0x3e }, /* '.' => '>' */
{ 0x2f, 0x2a }, /* '/' => '*' */
+ { 0x30, 0x7e }, /* '0' => '~' */
+ { 0x31, 0x7e }, /* '1' => '~' */
{ 0x32, 0x5e }, /* '2' => '^' */
{ 0x33, 0x5e }, /* '3' => '^' */
+ { 0x34, 0x7e }, /* '4' => '~' */
{ 0x37, 0x60 }, /* '7' => '`' */
{ 0x3b, 0x24 }, /* ';' => '$' */
+ { 0x4b, 0x26 }, /* 'K' => '&' */
+ { 0x58, 0x3e }, /* 'X' => '>' */
+ { 0x5a, 0x3c }, /* 'Z' => '<' */
+ { 0x62, 0x7b }, /* 'b' => '{' */
{ 0x63, 0x26 }, /* 'c' => '&' */
+ { 0x66, 0x5b }, /* 'f' => '[' */
+ { 0x67, 0x5d }, /* 'g' => ']' */
{ 0x6d, 0x3c }, /* 'm' => '<' */
+ { 0x6e, 0x7d }, /* 'n' => '}' */
+ { 0x71, 0x5c }, /* 'q' => '\\' */
{ 0x76, 0x40 }, /* 'v' => '@' */
+ { 0x77, 0x7c }, /* 'w' => '|' */
{ 0x78, 0x23 }, /* 'x' => '#' */
{ 0x7a, 0x3e }, /* 'z' => '>' */
+ { 0x7c, 0x7e }, /* '|' => '~' */
{ 0xdc, 0x3c }, /* Pseudo-'\\' => '<' */
+ { 0xfc, 0x3e }, /* Pseudo-'|' => '>' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_it.c b/src/hci/keymap/keymap_it.c
index a55dafe6a..2511bb791 100644
--- a/src/hci/keymap/keymap_it.c
+++ b/src/hci/keymap/keymap_it.c
@@ -37,13 +37,19 @@ static struct keymap_key it_basic[] = {
/** "it" AltGr remapping */
static struct keymap_key it_altgr[] = {
+ { 0x23, 0x7e }, /* '#' => '~' */
+ { 0x27, 0x23 }, /* '\'' => '#' */
{ 0x2d, 0x60 }, /* '-' => '`' */
{ 0x30, 0x7d }, /* '0' => '}' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
{ 0x39, 0x5d }, /* '9' => ']' */
{ 0x3b, 0x40 }, /* ';' => '@' */
{ 0x3d, 0x7e }, /* '=' => '~' */
+ { 0x40, 0x7e }, /* '@' => '~' */
{ 0x5c, 0x60 }, /* '\\' => '`' */
{ 0x71, 0x40 }, /* 'q' => '@' */
+ { 0x7c, 0x7e }, /* '|' => '~' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_lt.c b/src/hci/keymap/keymap_lt.c
index 5d6ee5a8c..a237b1d62 100644
--- a/src/hci/keymap/keymap_lt.c
+++ b/src/hci/keymap/keymap_lt.c
@@ -17,6 +17,10 @@ static struct keymap_key lt_basic[] = {
/** "lt" AltGr remapping */
static struct keymap_key lt_altgr[] = {
+ { 0x22, 0x5e }, /* '"' => '^' */
+ { 0x27, 0x5e }, /* '\'' => '^' */
+ { 0x4b, 0x26 }, /* 'K' => '&' */
+ { 0x71, 0x40 }, /* 'q' => '@' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_mt.c b/src/hci/keymap/keymap_mt.c
index 0a9a110b0..a95c5b4e8 100644
--- a/src/hci/keymap/keymap_mt.c
+++ b/src/hci/keymap/keymap_mt.c
@@ -22,6 +22,11 @@ static struct keymap_key mt_basic[] = {
/** "mt" AltGr remapping */
static struct keymap_key mt_altgr[] = {
+ { 0x30, 0x7d }, /* '0' => '}' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x5c, 0x60 }, /* '\\' => '`' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_no-latin1.c b/src/hci/keymap/keymap_no-latin1.c
index 63fe85548..1f4cc38d3 100644
--- a/src/hci/keymap/keymap_no-latin1.c
+++ b/src/hci/keymap/keymap_no-latin1.c
@@ -39,10 +39,15 @@ static struct keymap_key no_latin1_basic[] = {
/** "no-latin1" AltGr remapping */
static struct keymap_key no_latin1_altgr[] = {
+ { 0x22, 0x5b }, /* '"' => '[' */
+ { 0x27, 0x7b }, /* '\'' => '{' */
{ 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
{ 0x39, 0x5d }, /* '9' => ']' */
{ 0x5b, 0x7d }, /* '[' => '}' */
+ { 0x7b, 0x5d }, /* '{' => ']' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_no.c b/src/hci/keymap/keymap_no.c
index 4b2f7268e..239e3aea5 100644
--- a/src/hci/keymap/keymap_no.c
+++ b/src/hci/keymap/keymap_no.c
@@ -41,6 +41,13 @@ static struct keymap_key no_basic[] = {
static struct keymap_key no_altgr[] = {
{ 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x34, 0x24 }, /* '4' => '$' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x3a, 0x7e }, /* ':' => '~' */
+ { 0x5c, 0x7e }, /* '\\' => '~' */
+ { 0x5d, 0x7e }, /* ']' => '~' */
{ 0x71, 0x40 }, /* 'q' => '@' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_pt.c b/src/hci/keymap/keymap_pt.c
index f294e9563..75bf565ce 100644
--- a/src/hci/keymap/keymap_pt.c
+++ b/src/hci/keymap/keymap_pt.c
@@ -44,6 +44,7 @@ static struct keymap_key pt_altgr[] = {
{ 0x32, 0x40 }, /* '2' => '@' */
{ 0x37, 0x7b }, /* '7' => '{' */
{ 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
{ 0x71, 0x40 }, /* 'q' => '@' */
{ 0, 0 }
};
diff --git a/src/hci/keymap/keymap_se.c b/src/hci/keymap/keymap_se.c
index 6ca990444..9c6cf64a4 100644
--- a/src/hci/keymap/keymap_se.c
+++ b/src/hci/keymap/keymap_se.c
@@ -40,6 +40,11 @@ static struct keymap_key se_altgr[] = {
{ 0x2d, 0x5c }, /* '-' => '\\' */
{ 0x30, 0x7d }, /* '0' => '}' */
{ 0x32, 0x40 }, /* '2' => '@' */
+ { 0x34, 0x24 }, /* '4' => '$' */
+ { 0x37, 0x7b }, /* '7' => '{' */
+ { 0x38, 0x5b }, /* '8' => '[' */
+ { 0x39, 0x5d }, /* '9' => ']' */
+ { 0x5d, 0x7e }, /* ']' => '~' */
{ 0x71, 0x40 }, /* 'q' => '@' */
{ 0xdc, 0x7c }, /* Pseudo-'\\' => '|' */
{ 0, 0 }
diff --git a/src/hci/keymap/keymap_sg.c b/src/hci/keymap/keymap_sg.c
index 9a6db9cb4..2afe59c61 100644
--- a/src/hci/keymap/keymap_sg.c
+++ b/src/hci/keymap/keymap_sg.c
@@ -45,9 +45,11 @@ static struct keymap_key sg_basic[] = {
/** "sg" AltGr remapping */
static struct keymap_key sg_altgr[] = {
+ { 0x27, 0x7b }, /* '\'' => '{' */
{ 0x32, 0x40 }, /* '2' => '@' */
{ 0x33, 0x23 }, /* '3' => '#' */
{ 0x37, 0x7c }, /* '7' => '|' */
+ { 0x3d, 0x7e }, /* '=' => '~' */
{ 0x5c, 0x7d }, /* '\\' => '}' */
{ 0, 0 }
};
diff --git a/src/util/genkeymap.py b/src/util/genkeymap.py
index 8df949612..632f71eda 100755
--- a/src/util/genkeymap.py
+++ b/src/util/genkeymap.py
@@ -33,6 +33,10 @@ import textwrap
from typing import ClassVar, Optional
+BACKSPACE = chr(0x7f)
+"""Backspace character"""
+
+
class KeyType(IntEnum):
"""Key types"""
@@ -174,7 +178,7 @@ class KeyLayout(UserDict[KeyModifiers, Sequence[Key]]):
KeyModifiers.NONE: [(KEY_NON_US, ord('\\'))],
KeyModifiers.SHIFT: [(KEY_NON_US, ord('|'))],
# Treat Ctrl-Backspace as producing Backspace rather than Ctrl-H
- KeyModifiers.CTRL: [(KEY_BACKSPACE, 0x7f)],
+ KeyModifiers.CTRL: [(KEY_BACKSPACE, ord(BACKSPACE))],
},
'il': {
# Redefine some otherwise unreachable ASCII characters
@@ -200,11 +204,6 @@ class KeyLayout(UserDict[KeyModifiers, Sequence[Key]]):
"""Basic shifted keyboard layout"""
return self[KeyModifiers.SHIFT]
- @property
- def altgr(self):
- """AltGr keyboard layout"""
- return self.get(KeyModifiers.ALTGR, self.unshifted)
-
@classmethod
def load(cls, name: str) -> KeyLayout:
"""Load keymap using 'loadkeys -b'"""
@@ -281,7 +280,7 @@ class BiosKeyLayout(KeyLayout):
return inverse
-class KeymapKeys(UserDict[str, str]):
+class KeymapKeys(UserDict[str, Optional[str]]):
"""An ASCII character remapping"""
@classmethod
@@ -312,7 +311,8 @@ class KeymapKeys(UserDict[str, str]):
self.ascii_name(source), self.ascii_name(target)
)
for source, target in self.items()
- if ord(source) & ~BiosKeyLayout.KEY_PSEUDO != ord(target)
+ if target
+ and ord(source) & ~BiosKeyLayout.KEY_PSEUDO != ord(target)
) + '\t{ 0, 0 }\n}'
@@ -335,13 +335,12 @@ class Keymap:
# Construct raw mapping from source ASCII to target ASCII
raw = {source: self.target[key.modifiers][key.keycode].ascii
for source, key in self.source.inverse.items()}
- # Eliminate any null mappings, mappings that attempt to remap
- # the backspace key, or identity mappings
+ # Eliminate any identity mappings, or mappings that attempt to
+ # remap the backspace key
table = {source: target for source, target in raw.items()
- if target
- and ord(source) != 0x7f
- and ord(target) != 0x7f
- and source != target}
+ if source != target
+ and source != BACKSPACE
+ and target != BACKSPACE}
# Recursively delete any mappings that would produce
# unreachable alphanumerics (e.g. the "il" keymap, which maps
# away the whole lower-case alphabet)
@@ -354,8 +353,8 @@ class Keymap:
# Sanity check: ensure that all numerics are reachable using
# the same shift state
digits = '1234567890'
- unshifted = ''.join(table.get(x, x) for x in '1234567890')
- shifted = ''.join(table.get(x, x) for x in '!@#$%^&*()')
+ unshifted = ''.join(table.get(x) or x for x in '1234567890')
+ shifted = ''.join(table.get(x) or x for x in '!@#$%^&*()')
if digits not in (shifted, unshifted):
raise ValueError("Inconsistent numeric remapping %s / %s" %
(unshifted, shifted))
@@ -365,21 +364,22 @@ class Keymap:
def altgr(self) -> KeymapKeys:
"""AltGr remapping table"""
# Construct raw mapping from source ASCII to target ASCII
- raw = {source: self.target.altgr[key.keycode].ascii
- for source, key in self.source.inverse.items()
- if key.modifiers == KeyModifiers.NONE}
+ raw = {
+ source:
+ self.target.get((key.modifiers | KeyModifiers.ALTGR),
+ self.target[key.modifiers])[key.keycode].ascii
+ for source, key in self.source.inverse.items()
+ }
# Identify printable keys that are unreachable via the basic map
basic = self.basic
unmapped = set(x for x in basic.keys()
if x.isascii() and x.isprintable())
remapped = set(basic.values())
unreachable = unmapped - remapped
- # Eliminate any null mappings, mappings for unprintable
- # characters, or mappings for characters that are reachable
- # via the basic map
+ # Eliminate any mappings for unprintable characters, or
+ # mappings for characters that are reachable via the basic map
table = {source: target for source, target in raw.items()
if source.isprintable()
- and target
and target in unreachable}
# Check that all characters are now reachable
unreachable -= set(table.values())