diff --git a/NEWS b/NEWS index e3c5b77b..a332cbad 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +squeekboard 1.42.2 +------------------ +Released November 2024 +* Fixes: + * Compatibility: Squeekboard should now work better with apps that do not use the text-input-protocol of Wayland and rely on specific keycodes being assigned to specific characters/functions. + * Documentation: The recommended settings for creating layouts while using Phoc in a nested session, have been updated to work correctly with the changes to the scaling-algorithm. +* Contributors: + * MoonlightWave-12 + squeekboard 1.42.1 ------------------ Released October 2024 diff --git a/debian/changelog b/debian/changelog index c69ab470..cd5a881f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +squeekboard (1.42.2) experimental; urgency=medium + + * keyboard.rs: Add more keycodes and sort those + * keyboard.rs: Add keycode to the keymap with BackSpace if there is no other + * doc/layouts.md: Update recommended settings for creating layouts + + -- MoonlightWave-12 <135532-MoonlightWave-12@users.noreply.gitlab.gnome.org> Wed, 06 Nov 2024 11:24:22 +0100 + squeekboard (1.42.1) experimental; urgency=medium [ Sebastian Krzyszkowiak ] diff --git a/doc/layouts.md b/doc/layouts.md index a69776dc..1fd9fd3b 100644 --- a/doc/layouts.md +++ b/doc/layouts.md @@ -50,6 +50,9 @@ For testing the basic/compact shape: ```sh [output:WL-1] mode = 360x720 +phys_width = 60 +phys_height = 120 +scale = 1.00 ``` For testing the wide shape: @@ -57,8 +60,10 @@ For testing the wide shape: ```sh [output:WL-1] mode = 1280x800 +phys_width = 104 +phys_height = 65 +scale = 1.00 ``` -Make sure there is no `phys_height` or `phys_width` set. ### Layout-stretching diff --git a/meson.build b/meson.build index cb2de2da..a0a29cd9 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'squeekboard', 'c', 'rust', - version: '1.42.1', + version: '1.42.2', license: 'GPLv3', meson_version: '>=1.0.0', default_options: [ diff --git a/src/keyboard.rs b/src/keyboard.rs index f815c8a7..aa9a1d2c 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -116,15 +116,159 @@ pub fn generate_keycodes<'a, C: IntoIterator>( KEY_BACKSLASH, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH]; - HashMap::from_iter( + let keycode_offset = 8; + + let mut keycode_map = HashMap::from_iter( // Sort to remove a source of indeterminism in keycode assignment. sorted(key_names.into_iter()) - .zip(util::cycle_count((9..255).filter(|x| allowed.contains(&(x - 8))))) - .map(|(name, (code, keymap_idx))| ( + .zip(util::cycle_count((9..255).filter(|x| allowed.contains(&(x - keycode_offset))))) + .map(|(name, (mut code, mut keymap_idx))| { + // Some apps expect specific keycodes for certain characters/functions. + // Reserve the first 2 keymaps (0 and 1) for sorting those manually, + // and use keymap_idx 2 and higher for other keycodes, + // to not assign identical keycodes twice. + // TODO: Add the "Shift"-modifier for keycodes on keymap 1. + keymap_idx = keymap_idx + 2; + if name == "1" { code = KEY_1 + keycode_offset; keymap_idx = 0 } + if name == "2" { code = KEY_2 + keycode_offset; keymap_idx = 0 } + if name == "3" { code = KEY_3 + keycode_offset; keymap_idx = 0 } + if name == "4" { code = KEY_4 + keycode_offset; keymap_idx = 0 } + if name == "5" { code = KEY_5 + keycode_offset; keymap_idx = 0 } + if name == "6" { code = KEY_6 + keycode_offset; keymap_idx = 0 } + if name == "7" { code = KEY_7 + keycode_offset; keymap_idx = 0 } + if name == "8" { code = KEY_8 + keycode_offset; keymap_idx = 0 } + if name == "9" { code = KEY_9 + keycode_offset; keymap_idx = 0 } + if name == "0" { code = KEY_0 + keycode_offset; keymap_idx = 0 } + if name == "a" { code = KEY_A + keycode_offset; keymap_idx = 0 } + if name == "b" { code = KEY_B + keycode_offset; keymap_idx = 0 } + if name == "c" { code = KEY_C + keycode_offset; keymap_idx = 0 } + if name == "d" { code = KEY_D + keycode_offset; keymap_idx = 0 } + if name == "e" { code = KEY_E + keycode_offset; keymap_idx = 0 } + if name == "f" { code = KEY_F + keycode_offset; keymap_idx = 0 } + if name == "g" { code = KEY_G + keycode_offset; keymap_idx = 0 } + if name == "h" { code = KEY_H + keycode_offset; keymap_idx = 0 } + if name == "i" { code = KEY_I + keycode_offset; keymap_idx = 0 } + if name == "j" { code = KEY_J + keycode_offset; keymap_idx = 0 } + if name == "k" { code = KEY_K + keycode_offset; keymap_idx = 0 } + if name == "l" { code = KEY_L + keycode_offset; keymap_idx = 0 } + if name == "m" { code = KEY_M + keycode_offset; keymap_idx = 0 } + if name == "n" { code = KEY_N + keycode_offset; keymap_idx = 0 } + if name == "o" { code = KEY_O + keycode_offset; keymap_idx = 0 } + if name == "p" { code = KEY_P + keycode_offset; keymap_idx = 0 } + if name == "q" { code = KEY_Q + keycode_offset; keymap_idx = 0 } + if name == "r" { code = KEY_R + keycode_offset; keymap_idx = 0 } + if name == "s" { code = KEY_S + keycode_offset; keymap_idx = 0 } + if name == "t" { code = KEY_T + keycode_offset; keymap_idx = 0 } + if name == "u" { code = KEY_U + keycode_offset; keymap_idx = 0 } + if name == "v" { code = KEY_V + keycode_offset; keymap_idx = 0 } + if name == "w" { code = KEY_W + keycode_offset; keymap_idx = 0 } + if name == "x" { code = KEY_X + keycode_offset; keymap_idx = 0 } + if name == "y" { code = KEY_Y + keycode_offset; keymap_idx = 0 } + if name == "z" { code = KEY_Z + keycode_offset; keymap_idx = 0 } + if name == "A" { code = KEY_A + keycode_offset; keymap_idx = 1 } + if name == "B" { code = KEY_B + keycode_offset; keymap_idx = 1 } + if name == "C" { code = KEY_C + keycode_offset; keymap_idx = 1 } + if name == "D" { code = KEY_D + keycode_offset; keymap_idx = 1 } + if name == "E" { code = KEY_E + keycode_offset; keymap_idx = 1 } + if name == "F" { code = KEY_F + keycode_offset; keymap_idx = 1 } + if name == "G" { code = KEY_G + keycode_offset; keymap_idx = 1 } + if name == "H" { code = KEY_H + keycode_offset; keymap_idx = 1 } + if name == "I" { code = KEY_I + keycode_offset; keymap_idx = 1 } + if name == "J" { code = KEY_J + keycode_offset; keymap_idx = 1 } + if name == "K" { code = KEY_K + keycode_offset; keymap_idx = 1 } + if name == "L" { code = KEY_L + keycode_offset; keymap_idx = 1 } + if name == "M" { code = KEY_M + keycode_offset; keymap_idx = 1 } + if name == "N" { code = KEY_N + keycode_offset; keymap_idx = 1 } + if name == "O" { code = KEY_O + keycode_offset; keymap_idx = 1 } + if name == "P" { code = KEY_P + keycode_offset; keymap_idx = 1 } + if name == "Q" { code = KEY_Q + keycode_offset; keymap_idx = 1 } + if name == "R" { code = KEY_R + keycode_offset; keymap_idx = 1 } + if name == "S" { code = KEY_S + keycode_offset; keymap_idx = 1 } + if name == "T" { code = KEY_T + keycode_offset; keymap_idx = 1 } + if name == "U" { code = KEY_U + keycode_offset; keymap_idx = 1 } + if name == "V" { code = KEY_V + keycode_offset; keymap_idx = 1 } + if name == "W" { code = KEY_W + keycode_offset; keymap_idx = 1 } + if name == "X" { code = KEY_X + keycode_offset; keymap_idx = 1 } + if name == "Y" { code = KEY_Y + keycode_offset; keymap_idx = 1 } + if name == "Z" { code = KEY_Z + keycode_offset; keymap_idx = 1 } + if name == "U0021" { code = KEY_1 + keycode_offset; keymap_idx = 1 } + if name == "U0040" { code = KEY_2 + keycode_offset; keymap_idx = 1 } + if name == "U0023" { code = KEY_3 + keycode_offset; keymap_idx = 1 } + if name == "U0024" { code = KEY_4 + keycode_offset; keymap_idx = 1 } + if name == "U0025" { code = KEY_5 + keycode_offset; keymap_idx = 1 } + if name == "U005E" { code = KEY_6 + keycode_offset; keymap_idx = 1 } + if name == "U0026" { code = KEY_7 + keycode_offset; keymap_idx = 1 } + if name == "U002A" { code = KEY_8 + keycode_offset; keymap_idx = 1 } + if name == "U0028" { code = KEY_9 + keycode_offset; keymap_idx = 1 } + if name == "U0029" { code = KEY_0 + keycode_offset; keymap_idx = 1 } + if name == "U002D" { code = KEY_MINUS + keycode_offset; keymap_idx = 0 } + if name == "U005F" { code = KEY_MINUS + keycode_offset; keymap_idx = 1 } + if name == "U003D" { code = KEY_EQUAL + keycode_offset; keymap_idx = 0 } + if name == "U002B" { code = KEY_EQUAL + keycode_offset; keymap_idx = 1 } + if name == "U005B" { code = KEY_LEFTBRACE + keycode_offset; keymap_idx = 0 } + if name == "U007B" { code = KEY_LEFTBRACE + keycode_offset; keymap_idx = 1 } + if name == "U005D" { code = KEY_RIGHTBRACE + keycode_offset; keymap_idx = 0 } + if name == "U007D" { code = KEY_RIGHTBRACE + keycode_offset; keymap_idx = 1 } + if name == "U003B" { code = KEY_SEMICOLON + keycode_offset; keymap_idx = 0 } + if name == "U003A" { code = KEY_SEMICOLON + keycode_offset; keymap_idx = 1 } + if name == "U0027" { code = KEY_APOSTROPHE + keycode_offset; keymap_idx = 0 } + if name == "U0022" { code = KEY_APOSTROPHE + keycode_offset; keymap_idx = 1 } + if name == "U00B4" { code = KEY_GRAVE + keycode_offset; keymap_idx = 0 } + if name == "U007E" { code = KEY_GRAVE + keycode_offset; keymap_idx = 1 } + if name == "U005C" { code = KEY_BACKSLASH + keycode_offset; keymap_idx = 0 } + if name == "U007C" { code = KEY_BACKSLASH + keycode_offset; keymap_idx = 1 } + if name == "U002C" { code = KEY_COMMA + keycode_offset; keymap_idx = 0 } + if name == "U003C" { code = KEY_COMMA + keycode_offset; keymap_idx = 1 } + if name == "U002E" { code = KEY_DOT + keycode_offset; keymap_idx = 0 } + if name == "U003E" { code = KEY_DOT + keycode_offset; keymap_idx = 1 } + if name == "U002F" { code = KEY_SLASH + keycode_offset; keymap_idx = 0 } + if name == "U003F" { code = KEY_SLASH + keycode_offset; keymap_idx = 1 } + if name == "U0020" { code = KEY_SPACE + keycode_offset; keymap_idx = 0 } + if name == "BackSpace" { code = KEY_BACKSPACE + keycode_offset; keymap_idx = 0 } + if name == "Delete" { code = KEY_DELETE + keycode_offset; keymap_idx = 0 } + if name == "Down" { code = KEY_DOWN + keycode_offset; keymap_idx = 0 } + if name == "Left" { code = KEY_LEFT + keycode_offset; keymap_idx = 0 } + if name == "Right" { code = KEY_RIGHT + keycode_offset; keymap_idx = 0 } + if name == "Up" { code = KEY_UP + keycode_offset; keymap_idx = 0 } + if name == "End" { code = KEY_END + keycode_offset; keymap_idx = 0 } + if name == "Escape" { code = KEY_ESC + keycode_offset; keymap_idx = 0 } + if name == "F1" { code = KEY_F1 + keycode_offset; keymap_idx = 0 } + if name == "F2" { code = KEY_F2 + keycode_offset; keymap_idx = 0 } + if name == "F3" { code = KEY_F3 + keycode_offset; keymap_idx = 0 } + if name == "F4" { code = KEY_F4 + keycode_offset; keymap_idx = 0 } + if name == "F5" { code = KEY_F5 + keycode_offset; keymap_idx = 0 } + if name == "F6" { code = KEY_F6 + keycode_offset; keymap_idx = 0 } + if name == "F7" { code = KEY_F7 + keycode_offset; keymap_idx = 0 } + if name == "F8" { code = KEY_F8 + keycode_offset; keymap_idx = 0 } + if name == "F9" { code = KEY_F9 + keycode_offset; keymap_idx = 0 } + if name == "F10" { code = KEY_F10 + keycode_offset; keymap_idx = 0 } + if name == "F11" { code = KEY_F11 + keycode_offset; keymap_idx = 0 } + if name == "F12" { code = KEY_F12 + keycode_offset; keymap_idx = 0 } + if name == "Home" { code = KEY_HOME + keycode_offset; keymap_idx = 0 } + if name == "Insert" { code = KEY_INSERT + keycode_offset; keymap_idx = 0 } + if name == "Menu" { code = KEY_MENU + keycode_offset; keymap_idx = 0 } + if name == "Page_Down" { code = KEY_PAGEDOWN + keycode_offset; keymap_idx = 0 } + if name == "Page_Up" { code = KEY_PAGEUP + keycode_offset; keymap_idx = 0 } + if name == "Pause" { code = KEY_PAUSE + keycode_offset; keymap_idx = 0 } + if name == "Return" { code = KEY_ENTER + keycode_offset; keymap_idx = 0 } + if name == "Tab" { code = KEY_TAB + keycode_offset; keymap_idx = 0 } + ( String::from(name), KeyCode { code, keymap_idx }, - )) - ) + )}) + ); + // Workaround: BackSpace does not work with `tools/entry.py` (made with GTK3), + // if the keymap with BackSpace does not contain any other keycodes. + // This should only happen for the emoji-layout or incomplete custom-layouts, + // because the layout-tests for normal layouts check for the presence of a button for Return. + // This does add an "Unknown"-keycode, if necessary, to let BackSpace work anyway. + if !HashMap::contains_key(&keycode_map, &"Return".to_string()) { + HashMap::insert(&mut keycode_map, + "Unknown".to_string(), + KeyCode { code: KEY_UNKNOWN + keycode_offset, keymap_idx: 0 } + ); + } + keycode_map } #[derive(Debug)]