From ab506de76a74cd902401e0cc0bbe5a23849e5aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Hlusi=C4=8Dka?= Date: Thu, 12 Feb 2026 02:39:31 +0100 Subject: [PATCH] More host string sending improvements, add compiled czech coders' layout, send site password to host --- firmware/.zed/settings.json | 3 + firmware/acid-firmware/.cargo/config.toml | 3 + firmware/acid-firmware/README.md | 15 +- firmware/acid-firmware/keymaps/cz_coder.xkb | 1914 +++++++++++++++++++ firmware/acid-firmware/src/keymap.rs | 27 +- firmware/acid-firmware/src/ui/mod.rs | 10 +- firmware/acid-firmware/src/util.rs | 22 + 7 files changed, 1982 insertions(+), 12 deletions(-) create mode 100644 firmware/acid-firmware/keymaps/cz_coder.xkb diff --git a/firmware/.zed/settings.json b/firmware/.zed/settings.json index 883621a..38c5285 100644 --- a/firmware/.zed/settings.json +++ b/firmware/.zed/settings.json @@ -24,6 +24,9 @@ "ESP_LOG": "warn", "ESP_BACKTRACE_CONFIG_BACKTRACE_FRAMES": "20", "SLINT_FONT_SIZES": "8,11,10,12,13,14,15,16,18,20,22,24,32", + "ACID_KEYMAP_PATH": "../keymaps/cz_coder.xkb", + "ACID_COMPOSE_PATH": "../compose/cs_CZ Compose.txt", + "ACID_COMPOSE_LOCALE": "cs_CZ.UTF-8", }, "extraArgs": ["-Zbuild-std=core,alloc"], // Enable device support and a wide set of features on the esp-rtos crate. diff --git a/firmware/acid-firmware/.cargo/config.toml b/firmware/acid-firmware/.cargo/config.toml index f937429..a15830b 100644 --- a/firmware/acid-firmware/.cargo/config.toml +++ b/firmware/acid-firmware/.cargo/config.toml @@ -29,6 +29,9 @@ ESP_LOG = "warn" ESP_BACKTRACE_CONFIG_BACKTRACE_FRAMES = "20" # This is overkill, but we can afford it. SLINT_FONT_SIZES = "8,11,10,12,13,14,15,16,18,20,22,24,32" +ACID_KEYMAP_PATH = "../keymaps/cz_coder.xkb" +ACID_COMPOSE_PATH = "../compose/cs_CZ Compose.txt" +ACID_COMPOSE_LOCALE = "cs_CZ.UTF-8" # Xtensa only: # Needed for nightly, until llvm upstream has support for Rust Xtensa. diff --git a/firmware/acid-firmware/README.md b/firmware/acid-firmware/README.md index 9e49b5c..2419748 100644 --- a/firmware/acid-firmware/README.md +++ b/firmware/acid-firmware/README.md @@ -61,7 +61,7 @@ On Windows, use PuTTY with a baudrate of 115200. To generate an English (US) keymap, the following command may be used: -`xkbcli compile-keymap --include [path-to-xkb-directory] --layout us >my_compose.txt` +`xkbcli compile-keymap --include [path-to-xkb-directory] --layout us >my_keymap.xkb` Substitute `us` for any other 2-letter country code. @@ -80,7 +80,18 @@ Use libxkbcommon's `xkbcli` to compile a standalone compose file: Compose files to replace `[path-to-Compose-file]` with may be found in: * the `/usr/share/X11/locale` directory on X11-based Linux distributions; - * the [`libx11` git repository](https://gitlab.freedesktop.org/xorg/lib/libx11/-/tree/master). There's an button to download it as a ZIP archive. + * the [`libx11` git repository](https://gitlab.freedesktop.org/xorg/lib/libx11/-/tree/master/nls). There's a button to download it as a ZIP archive. + +### Setup in GNOME + +#### Making all xkb layouts available + +By default, GNOME displays only the most common keyboard layouts (`xkb_symbols`). Other keyboard layouts can be made visible via: +```sh +gsettings set org.gnome.desktop.input-sources show-all-sources true +``` + +In order to use completely custom layouts, [this article](https://web.archive.org/web/20260212010717/https://staticf0x.github.io/2021/custom-keyboard-layout-in-x11-and-wayland.html) may be helpful. # esp32s3 BLE example diff --git a/firmware/acid-firmware/keymaps/cz_coder.xkb b/firmware/acid-firmware/keymaps/cz_coder.xkb new file mode 100644 index 0000000..eba05de --- /dev/null +++ b/firmware/acid-firmware/keymaps/cz_coder.xkb @@ -0,0 +1,1914 @@ +xkb_keymap { +xkb_keycodes "(unnamed)" { + minimum = 8; + maximum = 708; + = 9; + = 10; + = 11; + = 12; + = 13; + = 14; + = 15; + = 16; + = 17; + = 18; + = 19; + = 20; + = 21; + = 22; + = 23; + = 24; + = 25; + = 26; + = 27; + = 28; + = 29; + = 30; + = 31; + = 32; + = 33; + = 34; + = 35; + = 36; + = 37; + = 38; + = 39; + = 40; + = 41; + = 42; + = 43; + = 44; + = 45; + = 46; + = 47; + = 48; + = 49; + = 50; + = 51; + = 52; + = 53; + = 54; + = 55; + = 56; + = 57; + = 58; + = 59; + = 60; + = 61; + = 62; + = 63; + = 64; + = 65; + = 66; + = 67; + = 68; + = 69; + = 70; + = 71; + = 72; + = 73; + = 74; + = 75; + = 76; + = 77; + = 78; + = 79; + = 80; + = 81; + = 82; + = 83; + = 84; + = 85; + = 86; + = 87; + = 88; + = 89; + = 90; + = 91; + = 92; + = 94; + = 95; + = 96; + = 97; + = 98; + = 99; + = 100; + = 101; + = 102; + = 103; + = 104; + = 105; + = 106; + = 107; + = 108; + = 109; + = 110; + = 111; + = 112; + = 113; + = 114; + = 115; + = 116; + = 117; + = 118; + = 119; + = 120; + = 121; + = 122; + = 123; + = 124; + = 125; + = 126; + = 127; + = 128; + = 129; + = 130; + = 131; + = 132; + = 133; + = 134; + = 135; + = 136; + = 137; + = 138; + = 139; + = 140; + = 141; + = 142; + = 143; + = 144; + = 145; + = 146; + = 147; + = 148; + = 149; + = 150; + = 151; + = 152; + = 153; + = 154; + = 155; + = 156; + = 157; + = 158; + = 159; + = 160; + = 161; + = 162; + = 163; + = 164; + = 165; + = 166; + = 167; + = 168; + = 169; + = 170; + = 171; + = 172; + = 173; + = 174; + = 175; + = 176; + = 177; + = 178; + = 179; + = 180; + = 181; + = 182; + = 183; + = 184; + = 185; + = 186; + = 187; + = 188; + = 189; + = 190; + = 191; + = 192; + = 193; + = 194; + = 195; + = 196; + = 197; + = 198; + = 199; + = 200; + = 201; + = 202; + = 203; + = 204; + = 205; + = 206; + = 207; + = 208; + = 209; + = 210; + = 211; + = 212; + = 213; + = 214; + = 215; + = 216; + = 217; + = 218; + = 219; + = 220; + = 221; + = 222; + = 223; + = 224; + = 225; + = 226; + = 227; + = 228; + = 229; + = 230; + = 231; + = 232; + = 233; + = 234; + = 235; + = 236; + = 237; + = 238; + = 239; + = 240; + = 241; + = 242; + = 243; + = 244; + = 245; + = 246; + = 247; + = 248; + = 249; + = 250; + = 251; + = 252; + = 253; + = 254; + = 255; + = 256; + = 360; + = 361; + = 362; + = 363; + = 364; + = 365; + = 366; + = 367; + = 368; + = 369; + = 370; + = 371; + = 372; + = 373; + = 374; + = 375; + = 376; + = 377; + = 378; + = 379; + = 380; + = 381; + = 382; + = 383; + = 384; + = 385; + = 386; + = 387; + = 388; + = 389; + = 390; + = 391; + = 392; + = 393; + = 394; + = 395; + = 396; + = 397; + = 398; + = 399; + = 400; + = 401; + = 402; + = 403; + = 404; + = 405; + = 406; + = 407; + = 408; + = 409; + = 410; + = 411; + = 412; + = 413; + = 414; + = 415; + = 416; + = 417; + = 418; + = 419; + = 420; + = 421; + = 422; + = 423; + = 424; + = 425; + = 426; + = 427; + = 428; + = 429; + = 430; + = 431; + = 432; + = 433; + = 434; + = 435; + = 436; + = 437; + = 438; + = 439; + = 440; + = 441; + = 442; + = 443; + = 444; + = 445; + = 446; + = 447; + = 448; + = 449; + = 450; + = 452; + = 453; + = 454; + = 456; + = 457; + = 458; + = 459; + = 472; + = 473; + = 474; + = 475; + = 476; + = 477; + = 478; + = 479; + = 480; + = 481; + = 482; + = 483; + = 484; + = 485; + = 486; + = 487; + = 488; + = 489; + = 490; + = 491; + = 492; + = 493; + = 505; + = 506; + = 507; + = 508; + = 509; + = 510; + = 511; + = 512; + = 513; + = 514; + = 520; + = 521; + = 522; + = 523; + = 524; + = 525; + = 526; + = 527; + = 528; + = 529; + = 530; + = 531; + = 532; + = 533; + = 534; + = 535; + = 536; + = 537; + = 538; + = 539; + = 540; + = 541; + = 542; + = 543; + = 544; + = 545; + = 546; + = 547; + = 548; + = 549; + = 550; + = 568; + = 569; + = 584; + = 585; + = 586; + = 587; + = 588; + = 589; + = 590; + = 591; + = 592; + = 593; + = 594; + = 595; + = 596; + = 597; + = 600; + = 601; + = 616; + = 617; + = 618; + = 619; + = 620; + = 621; + = 622; + = 623; + = 624; + = 625; + = 626; + = 627; + = 628; + = 629; + = 630; + = 631; + = 632; + = 633; + = 634; + = 635; + = 636; + = 637; + = 638; + = 639; + = 640; + = 641; + = 642; + = 643; + = 644; + = 645; + = 646; + = 647; + = 648; + = 649; + = 650; + = 651; + = 652; + = 653; + = 654; + = 655; + = 656; + = 657; + = 664; + = 665; + = 666; + = 667; + = 668; + = 669; + = 670; + = 671; + = 672; + = 673; + = 674; + = 675; + = 676; + = 677; + = 678; + = 679; + = 680; + = 681; + = 682; + = 683; + = 684; + = 685; + = 686; + = 687; + = 688; + = 689; + = 690; + = 691; + = 692; + = 693; + = 696; + = 697; + = 698; + = 699; + = 700; + = 701; + = 704; + = 705; + = 706; + = 707; + = 708; + indicator 1 = "Caps Lock"; + indicator 2 = "Num Lock"; + indicator 3 = "Scroll Lock"; + indicator 4 = "Compose"; + indicator 5 = "Kana"; + indicator 6 = "Sleep"; + indicator 7 = "Suspend"; + indicator 8 = "Mute"; + indicator 9 = "Misc"; + indicator 10 = "Mail"; + indicator 11 = "Charging"; + indicator 12 = "Shift Lock"; + indicator 13 = "Group 2"; + indicator 14 = "Mouse Keys"; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; +}; + +xkb_types "(unnamed)" { + virtual_modifiers NumLock,Alt,LevelThree,LevelFive,Meta,Super,Hyper,ScrollLock; + + type "ONE_LEVEL" { + modifiers= none; + level_name[1]= "Any"; + }; + type "TWO_LEVEL" { + modifiers= Shift; + map[Shift]= 2; + level_name[1]= "Base"; + level_name[2]= "Shift"; + }; + type "ALPHABETIC" { + modifiers= Shift+Lock; + map[Shift]= 2; + map[Lock]= 2; + level_name[1]= "Base"; + level_name[2]= "Caps"; + }; + type "PC_ALT_LEVEL2" { + modifiers= Alt; + map[Alt]= 2; + level_name[1]= "Base"; + level_name[2]= "Alt"; + }; + type "PC_SUPER_LEVEL2" { + modifiers= Mod4; + map[Mod4]= 2; + level_name[1]= "Base"; + level_name[2]= "Super"; + }; + type "PC_CONTROL_LEVEL2" { + modifiers= Control; + map[Control]= 2; + level_name[1]= "Base"; + level_name[2]= "Control"; + }; + type "CTRL+ALT" { + modifiers= Shift+Control+Alt+LevelThree; + map[Shift]= 2; + preserve[Shift]= Shift; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + preserve[Shift+LevelThree]= Shift; + map[Control+Alt]= 5; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "Ctrl+Alt"; + }; + type "THREE_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "Level3"; + }; + type "FOUR_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_SEMIALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 4; + preserve[Shift+Lock+LevelThree]= Lock; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_KEYPAD" { + modifiers= Shift+NumLock+LevelThree; + map[Shift]= 2; + map[NumLock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[NumLock+LevelThree]= 4; + map[Shift+NumLock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift/Numlock"; + level_name[3]= "AltGr"; + level_name[4]= "Shift/Numlock AltGr"; + }; + type "FOUR_LEVEL_MIXED_KEYPAD" { + modifiers= Shift+NumLock+LevelThree; + map[Shift]= 2; + map[NumLock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[NumLock+LevelThree]= 3; + map[Shift+NumLock+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Number"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_X" { + modifiers= Shift+Control+Alt+LevelThree; + map[LevelThree]= 2; + map[Shift+LevelThree]= 3; + map[Control+Alt]= 4; + level_name[1]= "Base"; + level_name[2]= "AltGr"; + level_name[3]= "Shift AltGr"; + level_name[4]= "Ctrl+Alt"; + }; + type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 4; + preserve[Lock]= Lock; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Caps / Shift AltGr"; + }; + type "FOUR_LEVEL_PLUS_LOCK" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock]= 5; + map[Shift+Lock]= 2; + map[Lock+LevelThree]= 3; + map[Shift+Lock+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "Lock"; + }; + type "EIGHT_LEVEL" { + modifiers= Shift+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree+LevelFive; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[Lock+LevelFive]= 6; + map[Shift+Lock+LevelFive]= 5; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[Lock+LevelThree+LevelFive]= 8; + map[Shift+Lock+LevelThree+LevelFive]= 7; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_SEMIALPHABETIC" { + modifiers= Shift+Lock+LevelThree+LevelFive; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 4; + preserve[Shift+Lock+LevelThree]= Lock; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[Lock+LevelFive]= 6; + map[Shift+Lock+LevelFive]= 5; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[Lock+LevelThree+LevelFive]= 7; + preserve[Lock+LevelThree+LevelFive]= Lock; + map[Shift+Lock+LevelThree+LevelFive]= 8; + preserve[Shift+Lock+LevelThree+LevelFive]= Lock; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_WITH_LEVEL5_LOCK" { + modifiers= Shift+NumLock+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + preserve[Shift+LevelFive]= Shift; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[NumLock]= 5; + map[Shift+NumLock]= 6; + preserve[Shift+NumLock]= Shift; + map[NumLock+LevelThree]= 7; + map[Shift+NumLock+LevelThree]= 8; + map[Shift+NumLock+LevelFive]= 2; + map[NumLock+LevelThree+LevelFive]= 3; + map[Shift+NumLock+LevelThree+LevelFive]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_ALPHABETIC_WITH_LEVEL5_LOCK" { + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + preserve[Shift+LevelFive]= Shift; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[NumLock]= 5; + map[Shift+NumLock]= 6; + preserve[Shift+NumLock]= Shift; + map[NumLock+LevelThree]= 7; + map[Shift+NumLock+LevelThree]= 8; + map[Shift+NumLock+LevelFive]= 2; + map[NumLock+LevelThree+LevelFive]= 3; + map[Shift+NumLock+LevelThree+LevelFive]= 4; + map[Lock]= 2; + map[Lock+LevelThree]= 3; + map[Shift+Lock+LevelThree]= 4; + map[Lock+LevelFive]= 5; + map[Shift+Lock+LevelFive]= 6; + map[Lock+LevelThree+LevelFive]= 7; + map[Shift+Lock+LevelThree+LevelFive]= 8; + map[Lock+NumLock]= 5; + map[Shift+Lock+NumLock]= 6; + map[Lock+NumLock+LevelThree]= 7; + map[Shift+Lock+NumLock+LevelThree]= 8; + map[Lock+NumLock+LevelFive]= 2; + map[Lock+NumLock+LevelThree+LevelFive]= 3; + map[Shift+Lock+NumLock+LevelThree+LevelFive]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_BY_CTRL" { + modifiers= Shift+Lock+Control+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + map[Control]= 5; + map[Shift+Control]= 6; + map[Lock+Control]= 6; + map[Shift+Lock+Control]= 5; + map[Control+LevelThree]= 7; + map[Shift+Control+LevelThree]= 8; + map[Lock+Control+LevelThree]= 8; + map[Shift+Lock+Control+LevelThree]= 7; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "Level3"; + level_name[4]= "Shift Level3"; + level_name[5]= "Ctrl"; + level_name[6]= "Shift Ctrl"; + level_name[7]= "Level3 Ctrl"; + level_name[8]= "Shift Level3 Ctrl"; + }; + type "KEYPAD" { + modifiers= Shift+NumLock; + map[NumLock]= 2; + level_name[1]= "Base"; + level_name[2]= "Number"; + }; + type "SHIFT+ALT" { + modifiers= Shift+Alt; + map[Shift+Alt]= 2; + level_name[1]= "Base"; + level_name[2]= "Shift+Alt"; + }; +}; + +xkb_compatibility "(unnamed)" { + virtual_modifiers NumLock,Alt,LevelThree,LevelFive,Meta,Super,Hyper,ScrollLock; + + interpret.useModMapMods= AnyLevel; + interpret.repeat= False; + interpret ISO_Level2_Latch+Exactly(Shift) { + useModMapMods=level1; + action= LatchMods(modifiers=Shift,clearLocks,latchToLock); + }; + interpret Shift_Lock+AnyOf(Shift+Lock) { + action= LockMods(modifiers=Shift); + }; + interpret Num_Lock+AnyOf(all) { + virtualModifier= NumLock; + action= LockMods(modifiers=NumLock); + }; + interpret ISO_Level3_Shift+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= SetMods(modifiers=LevelThree,clearLocks); + }; + interpret ISO_Level3_Latch+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); + }; + interpret ISO_Level3_Lock+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= LockMods(modifiers=LevelThree); + }; + interpret Alt_L+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Alt_R+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Meta_L+AnyOf(all) { + virtualModifier= Meta; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Meta_R+AnyOf(all) { + virtualModifier= Meta; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Super_L+AnyOf(all) { + virtualModifier= Super; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Super_R+AnyOf(all) { + virtualModifier= Super; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Hyper_L+AnyOf(all) { + virtualModifier= Hyper; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Hyper_R+AnyOf(all) { + virtualModifier= Hyper; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Scroll_Lock+AnyOf(all) { + virtualModifier= ScrollLock; + action= LockMods(modifiers=modMapMods); + }; + interpret ISO_Level5_Shift+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= SetMods(modifiers=LevelFive,clearLocks); + }; + interpret ISO_Level5_Latch+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); + }; + interpret ISO_Level5_Lock+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= LockMods(modifiers=LevelFive); + }; + interpret Mode_switch+AnyOfOrNone(all) { + action= SetGroup(group=+1); + }; + interpret ISO_Level3_Shift+AnyOfOrNone(all) { + action= SetMods(modifiers=LevelThree,clearLocks); + }; + interpret ISO_Level3_Latch+AnyOfOrNone(all) { + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); + }; + interpret ISO_Level3_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=LevelThree); + }; + interpret ISO_Group_Latch+AnyOfOrNone(all) { + action= LatchGroup(group=2); + }; + interpret ISO_Next_Group+AnyOfOrNone(all) { + action= LockGroup(group=+1); + }; + interpret ISO_Prev_Group+AnyOfOrNone(all) { + action= LockGroup(group=-1); + }; + interpret ISO_First_Group+AnyOfOrNone(all) { + action= LockGroup(group=1); + }; + interpret ISO_Last_Group+AnyOfOrNone(all) { + action= LockGroup(group=2); + }; + interpret KP_1+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_End+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_2+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_Down+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_3+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_Next+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_4+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_Left+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_6+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_Right+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_7+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_Home+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_8+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_Up+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_9+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_Prior+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_5+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_Begin+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_F2+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_Divide+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_F3+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_Multiply+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_F4+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Subtract+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Separator+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_Add+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_0+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Insert+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Decimal+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret KP_Delete+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret F25+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret F26+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret F27+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret F29+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret F31+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret F33+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret F35+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret Pointer_Button_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default); + }; + interpret Pointer_Button1+AnyOfOrNone(all) { + action= PtrBtn(button=1); + }; + interpret Pointer_Button2+AnyOfOrNone(all) { + action= PtrBtn(button=2); + }; + interpret Pointer_Button3+AnyOfOrNone(all) { + action= PtrBtn(button=3); + }; + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default,count=2); + }; + interpret Pointer_DblClick1+AnyOfOrNone(all) { + action= PtrBtn(button=1,count=2); + }; + interpret Pointer_DblClick2+AnyOfOrNone(all) { + action= PtrBtn(button=2,count=2); + }; + interpret Pointer_DblClick3+AnyOfOrNone(all) { + action= PtrBtn(button=3,count=2); + }; + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { + action= LockPtrBtn(button=default,affect=both); + }; + interpret Pointer_Drag1+AnyOfOrNone(all) { + action= LockPtrBtn(button=1,affect=both); + }; + interpret Pointer_Drag2+AnyOfOrNone(all) { + action= LockPtrBtn(button=2,affect=both); + }; + interpret Pointer_Drag3+AnyOfOrNone(all) { + action= LockPtrBtn(button=3,affect=both); + }; + interpret Pointer_EnableKeys+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret Pointer_Accelerate+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=+1); + }; + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=-1); + }; + interpret AccessX_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXKeys); + }; + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXFeedback); + }; + interpret RepeatKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=RepeatKeys); + }; + interpret SlowKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=SlowKeys); + }; + interpret BounceKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=BounceKeys); + }; + interpret StickyKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=StickyKeys); + }; + interpret MouseKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Overlay1_Enable+AnyOfOrNone(all) { + action= LockControls(controls=none); + }; + interpret Overlay2_Enable+AnyOfOrNone(all) { + action= LockControls(controls=none); + }; + interpret AudibleBell_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AudibleBell); + }; + interpret Terminate_Server+AnyOfOrNone(all) { + action= Terminate(); + }; + interpret Alt_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Alt,clearLocks); + }; + interpret Alt_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Alt,clearLocks); + }; + interpret Meta_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Meta,clearLocks); + }; + interpret Meta_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Meta,clearLocks); + }; + interpret Super_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Super,clearLocks); + }; + interpret Super_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Super,clearLocks); + }; + interpret Hyper_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Hyper,clearLocks); + }; + interpret Hyper_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Hyper,clearLocks); + }; + interpret Shift_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Shift,clearLocks); + }; + interpret Shift_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Shift,clearLocks); + }; + interpret XF86Switch_VT_1+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=1,!same); + }; + interpret XF86Switch_VT_2+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=2,!same); + }; + interpret XF86Switch_VT_3+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=3,!same); + }; + interpret XF86Switch_VT_4+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=4,!same); + }; + interpret XF86Switch_VT_5+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=5,!same); + }; + interpret XF86Switch_VT_6+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=6,!same); + }; + interpret XF86Switch_VT_7+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=7,!same); + }; + interpret XF86Switch_VT_8+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=8,!same); + }; + interpret XF86Switch_VT_9+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=9,!same); + }; + interpret XF86Switch_VT_10+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=10,!same); + }; + interpret XF86Switch_VT_11+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=11,!same); + }; + interpret XF86Switch_VT_12+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=12,!same); + }; + interpret XF86LogGrabInfo+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); + }; + interpret XF86LogWindowTree+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); + }; + interpret XF86Next_VMode+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); + }; + interpret XF86Prev_VMode+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); + }; + interpret ISO_Level5_Shift+AnyOfOrNone(all) { + action= SetMods(modifiers=LevelFive,clearLocks); + }; + interpret ISO_Level5_Latch+AnyOfOrNone(all) { + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); + }; + interpret ISO_Level5_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=LevelFive); + }; + interpret Caps_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=Lock); + }; + interpret Any+Exactly(Lock) { + action= LockMods(modifiers=Lock); + }; + interpret Any+AnyOf(all) { + action= SetMods(modifiers=modMapMods,clearLocks); + }; + indicator "Caps Lock" { + whichModState= locked; + modifiers= Lock; + }; + indicator "Num Lock" { + whichModState= locked; + modifiers= NumLock; + }; + indicator "Scroll Lock" { + whichModState= locked; + modifiers= ScrollLock; + }; + indicator "Shift Lock" { + whichModState= locked; + modifiers= Shift; + }; + indicator "Group 2" { + groups= 0xfe; + }; + indicator "Mouse Keys" { + controls= MouseKeys; + }; +}; + +xkb_symbols "(unnamed)" { + name[Group1]="Czech (coder)"; + + key { [ Escape ] }; + key { [ 1, exclam ] }; + key { [ 2, at, ecaron, Ecaron ] }; + key { [ 3, numbersign, scaron, Scaron ] }; + key { [ 4, dollar, ccaron, Ccaron ] }; + key { [ 5, percent, rcaron, Rcaron ] }; + key { [ 6, asciicircum, zcaron, Zcaron ] }; + key { [ 7, ampersand, yacute, Yacute ] }; + key { [ 8, asterisk, aacute, Aacute ] }; + key { [ 9, parenleft, iacute, Iacute ] }; + key { [ 0, parenright, eacute, Eacute ] }; + key { [ minus, underscore ] }; + key { [ equal, plus, dead_acute, dead_caron ] }; + key { [ BackSpace, BackSpace ] }; + key { [ Tab, ISO_Left_Tab ] }; + key { [ q, Q ] }; + key { [ w, W ] }; + key { [ e, E, e, EuroSign ] }; + key { [ r, R ] }; + key { [ t, T ] }; + key { [ y, Y ] }; + key { [ u, U ] }; + key { [ i, I ] }; + key { [ o, O ] }; + key { [ p, P ] }; + key { [ bracketleft, braceleft, uacute, Uacute ] }; + key { [ bracketright, braceright ] }; + key { [ Return ] }; + key { [ Control_L ] }; + key { [ a, A ] }; + key { [ s, S ] }; + key { [ d, D ] }; + key { [ f, F ] }; + key { [ g, G ] }; + key { [ h, H ] }; + key { [ j, J ] }; + key { [ k, K ] }; + key { [ l, L ] }; + key { [ semicolon, colon, uring, Uring ] }; + key { [ apostrophe, quotedbl, section, quotedbl ] }; + key { [ grave, asciitilde, semicolon, dead_abovering ] }; + key { [ Shift_L ] }; + key { [ backslash, bar, dead_diaeresis, apostrophe ] }; + key { [ z, Z ] }; + key { [ x, X ] }; + key { [ c, C ] }; + key { [ v, V ] }; + key { [ b, B ] }; + key { [ n, N ] }; + key { [ m, M ] }; + key { [ comma, less ] }; + key { [ period, greater ] }; + key { [ slash, question ] }; + key { [ Shift_R ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] + }; + key { [ Alt_L, Meta_L ] }; + key { [ space ] }; + key { [ Caps_Lock ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] + }; + key { [ Num_Lock ] }; + key { [ Scroll_Lock ] }; + key { [ KP_Home, KP_7 ] }; + key { [ KP_Up, KP_8 ] }; + key { [ KP_Prior, KP_9 ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] + }; + key { [ KP_Left, KP_4 ] }; + key { [ KP_Begin, KP_5 ] }; + key { [ KP_Right, KP_6 ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] + }; + key { [ KP_End, KP_1 ] }; + key { [ KP_Down, KP_2 ] }; + key { [ KP_Next, KP_3 ] }; + key { [ KP_Insert, KP_0 ] }; + key { [ KP_Delete, KP_Decimal ] }; + key { [ ISO_Level3_Shift ] }; + key { [ less, greater, bar, brokenbar ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] + }; + key { [ Katakana ] }; + key { [ Hiragana ] }; + key { [ Henkan_Mode ] }; + key { [ Hiragana_Katakana ] }; + key { [ Muhenkan ] }; + key { [ KP_Enter ] }; + key { [ Control_R ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] + }; + key { + type= "PC_ALT_LEVEL2", + symbols[Group1]= [ Print, Sys_Req ] + }; + key { + type= "ONE_LEVEL", + symbols[Group1]= [ ISO_Level3_Shift ] + }; + key { [ Linefeed ] }; + key { [ Home ] }; + key { [ Up ] }; + key { [ Prior ] }; + key { [ Left ] }; + key { [ Right ] }; + key { [ End ] }; + key { [ Down ] }; + key { [ Next ] }; + key { [ Insert ] }; + key { [ Delete ] }; + key { [ XF86AudioMute ] }; + key { [ XF86AudioLowerVolume ] }; + key { [ XF86AudioRaiseVolume ] }; + key { [ XF86PowerOff ] }; + key { [ KP_Equal ] }; + key { [ plusminus ] }; + key { + type= "PC_CONTROL_LEVEL2", + symbols[Group1]= [ Pause, Break ] + }; + key { [ XF86LaunchA ] }; + key { [ KP_Decimal, KP_Decimal ] }; + key { [ Hangul ] }; + key { [ Hangul_Hanja ] }; + key { [ Super_L ] }; + key { [ Super_R ] }; + key { [ Menu ] }; + key { [ Cancel ] }; + key { [ Redo ] }; + key { [ SunProps ] }; + key { [ Undo ] }; + key { [ SunFront ] }; + key { [ XF86Copy ] }; + key { [ XF86Open ] }; + key { [ XF86Paste ] }; + key { [ Find ] }; + key { [ XF86Cut ] }; + key { [ Help ] }; + key { [ XF86MenuKB ] }; + key { [ XF86Calculator ] }; + key { [ XF86Sleep ] }; + key { [ XF86WakeUp ] }; + key { [ XF86Explorer ] }; + key { [ XF86Send ] }; + key { [ XF86Xfer ] }; + key { [ XF86Launch1 ] }; + key { [ XF86Launch2 ] }; + key { [ XF86WWW ] }; + key { [ XF86DOS ] }; + key { [ XF86ScreenSaver ] }; + key { [ XF86RotateWindows ] }; + key { [ XF86TaskPane ] }; + key { [ XF86Mail ] }; + key { [ XF86Favorites ] }; + key { [ XF86MyComputer ] }; + key { [ XF86Back ] }; + key { [ XF86Forward ] }; + key { [ XF86Eject ] }; + key { [ XF86Eject ] }; + key { [ XF86AudioNext ] }; + key { [ XF86AudioPlay, XF86AudioPause ] }; + key { [ XF86AudioPrev ] }; + key { [ XF86AudioStop, XF86Eject ] }; + key { [ XF86AudioRecord ] }; + key { [ XF86AudioRewind ] }; + key { [ XF86Phone ] }; + key { [ XF86Tools ] }; + key { [ XF86HomePage ] }; + key { [ XF86Reload ] }; + key { [ XF86Close ] }; + key { [ XF86ScrollUp ] }; + key { [ XF86ScrollDown ] }; + key { [ parenleft ] }; + key { [ parenright ] }; + key { [ XF86New ] }; + key { [ Redo ] }; + key { [ XF86Tools ] }; + key { [ XF86Launch5 ] }; + key { [ XF86Launch6 ] }; + key { [ XF86Launch7 ] }; + key { [ XF86Launch8 ] }; + key { [ XF86Launch9 ] }; + key { [ XF86AudioMicMute ] }; + key { [ XF86TouchpadToggle ] }; + key { [ XF86TouchpadOn ] }; + key { [ XF86TouchpadOff ] }; + key { [ ISO_Level5_Shift ] }; + key { [ NoSymbol, Alt_L ] }; + key { [ NoSymbol, Meta_L ] }; + key { [ NoSymbol, Super_L ] }; + key { [ NoSymbol, Hyper_L ] }; + key { [ XF86AudioPlay ] }; + key { [ XF86AudioPause ] }; + key { [ XF86Launch3 ] }; + key { [ XF86Launch4 ] }; + key { [ XF86LaunchB ] }; + key { [ XF86Suspend ] }; + key { [ XF86Close ] }; + key { [ XF86AudioPlay ] }; + key { [ XF86AudioForward ] }; + key { [ Print ] }; + key { [ XF86WebCam ] }; + key { [ XF86AudioPreset ] }; + key { [ XF86Mail ] }; + key { [ XF86Messenger ] }; + key { [ XF86Search ] }; + key { [ XF86Go ] }; + key { [ XF86Finance ] }; + key { [ XF86Game ] }; + key { [ XF86Shop ] }; + key { [ Cancel ] }; + key { [ XF86MonBrightnessDown ] }; + key { [ XF86MonBrightnessUp ] }; + key { [ XF86AudioMedia ] }; + key { [ XF86Display ] }; + key { [ XF86KbdLightOnOff ] }; + key { [ XF86KbdBrightnessDown ] }; + key { [ XF86KbdBrightnessUp ] }; + key { [ XF86Send ] }; + key { [ XF86Reply ] }; + key { [ XF86MailForward ] }; + key { [ XF86Save ] }; + key { [ XF86Documents ] }; + key { [ XF86Battery ] }; + key { [ XF86Bluetooth ] }; + key { [ XF86WLAN ] }; + key { [ XF86UWB ] }; + key { [ XF86Next_VMode ] }; + key { [ XF86Prev_VMode ] }; + key { [ XF86MonBrightnessCycle ] }; + key { [ XF86BrightnessAuto ] }; + key { [ XF86DisplayOff ] }; + key { [ XF86WWAN ] }; + key { [ XF86RFKill ] }; + key { [ XF86AudioMicMute ] }; + key { [ XF86Info ] }; + key { [ XF86Favorites ] }; + key { [ XF86CycleAngle ] }; + key { [ XF86FullScreen ] }; + key { [ XF86Keyboard ] }; + key { [ XF86AspectRatio ] }; + key { [ XF86DVD ] }; + key { [ XF86Audio ] }; + key { [ XF86Video ] }; + key { [ XF86Calendar ] }; + key { [ XF86ChannelUp ] }; + key { [ XF86ChannelDown ] }; + key { [ XF86AudioRandomPlay ] }; + key { [ XF86Break ] }; + key { [ XF86VideoPhone ] }; + key { [ XF86Game ] }; + key { [ XF86ZoomIn ] }; + key { [ XF86ZoomOut ] }; + key { [ XF86ZoomReset ] }; + key { [ XF86Word ] }; + key { [ XF86Editor ] }; + key { [ XF86Excel ] }; + key { [ XF86GraphicsEditor ] }; + key { [ XF86Presentation ] }; + key { [ XF86Database ] }; + key { [ XF86News ] }; + key { [ XF86Voicemail ] }; + key { [ XF86Addressbook ] }; + key { [ XF86Messenger ] }; + key { [ XF86DisplayToggle ] }; + key { [ XF86SpellCheck ] }; + key { [ XF86LogOff ] }; + key { [ dollar ] }; + key { [ EuroSign ] }; + key { [ XF86FrameBack ] }; + key { [ XF86FrameForward ] }; + key { [ XF86ContextMenu ] }; + key { [ XF86MediaRepeat ] }; + key { [ XF8610ChannelsUp ] }; + key { [ XF8610ChannelsDown ] }; + key { [ XF86Images ] }; + key { [ XF86NotificationCenter ] }; + key { [ XF86PickupPhone ] }; + key { [ XF86HangupPhone ] }; + key { [ XF86Fn ] }; + key { [ XF86Fn_Esc ] }; + key { [ XF86FnRightShift ] }; + key { [ braille_dot_1 ] }; + key { [ braille_dot_2 ] }; + key { [ braille_dot_3 ] }; + key { [ braille_dot_4 ] }; + key { [ braille_dot_5 ] }; + key { [ braille_dot_6 ] }; + key { [ braille_dot_7 ] }; + key { [ braille_dot_8 ] }; + key { [ braille_dot_9 ] }; + key { [ braille_dot_1 ] }; + key { [ XF86Numeric0 ] }; + key { [ XF86Numeric1 ] }; + key { [ XF86Numeric2 ] }; + key { [ XF86Numeric3 ] }; + key { [ XF86Numeric4 ] }; + key { [ XF86Numeric5 ] }; + key { [ XF86Numeric6 ] }; + key { [ XF86Numeric7 ] }; + key { [ XF86Numeric8 ] }; + key { [ XF86Numeric9 ] }; + key { [ XF86NumericStar ] }; + key { [ XF86NumericPound ] }; + key { [ XF86NumericA ] }; + key { [ XF86NumericB ] }; + key { [ XF86NumericC ] }; + key { [ XF86NumericD ] }; + key { [ XF86CameraFocus ] }; + key { [ XF86WPSButton ] }; + key { [ XF86TouchpadToggle ] }; + key { [ XF86TouchpadOn ] }; + key { [ XF86TouchpadOff ] }; + key { [ XF86CameraZoomIn ] }; + key { [ XF86CameraZoomOut ] }; + key { [ XF86CameraUp ] }; + key { [ XF86CameraDown ] }; + key { [ XF86CameraLeft ] }; + key { [ XF86CameraRight ] }; + key { [ XF86AttendantOn ] }; + key { [ XF86AttendantOff ] }; + key { [ XF86AttendantToggle ] }; + key { [ XF86LightsToggle ] }; + key { [ XF86ALSToggle ] }; + key { [ XF86RotationLockToggle ] }; + key { [ XF86Buttonconfig ] }; + key { [ XF86Taskmanager ] }; + key { [ XF86Journal ] }; + key { [ XF86ControlPanel ] }; + key { [ XF86AppSelect ] }; + key { [ XF86Screensaver ] }; + key { [ XF86VoiceCommand ] }; + key { [ XF86Assistant ] }; + key { [ ISO_Next_Group ] }; + key { [ XF86EmojiPicker ] }; + key { [ XF86Dictate ] }; + key { [ XF86CameraAccessEnable ] }; + key { [ XF86CameraAccessDisable ] }; + key { [ XF86CameraAccessToggle ] }; + key { [ XF86BrightnessMin ] }; + key { [ XF86BrightnessMax ] }; + key { [ XF86KbdInputAssistPrev ] }; + key { [ XF86KbdInputAssistNext ] }; + key { [ XF86KbdInputAssistPrevgroup ] }; + key { [ XF86KbdInputAssistNextgroup ] }; + key { [ XF86KbdInputAssistAccept ] }; + key { [ XF86KbdInputAssistCancel ] }; + key { [ XF86RightUp ] }; + key { [ XF86RightDown ] }; + key { [ XF86LeftUp ] }; + key { [ XF86LeftDown ] }; + key { [ XF86RootMenu ] }; + key { [ XF86MediaTopMenu ] }; + key { [ XF86Numeric11 ] }; + key { [ XF86Numeric12 ] }; + key { [ XF86AudioDesc ] }; + key { [ XF863DMode ] }; + key { [ XF86NextFavorite ] }; + key { [ XF86StopRecord ] }; + key { [ XF86PauseRecord ] }; + key { [ XF86VOD ] }; + key { [ XF86Unmute ] }; + key { [ XF86FastReverse ] }; + key { [ XF86SlowReverse ] }; + key { [ XF86Data ] }; + key { [ XF86OnScreenKeyboard ] }; + key { [ XF86PrivacyScreenToggle ] }; + key { [ XF86SelectiveScreenshot ] }; + key { [ XF86NextElement ] }; + key { [ XF86PreviousElement ] }; + key { [ XF86AutopilotEngageToggle ] }; + key { [ XF86MarkWaypoint ] }; + key { [ XF86Sos ] }; + key { [ XF86NavChart ] }; + key { [ XF86FishingChart ] }; + key { [ XF86SingleRangeRadar ] }; + key { [ XF86DualRangeRadar ] }; + key { [ XF86RadarOverlay ] }; + key { [ XF86TraditionalSonar ] }; + key { [ XF86ClearvuSonar ] }; + key { [ XF86SidevuSonar ] }; + key { [ XF86NavInfo ] }; + key { [ XF86BrightnessAdjust ] }; + key { [ XF86Macro1 ] }; + key { [ XF86Macro2 ] }; + key { [ XF86Macro3 ] }; + key { [ XF86Macro4 ] }; + key { [ XF86Macro5 ] }; + key { [ XF86Macro6 ] }; + key { [ XF86Macro7 ] }; + key { [ XF86Macro8 ] }; + key { [ XF86Macro9 ] }; + key { [ XF86Macro10 ] }; + key { [ XF86Macro11 ] }; + key { [ XF86Macro12 ] }; + key { [ XF86Macro13 ] }; + key { [ XF86Macro14 ] }; + key { [ XF86Macro15 ] }; + key { [ XF86Macro16 ] }; + key { [ XF86Macro17 ] }; + key { [ XF86Macro18 ] }; + key { [ XF86Macro19 ] }; + key { [ XF86Macro20 ] }; + key { [ XF86Macro21 ] }; + key { [ XF86Macro22 ] }; + key { [ XF86Macro23 ] }; + key { [ XF86Macro24 ] }; + key { [ XF86Macro25 ] }; + key { [ XF86Macro26 ] }; + key { [ XF86Macro27 ] }; + key { [ XF86Macro28 ] }; + key { [ XF86Macro29 ] }; + key { [ XF86Macro30 ] }; + key { [ XF86MacroRecordStart ] }; + key { [ XF86MacroRecordStop ] }; + key { [ XF86MacroPresetCycle ] }; + key { [ XF86MacroPreset1 ] }; + key { [ XF86MacroPreset2 ] }; + key { [ XF86MacroPreset3 ] }; + key { [ XF86KbdLcdMenu1 ] }; + key { [ XF86KbdLcdMenu2 ] }; + key { [ XF86KbdLcdMenu3 ] }; + key { [ XF86KbdLcdMenu4 ] }; + key { [ XF86KbdLcdMenu5 ] }; + modifier_map Shift { , }; + modifier_map Lock { }; + modifier_map Control { , }; + modifier_map Mod1 { , , }; + modifier_map Mod2 { }; + modifier_map Mod3 { }; + modifier_map Mod4 { , , , }; + modifier_map Mod5 { }; +}; + +}; + diff --git a/firmware/acid-firmware/src/keymap.rs b/firmware/acid-firmware/src/keymap.rs index 7a636d6..bd2dd98 100644 --- a/firmware/acid-firmware/src/keymap.rs +++ b/firmware/acid-firmware/src/keymap.rs @@ -1,5 +1,6 @@ use core::alloc::Layout; use core::fmt::Debug; +use core::ops::Index; use core::slice; use alloc::alloc::Allocator; @@ -24,7 +25,7 @@ use static_cell::StaticCell; use xkbcommon::xkb::{self, FeedResult, KeyDirection, Keysym, ModIndex, ModMask, Status}; use crate::matrix::{MATRIX_COLS, MATRIX_ROWS}; -use crate::util::DurationExt; +use crate::util::{DurationExt, get_file_name}; use crate::vial::CustomKeycodes; use crate::{KEYBOARD_REPORT_PROXY, PSRAM_ALLOCATOR}; @@ -67,9 +68,17 @@ pub const fn get_default_keymap() -> [[[KeyAction; MATRIX_COLS]; MATRIX_ROWS]; N } pub fn create_hid_report_interceptor() -> impl Future { - const KEYMAP_STRING: &str = include_str!("../keymaps/cz.xkb"); - const COMPOSE_MAP_STRING: &str = include_str!("../compose/cs_CZ Compose.txt"); - const COMPOSE_MAP_LOCALE: &str = "cs_CZ.UTF-8"; + // TODO: Use `include_dir` or similar to support multiple keymaps. + const KEYMAP_NAME: &str = get_file_name(env!("ACID_KEYMAP_PATH")); + const KEYMAP_STRING: &str = include_str!(env!("ACID_KEYMAP_PATH")); + const COMPOSE_MAP_NAME: &str = get_file_name(env!("ACID_COMPOSE_PATH")); + const COMPOSE_MAP_STRING: &str = include_str!(env!("ACID_COMPOSE_PATH")); + // E.g. `cs_CZ.UTF-8` + const COMPOSE_MAP_LOCALE: &str = env!("ACID_COMPOSE_LOCALE"); + + info!( + "Keymap: {KEYMAP_NAME:?}, compose: {COMPOSE_MAP_NAME:?}, compose locale: {COMPOSE_MAP_LOCALE:?}" + ); let keymap_string_buffer = unsafe { let allocation = PSRAM_ALLOCATOR.alloc_caps( @@ -230,6 +239,7 @@ async fn send_strings_to_host( continue; } + // TODO: Check whether this is necessary, otherwise remove. rmk::channel::KEYBOARD_REPORT_RECEIVER .send(Report::KeyboardReport(KeyboardReport { modifier, @@ -243,7 +253,9 @@ async fn send_strings_to_host( })) .await; - keycodes_vec.push(keycode.keycode); + keycodes_vec + .push(keycode.keycode) + .expect("no space for the main keycode"); warn!( "Sending HID keycode 0x{:02x} with modifier 0x{:02x} (xkb mask 0x{:02x}) as keycode sequence {keycodes_vec:02x?}", keycode.keycode, modifier, keycode.mod_mask @@ -480,6 +492,11 @@ pub fn string_to_hid_keycodes( continue; }; + if (0x65..USB_HID_LEFT_CTRL).contains(&hid_keycode) { + warn!("Skipping candidate because is in a poorly supported range of HID keycodes."); + continue; + } + let Some(&simplest_mod_mask) = masks.iter().min() else { error!("No mod mask found for this key."); continue; diff --git a/firmware/acid-firmware/src/ui/mod.rs b/firmware/acid-firmware/src/ui/mod.rs index 7a55a23..f38d093 100644 --- a/firmware/acid-firmware/src/ui/mod.rs +++ b/firmware/acid-firmware/src/ui/mod.rs @@ -17,7 +17,7 @@ use hex::FromHexError; use i_slint_core::model::{ModelChangeListener, ModelChangeListenerContainer}; use log::{error, info, warn}; use password_hash::Key; -use rmk::futures::TryFutureExt; +use rmk::futures::{FutureExt, TryFutureExt}; use slint::{ Model, ModelExt, ModelNotify, ModelRc, ModelTracker, SharedString, StandardListViewItem, VecModel, @@ -765,14 +765,14 @@ impl AppViewTrait for StateUserSites { warn!("Site password: {site_password:?}"); - for character in site_password.chars() { - let keysym = xkbcommon::xkb::utf32_to_keysym(character as u32); - } - slint::spawn_local({ let username = user_sites.username.clone(); let db = state.db.clone(); async move { + // Send password to the host. + OUTPUT_STRING_CHANNEL.send(site_password).await; + + // Update the stored site. let mut write = db.write_transaction().await; let key = DbKey::new(DbPathSpectreUserSite { user_sites: DbPathSpectreUserSites { diff --git a/firmware/acid-firmware/src/util.rs b/firmware/acid-firmware/src/util.rs index b601a56..80abdf4 100644 --- a/firmware/acid-firmware/src/util.rs +++ b/firmware/acid-firmware/src/util.rs @@ -24,3 +24,25 @@ impl DurationExt for Duration { FormattedDuration(self) } } + +pub const fn get_file_name(path: &str) -> &str { + let path = path.as_bytes(); + let mut start_index = path.len() as isize; + + loop { + start_index -= 1; + + if start_index < 0 + || path[start_index as usize] == b'/' + || path[start_index as usize] == b'\\' + { + start_index += 1; + break; + } + } + + match str::from_utf8(path.split_at(start_index as usize).1) { + Ok(substring) => substring, + Err(_) => panic!("Failed to extract the file name from a path."), + } +}