{"id":19831751,"url":"https://github.com/mateolafalce/k_board","last_synced_at":"2025-05-01T16:32:23.426Z","repository":{"id":200126993,"uuid":"702527496","full_name":"mateolafalce/k_board","owner":"mateolafalce","description":"A lightweight keyboard mannager developed for dynamic programs by listening to keyboard events in raw mode (without the need to press enter). The handler has all keyboard events.","archived":false,"fork":false,"pushed_at":"2024-08-15T11:49:43.000Z","size":62,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-31T12:13:04.818Z","etag":null,"topics":["keyboard","mannager","rawinput","rust","tty","tui"],"latest_commit_sha":null,"homepage":"https://github.com/mateolafalce/k_board","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mateolafalce.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-09T13:41:15.000Z","updated_at":"2024-10-10T06:36:29.000Z","dependencies_parsed_at":"2023-12-28T00:57:27.290Z","dependency_job_id":"69785a48-dc6e-4562-a3dc-19f877ffa252","html_url":"https://github.com/mateolafalce/k_board","commit_stats":null,"previous_names":["mateolafalce/k_board"],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateolafalce%2Fk_board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateolafalce%2Fk_board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateolafalce%2Fk_board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateolafalce%2Fk_board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mateolafalce","download_url":"https://codeload.github.com/mateolafalce/k_board/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224266904,"owners_count":17283226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["keyboard","mannager","rawinput","rust","tty","tui"],"created_at":"2024-11-12T11:34:23.141Z","updated_at":"2025-05-01T16:32:23.408Z","avatar_url":"https://github.com/mateolafalce.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# k_board\n\n[\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/v/k_board.svg?style=for-the-badge\u0026color=fc8d62\u0026logo=rust\" height=\"20\"\u003e](https://crates.io/crates/k_board)\n[\u003cimg alt=\"github\" src=\"https://img.shields.io/badge/github-mateolafalce/k__board-8da0cb?style=for-the-badge\u0026labelColor=555555\u0026logo=github\" height=\"20\"\u003e](https://github.com/mateolafalce/k_board)\n[\u003cimg alt=\"docs.rs\" src=\"https://img.shields.io/badge/docs.rs-k__board-66c2a5?style=for-the-badge\u0026labelColor=555555\u0026logo=docs.rs\" height=\"20\"\u003e](https://docs.rs/k_board)\n\n\u003c/div\u003e\n\n\nA lightweight keyboard mannager developed for dynamic programs by listening to keyboard events in raw mode (without the need to press enter). The handler has all the standard events of a western keyboard.\n\n- Only for Gnu/Linux distributions\n\n```rust\npub enum Keys {\n    Up,\n    Down,\n    Left,\n    Right,\n    Enter,\n    Space,\n    Delete,\n    Escape,\n    Char(char)\n    F(u8),\n    Ctrl(char),\n    Alt(char),\n    AltGr(char),\n    Null,\n}\n```\n\n---\n\n## Examples\n\n\u003cdetails\u003e\n\u003csummary\u003eArrows keys \u0026 enter for dynamic menus\u003c/summary\u003e\n\nSimply `cargo add k_board`. No features.\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    menu(0);\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Up =\u003e menu(0),\n            Keys::Down =\u003e menu(1),\n            Keys::Enter =\u003e break,\n            _ =\u003e {}\n        }\n    }\n}\n\nfn menu(operation: u8) {\n    std::process::Command::new(\"clear\").status().unwrap();\n    let mut op: Vec\u003cchar\u003e = vec!['*', ' '];\n    if operation == 1 {\n        op[0] = ' ';\n        op[1] = '*';\n    }\n    println!(\n        \"[{}] I use k_board lightweight software\\n[{}] I use heavyweight software\",\n        op[0], op[1]\n    );\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCtrl + key, for standar cli events\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"ctrl_lower_letter\", \"ctrl_upper_letter\", \"lower_letter\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Ctrl('c') =\u003e copy_terminal(),\n            Keys::Ctrl('s') =\u003e paste_into_terminal(),\n            // remember upper \u0026 lower case in Ctrl + key is the same hex code\n            Keys::Ctrl('a') =\u003e do_this(),\n            Keys::Ctrl('A') =\u003e do_this(),\n            Keys::Char('q') =\u003e break,\n            _ =\u003e (),\n        }\n    }\n}\n\nfn copy_terminal() {}\nfn paste_into_terminal() {}\nfn reduce_screen() {}\nfn zoom_screen() {}\nfn do_this() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eGet the F1, F2, F3 ...\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"f\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::F(5) =\u003e update_screen(),\n            Keys::F(9) =\u003e full_screen(),\n            Keys::Enter =\u003e break,\n            _ =\u003e {}\n        }\n    }\n}\n\nfn update_screen() {}\nfn full_screen() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWhat number you press?\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"numbers\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Char('0') =\u003e break,\n            Keys::Char('1') =\u003e download(),\n            Keys::Char('2') =\u003e see_file(),\n            Keys::Char('3') =\u003e share(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn download() {}\nfn see_file() {}\nfn share() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCalculator\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"numbers\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\nuse std::io;\n\nfn main() {\n    let mut result: f64 = 0.0;\n    let first: f64 = 10.0;\n    let second: f64 = 5.69;\n    let operation: i8 = get_operation();\n    match operation {\n        0 =\u003e result = first + second,\n        1 =\u003e result = first - second,\n        2 =\u003e result = first * second,\n        3 =\u003e {\n            if second != 0.0 {\n                result = first / second\n            }\n        }\n        _ =\u003e {}\n    }\n    println!(\"The result is: {}\", result);\n}\n\n\nfn get_operation() -\u003e i8 {\n    let mut operation: i8 = 0;\n    menu(\u0026mut operation, 0);\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Up =\u003e menu(\u0026mut operation, -1),\n            Keys::Down =\u003e menu(\u0026mut operation, 1),\n            Keys::Enter =\u003e break,\n            _ =\u003e {}\n        }\n    }\n    operation\n}\n\nfn menu(operation: \u0026mut i8, selection: i8) {\n    std::process::Command::new(\"clear\").status().unwrap();\n    if *operation \u003e 0 || *operation \u003c 3 {\n        *operation += selection;\n    }\n    let mut op = vec![' ', ' ', ' ', ' '];\n    for i in 0..4 {\n        if i == *operation {\n            op[i as usize] = '*';\n        }\n    }\n    println!(\n        \"{} Add\\n{} Subtract\\n{} Multiply\\n{} Divide\",\n        op[0], op[1], op[2], op[3]\n    );\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eESC, simbols, etc\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"standar\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Escape =\u003e break,\n            Keys::Space =\u003e jump(),\n            Keys::Char('$') =\u003e money(),\n            Keys::Char('@') =\u003e email(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn jump() {}\nfn money() {}\nfn email() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCtrl +  \u0026 Ctrl - for screen size\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"ctrl_standar\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Enter =\u003e break,\n            Keys::Ctrl('-') =\u003e less_zoom(),\n            Keys::Ctrl('+') =\u003e zoom(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn less_zoom() {}\nfn zoom() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAlt + key\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"alt_lower_letter\", \"alt_upper_letter\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Enter =\u003e break,\n            Keys::Alt('a') =\u003e shy(),\n            Keys::Alt('A') =\u003e angry(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn shy() {}\nfn angry() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eGet lower \u0026 upper letters\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"lower_letter\", \"upper_letter\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Enter =\u003e break,\n            Keys::Char('b') =\u003e lower_case(),\n            Keys::Char('B') =\u003e upper_case(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn lower_case() {}\nfn upper_case() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eGet Alt Gr + key\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"alt_gr_lower_letter\", \"alt_gr_upper_letter\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Enter =\u003e break,\n            Keys::AltGr('l') =\u003e f1(),\n            Keys::AltGr('L') =\u003e f2(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn f1() {}\nfn f2() {}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCtrl, Alt \u0026 Alr Gr + number\u003c/summary\u003e\n\n```toml\n[dependencies]\nk_board = { version = \"1.3.1\", features = [\"ctrl_numbers\", \"alt_numbers\", \"alt_gr_numbers\"] }\n```\n\n```rust\nuse k_board::{keyboard::Keyboard, keys::Keys};\n\nfn main() {\n    let keyboard = Keyboard::new();\n    for key in keyboard {\n        match key {\n            Keys::Enter =\u003e break,\n            Keys::Ctrl('0') =\u003e execute(),\n            Keys::Alt('1') =\u003e read(),\n            Keys::AltGr('2') =\u003e write(),\n            _ =\u003e {}\n        }\n    }\n}\n\nfn execute() {}\nfn read() {}\nfn write() {}\n```\n\n\u003c/details\u003e\n\n---\n\n## Contributing \n\nFeel free to contribute to the repository. Run the bash command below to make all ci/cd actions successful. Below, a fragment that allows you to visualize in hexadecimal the key or the event executed on your keyboard.\n\n```bash\nclear \u0026\u0026 \ncargo fmt \u0026\u0026\ncargo clippy \u0026\u0026\ncargo build --all-features\n```\n\n```rust\nuse k_board::termio::{restore_termios, setup_raw_mode, termios};\nuse std::io::{Read, Write};\n\nfn main() -\u003e std::io::Result\u003c()\u003e {\n    println!(\"Press a key or an keyboard event!\");\n    loop {\n        let _ = get_key();\n    }\n}\n\npub fn get_key() -\u003e std::io::Result\u003c()\u003e {\n    let termios_enviroment: termios = setup_raw_mode()?;\n    std::io::stdout().flush().unwrap();\n    let mut buffer: [u8; 3] = [0; 3];\n    #[allow(clippy::unused_io_amount)]\n    std::io::stdin().read(\u0026mut buffer)?;\n    if buffer[0] != 0x00 {\n        println!(\n            \"[0x{:x?}, 0x{:x?}, 0x{:x?}]\",\n            buffer[0], buffer[1], buffer[2]\n        );\n    }\n    std::io::stdout().flush().unwrap();\n    restore_termios(\u0026termios_enviroment)?;\n    Ok(())\n}\n```\n\n---\n\n## Why k_board?\n\nk_board, is designed for low-level development (direct interaction with the OS), boasts high and efficient performance compared to other libraries dedicated to keyboard interaction. This is demonstrated by performance tests conducted and that you can also perform to verify the technical superiority of this crate.\n\nThis has allowed k_board to be lighter than keyboard handling libraries without sacrificing quality and adding in-depth control to the developer over which part of the keyboard to manage and which not to.\n\n---\n\n## Features\n\nThe library has different features depending on the developer's needs.\n\n\u003cdetails\u003e\n\u003csummary\u003eno-feature(default)\u003c/summary\u003e\n\n```rust\npub const ARROWS_ENTER: [([u8; BYTES], Keys); 5] = [\n    ([0x1B, 0x5B, 0x41], Keys::Up),\n    ([0x1B, 0x5B, 0x42], Keys::Down),\n    ([0x1B, 0x5B, 0x43], Keys::Right),\n    ([0x1B, 0x5B, 0x44], Keys::Left),\n    ([0x0A, 0x00, 0x00], Keys::Enter),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003estandar\u003c/summary\u003e\n\n```rust\npub const STANDAR: [([u8; BYTES], Keys); 40] = [\n    ([0x1B, 0x5B, 0x48], Keys::Home),\n    ([0x09, 0x00, 0x00], Keys::Tab),\n    ([0x1B, 0x5B, 0x46], Keys::End),\n    ([0x1B, 0x5B, 0x5a], Keys::Backtab),\n    ([0x1b, 0x00, 0x00], Keys::Escape),\n    ([0x20, 0x00, 0x00], Keys::Space),\n    ([0x7F, 0x00, 0x00], Keys::Delete),\n    ([0x2b, 0x00, 0x00], Keys::Char('+')),\n    ([0x2d, 0x00, 0x00], Keys::Char('-')),\n    ([0x3d, 0x00, 0x00], Keys::Char('=')),\n    ([0x2f, 0x00, 0x00], Keys::Char('/')),\n    ([0x5c, 0x00, 0x00], Keys::Char('\\\\')),\n    ([0x5e, 0x00, 0x00], Keys::Char('^')),\n    ([0x2a, 0x00, 0x00], Keys::Char('*')),\n    ([0x2e, 0x00, 0x00], Keys::Char('.')),\n    ([0x2c, 0x00, 0x00], Keys::Char(',')),\n    ([0x23, 0x00, 0x00], Keys::Char('#')),\n    ([0x26, 0x00, 0x00], Keys::Char('\u0026')),\n    ([0x25, 0x00, 0x00], Keys::Char('%')),\n    ([0x7c, 0x00, 0x00], Keys::Char('|')),\n    ([0x24, 0x00, 0x00], Keys::Char('$')),\n    ([0x3a, 0x00, 0x00], Keys::Char(':')),\n    ([0x3b, 0x00, 0x00], Keys::Char(';')),\n    ([0xc2, 0xbf, 0x00], Keys::Char('¿')),\n    ([0x3f, 0x00, 0x00], Keys::Char('?')),\n    ([0x5b, 0x00, 0x00], Keys::Char('[')),\n    ([0x5d, 0x00, 0x00], Keys::Char(']')),\n    ([0x7b, 0x00, 0x00], Keys::Char('{')),\n    ([0x7d, 0x00, 0x00], Keys::Char('}')),\n    ([0x28, 0x00, 0x00], Keys::Char('(')),\n    ([0x29, 0x00, 0x00], Keys::Char(')')),\n    ([0x3c, 0x00, 0x00], Keys::Char('\u003c')),\n    ([0x3e, 0x00, 0x00], Keys::Char('\u003e')),\n    ([0x27, 0x00, 0x00], Keys::Char('\\'')),\n    ([0x40, 0x00, 0x00], Keys::Char('@')),\n    ([0xc2, 0xa1, 0x0], Keys::Char('¡')),\n    ([0x21, 0x00, 0x00], Keys::Char('!')),\n    ([0x22, 0x0, 0x0], Keys::Char('\"')),\n    ([0x60, 0x0, 0x0], Keys::Char('`')),\n    ([0xc2, 0xb4, 0x00], Keys::Char('´')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003enumbers\u003c/summary\u003e\n\n```rust\npub const NUMBERS: [([u8; BYTES], Keys); 10] = [\n    ([0x30, 0x00, 0x00], Keys::Char('0')),\n    ([0x31, 0x00, 0x00], Keys::Char('1')),\n    ([0x32, 0x00, 0x00], Keys::Char('2')),\n    ([0x33, 0x00, 0x00], Keys::Char('3')),\n    ([0x34, 0x00, 0x00], Keys::Char('4')),\n    ([0x35, 0x00, 0x00], Keys::Char('5')),\n    ([0x36, 0x00, 0x00], Keys::Char('6')),\n    ([0x37, 0x00, 0x00], Keys::Char('7')),\n    ([0x38, 0x00, 0x00], Keys::Char('8')),\n    ([0x39, 0x00, 0x00], Keys::Char('9')),\n];\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003elower_letter\u003c/summary\u003e\n\n```rust\npub const LOWER_LETTERS: [([u8; BYTES], Keys); 27] = [\n    ([0x61, 0x00, 0x00], Keys::Char('a')),\n    ([0x62, 0x00, 0x00], Keys::Char('b')),\n    ([0x63, 0x00, 0x00], Keys::Char('c')),\n    ([0x64, 0x00, 0x00], Keys::Char('d')),\n    ([0x65, 0x00, 0x00], Keys::Char('e')),\n    ([0x66, 0x00, 0x00], Keys::Char('f')),\n    ([0x67, 0x00, 0x00], Keys::Char('g')),\n    ([0x68, 0x00, 0x00], Keys::Char('h')),\n    ([0x69, 0x00, 0x00], Keys::Char('i')),\n    ([0x6A, 0x00, 0x00], Keys::Char('j')),\n    ([0x6B, 0x00, 0x00], Keys::Char('k')),\n    ([0x6C, 0x00, 0x00], Keys::Char('l')),\n    ([0x6D, 0x00, 0x00], Keys::Char('m')),\n    ([0x6E, 0x00, 0x00], Keys::Char('n')),\n    ([0xb1, 0xb1, 0x00], Keys::Char('ñ')),\n    ([0x6F, 0x00, 0x00], Keys::Char('o')),\n    ([0x70, 0x00, 0x00], Keys::Char('p')),\n    ([0x71, 0x00, 0x00], Keys::Char('q')),\n    ([0x72, 0x00, 0x00], Keys::Char('r')),\n    ([0x73, 0x00, 0x00], Keys::Char('s')),\n    ([0x74, 0x00, 0x00], Keys::Char('t')),\n    ([0x75, 0x00, 0x00], Keys::Char('u')),\n    ([0x76, 0x00, 0x00], Keys::Char('v')),\n    ([0x77, 0x00, 0x00], Keys::Char('w')),\n    ([0x78, 0x00, 0x00], Keys::Char('x')),\n    ([0x79, 0x00, 0x00], Keys::Char('y')),\n    ([0x7A, 0x00, 0x00], Keys::Char('z')),\n];\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eupper_letter\u003c/summary\u003e\n\n```rust\npub const UPPER_LETTER: [([u8; BYTES], Keys); 27] = [\n    ([0x41, 0x00, 0x00], Keys::Char('A')),\n    ([0x42, 0x00, 0x00], Keys::Char('B')),\n    ([0x43, 0x00, 0x00], Keys::Char('C')),\n    ([0x44, 0x00, 0x00], Keys::Char('D')),\n    ([0x45, 0x00, 0x00], Keys::Char('E')),\n    ([0x46, 0x00, 0x00], Keys::Char('F')),\n    ([0x47, 0x00, 0x00], Keys::Char('G')),\n    ([0x48, 0x00, 0x00], Keys::Char('H')),\n    ([0x49, 0x00, 0x00], Keys::Char('I')),\n    ([0x4A, 0x00, 0x00], Keys::Char('J')),\n    ([0x4B, 0x00, 0x00], Keys::Char('K')),\n    ([0x4C, 0x00, 0x00], Keys::Char('L')),\n    ([0x4D, 0x00, 0x00], Keys::Char('M')),\n    ([0x4E, 0x00, 0x00], Keys::Char('N')),\n    ([0xb1, 0x91, 0x00], Keys::Char('Ñ')),\n    ([0x4F, 0x00, 0x00], Keys::Char('O')),\n    ([0x50, 0x00, 0x00], Keys::Char('P')),\n    ([0x51, 0x00, 0x00], Keys::Char('Q')),\n    ([0x52, 0x00, 0x00], Keys::Char('R')),\n    ([0x53, 0x00, 0x00], Keys::Char('S')),\n    ([0x54, 0x00, 0x00], Keys::Char('T')),\n    ([0x55, 0x00, 0x00], Keys::Char('U')),\n    ([0x56, 0x00, 0x00], Keys::Char('V')),\n    ([0x57, 0x00, 0x00], Keys::Char('W')),\n    ([0x58, 0x00, 0x00], Keys::Char('X')),\n    ([0x59, 0x00, 0x00], Keys::Char('Y')),\n    ([0x5A, 0x00, 0x00], Keys::Char('Z')),\n];\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ef\u003c/summary\u003e\n\n```rust\npub const F: [([u8; BYTES], Keys); 12] = [\n    ([0x1b, 0x4f, 0x50], Keys::F(1)),\n    ([0x1b, 0x4f, 0x51], Keys::F(2)),\n    ([0x1b, 0x4f, 0x52], Keys::F(3)),\n    ([0x1b, 0x4f, 0x53], Keys::F(4)),\n    ([0x35, 0x7E, 0x00], Keys::F(5)),\n    ([0x37, 0x7E, 0x00], Keys::F(6)),\n    ([0x38, 0x7E, 0x00], Keys::F(7)),\n    ([0x39, 0x7E, 0x00], Keys::F(8)),\n    ([0x30, 0x7E, 0x00], Keys::F(9)),\n    ([0x31, 0x7E, 0x00], Keys::F(10)),\n    ([0x33, 0x7E, 0x00], Keys::F(11)),\n    ([0x34, 0x7E, 0x00], Keys::F(12)),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ectrl_lower_letter\u003c/summary\u003e\n\n```rust\npub const CTRL_LOWER_LETTER: [([u8; BYTES], Keys); 24] = [\n    ([0x01, 0x00, 0x00], Keys::Ctrl('a')),\n    ([0x02, 0x00, 0x00], Keys::Ctrl('b')),\n    ([0x03, 0x00, 0x00], Keys::Ctrl('c')),\n    ([0x04, 0x00, 0x00], Keys::Ctrl('d')),\n    ([0x05, 0x00, 0x00], Keys::Ctrl('e')),\n    ([0x06, 0x00, 0x00], Keys::Ctrl('f')),\n    ([0x07, 0x00, 0x00], Keys::Ctrl('g')),\n    ([0x08, 0x00, 0x00], Keys::Ctrl('h')),\n    ([0x0B, 0x00, 0x00], Keys::Ctrl('k')),\n    ([0x0C, 0x00, 0x00], Keys::Ctrl('l')),\n    ([0x0D, 0x00, 0x00], Keys::Ctrl('m')),\n    ([0x0E, 0x00, 0x00], Keys::Ctrl('n')),\n    ([0x0F, 0x00, 0x00], Keys::Ctrl('o')),\n    ([0x10, 0x00, 0x00], Keys::Ctrl('p')),\n    ([0x11, 0x00, 0x00], Keys::Ctrl('q')),\n    ([0x12, 0x00, 0x00], Keys::Ctrl('r')),\n    ([0x13, 0x00, 0x00], Keys::Ctrl('s')),\n    ([0x14, 0x00, 0x00], Keys::Ctrl('t')),\n    ([0x15, 0x00, 0x00], Keys::Ctrl('u')),\n    ([0x16, 0x00, 0x00], Keys::Ctrl('v')),\n    ([0x17, 0x00, 0x00], Keys::Ctrl('w')),\n    ([0x18, 0x00, 0x00], Keys::Ctrl('x')),\n    ([0x19, 0x00, 0x00], Keys::Ctrl('y')),\n    ([0x1A, 0x00, 0x00], Keys::Ctrl('z')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ectrl_upper_letter\u003c/summary\u003e\n\n* remember upper \u0026 lower case in Ctrl + key is the same hex code. \n\n```rust\npub const CTRL_UPPER_LETTER: [([u8; BYTES], Keys); 24] = [\n    (CTRL_LOWER_LETTER[0].0, Keys::Ctrl('A')),\n    (CTRL_LOWER_LETTER[1].0, Keys::Ctrl('B')),\n    (CTRL_LOWER_LETTER[2].0, Keys::Ctrl('C')),\n    (CTRL_LOWER_LETTER[3].0, Keys::Ctrl('D')),\n    (CTRL_LOWER_LETTER[4].0, Keys::Ctrl('E')),\n    (CTRL_LOWER_LETTER[5].0, Keys::Ctrl('F')),\n    (CTRL_LOWER_LETTER[6].0, Keys::Ctrl('G')),\n    (CTRL_LOWER_LETTER[7].0, Keys::Ctrl('H')),\n    (CTRL_LOWER_LETTER[8].0, Keys::Ctrl('K')),\n    (CTRL_LOWER_LETTER[9].0, Keys::Ctrl('L')),\n    (CTRL_LOWER_LETTER[10].0, Keys::Ctrl('M')),\n    (CTRL_LOWER_LETTER[11].0, Keys::Ctrl('N')),\n    (CTRL_LOWER_LETTER[12].0, Keys::Ctrl('O')),\n    (CTRL_LOWER_LETTER[13].0, Keys::Ctrl('P')),\n    (CTRL_LOWER_LETTER[14].0, Keys::Ctrl('Q')),\n    (CTRL_LOWER_LETTER[15].0, Keys::Ctrl('R')),\n    (CTRL_LOWER_LETTER[16].0, Keys::Ctrl('S')),\n    (CTRL_LOWER_LETTER[17].0, Keys::Ctrl('T')),\n    (CTRL_LOWER_LETTER[18].0, Keys::Ctrl('U')),\n    (CTRL_LOWER_LETTER[19].0, Keys::Ctrl('V')),\n    (CTRL_LOWER_LETTER[20].0, Keys::Ctrl('W')),\n    (CTRL_LOWER_LETTER[21].0, Keys::Ctrl('X')),\n    (CTRL_LOWER_LETTER[22].0, Keys::Ctrl('Y')),\n    (CTRL_LOWER_LETTER[23].0, Keys::Ctrl('Z')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ectrl_standar\u003c/summary\u003e\n\n```rust\npub const CTRL_STANDAR: [([u8; BYTES], Keys); 2] = [\n    ([0x2b, 0x00, 0x00], Keys::Ctrl('+')),\n    ([0x1f, 0x00, 0x00], Keys::Ctrl('-')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ectrl_numbers\u003c/summary\u003e\n\n```rust\npub const CTRL_NUMBERS: [([u8; BYTES], Keys); 10] = [\n    ([0x30, 0x00, 0x00], Keys::Ctrl('0')),\n    ([0x31, 0x00, 0x00], Keys::Ctrl('1')),\n    ([0x32, 0x00, 0x00], Keys::Ctrl('2')),\n    ([0x33, 0x00, 0x00], Keys::Ctrl('3')),\n    ([0x34, 0x00, 0x00], Keys::Ctrl('4')),\n    ([0x35, 0x00, 0x00], Keys::Ctrl('5')),\n    ([0x36, 0x00, 0x00], Keys::Ctrl('6')),\n    ([0x37, 0x00, 0x00], Keys::Ctrl('7')),\n    ([0x38, 0x00, 0x00], Keys::Ctrl('8')),\n    ([0x39, 0x00, 0x00], Keys::Ctrl('9')),\n];\n```\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ealt_lower_letter\u003c/summary\u003e\n\n```rust\npub const ALT_LOWER_LETTER: [([u8; BYTES], Keys); 27] = [\n    ([0x1b, 0x61, 0x00], Keys::Alt('a')),\n    ([0x1b, 0x62, 0x00], Keys::Alt('b')),\n    ([0x1b, 0x63, 0x00], Keys::Alt('c')),\n    ([0x1b, 0x64, 0x00], Keys::Alt('d')),\n    ([0x1b, 0x65, 0x00], Keys::Alt('e')),\n    ([0x1b, 0x66, 0x00], Keys::Alt('f')),\n    ([0x1b, 0x67, 0x00], Keys::Alt('g')),\n    ([0x1b, 0x68, 0x00], Keys::Alt('h')),\n    ([0x1b, 0x69, 0x00], Keys::Alt('i')),\n    ([0x1b, 0x6A, 0x00], Keys::Alt('j')),\n    ([0x1b, 0x6B, 0x00], Keys::Alt('k')),\n    ([0x1b, 0x6C, 0x00], Keys::Alt('l')),\n    ([0x1b, 0x6d, 0x00], Keys::Alt('m')),\n    ([0x1b, 0x6e, 0x00], Keys::Alt('n')),\n    ([0x1b, 0xc3, 0xb1], Keys::Alt('ñ')),\n    ([0x1b, 0x6f, 0x00], Keys::Alt('o')),\n    ([0x1b, 0x70, 0x00], Keys::Alt('p')),\n    ([0x1b, 0x71, 0x00], Keys::Alt('q')),\n    ([0x1b, 0x72, 0x00], Keys::Alt('r')),\n    ([0x1b, 0x73, 0x00], Keys::Alt('s')),\n    ([0x1b, 0x74, 0x00], Keys::Alt('t')),\n    ([0x1b, 0x75, 0x00], Keys::Alt('u')),\n    ([0x1b, 0x76, 0x00], Keys::Alt('v')),\n    ([0x1b, 0x77, 0x00], Keys::Alt('w')),\n    ([0x1b, 0x78, 0x00], Keys::Alt('x')),\n    ([0x1b, 0x79, 0x00], Keys::Alt('y')),\n    ([0x1b, 0x7a, 0x00], Keys::Alt('z')),\n];\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ealt_upper_letter\u003c/summary\u003e\n\n```rust\npub const ALT_UPPER_LETTER: [([u8; BYTES], Keys); 27] = [\n    ([0x1b, 0x41, 0x00], Keys::Alt('A')),\n    ([0x1b, 0x42, 0x00], Keys::Alt('B')),\n    ([0x1b, 0x43, 0x00], Keys::Alt('C')),\n    ([0x1b, 0x44, 0x00], Keys::Alt('D')),\n    ([0x1b, 0x45, 0x00], Keys::Alt('E')),\n    ([0x1b, 0x46, 0x00], Keys::Alt('F')),\n    ([0x1b, 0x47, 0x00], Keys::Alt('G')),\n    ([0x1b, 0x48, 0x00], Keys::Alt('H')),\n    ([0x1b, 0x49, 0x00], Keys::Alt('I')),\n    ([0x1b, 0x4A, 0x00], Keys::Alt('J')),\n    ([0x1b, 0x4B, 0x00], Keys::Alt('K')),\n    ([0x1b, 0x4C, 0x00], Keys::Alt('L')),\n    ([0x1b, 0x4D, 0x00], Keys::Alt('M')),\n    ([0x1b, 0x4E, 0x00], Keys::Alt('N')),\n    ([0x1b, 0xc3, 0x91], Keys::Alt('Ñ')),\n    ([0x1b, 0x4f, 0x00], Keys::Alt('O')),\n    ([0x1b, 0x50, 0x00], Keys::Alt('P')),\n    ([0x1b, 0x51, 0x00], Keys::Alt('Q')),\n    ([0x1b, 0x52, 0x00], Keys::Alt('R')),\n    ([0x1b, 0x53, 0x00], Keys::Alt('S')),\n    ([0x1b, 0x54, 0x00], Keys::Alt('T')),\n    ([0x1b, 0x55, 0x00], Keys::Alt('U')),\n    ([0x1b, 0x56, 0x00], Keys::Alt('V')),\n    ([0x1b, 0x57, 0x00], Keys::Alt('W')),\n    ([0x1b, 0x58, 0x00], Keys::Alt('X')),\n    ([0x1b, 0x59, 0x00], Keys::Alt('Y')),\n    ([0x1b, 0x5A, 0x00], Keys::Alt('Z')),\n];\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ealt_numbers\u003c/summary\u003e\n\n* remember Alt + number is the same hex code as Ctrl + number. \n\n```rust\npub const ALT_NUMBERS: [([u8; BYTES], Keys); 10] = [\n    (CTRL_NUMBERS[0].0, Keys::Alt('0')),\n    (CTRL_NUMBERS[1].0, Keys::Alt('1')),\n    (CTRL_NUMBERS[2].0, Keys::Alt('2')),\n    (CTRL_NUMBERS[3].0, Keys::Alt('3')),\n    (CTRL_NUMBERS[4].0, Keys::Alt('4')),\n    (CTRL_NUMBERS[5].0, Keys::Alt('5')),\n    (CTRL_NUMBERS[6].0, Keys::Alt('6')),\n    (CTRL_NUMBERS[7].0, Keys::Alt('7')),\n    (CTRL_NUMBERS[8].0, Keys::Alt('8')),\n    (CTRL_NUMBERS[9].0, Keys::Alt('9')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ealt_gr_letter\u003c/summary\u003e\n\n```rust\npub const ALT_GR_LETTER: [([u8; BYTES], Keys); 27] = [\n    ([0xc3, 0xa6, 0x00], Keys::AltGr('a')),\n    ([0xe2, 0x80, 0x9c], Keys::AltGr('b')),\n    ([0xc2, 0xa2, 0x00], Keys::AltGr('c')),\n    ([0xc3, 0xb0, 0x00], Keys::AltGr('d')),\n    ([0xe2, 0x82, 0xac], Keys::AltGr('e')),\n    ([0xc4, 0x91, 0x00], Keys::AltGr('f')),\n    ([0xc5, 0x8b, 0x00], Keys::AltGr('g')),\n    ([0xc4, 0xa7, 0x00], Keys::AltGr('h')),\n    ([0xe2, 0x86, 0x92], Keys::AltGr('i')),\n    ([0xcc, 0x89, 0x00], Keys::AltGr('j')),\n    ([0xc4, 0xb8, 0x00], Keys::AltGr('k')),\n    ([0xc5, 0x82, 0x00], Keys::AltGr('l')),\n    ([0xc2, 0xb5, 0x00], Keys::AltGr('m')),\n    ([0xe2, 0x80, 0x9d], Keys::AltGr('n')),\n    ([0x7e, 0x00, 0x00], Keys::AltGr('ñ')),\n    ([0xc3, 0xb8, 0x00], Keys::AltGr('o')),\n    ([0xc3, 0xbe, 0x00], Keys::AltGr('p')),\n    ([0x40, 0x00, 0x00], Keys::AltGr('q')),\n    ([0xc2, 0xb6, 0x00], Keys::AltGr('r')),\n    ([0xc3, 0x9f, 0x00], Keys::AltGr('s')),\n    ([0xc5, 0xa7, 0x00], Keys::AltGr('t')),\n    ([0xe2, 0x86, 0x93], Keys::AltGr('u')),\n    ([0xe2, 0x80, 0x9e], Keys::AltGr('v')),\n    ([0xc5, 0xbf, 0x00], Keys::AltGr('w')),\n    ([0xc2, 0xbb, 0x00], Keys::AltGr('x')),\n    ([0xe2, 0x86, 0x90], Keys::AltGr('y')),\n    ([0xc2, 0xab, 0x00], Keys::AltGr('z')),\n];\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ealt_gr_numbers\u003c/summary\u003e\n\n* remember Alt Gr + number is the same hex code as Ctrl + number. \n\n```rust\npub const ALT_GR_NUMBERS: [([u8; BYTES], Keys); 10] = [\n    (CTRL_NUMBERS[0].0, Keys::Alt('0')),\n    (CTRL_NUMBERS[1].0, Keys::Alt('1')),\n    (CTRL_NUMBERS[2].0, Keys::Alt('2')),\n    (CTRL_NUMBERS[3].0, Keys::Alt('3')),\n    (CTRL_NUMBERS[4].0, Keys::Alt('4')),\n    (CTRL_NUMBERS[5].0, Keys::Alt('5')),\n    (CTRL_NUMBERS[6].0, Keys::Alt('6')),\n    (CTRL_NUMBERS[7].0, Keys::Alt('7')),\n    (CTRL_NUMBERS[8].0, Keys::Alt('8')),\n    (CTRL_NUMBERS[9].0, Keys::Alt('9')),\n];\n```\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003efull\u003c/summary\u003e\n\nall features!\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateolafalce%2Fk_board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmateolafalce%2Fk_board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateolafalce%2Fk_board/lists"}