├── .github └── workflows │ ├── build.yml │ └── release.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pylintrc ├── LICENSE ├── PICODUCKY.md ├── README-DEV.md ├── README-MACROPAD.md ├── README.md ├── build.py ├── docs ├── drive_generic-nohid.png ├── drive_generic.png ├── drive_pico_ducky-nohid.png └── drive_pico_ducky.png ├── examples ├── simpletest.py └── switch_layouts.py ├── generator-web ├── data │ └── .htaccess ├── generator │ └── .htaccess ├── index.php ├── js │ ├── drive.png │ ├── jquery.min.js │ ├── jszip-utils.js │ ├── jszip.js │ └── sample_code.png ├── layout_generator.html ├── layout_generator.js ├── layout_generator_link.js ├── make_zip_bundle.php ├── mpy-cross │ ├── .htaccess │ ├── mpy-cross.static-amd64-linux-6 │ ├── mpy-cross.static-amd64-linux-7 │ └── mpy-cross.static-amd64-linux-8 └── src │ ├── keycode_name_to_virtualkey.js │ ├── keycode_us_ref.js │ ├── sample_code.py │ ├── sample_code_template.py │ └── virtualkey_table_us.js ├── generator ├── __init__.py ├── keycode_name_to_virtualkey.py ├── keycode_us_ref.py ├── layout_generator.py └── virtualkey_table_us.py ├── libraries ├── helpers │ ├── alt_codes.py │ └── consumer_control_extended.py ├── keycodes │ ├── keycode_mac_fr.py │ ├── keycode_win_br.py │ ├── keycode_win_cz.py │ ├── keycode_win_cz1.py │ ├── keycode_win_da.py │ ├── keycode_win_de.py │ ├── keycode_win_es.py │ ├── keycode_win_fr.py │ ├── keycode_win_hu.py │ ├── keycode_win_it.py │ ├── keycode_win_po.py │ ├── keycode_win_sw.py │ ├── keycode_win_tr.py │ └── keycode_win_uk.py └── layouts │ ├── keyboard_layout_mac_fr.py │ ├── keyboard_layout_us_dvo.py │ ├── keyboard_layout_win_br.py │ ├── keyboard_layout_win_cz.py │ ├── keyboard_layout_win_cz1.py │ ├── keyboard_layout_win_da.py │ ├── keyboard_layout_win_de.py │ ├── keyboard_layout_win_es.py │ ├── keyboard_layout_win_fr.py │ ├── keyboard_layout_win_hu.py │ ├── keyboard_layout_win_it.py │ ├── keyboard_layout_win_po.py │ ├── keyboard_layout_win_sw.py │ ├── keyboard_layout_win_tr.py │ └── keyboard_layout_win_uk.py ├── requirements-dev.txt ├── requirements-modules.txt └── tests ├── batch_test_generator.sh ├── batch_test_press_keys.sh ├── compare_keycodes.py ├── compare_layouts.py ├── keyboard_test.py ├── make_generated_mpy.sh ├── make_validated.sh ├── reference ├── keyboard_layout.py ├── keyboard_layout_us.py ├── keycode_names.py └── usbif_keycode_scancode.py └── simple_layout_ords.py /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build CI 2 | 3 | on: [pull_request, push] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Dump GitHub context 10 | env: 11 | GITHUB_CONTEXT: ${{ toJson(github) }} 12 | run: echo "$GITHUB_CONTEXT" 13 | - name: Set up Python 3.9 14 | uses: actions/setup-python@v1 15 | with: 16 | python-version: 3.9 17 | - name: Versions 18 | run: | 19 | python3 --version 20 | - uses: actions/checkout@v1 21 | with: 22 | submodules: true 23 | - name: Install deps 24 | run: | 25 | pip install -r requirements-dev.txt 26 | - name: Library version 27 | run: | 28 | git describe --dirty --always --tags 29 | - name: Build assets 30 | run: | 31 | python3 build.py 32 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Actions 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | upload-release-assets: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Dump GitHub context 12 | env: 13 | GITHUB_CONTEXT: ${{ toJson(github) }} 14 | run: echo "$GITHUB_CONTEXT" 15 | - name: Set up Python 3.9 16 | uses: actions/setup-python@v1 17 | with: 18 | python-version: 3.9 19 | - name: Versions 20 | run: | 21 | python3 --version 22 | - uses: actions/checkout@v1 23 | with: 24 | submodules: true 25 | - name: Install deps 26 | run: | 27 | pip install -r requirements-dev.txt 28 | - name: Build assets 29 | run: | 30 | python3 build.py 31 | - name: Upload Release Assets 32 | # the 'official' actions version does not yet support dynamically 33 | # supplying asset names to upload. @csexton's version chosen based on 34 | # discussion in the issue below, as its the simplest to implement and 35 | # allows for selecting files with a pattern. 36 | # https://github.com/actions/upload-release-asset/issues/4 37 | #uses: actions/upload-release-asset@v1.0.1 38 | uses: csexton/release-asset-action@master 39 | with: 40 | pattern: "_build/release/*" 41 | github-token: ${{ secrets.GITHUB_TOKEN }} 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _*/ 2 | .env 3 | venv 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Diego Elio Pettenò 2 | # 3 | # SPDX-License-Identifier: Unlicense 4 | 5 | repos: 6 | - repo: https://github.com/pycqa/pylint 7 | rev: pylint-2.6.0 8 | hooks: 9 | - id: pylint 10 | name: lint (examples) 11 | types: [python] 12 | files: ^examples/ 13 | args: 14 | - --disable=missing-docstring,invalid-name,bad-whitespace 15 | - id: pylint 16 | name: lint (code) 17 | types: [python] 18 | exclude: "^(docs/|examples/|setup.py$)" 19 | - repo: https://github.com/python/black 20 | rev: 20.8b1 21 | hooks: 22 | - id: black 23 | - repo: https://github.com/fsfe/reuse-tool 24 | rev: v0.12.1 25 | hooks: 26 | - id: reuse 27 | - repo: https://github.com/pre-commit/pre-commit-hooks 28 | rev: v2.3.0 29 | hooks: 30 | - id: check-yaml 31 | - id: end-of-file-fixer 32 | - id: trailing-whitespace 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Neradoc neraOnGit@ri1.fr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PICODUCKY.md: -------------------------------------------------------------------------------- 1 | How to use one of these layouts with [the pico-ducky repository](https://github.com/dbisu/pico-ducky). 2 | 3 | ## First step 4 | 5 | #### Go to the [latest release page](https://github.com/Neradoc/Circuitpython_Keyboard_Layouts/releases/latest), look if your language is in the list. 6 | 7 | ## If your language/layout is in the bundle 8 | 9 | Download the `py` zip, named `circuitpython-keyboard-layouts-py-XXXXXXXX.zip` 10 | 11 | **NOTE: You can use the mpy format targetting the version of Circuitpython that is on the device (6 or 7), but on Raspberry Pi Pico you don't need it - it only reduces file size and RAM used for loading the library, which the pico has plenty of.** 12 | 13 | ## If your language/layout is not in the bundle 14 | 15 | Try the online generator, it should be able to generate a zip file with the modules for your language. 16 | 17 | https://www.neradoc.me/layouts/ 18 | 19 | ## Now you have a zip file 20 | 21 | ### Find your language/layout in the lib directory 22 | 23 | For a language `LANG`, copy the following files from the zip's `lib` folder to the `lib` directory of the board. 24 | **DO NOT** modify the adafruit_hid directory. Your files go directly in `lib`. 25 | **DO NOT** change the names or extensions. Just pick the files you need. 26 | Replace `LANG` with the letters for your language of choice. 27 | 28 | - `keyboard_layout_win_LANG.py` 29 | - `keycode_win_LANG.py` 30 | 31 | This is what it should look like **if your language is French for example**. 32 | 33 | ![CIRCUITPY drive screenshot](docs/drive_pico_ducky-nohid.png) 34 | 35 | Don't forget to also install [the adafruit_hid library](https://github.com/adafruit/Adafruit_CircuitPython_HID/releases/latest) in the lib directory. 36 | 37 | ### Modify the pico-ducky code to use your language file: 38 | 39 | At the start of the file remove or comment out these lines (add `#` at the start of the line). 40 | 41 | ```py 42 | from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS as KeyboardLayout 43 | from adafruit_hid.keycode import Keycode 44 | ``` 45 | 46 | And add or uncomment (remove the `#`) these lines. 47 | *Replace `LANG` with the letters for your language of choice. The name must match the file (without the py or mpy extension).* 48 | ```py 49 | from keyboard_layout_win_LANG import KeyboardLayout 50 | from keycode_win_LANG import Keycode 51 | ``` 52 | -------------------------------------------------------------------------------- /README-DEV.md: -------------------------------------------------------------------------------- 1 | ### KeyboardLayoutBase class 2 | 3 | - ASCII_TO_KEYCODE is a bytes string with the keycode for each low-ascii character at the ascii value place. The keycode for "u" is at: `ASCII_TO_KEYCODE[ord("u")]`. Since the keycode value is below 0x80, the high bit is used to encode if the shift key is needed. 4 | - `NEED_ALTGR` lists characters that require the altgr key in addition. 5 | - `HIGHER_ASCII` is a dictionary that associates the `ord()` int value of high ascii and utf8 characters of one or more bytes to the keycode. 6 | - `COMBINED_KEYS` is a table (dictionary) of characters like `Ñ` that can be accessed by typing first a dead key (like `~`) followed by a regular key (like `N`) - on a Windows French keyboard for example. 7 | - Indexes are `ord()` int values of each character. 8 | - The value is an int encoding 2 bytes. 9 | - The upper byte is the keycode of the first key, including the shift bit. 10 | - The lower byte is the ascii code of the second key (a-z, A-Z or space). 11 | - The lower byte's high bit also encodes whether or not the first key needs altgr, so as not to pack NEEDS_ALTGR with a bunch of characters. 12 | 13 | With the `Ñ` example: 14 | - `~` is altgr + `é`, `é` is keycode 0x1F 15 | - `N` is ascii code 0x4E, with the altgr bit becomes 0xCE 16 | - `Ñ` is therefore `0xD1: 0x1FCE,` 17 | - When typing, "N" is looked up: `ASCII_TO_KEYCODE[0x4E] == 0x91` (shift+0x11) 18 | - So `write("Ñ")` sends the keycodes: `(0xE6, 0x1F)` (altgr+é) then `(0xE1, 0x11)` (shift+n) 19 | 20 | Using int values to index the dictionaries, and as values for the `COMBINED_KEYS` table reduces the memory size compared to strings and bytestrings. 21 | 22 | ### Layouts and KeyboardLayout classes 23 | 24 | Every layout class is called KeyboardLayout, to make changing layout easier without having a different class name in every file, and have to guess or lookup the class name (is it CamelCase of the module name ? Is it US or Us ?). For compatibility, I added `KeyboardLayout = KeyboardLayoutUS` in the US keyboard layout. Importing multiple layouts is possible by using the full `module.KeyboardLayout` name, or `import KeyboardLayout as ...` 25 | -------------------------------------------------------------------------------- /README-MACROPAD.md: -------------------------------------------------------------------------------- 1 | # Adafruit's Macropad and Keyboard Layouts 2 | 3 | When using the `adafruit_macropad` library with Adafruit's Macropad, you can setup the layout and keycode classes in the constructor with code like this. Changing the **PLATFORM_LANGUAGE** modules names for the ones you use of course. 4 | 5 | ```py 6 | from adafruit_macropad import MacroPad 7 | 8 | from keyboard_layout_PLATFORM_LANGUAGE import KeyboardLayout 9 | from keycode_PLATFORM_LANGUAGE import Keycode 10 | 11 | macropad = MacroPad( 12 | layout_class=KeyboardLayout, 13 | keycode_class=Keycode, 14 | ) 15 | ``` 16 | 17 | [See this file in the macropad library](https://github.com/adafruit/Adafruit_CircuitPython_MacroPad/blob/main/examples/macropad_keyboard_layout.py) for a full example script. 18 | 19 | ## The Hotkeys Project 20 | 21 | For [the popular hotkeys project](https://learn.adafruit.com/macropad-hotkeys), you will have to update **code.py** with the change above, making sure you replace the existing `macropad = MacroPad()` line, and not add one. 22 | 23 | You also have to change the macros to use the keycodes setup in the macropad module instead of the `adafruit_hid` default keycode module. The `adafruit_macropad.keycodes` is a module-level variable that is setup with the value defined in the MacroPad class. When it's imported in the macros files it shares that value with the one defined in **code.py**. 24 | 25 | Replace in every macro file: 26 | ```py 27 | from adafruit_hid.keycode import Keycode 28 | ``` 29 | With: 30 | ```py 31 | from adafruit_macropad import keycodes as Keycode 32 | ``` 33 | 34 | Note that some of the default macros might still use key names that are not available on your keyboard, or shortcuts that do not match the localized version of your applications. For example there is no `[` key on a French keyboard, if a shortcut uses it, it pust be changed to the correct shortcut for your application. 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Keyboard Layouts For Circuitpython 2 | 3 | The goal of this repository is to contain a list of keyboard layouts for use with the Circuitpython [`adafruit_hid`](https://github.com/adafruit/Adafruit_CircuitPython_HID) library, that can be used as a reference for international keyboards and can be distributed as a "bundle" in the style of the Adafruit bundle. 4 | 5 | It can be used with circup for easy installation. 6 | 7 | ``` 8 | circup bundle-add Neradoc/Circuitpython_Keyboard_Layouts 9 | circup install keyboard_layout_win_fr keycode_win_fr 10 | ``` 11 | 12 | There's a couple of project-specific guides: 13 | 14 | - [How to use the layouts with Adafruit's Macropad and the **Hotkeys** project](README-MACROPAD.md). 15 | - [For pico-ducky users, there's a dedicated guide](PICODUCKY.md). 16 | 17 | ## Install your language 18 | 19 | To install both the layout and keycode files for your language, you need to copy 2 files to your board. Pick the language and platforms that match yours. Use the `.py` version, or the `.mpy` version matching your version of Circuitpython. The mpy files take less space and are better suited for Circuitpython boards with less than 1MB of drive. 20 | 21 | - `keyboard_layout_win_fr.mpy` (pick your platform/language) 22 | - `keycode_win_fr.mpy` (pick your platform/language) 23 | 24 | The files go directly in the directory called "**lib**" on the board. 25 | 26 | ![CIRCUITPY drive screenshot](docs/drive_generic-nohid.png) 27 | 28 | Don't forget to also install [the adafruit_hid library](https://github.com/adafruit/Adafruit_CircuitPython_HID/releases/latest) in the lib directory. 29 | 30 | ## Use the libraries 31 | 32 | ### Layouts 33 | 34 | Layouts require the **latest** version of the `adafruit_hid` library (at least 5.x.x). 35 | 36 | For the plaform **platform** (win, mac) and the layout language **lang**. The module `keyboard_layout_platform_lang` has a class called `KeyboardLayout`. It contains the layout information for use with the `Keyboard` to type text. 37 | 38 | ```py 39 | import usb_hid 40 | from adafruit_hid.keyboard import Keyboard 41 | from keyboard_layout_win_fr import KeyboardLayout 42 | keyboard = Keyboard(usb_hid.devices) 43 | layout = KeyboardLayout(keyboard) 44 | layout.write("Bonjour le monde") 45 | ``` 46 | 47 | Switching layouts on start can be done by conditionally importing a different layout module, or renaming the imported layout class like this for example: 48 | 49 | ```py 50 | from keyboard_layout_win_fr import KeyboardLayout as LayoutFR 51 | from keyboard_layout_win_de import KeyboardLayout as LayoutDE 52 | ``` 53 | 54 | ### Keycodes 55 | 56 | `keycode__` modules are an attempt to make it easier to swap layouts. While keycode numbers are really physical positions on a keyboard, HID Keycodes normally reference the US keyboard for key names. These localized keycodes offer a level of conversion allowing to use `Keycode.A` across azerty and qwerty keyboards for example. It won't swap `control` and `command` to match the platform however. (A helper module could do that). 57 | 58 | ```py 59 | if IS_AZERTY: 60 | from keycode_mac_fr import Keycode 61 | else: 62 | from adafruit_hid.keycode import Keycode 63 | 64 | kbd.send(Keycode.COMMAND, Keycode.A) 65 | ``` 66 | 67 | ## Helpers 68 | 69 | The `consumer_control_extended` module brings a big list of names for the consumer controls page in the HID specs, to be used with `adafruit_hid.consumer_control`. 70 | 71 | ## The Layout Generator 72 | 73 | This needs to be further documentend, but for now `tests/make_validated.sh` shows an example of how to use it. There is a live version of the web generator, though it might not always be the current release. 74 | 75 | https://www.neradoc.me/layouts/ 76 | -------------------------------------------------------------------------------- /docs/drive_generic-nohid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/docs/drive_generic-nohid.png -------------------------------------------------------------------------------- /docs/drive_generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/docs/drive_generic.png -------------------------------------------------------------------------------- /docs/drive_pico_ducky-nohid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/docs/drive_pico_ducky-nohid.png -------------------------------------------------------------------------------- /docs/drive_pico_ducky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/docs/drive_pico_ducky.png -------------------------------------------------------------------------------- /examples/simpletest.py: -------------------------------------------------------------------------------- 1 | import usb_hid 2 | from adafruit_hid.keyboard import Keyboard 3 | 4 | # import the classes for the international layout 5 | from keyboard_layout_win_fr import KeyboardLayout 6 | from keycode_win_fr import Keycode 7 | 8 | keyboard = Keyboard(usb_hid.devices) 9 | 10 | # type with a layout 11 | layout = KeyboardLayout(keyboard) 12 | layout.write("Bonjour le monde") 13 | 14 | # shortcuts with keycodes 15 | keyboard.send(Keycode.ALT, Keycode.TAB) 16 | -------------------------------------------------------------------------------- /examples/switch_layouts.py: -------------------------------------------------------------------------------- 1 | import usb_hid 2 | from adafruit_hid.keyboard import Keyboard 3 | 4 | # import the classes for the international layout 5 | from keyboard_layout_win_fr import KeyboardLayout as KeyboardLayoutFR 6 | from keyboard_layout_win_us import KeyboardLayout as KeyboardLayoutUS 7 | from keycode_win_fr import Keycode as KeycodeFR 8 | from keycode_win_us import Keycode as KeycodeUS 9 | 10 | keyboard = Keyboard(usb_hid.devices) 11 | 12 | # type in french 13 | layout = KeyboardLayoutFR(keyboard) 14 | layout.write("Vive l'été à la forêt") 15 | 16 | # switch layout 17 | # needs to have the layouts configured and the shortcut too 18 | # NOTE: alt and shift don't need a special layout 19 | keyboard.send(KeycodeFR.SHIFT, KeycodeFR.ALT) 20 | 21 | # type in english 22 | layout = KeyboardLayoutFR(keyboard) 23 | layout.write("This was QWERTY") 24 | -------------------------------------------------------------------------------- /generator-web/data/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | -------------------------------------------------------------------------------- /generator-web/generator/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | -------------------------------------------------------------------------------- /generator-web/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Make a layout 6 | 74 | 75 | 76 | 77 | 78 |
79 | 80 |

Generate a Windows keyboard layout for Circuitpython's adafruit_hid.

81 |

This is the online generator for the Circuitpython Keyboard Layouts repository.

82 |
    83 |
  • Go to kbdlayout.info and find your layout's page.
  • 84 |
  • Paste the url of the layout into the box below (see example).
  • 85 |
  • Press the "Make Zip Bundle Links" button.
  • 86 |
  • Click the link to download the zip with the modules.
  • 87 |
  • Unzip the zip.
  • 88 |
  • Copy the files to your boards "lib" directory (not the sample code).
  • 89 |
  • Don't forget ton install adafruit_hid too if it's not already there.
  • 90 |
  • Follow the sample code, included in the zip.
  • 91 |
  • Come bother me on the adafruit discord if it doesn't work (no private messages).
  • 92 |
  • Or open an issue on github.
  • 93 |
94 |

Note: There are additional links to have the module files pre-compiled for Circuitpython 6 or 7. A pre-compiled (.mpy) file takes less space and is faster to load. It also requires less RAM to load, which might allow it to be used on a SAMD21 board (often refered to M0, they are very limited in memory when running Circuitpython).

95 |

96 | Url: 97 | 98 |

99 |

100 | Download the zip file (.py) 101 | CP6 102 | CP7 103 | CP8 104 |

105 |

106 |
DEBUG
107 |

108 |

109 | 	

110 |

111 | 
112 |

113 |

114 |
115 | 116 | 117 | -------------------------------------------------------------------------------- /generator-web/layout_generator_link.js: -------------------------------------------------------------------------------- 1 | function download_layout() { 2 | $(".download_link").hide(); 3 | 4 | var url = $("#input").val(); 5 | var zip_url = "make_zip_bundle.php?url=" + url; 6 | console.log(zip_url); 7 | 8 | var platform = "win"; 9 | var lang = url.split("/").pop().replace("kbd", ""); 10 | 11 | zips = [ 12 | { extension: ".py", extout: ".py", id: "", version: "py" }, 13 | { extension: "6.mpy", extout: ".mpy", id: "6", version: "mpy6" }, 14 | { extension: "7.mpy", extout: ".mpy", id: "7", version: "mpy7" }, 15 | { extension: "8.mpy", extout: ".mpy", id: "8", version: "mpy8" }, 16 | ]; 17 | for( z in zips ) { 18 | var zipper = zips[z]; 19 | // 20 | var zurl = zip_url + "&cpversion="+zipper.id; 21 | var zip_name = "keyboard_layout_" + platform + "_" + lang + "-{}.zip"; 22 | var zip_file = zip_name.replace("{}", zipper.version); 23 | 24 | // 25 | $("#download_link"+zipper.id).attr("href", zurl); 26 | //$("#download_link"+zipper.id).attr("download", zip_file); 27 | $("#download_link"+zipper.id).attr("title", zip_file); 28 | $("#download_link"+zipper.id).show(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /generator-web/make_zip_bundle.php: -------------------------------------------------------------------------------- 1 | 1000000 ) { 55 | $ERRORS[] = "Source URL file too big."; 56 | } else { 57 | file_put_contents($filepath_xml, $data); 58 | } 59 | 60 | } else { 61 | $ERRORS[] = "The source could not be interpreted, or is not supported, check the spelling."; 62 | } 63 | 64 | if(count($ERRORS) > 0) { 65 | # other platforms or sources 66 | header("HTTP/1.1 500 Internal Server Error"); 67 | print("
");
 68 | 	print(join("\n", $ERRORS));
 69 | 	print(htmlentities($source_url));
 70 | 	print("
"); 71 | ob_end_flush(); 72 | exit(0); 73 | } 74 | 75 | $layout_out = array(); 76 | $layout_command = "python3 -m generator --keyboard ".$filepath_xml." --show layout -d0 2>&1"; 77 | exec($layout_command, $layout_out, $result_code); 78 | $layout = join("\n", $layout_out); 79 | if($result_code != 0) { $ERRORS[] = "Error Layout\n"; } 80 | 81 | $layout = preg_replace("/".preg_quote($VERSION0)."/", $VERSION, $layout); 82 | 83 | $keycodes_out = array(); 84 | $keycodes_command = "python3 -m generator --keyboard ".$filepath_xml." --show keycode -d0 2>&1"; 85 | exec($keycodes_command, $keycodes_out, $result_code); 86 | $keycodes = join("\n", $keycodes_out); 87 | if($result_code != 0) { $ERRORS[] = "Error Keycodes\n"; } 88 | 89 | # $ERRORS[] = $layout_command; 90 | # $ERRORS[] = $keycodes_command; 91 | 92 | $keycodes = preg_replace("/".preg_quote($VERSION0)."/", $VERSION, $keycodes); 93 | 94 | if(LAYOUT_BASE) { 95 | if( !file_exists("src/keyboard_layout6.mpy") ) { 96 | exec("mpy-cross/mpy-cross.static-amd64-linux-6 src/keyboard_layout.py"); 97 | rename("src/keyboard_layout.mpy", "src/keyboard_layout6.mpy"); 98 | } 99 | if( !file_exists("src/keyboard_layout7.mpy") ) { 100 | exec("mpy-cross/mpy-cross.static-amd64-linux-7 src/keyboard_layout.py"); 101 | rename("src/keyboard_layout.mpy", "src/keyboard_layout7.mpy"); 102 | } 103 | if( !file_exists("src/keyboard_layout8.mpy") ) { 104 | exec("mpy-cross/mpy-cross.static-amd64-linux-8 src/keyboard_layout.py"); 105 | rename("src/keyboard_layout.mpy", "src/keyboard_layout8.mpy"); 106 | } 107 | } 108 | 109 | function make_zip($layout, $keycodes, $cpversion, $platform, $lang) { 110 | global $debug; 111 | $deletes = array(); 112 | 113 | if( $cpversion == "6" ) { 114 | $filepath_zip = "data/layout_files_".$platform."_".$lang."-6mpy.zip"; 115 | } elseif( $cpversion == "7" ) { 116 | $filepath_zip = "data/layout_files_".$platform."_".$lang."-7mpy.zip"; 117 | } elseif( $cpversion == "8" ) { 118 | $filepath_zip = "data/layout_files_".$platform."_".$lang."-8mpy.zip"; 119 | } else { 120 | $filepath_zip = "data/layout_files_".$platform."_".$lang."-py.zip"; 121 | } 122 | 123 | $zip = new ZipArchive(); 124 | if ($zip->open($filepath_zip, ZipArchive::CREATE) !== true) { 125 | ?>

Cannot open

?>addFile($mpyfile, $layout_name); 142 | $deletes[] = $tempfile; 143 | $deletes[] = $mpyfile; 144 | # keycodes 145 | $keycodes_name = preg_replace("/\.py$/", ".mpy", $keycodes_file); 146 | $tempfile = "data/" . uniqid() . $keycodes_file; 147 | file_put_contents($tempfile, $keycodes); 148 | exec("mpy-cross/mpy-cross.static-amd64-linux-".$cpversion." ".$tempfile); 149 | $mpyfile = preg_replace("/\.py$/", ".mpy", $tempfile); 150 | $zip->addFile($mpyfile, $keycodes_name); 151 | $deletes[] = $tempfile; 152 | $deletes[] = $mpyfile; 153 | # layout base 154 | if(LAYOUT_BASE) { 155 | $zip->addFile("src/keyboard_layout".$cpversion.".mpy", "keyboard_layout.mpy"); 156 | } 157 | } else { 158 | $zip->addFromString($layout_file, $layout); 159 | $zip->addFromString($keycodes_file, $keycodes); 160 | if(LAYOUT_BASE) { 161 | $zip->addFile("src/keyboard_layout.py", "keyboard_layout.py"); 162 | } 163 | } 164 | 165 | $data = file_get_contents("src/sample_code_template.py"); 166 | $data = preg_replace("//", $platform, $data); 167 | $data = preg_replace("//", $lang, $data); 168 | $zip->addFromString("sample_code.py", $data); 169 | 170 | $zip->close(); 171 | 172 | if( !$debug ) { 173 | header('Content-Description: File Transfer'); 174 | header('Content-Type: application/octet-stream'); 175 | header('Content-Disposition: attachment; filename="'.basename($filepath_zip).'"'); 176 | header('Expires: 0'); 177 | header('Cache-Control: must-revalidate'); 178 | header('Pragma: public'); 179 | header('Content-Length: ' . filesize($filepath_zip)); 180 | } 181 | 182 | if($debug) { 183 | print("END FLUSH\n"); 184 | ob_end_flush(); 185 | } else { 186 | ob_end_clean(); 187 | readfile($filepath_zip); 188 | $deletes[] = $filepath_zip; 189 | } 190 | 191 | foreach($deletes as $file) { 192 | if( $debug ) { 193 | print("DELETE $file\n"); 194 | } 195 | if( file_exists($file) ) { 196 | unlink($file); 197 | } 198 | } 199 | } 200 | } 201 | 202 | if( count($ERRORS) > 0 ) { 203 | header("HTTP/1.1 500 Internal Server Error"); 204 | print("
\n");
205 | 	print("The source could not be interpreted, or is not supported, check the spelling.\n");
206 | 	print(htmlentities($source_url)."\n");
207 | 	print(htmlentities($filepath_xml)."\n");
208 | 	print(join("\n", $ERRORS));
209 | 	if($debug) {
210 | 		print_r($layout_out);
211 | 		print_r($keycodes_out);
212 | 	}
213 | 	print("\n
"); 214 | ob_end_flush(); 215 | } else { 216 | make_zip($layout, $keycodes, $cpversion, $platform, $lang); 217 | } 218 | -------------------------------------------------------------------------------- /generator-web/mpy-cross/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | -------------------------------------------------------------------------------- /generator-web/mpy-cross/mpy-cross.static-amd64-linux-6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/generator-web/mpy-cross/mpy-cross.static-amd64-linux-6 -------------------------------------------------------------------------------- /generator-web/mpy-cross/mpy-cross.static-amd64-linux-7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/generator-web/mpy-cross/mpy-cross.static-amd64-linux-7 -------------------------------------------------------------------------------- /generator-web/mpy-cross/mpy-cross.static-amd64-linux-8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Neradoc/Circuitpython_Keyboard_Layouts/6b4cf4fd8ce761dc71b8a8ae219976a9a3510600/generator-web/mpy-cross/mpy-cross.static-amd64-linux-8 -------------------------------------------------------------------------------- /generator-web/src/keycode_name_to_virtualkey.js: -------------------------------------------------------------------------------- 1 | // export 2 | var name_to_virtualkey = { 3 | "ONE": "1", 4 | "TWO": "2", 5 | "THREE": "3", 6 | "FOUR": "4", 7 | "FIVE": "5", 8 | "SIX": "6", 9 | "SEVEN": "7", 10 | "EIGHT": "8", 11 | "NINE": "9", 12 | "ZERO": "0", 13 | // modifiers 14 | "RIGHT_SHIFT": "RSHIFT", 15 | "LEFT_SHIFT": "LSHIFT", 16 | "SHIFT": "LSHIFT", 17 | "RIGHT_ALT": "RMENU", 18 | "LEFT_ALT": "LMENU", 19 | "ALT": "LMENU", 20 | "OPTION": "LMENU", 21 | "RIGHT_CONTROL": "RCONTROL", 22 | "LEFT_CONTROL": "LCONTROL", 23 | "CONTROL": "LCONTROL", 24 | // windows key 25 | "LEFT_GUI": "LWIN", 26 | "GUI": "LWIN", 27 | "WINDOWS": "LWIN", 28 | "COMMAND": "LWIN", 29 | "RIGHT_GUI": "RWIN", 30 | // apps ? 31 | "APPLICATION": "APPS", 32 | // other 33 | "BACKSPACE": "BACK", 34 | "ENTER": "RETURN", 35 | "RETURN": "RETURN", 36 | "CAPS_LOCK": "CAPITAL", 37 | "SPACEBAR": "SPACE", 38 | "SPACE": "SPACE", // use both 39 | // punctuation or stuff 40 | "COMMA": "OEM_COMMA", 41 | "PERIOD": "OEM_PERIOD", 42 | "EQUALS": "OEM_PLUS", 43 | "SEMICOLON": "OEM_1", 44 | "FORWARD_SLASH": "OEM_2", 45 | "GRAVE_ACCENT": "OEM_3", 46 | "LEFT_BRACKET": "OEM_4", 47 | "BACKSLASH": "OEM_5", 48 | "RIGHT_BRACKET": "OEM_6", 49 | "QUOTE": "OEM_7", 50 | "MINUS": "OEM_MINUS", 51 | "PAGE_DOWN": "NEXT", 52 | "PAGE_UP": "PRIOR", 53 | "PRINT_SCREEN": "SNAPSHOT", 54 | "SCROLL_LOCK": "SCROLL", 55 | // numpad 56 | "KEYPAD_NUMLOCK": "NUMLOCK", 57 | "KEYPAD_FORWARD_SLASH": "DIVIDE", 58 | "KEYPAD_ASTERISK": "MULTIPLY", 59 | "KEYPAD_MINUS": "SUBTRACT", 60 | "KEYPAD_PLUS": "ADD", 61 | // arrows 62 | "LEFT_ARROW": "LEFT", 63 | "RIGHT_ARROW": "RIGHT", 64 | "UP_ARROW": "UP", 65 | "DOWN_ARROW": "DOWN", 66 | // other numpad 67 | "KEYPAD_ONE": "NUMPAD1", 68 | "KEYPAD_TWO": "NUMPAD2", 69 | "KEYPAD_THREE": "NUMPAD3", 70 | "KEYPAD_FOUR": "NUMPAD4", 71 | "KEYPAD_FIVE": "NUMPAD5", 72 | "KEYPAD_SIX": "NUMPAD6", 73 | "KEYPAD_SEVEN": "NUMPAD7", 74 | "KEYPAD_EIGHT": "NUMPAD8", 75 | "KEYPAD_NINE": "NUMPAD9", 76 | "KEYPAD_ZERO": "NUMPAD0", 77 | "KEYPAD_PERIOD": "DECIMAL", 78 | // 'POUND': no US 79 | // 'POWER': mac ? 80 | }; 81 | -------------------------------------------------------------------------------- /generator-web/src/keycode_us_ref.js: -------------------------------------------------------------------------------- 1 | // export 2 | var Keycode = { 3 | "A": 0x04, 4 | "B": 0x05, 5 | "C": 0x06, 6 | "D": 0x07, 7 | "E": 0x08, 8 | "F": 0x09, 9 | "G": 0x0A, 10 | "H": 0x0B, 11 | "I": 0x0C, 12 | "J": 0x0D, 13 | "K": 0x0E, 14 | "L": 0x0F, 15 | "M": 0x10, 16 | "N": 0x11, 17 | "O": 0x12, 18 | "P": 0x13, 19 | "Q": 0x14, 20 | "R": 0x15, 21 | "S": 0x16, 22 | "T": 0x17, 23 | "U": 0x18, 24 | "V": 0x19, 25 | "W": 0x1A, 26 | "X": 0x1B, 27 | "Y": 0x1C, 28 | "Z": 0x1D, 29 | 30 | "ONE": 0x1E, 31 | "TWO": 0x1F, 32 | "THREE": 0x20, 33 | "FOUR": 0x21, 34 | "FIVE": 0x22, 35 | "SIX": 0x23, 36 | "SEVEN": 0x24, 37 | "EIGHT": 0x25, 38 | "NINE": 0x26, 39 | "ZERO": 0x27, 40 | "ENTER": 0x28, 41 | "RETURN": 0x28, 42 | "ESCAPE": 0x29, 43 | "BACKSPACE": 0x2A, 44 | "TAB": 0x2B, 45 | "SPACEBAR": 0x2C, 46 | "SPACE": 0x2C, 47 | "MINUS": 0x2D, 48 | "EQUALS": 0x2E, 49 | "LEFT_BRACKET": 0x2F, 50 | "RIGHT_BRACKET": 0x30, 51 | "BACKSLASH": 0x31, 52 | "POUND": 0x32, 53 | "SEMICOLON": 0x33, 54 | "QUOTE": 0x34, 55 | "GRAVE_ACCENT": 0x35, 56 | "COMMA": 0x36, 57 | "PERIOD": 0x37, 58 | "FORWARD_SLASH": 0x38, 59 | 60 | "CAPS_LOCK": 0x39, 61 | 62 | "F1": 0x3A, 63 | "F2": 0x3B, 64 | "F3": 0x3C, 65 | "F4": 0x3D, 66 | "F5": 0x3E, 67 | "F6": 0x3F, 68 | "F7": 0x40, 69 | "F8": 0x41, 70 | "F9": 0x42, 71 | "F10": 0x43, 72 | "F11": 0x44, 73 | "F12": 0x45, 74 | 75 | "PRINT_SCREEN": 0x46, 76 | "SCROLL_LOCK": 0x47, 77 | "PAUSE": 0x48, 78 | 79 | "INSERT": 0x49, 80 | "HOME": 0x4A, 81 | "PAGE_UP": 0x4B, 82 | "DELETE": 0x4C, 83 | "END": 0x4D, 84 | "PAGE_DOWN": 0x4E, 85 | 86 | "RIGHT_ARROW": 0x4F, 87 | "LEFT_ARROW": 0x50, 88 | "DOWN_ARROW": 0x51, 89 | "UP_ARROW": 0x52, 90 | 91 | "KEYPAD_NUMLOCK": 0x53, 92 | "KEYPAD_FORWARD_SLASH": 0x54, 93 | "KEYPAD_ASTERISK": 0x55, 94 | "KEYPAD_MINUS": 0x56, 95 | "KEYPAD_PLUS": 0x57, 96 | "KEYPAD_ENTER": 0x58, 97 | "KEYPAD_ONE": 0x59, 98 | "KEYPAD_TWO": 0x5A, 99 | "KEYPAD_THREE": 0x5B, 100 | "KEYPAD_FOUR": 0x5C, 101 | "KEYPAD_FIVE": 0x5D, 102 | "KEYPAD_SIX": 0x5E, 103 | "KEYPAD_SEVEN": 0x5F, 104 | "KEYPAD_EIGHT": 0x60, 105 | "KEYPAD_NINE": 0x61, 106 | "KEYPAD_ZERO": 0x62, 107 | "KEYPAD_PERIOD": 0x63, 108 | "KEYPAD_BACKSLASH": 0x64, 109 | 110 | "APPLICATION": 0x65, 111 | "POWER": 0x66, 112 | "KEYPAD_EQUALS": 0x67, 113 | "F13": 0x68, 114 | "F14": 0x69, 115 | "F15": 0x6A, 116 | "F16": 0x6B, 117 | "F17": 0x6C, 118 | "F18": 0x6D, 119 | "F19": 0x6E, 120 | 121 | "F20": 0x6F, 122 | "F21": 0x70, 123 | "F22": 0x71, 124 | "F23": 0x72, 125 | "F24": 0x73, 126 | 127 | "LEFT_CONTROL": 0xE0, 128 | "CONTROL": 0xE0, 129 | "LEFT_SHIFT": 0xE1, 130 | "SHIFT": 0xE1, 131 | "LEFT_ALT": 0xE2, 132 | "ALT": 0xE2, 133 | "OPTION": 0xE2, 134 | "LEFT_GUI": 0xE3, 135 | "GUI": 0xE3, 136 | "WINDOWS": 0xE3, 137 | "COMMAND": 0xE3, 138 | "RIGHT_CONTROL": 0xE4, 139 | "RIGHT_SHIFT": 0xE5, 140 | "RIGHT_ALT": 0xE6, 141 | "RIGHT_GUI": 0xE7, 142 | }; -------------------------------------------------------------------------------- /generator-web/src/sample_code.py: -------------------------------------------------------------------------------- 1 | import usb_hid 2 | from adafruit_hid.keyboard import Keyboard 3 | import keyboard_layout_win_fr 4 | from keycode_win_fr import Keycode 5 | 6 | keyboard = Keyboard(usb_hid.devices) 7 | # type with a layout 8 | layout = keyboard_layout_win_fr.KeyboardLayout(keyboard) 9 | layout.write("Bonjour le monde") 10 | # shortcuts with keycodes 11 | keyboard.send(Keycode.LEFT_CONTROL, Keycode.A) 12 | keyboard.send(Keycode.DELETE) 13 | -------------------------------------------------------------------------------- /generator-web/src/sample_code_template.py: -------------------------------------------------------------------------------- 1 | import usb_hid 2 | from adafruit_hid.keyboard import Keyboard 3 | import keyboard_layout__ 4 | from keycode__ import Keycode 5 | 6 | keyboard = Keyboard(usb_hid.devices) 7 | # type with a layout 8 | layout = keyboard_layout__.KeyboardLayout(keyboard) 9 | layout.write("Bonjour le monde") 10 | # shortcuts with keycodes 11 | keyboard.send(Keycode.LEFT_CONTROL, Keycode.A) 12 | keyboard.send(Keycode.DELETE) 13 | -------------------------------------------------------------------------------- /generator/__init__.py: -------------------------------------------------------------------------------- 1 | from . import layout_generator 2 | 3 | layout_generator.main() 4 | -------------------------------------------------------------------------------- /generator/keycode_name_to_virtualkey.py: -------------------------------------------------------------------------------- 1 | name_to_virtualkey = { 2 | "ONE": "1", 3 | "TWO": "2", 4 | "THREE": "3", 5 | "FOUR": "4", 6 | "FIVE": "5", 7 | "SIX": "6", 8 | "SEVEN": "7", 9 | "EIGHT": "8", 10 | "NINE": "9", 11 | "ZERO": "0", 12 | # modifiers 13 | "RIGHT_SHIFT": "RSHIFT", 14 | "LEFT_SHIFT": "LSHIFT", 15 | "SHIFT": "LSHIFT", 16 | "RIGHT_ALT": "RMENU", 17 | "LEFT_ALT": "LMENU", 18 | "ALT": "LMENU", 19 | "OPTION": "LMENU", 20 | "RIGHT_CONTROL": "RCONTROL", 21 | "LEFT_CONTROL": "LCONTROL", 22 | "CONTROL": "LCONTROL", 23 | # ALT GR 24 | "ALTGR": "RMENU", 25 | # windows key 26 | "LEFT_GUI": "LWIN", 27 | "GUI": "LWIN", 28 | "WINDOWS": "LWIN", 29 | "COMMAND": "LWIN", 30 | "RIGHT_GUI": "RWIN", 31 | # apps ? 32 | "APPLICATION": "APPS", 33 | # other 34 | "BACKSPACE": "BACK", 35 | "ENTER": "RETURN", 36 | "RETURN": "RETURN", 37 | "CAPS_LOCK": "CAPITAL", 38 | "SPACEBAR": "SPACE", 39 | "SPACE": "SPACE", # use both 40 | # punctuation or stuff 41 | "COMMA": "OEM_COMMA", 42 | "PERIOD": "OEM_PERIOD", 43 | "EQUALS": "OEM_PLUS", 44 | "SEMICOLON": "OEM_1", 45 | "FORWARD_SLASH": "OEM_2", 46 | "GRAVE_ACCENT": "OEM_3", 47 | "LEFT_BRACKET": "OEM_4", 48 | "BACKSLASH": "OEM_5", 49 | "RIGHT_BRACKET": "OEM_6", 50 | "QUOTE": "OEM_7", 51 | "MINUS": "OEM_MINUS", 52 | "PAGE_DOWN": "NEXT", 53 | "PAGE_UP": "PRIOR", 54 | "PRINT_SCREEN": "SNAPSHOT", 55 | "SCROLL_LOCK": "SCROLL", 56 | # numpad 57 | "KEYPAD_NUMLOCK": "NUMLOCK", 58 | "KEYPAD_FORWARD_SLASH": "DIVIDE", 59 | "KEYPAD_ASTERISK": "MULTIPLY", 60 | "KEYPAD_MINUS": "SUBTRACT", 61 | "KEYPAD_PLUS": "ADD", 62 | # arrows 63 | "LEFT_ARROW": "LEFT", 64 | "RIGHT_ARROW": "RIGHT", 65 | "UP_ARROW": "UP", 66 | "DOWN_ARROW": "DOWN", 67 | # other numpad 68 | "KEYPAD_ONE": "NUMPAD1", 69 | "KEYPAD_TWO": "NUMPAD2", 70 | "KEYPAD_THREE": "NUMPAD3", 71 | "KEYPAD_FOUR": "NUMPAD4", 72 | "KEYPAD_FIVE": "NUMPAD5", 73 | "KEYPAD_SIX": "NUMPAD6", 74 | "KEYPAD_SEVEN": "NUMPAD7", 75 | "KEYPAD_EIGHT": "NUMPAD8", 76 | "KEYPAD_NINE": "NUMPAD9", 77 | "KEYPAD_ZERO": "NUMPAD0", 78 | "KEYPAD_PERIOD": "DECIMAL", 79 | # 'POUND': no US 80 | # 'POWER': mac ? 81 | } 82 | -------------------------------------------------------------------------------- /libraries/helpers/alt_codes.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | Courtesy of https://github.com/nico7885 6 | """ 7 | 8 | from adafruit_hid.keycode import Keycode 9 | 10 | 11 | class Altcode(Keycode): 12 | unicodeChar = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ" 13 | asciiexValue = (128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 158, 159) 14 | 15 | def __init__(self, keyboard, layout): 16 | self.keyboard = keyboard 17 | self.layout = layout 18 | 19 | def _special_char(self, char_value): 20 | if char_value == 0x0A or char_value == 0x0D: 21 | self.keyboard.send(Keycode.ENTER) 22 | elif char_value == 0x09: 23 | self.keyboard.send(Keycode.TAB) 24 | else: 25 | raise ValueError("Value of char is unknown:", char_value) 26 | 27 | def _get_value_of_char(self, char): 28 | # if the character is in the extended ascii table, 29 | # return the ASCII value else return the unicode value 30 | indice = self.unicodeChar.find(char) 31 | if indice != -1: 32 | char_val = self.asciiexValue[indice] 33 | else: 34 | char_val = ord(char) 35 | return char_val 36 | 37 | def _num_to_keypad(self, string): 38 | for char in string: 39 | if char.isdigit(): 40 | num = int(char) 41 | # don't use send because it releases all 42 | if num > 0: 43 | self.keyboard.press(self.KEYPAD_ONE + num - 1) 44 | self.keyboard.release(self.KEYPAD_ONE + num - 1) 45 | elif num == 0: 46 | self.keyboard.press(self.KEYPAD_ZERO) 47 | self.keyboard.release(self.KEYPAD_ZERO) 48 | else: 49 | raise ValueError("Char is not a digit:", char) 50 | break 51 | 52 | def _win_alt_code_CP1252(self, asciiex_string): 53 | len_asciiex = len(asciiex_string) 54 | self.keyboard.press(self.ALT) 55 | for x in range(4 - len_asciiex): 56 | # don't use send because it releases all 57 | self.keyboard.press(self.KEYPAD_ZERO) 58 | self.keyboard.release(self.KEYPAD_ZERO) 59 | self._num_to_keypad(asciiex_string) 60 | self.keyboard.release_all() 61 | 62 | def _win_alt_unicode_point(self, unicode_string): 63 | self.keyboard.press(self.ALT) 64 | self._num_to_keypad(unicode_string) 65 | self.keyboard.release_all() 66 | 67 | def windows(self, string): 68 | for char in string: 69 | char_val = self._get_value_of_char(char) 70 | if char_val < 32: 71 | # for TAB and \n 72 | self._special_char(char_val) 73 | elif char_val < 256: 74 | self._win_alt_code_CP1252(str(char_val)) 75 | else: 76 | self._win_alt_unicode_point(str(char_val)) 77 | 78 | def _linux_alt_unicode_point(self, unicode_stringHex): 79 | self.keyboard.send(self.CONTROL, self.SHIFT, self.U) 80 | for char in unicode_stringHex[2:]: 81 | # don't send shift or altgr here, only the key pos is required 82 | self.keyboard.send(self.layout.keycodes(char)[-1]) 83 | self.keyboard.send(self.ENTER) 84 | 85 | def linux(self, string): 86 | for char in string: 87 | char_val = ord(char) 88 | if char_val < 32: 89 | # for TAB and \n 90 | self._special_char(char_val) 91 | else: 92 | self._linux_alt_unicode_point(hex(char_val)) 93 | -------------------------------------------------------------------------------- /libraries/helpers/consumer_control_extended.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | Extended list of consumer controls. 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class ConsumerControlExtended: 14 | UNASSIGNED = 0x00 15 | CONSUMER_CONTROL = 0x01 16 | NUMERIC_KEY_PAD = 0x02 17 | PROGRAMMABLE_BUTTONS = 0x03 18 | PLUS10 = 0x20 19 | PLUS100 = 0x21 20 | AM_PM = 0x22 # AM/PM 21 | AM = AM_PM 22 | PM = AM_PM 23 | POWER = 0x30 24 | RESET = 0x31 25 | SLEEP = 0x32 26 | SLEEP_AFTER = 0x33 27 | SLEEP_MODE = 0x34 28 | ILLUMINATION = 0x35 29 | FUNCTION_BUTTONS = 0x36 30 | MENU = 0x40 31 | MENU_PICK = 0x41 32 | MENU_UP = 0x42 33 | MENU_DOWN = 0x43 34 | MENU_LEFT = 0x44 35 | MENU_RIGHT = 0x45 36 | MENU_ESCAPE = 0x46 37 | MENU_VALUE_INCREASE = 0x47 38 | MENU_VALUE_DECREASE = 0x48 39 | DATA_ON_SCREEN = 0x60 40 | CLOSED_CAPTION = 0x61 41 | CLOSED_CAPTION_SELECT = 0x62 42 | VCR_TV = 0x63 # VCR/TV 43 | # VCR = VCR_TV 44 | # TV = VCR_TV 45 | BROADCAST_MODE = 0x64 46 | SNAPSHOT = 0x65 47 | STILL = 0x66 48 | SELECTION = 0x80 49 | ASSIGN_SELECTION = 0x81 50 | MODE_STEP = 0x82 51 | RECALL_LAST = 0x83 52 | ENTER_CHANNEL = 0x84 53 | ORDER_MOVIE = 0x85 54 | CHANNEL = 0x86 55 | MEDIA_SELECTION = 0x87 56 | MEDIA_SELECT_COMPUTER = 0x88 57 | MEDIA_SELECT_TV = 0x89 58 | MEDIA_SELECT_WWW = 0x8A 59 | MEDIA_SELECT_DVD = 0x8B 60 | MEDIA_SELECT_TELEPHONE = 0x8C 61 | MEDIA_SELECT_PROGRAM_GUIDE = 0x8D 62 | MEDIA_SELECT_VIDEO_PHONE = 0x8E 63 | MEDIA_SELECT_GAMES = 0x8F 64 | MEDIA_SELECT_MESSAGES = 0x90 65 | MEDIA_SELECT_CD = 0x91 66 | MEDIA_SELECT_VCR = 0x92 67 | MEDIA_SELECT_TUNER = 0x93 68 | QUIT = 0x94 69 | HELP = 0x95 70 | MEDIA_SELECT_TAPE = 0x96 71 | MEDIA_SELECT_CABLE = 0x97 72 | MEDIA_SELECT_SATELLITE = 0x98 73 | MEDIA_SELECT_SECURITY = 0x99 74 | MEDIA_SELECT_HOME = 0x9A 75 | MEDIA_SELECT_CALL = 0x9B 76 | CHANNEL_INCREMENT = 0x9C 77 | CHANNEL_DECREMENT = 0x9D 78 | MEDIA_SELECT_SAP = 0x9E 79 | VCR_PLUS = 0xA0 80 | ONCE = 0xA1 81 | DAILY = 0xA2 82 | WEEKLY = 0xA3 83 | MONTHLY = 0xA4 84 | PLAY = 0xB0 85 | PAUSE = 0xB1 86 | RECORD = 0xB2 87 | FAST_FORWARD = 0xB3 88 | REWIND = 0xB4 89 | SCAN_NEXT_TRACK = 0xB5 90 | SCAN_PREVIOUS_TRACK = 0xB6 91 | STOP = 0xB7 92 | EJECT = 0xB8 93 | RANDOM_PLAY = 0xB9 94 | SELECT_DISC = 0xBA 95 | ENTER_DISC = 0xBB 96 | REPEAT = 0xBC 97 | TRACKING = 0xBD 98 | TRACK_NORMAL = 0xBE 99 | SLOW_TRACKING = 0xBF 100 | FRAME_FORWARD = 0xC0 101 | FRAME_BACK = 0xC1 102 | MARK = 0xC2 103 | CLEAR_MARK = 0xC3 104 | REPEAT_FROM_MARK = 0xC4 105 | RETURN_TO_MARK = 0xC5 106 | SEARCH_MARK_FORWARD = 0xC6 107 | SEARCH_MARK_BACKWARDS = 0xC7 108 | COUNTER_RESET = 0xC8 109 | SHOW_COUNTER = 0xC9 110 | TRACKING_INCREMENT = 0xCA 111 | TRACKING_DECREMENT = 0xCB 112 | VOLUME = 0xE0 113 | BALANCE = 0xE1 114 | MUTE = 0xE2 115 | BASS = 0xE3 116 | TREBLE = 0xE4 117 | BASS_BOOST = 0xE5 118 | SURROUND_MODE = 0xE6 119 | LOUDNESS = 0xE7 120 | MPX = 0xE8 121 | VOLUME_UP = 0xE9 122 | VOLUME_DOWN = 0xEA 123 | SPEED_SELECT = 0xF0 124 | PLAYBACK_SPEED = 0xF1 125 | STANDARD_PLAY = 0xF2 126 | LONG_PLAY = 0xF3 127 | EXTENDED_PLAY = 0xF4 128 | SLOW = 0xF5 129 | FAN_ENABLE = 0x100 130 | FAN_SPEED = 0x101 131 | LIGHT = 0x102 132 | LIGHT_ILLUMINATION_LEVEL = 0x103 133 | CLIMATE_CONTROL_ENABLE = 0x104 134 | ROOM_TEMPERATURE = 0x105 135 | SECURITY_ENABLE = 0x106 136 | FIRE_ALARM = 0x107 137 | POLICE_ALARM = 0x108 138 | BALANCE_RIGHT = 0x150 139 | BALANCE_LEFT = 0x151 140 | BASS_INCREMENT = 0x152 141 | BASS_DECREMENT = 0x153 142 | TREBLE_INCREMENT = 0x154 143 | TREBLE_DECREMENT = 0x155 144 | SPEAKER_SYSTEM = 0x160 145 | CHANNEL_LEFT = 0x161 146 | CHANNEL_RIGHT = 0x162 147 | CHANNEL_CENTER = 0x163 148 | CHANNEL_FRONT = 0x164 149 | CHANNEL_CENTER_FRONT = 0x165 150 | CHANNEL_SIDE = 0x166 151 | CHANNEL_SURROUND = 0x167 152 | CHANNEL_LOW_FREQUENCY_ENHANCEMENT = 0x168 153 | CHANNEL_TOP = 0x169 154 | CHANNEL_UNKNOWN = 0x16A 155 | SUB_CHANNEL = 0x170 156 | SUB_CHANNEL_INCREMENT = 0x171 157 | SUB_CHANNEL_DECREMENT = 0x172 158 | ALTERNATE_AUDIO_INCREMENT = 0x173 159 | ALTERNATE_AUDIO_DECREMENT = 0x174 160 | APPLICATION_LAUNCH_BUTTONS = 0x180 161 | AL_LAUNCH_BUTTON_CONFIGURATION_TOOL = 0x181 162 | AL_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182 163 | AL_CONSUMER_CONTROL_CONFIGURATION = 0x183 164 | AL_WORD_PROCESSOR = 0x184 165 | AL_TEXT_EDITOR = 0x185 166 | AL_SPREADSHEET = 0x186 167 | AL_GRAPHICS_EDITOR = 0x187 168 | AL_PRESENTATION_APP = 0x188 169 | AL_DATABASE_APP = 0x189 170 | AL_EMAIL_READER = 0x18A 171 | AL_NEWSREADER = 0x18B 172 | AL_VOICEMAIL = 0x18C 173 | AL_CONTACTS = 0x18D # AL_CONTACTS/ADDRESS_BOOK 174 | AL_ADDRESS_BOOK = AL_CONTACTS 175 | AL_CALENDAR = 0x18E # AL_CALENDAR/SCHEDULE 176 | AL_SCHEDULE = AL_CALENDAR 177 | AL_PROJECT_MANAGER = 0x18F # AL_TASK/PROJECT_MANAGER 178 | # AL_TASK_MANAGER = AL_PROJECT_MANAGER 179 | AL_LOG = 0x193 # AL_LOG/JOURNAL/TIMECARD 180 | AL_JOURNAL = AL_LOG 181 | AL_TIMECARD = AL_LOG 182 | AL_CHECKBOOK = 0x191 # AL_CHECKBOOK/FINANCE 183 | AL_FINANCE = AL_CHECKBOOK 184 | AL_CALCULATOR = 0x192 185 | AL_AV_CAPTURE_PLAYBACK = 0x193 # AL_A/V_CAPTURE/PLAYBACK 186 | AL_LOCAL_MACHINE_BROWSER = 0x194 187 | AL_LAN_BROWSER = 0x195 # AL_LAN/WAN_BROWSER 188 | AL_WAN_BROWSER = AL_LAN_BROWSER 189 | AL_INTERNET_BROWSER = 0x196 190 | AL_REMOTE_NETWORKING = 0x197 # AL_REMOTE_NETWORKING/ISP_CONNECT 191 | AL_ISP_CONNECT = AL_REMOTE_NETWORKING 192 | AL_NETWORK_CONFERENCE = 0x198 193 | AL_NETWORK_CHAT = 0x199 194 | AL_TELEPHONY = 0x19A # AL_TELEPHONY/DIALER 195 | AL_DIALER = AL_TELEPHONY 196 | AL_LOGON = 0x19B 197 | AL_LOGOFF = 0x19C 198 | AL_LOGON_LOGOFF = 0x19D # AL_LOGON/LOGOFF 199 | AL_TERMINAL_LOCK = 0x19E # AL_TERMINAL_LOCK/SCREENSAVER 200 | AL_SCREENSAVER = AL_TERMINAL_LOCK 201 | AL_CONTROL_PANEL = 0x19F 202 | AL_COMMAND_LINE_PROCESSOR = 0x1A0 # AL_COMMAND_LINE_PROCESSOR/RUN 203 | AL_RUN = AL_COMMAND_LINE_PROCESSOR 204 | AL_PROCESS_MANAGER = 0x1A1 # AL_PROCESS/TASK_MANAGER 205 | AL_TASK_MANAGER = AL_PROCESS_MANAGER 206 | AL_SELECT_TASK = 0x1A2 # AL_SELECT_TASK/APPLICATION 207 | AL_SELECT_APPLICATION = AL_SELECT_TASK 208 | AL_NEXT_TASK = 0x1A3 # AL_NEXT_TASK/APPLICATION 209 | AL_NEXT_APPLICATION = AL_NEXT_TASK 210 | AL_PREVIOUS_TASK = 0x1A4 # AL_PREVIOUS_TASK/APPLICATION 211 | AL_PREVIOUS_APPLICATION = AL_PREVIOUS_TASK 212 | AL_PREEMPTIVE_HALT_TASK = 0x1A5 # AL_PREEMPTIVE_HALT_TASK/APPLICATION 213 | AL_PREEMPTIVE_HALT_APPLICATION = AL_PREEMPTIVE_HALT_TASK 214 | GENERIC_GUI_APPLICATION_CONTROLS = 0x200 215 | AC_NEW = 0x201 216 | AC_OPEN = 0x202 217 | AC_CLOSE = 0x203 218 | AC_EXIT = 0x204 219 | AC_MAXIMIZE = 0x205 220 | AC_MINIMIZE = 0x206 221 | AC_SAVE = 0x207 222 | AC_PRINT = 0x208 223 | AC_PROPERTIES = 0x209 224 | AC_UNDO = 0x21A 225 | AC_COPY = 0x21B 226 | AC_CUT = 0x21C 227 | AC_PASTE = 0x21D 228 | AC_SELECT_ALL = 0x21E 229 | AC_FIND = 0x21F 230 | AC_FIND_AND_REPLACE = 0x220 231 | AC_SEARCH = 0x221 232 | AC_GO_TO = 0x222 233 | AC_HOME = 0x223 234 | AC_BACK = 0x224 235 | AC_FORWARD = 0x225 236 | AC_STOP = 0x226 237 | AC_REFRESH = 0x227 238 | AC_PREVIOUS_LINK = 0x228 239 | AC_NEXT_LINK = 0x229 240 | AC_BOOKMARKS = 0x22A 241 | AC_HISTORY = 0x22B 242 | AC_SUBSCRIPTIONS = 0x22C 243 | AC_ZOOM_IN = 0x22D 244 | AC_ZOOM_OUT = 0x22E 245 | AC_ZOOM = 0x22F 246 | AC_FULL_SCREEN_VIEW = 0x230 247 | AC_NORMAL_VIEW = 0x231 248 | AC_VIEW_TOGGLE = 0x232 249 | AC_SCROLL_UP = 0x233 250 | AC_SCROLL_DOWN = 0x234 251 | AC_SCROLL = 0x235 252 | AC_PAN_LEFT = 0x236 253 | AC_PAN_RIGHT = 0x237 254 | AC_PAN = 0x238 255 | AC_NEW_WINDOW = 0x239 256 | AC_TILE_HORIZONTALLY = 0x23A 257 | AC_TILE_VERTICALLY = 0x23B 258 | AC_FORMAT = 0x23C 259 | 260 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_br.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TIL = 0x34 71 | TWO = 0x1f 72 | FIVE = 0x22 73 | FOUR = 0x21 74 | HOME = 0x4a 75 | NINE = 0x26 76 | ZERO = 0x27 77 | AGUDO = 0x2f 78 | ALTGR = 0xe6 79 | COMMA = 0x36 80 | EIGHT = 0x25 81 | ENTER = 0x28 82 | GRAVE = 0x2f 83 | MINUS = 0x2d 84 | PAUSE = 0x48 85 | QUOTE = 0x34 86 | SEVEN = 0x24 87 | SHIFT = 0xe1 88 | SPACE = 0x2c 89 | THREE = 0x20 90 | TREMA = 0x23 91 | APPLICATION = 0x65 92 | BACKSLASH = 0x31 93 | BACKSPACE = 0x2a 94 | CAPS_LOCK = 0x39 95 | CIRCUNFLEXO = 0x34 96 | COMMAND = 0xe3 97 | CONTROL = 0xe0 98 | DELETE = 0x4c 99 | DOWN_ARROW = 0x51 100 | EQUALS = 0x2e 101 | ESCAPE = 0x29 102 | FORWARD_SLASH = 0x38 103 | GRAVE_ACCENT = 0x35 104 | INSERT = 0x49 105 | KEYPAD_ASTERISK = 0x55 106 | KEYPAD_EIGHT = 0x60 107 | KEYPAD_FIVE = 0x5d 108 | KEYPAD_FORWARD_SLASH = 0x54 109 | KEYPAD_FOUR = 0x5c 110 | KEYPAD_MINUS = 0x56 111 | KEYPAD_NINE = 0x61 112 | KEYPAD_NUMLOCK = 0x53 113 | KEYPAD_ONE = 0x59 114 | KEYPAD_PERIOD = 0x63 115 | KEYPAD_PLUS = 0x57 116 | KEYPAD_SEVEN = 0x5f 117 | KEYPAD_SIX = 0x5e 118 | KEYPAD_THREE = 0x5b 119 | KEYPAD_TWO = 0x5a 120 | KEYPAD_ZERO = 0x62 121 | LEFT_ALT = 0xe2 122 | LEFT_ARROW = 0x50 123 | LEFT_BRACKET = 0x2f 124 | LEFT_CONTROL = 0xe0 125 | LEFT_GUI = 0xe3 126 | LEFT_SHIFT = 0xe1 127 | OEM_102 = 0x64 128 | OPTION = 0xe2 129 | PAGE_DOWN = 0x4e 130 | PAGE_UP = 0x4b 131 | PERIOD = 0x37 132 | PRINT_SCREEN = 0x46 133 | RETURN = 0x28 134 | RIGHT_ALT = 0xe6 135 | RIGHT_ARROW = 0x4f 136 | RIGHT_BRACKET = 0x30 137 | RIGHT_CONTROL = 0xe4 138 | RIGHT_GUI = 0xe7 139 | RIGHT_SHIFT = 0xe5 140 | SCROLL_LOCK = 0x47 141 | SEMICOLON = 0x33 142 | SPACEBAR = 0x2c 143 | UP_ARROW = 0x52 144 | WINDOWS = 0xe3 145 | 146 | @classmethod 147 | def modifier_bit(cls, keycode): 148 | """Return the modifer bit to be set in an HID keycode report if this is a 149 | modifier key; otherwise return 0.""" 150 | return ( 151 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 152 | ) 153 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_cz.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1d 39 | Z = 0x1c 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | RING = 0x22 76 | ZERO = 0x27 77 | ALTGR = 0xe6 78 | BREVE = 0x21 79 | COMMA = 0x36 80 | ČáRKA = 0x26 81 | EIGHT = 0x25 82 | ENTER = 0x28 83 | HACEK = 0x1f 84 | MINUS = 0x38 85 | PAUSE = 0x48 86 | QUOTE = 0x34 87 | SEVEN = 0x24 88 | SHIFT = 0xe1 89 | SPACE = 0x2c 90 | THREE = 0x20 91 | APPLICATION = 0x65 92 | BACKSLASH = 0x31 93 | BACKSPACE = 0x2a 94 | CAPS_LOCK = 0x39 95 | CEDILLA = 0x2e 96 | CIRCUMFLEX = 0x20 97 | COMMAND = 0xe3 98 | CONTROL = 0xe0 99 | DELETE = 0x4c 100 | DOUBLE_ACUTE = 0x27 101 | DOWN_ARROW = 0x51 102 | EQUALS = 0x2d 103 | ESCAPE = 0x29 104 | FORWARD_SLASH = 0x2e 105 | GRAVE_ACCENT = 0x35 106 | INSERT = 0x49 107 | KEYPAD_ASTERISK = 0x55 108 | KEYPAD_EIGHT = 0x60 109 | KEYPAD_FIVE = 0x5d 110 | KEYPAD_FORWARD_SLASH = 0x54 111 | KEYPAD_FOUR = 0x5c 112 | KEYPAD_MINUS = 0x56 113 | KEYPAD_NINE = 0x61 114 | KEYPAD_NUMLOCK = 0x53 115 | KEYPAD_ONE = 0x59 116 | KEYPAD_PERIOD = 0x63 117 | KEYPAD_PLUS = 0x57 118 | KEYPAD_SEVEN = 0x5f 119 | KEYPAD_SIX = 0x5e 120 | KEYPAD_THREE = 0x5b 121 | KEYPAD_TWO = 0x5a 122 | KEYPAD_ZERO = 0x62 123 | LEFT_ALT = 0xe2 124 | LEFT_ARROW = 0x50 125 | LEFT_BRACKET = 0x2f 126 | LEFT_CONTROL = 0xe0 127 | LEFT_GUI = 0xe3 128 | LEFT_SHIFT = 0xe1 129 | OEM_102 = 0x64 130 | OGONEK = 0x23 131 | OPTION = 0xe2 132 | PAGE_DOWN = 0x4e 133 | PAGE_UP = 0x4b 134 | PERIOD = 0x37 135 | PRINT_SCREEN = 0x46 136 | RETURN = 0x28 137 | RIGHT_ALT = 0xe6 138 | RIGHT_ARROW = 0x4f 139 | RIGHT_BRACKET = 0x30 140 | RIGHT_CONTROL = 0xe4 141 | RIGHT_GUI = 0xe7 142 | RIGHT_SHIFT = 0xe5 143 | SCROLL_LOCK = 0x47 144 | SEMICOLON = 0x33 145 | SPACEBAR = 0x2c 146 | UMLAUT = 0x2d 147 | UP_ARROW = 0x52 148 | WINDOWS = 0xe3 149 | 150 | @classmethod 151 | def modifier_bit(cls, keycode): 152 | """Return the modifer bit to be set in an HID keycode report if this is a 153 | modifier key; otherwise return 0.""" 154 | return ( 155 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 156 | ) 157 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_cz1.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | RING = 0x35 76 | ZERO = 0x27 77 | ALTGR = 0xe6 78 | COMMA = 0x36 79 | ČáRKA = 0x2e 80 | EIGHT = 0x25 81 | ENTER = 0x28 82 | HACEK = 0x2e 83 | MINUS = 0x2d 84 | PAUSE = 0x48 85 | QUOTE = 0x34 86 | SEVEN = 0x24 87 | SHIFT = 0xe1 88 | SPACE = 0x2c 89 | THREE = 0x20 90 | APPLICATION = 0x65 91 | BACKSLASH = 0x31 92 | BACKSPACE = 0x2a 93 | CAPS_LOCK = 0x39 94 | COMMAND = 0xe3 95 | CONTROL = 0xe0 96 | DELETE = 0x4c 97 | DOWN_ARROW = 0x51 98 | EQUALS = 0x2e 99 | ESCAPE = 0x29 100 | FORWARD_SLASH = 0x38 101 | GRAVE_ACCENT = 0x35 102 | INSERT = 0x49 103 | KEYPAD_ASTERISK = 0x55 104 | KEYPAD_EIGHT = 0x60 105 | KEYPAD_FIVE = 0x5d 106 | KEYPAD_FORWARD_SLASH = 0x54 107 | KEYPAD_FOUR = 0x5c 108 | KEYPAD_MINUS = 0x56 109 | KEYPAD_NINE = 0x61 110 | KEYPAD_NUMLOCK = 0x53 111 | KEYPAD_ONE = 0x59 112 | KEYPAD_PERIOD = 0x63 113 | KEYPAD_PLUS = 0x57 114 | KEYPAD_SEVEN = 0x5f 115 | KEYPAD_SIX = 0x5e 116 | KEYPAD_THREE = 0x5b 117 | KEYPAD_TWO = 0x5a 118 | KEYPAD_ZERO = 0x62 119 | LEFT_ALT = 0xe2 120 | LEFT_ARROW = 0x50 121 | LEFT_BRACKET = 0x2f 122 | LEFT_CONTROL = 0xe0 123 | LEFT_GUI = 0xe3 124 | LEFT_SHIFT = 0xe1 125 | OEM_102 = 0x64 126 | OPTION = 0xe2 127 | PAGE_DOWN = 0x4e 128 | PAGE_UP = 0x4b 129 | PERIOD = 0x37 130 | PRINT_SCREEN = 0x46 131 | RETURN = 0x28 132 | RIGHT_ALT = 0xe6 133 | RIGHT_ARROW = 0x4f 134 | RIGHT_BRACKET = 0x30 135 | RIGHT_CONTROL = 0xe4 136 | RIGHT_GUI = 0xe7 137 | RIGHT_SHIFT = 0xe5 138 | SCROLL_LOCK = 0x47 139 | SEMICOLON = 0x33 140 | SPACEBAR = 0x2c 141 | UMLAUT = 0x31 142 | UP_ARROW = 0x52 143 | WINDOWS = 0xe3 144 | 145 | @classmethod 146 | def modifier_bit(cls, keycode): 147 | """Return the modifer bit to be set in an HID keycode report if this is a 148 | modifier key; otherwise return 0.""" 149 | return ( 150 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 151 | ) 152 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_da.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x27 76 | ALTGR = 0xe6 77 | COMMA = 0x36 78 | EIGHT = 0x25 79 | ENTER = 0x28 80 | MINUS = 0x38 81 | PAUSE = 0x48 82 | QUOTE = 0x34 83 | SEVEN = 0x24 84 | SHIFT = 0xe1 85 | SPACE = 0x2c 86 | THREE = 0x20 87 | TILDE = 0x30 88 | TREMA = 0x30 89 | ACCENT_AIGU = 0x2e 90 | ACCENT_GRAVE = 0x2e 91 | APPLICATION = 0x65 92 | BACKSLASH = 0x35 93 | BACKSPACE = 0x2a 94 | CAPS_LOCK = 0x39 95 | CIRKUMFLEKS = 0x30 96 | COMMAND = 0xe3 97 | CONTROL = 0xe0 98 | DELETE = 0x4c 99 | DOWN_ARROW = 0x51 100 | EQUALS = 0x2d 101 | ESCAPE = 0x29 102 | FORWARD_SLASH = 0x31 103 | GRAVE_ACCENT = 0x33 104 | INSERT = 0x49 105 | KEYPAD_ASTERISK = 0x55 106 | KEYPAD_EIGHT = 0x60 107 | KEYPAD_FIVE = 0x5d 108 | KEYPAD_FORWARD_SLASH = 0x54 109 | KEYPAD_FOUR = 0x5c 110 | KEYPAD_MINUS = 0x56 111 | KEYPAD_NINE = 0x61 112 | KEYPAD_NUMLOCK = 0x53 113 | KEYPAD_ONE = 0x59 114 | KEYPAD_PERIOD = 0x63 115 | KEYPAD_PLUS = 0x57 116 | KEYPAD_SEVEN = 0x5f 117 | KEYPAD_SIX = 0x5e 118 | KEYPAD_THREE = 0x5b 119 | KEYPAD_TWO = 0x5a 120 | KEYPAD_ZERO = 0x62 121 | LEFT_ALT = 0xe2 122 | LEFT_ARROW = 0x50 123 | LEFT_BRACKET = 0x2e 124 | LEFT_CONTROL = 0xe0 125 | LEFT_GUI = 0xe3 126 | LEFT_SHIFT = 0xe1 127 | OEM_102 = 0x64 128 | OPTION = 0xe2 129 | PAGE_DOWN = 0x4e 130 | PAGE_UP = 0x4b 131 | PERIOD = 0x37 132 | PRINT_SCREEN = 0x46 133 | RETURN = 0x28 134 | RIGHT_ALT = 0xe6 135 | RIGHT_ARROW = 0x4f 136 | RIGHT_BRACKET = 0x2f 137 | RIGHT_CONTROL = 0xe4 138 | RIGHT_GUI = 0xe7 139 | RIGHT_SHIFT = 0xe5 140 | SCROLL_LOCK = 0x47 141 | SEMICOLON = 0x30 142 | SPACEBAR = 0x2c 143 | UP_ARROW = 0x52 144 | WINDOWS = 0xe3 145 | 146 | @classmethod 147 | def modifier_bit(cls, keycode): 148 | """Return the modifer bit to be set in an HID keycode report if this is a 149 | modifier key; otherwise return 0.""" 150 | return ( 151 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 152 | ) 153 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_de.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1d 39 | Z = 0x1c 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | AKUT = 0x2e 72 | FIVE = 0x22 73 | FOUR = 0x21 74 | HOME = 0x4a 75 | NINE = 0x26 76 | ZERO = 0x27 77 | ALTGR = 0xe6 78 | COMMA = 0x36 79 | EIGHT = 0x25 80 | ENTER = 0x28 81 | MINUS = 0x38 82 | PAUSE = 0x48 83 | QUOTE = 0x34 84 | SEVEN = 0x24 85 | SHIFT = 0xe1 86 | SPACE = 0x2c 87 | THREE = 0x20 88 | APPLICATION = 0x65 89 | BACKSLASH = 0x2d 90 | BACKSPACE = 0x2a 91 | CAPS_LOCK = 0x39 92 | COMMAND = 0xe3 93 | CONTROL = 0xe0 94 | DELETE = 0x4c 95 | DOWN_ARROW = 0x51 96 | EQUALS = 0x30 97 | ESCAPE = 0x29 98 | ESZETT = 0x2d 99 | FORWARD_SLASH = 0x31 100 | GRAVE_ACCENT = 0x33 101 | GRAVIS = 0x2e 102 | INSERT = 0x49 103 | KEYPAD_ASTERISK = 0x55 104 | KEYPAD_EIGHT = 0x60 105 | KEYPAD_FIVE = 0x5d 106 | KEYPAD_FORWARD_SLASH = 0x54 107 | KEYPAD_FOUR = 0x5c 108 | KEYPAD_MINUS = 0x56 109 | KEYPAD_NINE = 0x61 110 | KEYPAD_NUMLOCK = 0x53 111 | KEYPAD_ONE = 0x59 112 | KEYPAD_PERIOD = 0x63 113 | KEYPAD_PLUS = 0x57 114 | KEYPAD_SEVEN = 0x5f 115 | KEYPAD_SIX = 0x5e 116 | KEYPAD_THREE = 0x5b 117 | KEYPAD_TWO = 0x5a 118 | KEYPAD_ZERO = 0x62 119 | LEFT_ALT = 0xe2 120 | LEFT_ARROW = 0x50 121 | LEFT_CONTROL = 0xe0 122 | LEFT_GUI = 0xe3 123 | LEFT_SHIFT = 0xe1 124 | OEM_102 = 0x64 125 | OPTION = 0xe2 126 | PAGE_DOWN = 0x4e 127 | PAGE_UP = 0x4b 128 | PERIOD = 0x37 129 | PRINT_SCREEN = 0x46 130 | RETURN = 0x28 131 | RIGHT_ALT = 0xe6 132 | RIGHT_ARROW = 0x4f 133 | RIGHT_BRACKET = 0x2e 134 | RIGHT_CONTROL = 0xe4 135 | RIGHT_GUI = 0xe7 136 | RIGHT_SHIFT = 0xe5 137 | SCROLL_LOCK = 0x47 138 | SEMICOLON = 0x2f 139 | SPACEBAR = 0x2c 140 | UP_ARROW = 0x52 141 | WINDOWS = 0xe3 142 | ZIRKUMFLEX = 0x35 143 | 144 | @classmethod 145 | def modifier_bit(cls, keycode): 146 | """Return the modifer bit to be set in an HID keycode report if this is a 147 | modifier key; otherwise return 0.""" 148 | return ( 149 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 150 | ) 151 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_es.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x27 76 | AGUDO = 0x34 77 | ALTGR = 0xe6 78 | COMMA = 0x36 79 | EIGHT = 0x25 80 | ENTER = 0x28 81 | GRAVE = 0x2f 82 | MINUS = 0x38 83 | PAUSE = 0x48 84 | QUOTE = 0x34 85 | SEVEN = 0x24 86 | SHIFT = 0xe1 87 | SPACE = 0x2c 88 | THREE = 0x20 89 | TILDE = 0x21 90 | APPLICATION = 0x65 91 | BACKSLASH = 0x35 92 | BACKSPACE = 0x2a 93 | CAPS_LOCK = 0x39 94 | CIRCUNFLEJO = 0x2f 95 | COMMAND = 0xe3 96 | CONTROL = 0xe0 97 | DELETE = 0x4c 98 | DIERERIS = 0x34 99 | DOWN_ARROW = 0x51 100 | EQUALS = 0x30 101 | ESCAPE = 0x29 102 | FORWARD_SLASH = 0x31 103 | GRAVE_ACCENT = 0x33 104 | INSERT = 0x49 105 | KEYPAD_ASTERISK = 0x55 106 | KEYPAD_EIGHT = 0x60 107 | KEYPAD_FIVE = 0x5d 108 | KEYPAD_FORWARD_SLASH = 0x54 109 | KEYPAD_FOUR = 0x5c 110 | KEYPAD_MINUS = 0x56 111 | KEYPAD_NINE = 0x61 112 | KEYPAD_NUMLOCK = 0x53 113 | KEYPAD_ONE = 0x59 114 | KEYPAD_PERIOD = 0x63 115 | KEYPAD_PLUS = 0x57 116 | KEYPAD_SEVEN = 0x5f 117 | KEYPAD_SIX = 0x5e 118 | KEYPAD_THREE = 0x5b 119 | KEYPAD_TWO = 0x5a 120 | KEYPAD_ZERO = 0x62 121 | LEFT_ALT = 0xe2 122 | LEFT_ARROW = 0x50 123 | LEFT_BRACKET = 0x2d 124 | LEFT_CONTROL = 0xe0 125 | LEFT_GUI = 0xe3 126 | LEFT_SHIFT = 0xe1 127 | OEM_102 = 0x64 128 | OPTION = 0xe2 129 | PAGE_DOWN = 0x4e 130 | PAGE_UP = 0x4b 131 | PERIOD = 0x37 132 | PRINT_SCREEN = 0x46 133 | RETURN = 0x28 134 | RIGHT_ALT = 0xe6 135 | RIGHT_ARROW = 0x4f 136 | RIGHT_BRACKET = 0x2e 137 | RIGHT_CONTROL = 0xe4 138 | RIGHT_GUI = 0xe7 139 | RIGHT_SHIFT = 0xe5 140 | SCROLL_LOCK = 0x47 141 | SEMICOLON = 0x2f 142 | SPACEBAR = 0x2c 143 | UP_ARROW = 0x52 144 | WINDOWS = 0xe3 145 | 146 | @classmethod 147 | def modifier_bit(cls, keycode): 148 | """Return the modifer bit to be set in an HID keycode report if this is a 149 | modifier key; otherwise return 0.""" 150 | return ( 151 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 152 | ) 153 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_fr.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x14 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x33 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x04 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1d 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1a 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x27 76 | ALTGR = 0xe6 77 | COMMA = 0x10 78 | EIGHT = 0x25 79 | ENTER = 0x28 80 | GRAVE = 0x24 81 | OEM_8 = 0x38 82 | PAUSE = 0x48 83 | QUOTE = 0x35 84 | SEVEN = 0x24 85 | SHIFT = 0xe1 86 | SPACE = 0x2c 87 | THREE = 0x20 88 | TILDE = 0x1f 89 | TREMA = 0x2f 90 | ACCENT_CIRCONFLEXE = 0x2f 91 | APPLICATION = 0x65 92 | BACKSLASH = 0x31 93 | BACKSPACE = 0x2a 94 | CAPS_LOCK = 0x39 95 | COMMAND = 0xe3 96 | CONTROL = 0xe0 97 | DELETE = 0x4c 98 | DOWN_ARROW = 0x51 99 | EQUALS = 0x2e 100 | ESCAPE = 0x29 101 | FORWARD_SLASH = 0x37 102 | GRAVE_ACCENT = 0x34 103 | INSERT = 0x49 104 | KEYPAD_ASTERISK = 0x55 105 | KEYPAD_EIGHT = 0x60 106 | KEYPAD_FIVE = 0x5d 107 | KEYPAD_FORWARD_SLASH = 0x54 108 | KEYPAD_FOUR = 0x5c 109 | KEYPAD_MINUS = 0x56 110 | KEYPAD_NINE = 0x61 111 | KEYPAD_NUMLOCK = 0x53 112 | KEYPAD_ONE = 0x59 113 | KEYPAD_PERIOD = 0x63 114 | KEYPAD_PLUS = 0x57 115 | KEYPAD_SEVEN = 0x5f 116 | KEYPAD_SIX = 0x5e 117 | KEYPAD_THREE = 0x5b 118 | KEYPAD_TWO = 0x5a 119 | KEYPAD_ZERO = 0x62 120 | LEFT_ALT = 0xe2 121 | LEFT_ARROW = 0x50 122 | LEFT_BRACKET = 0x2d 123 | LEFT_CONTROL = 0xe0 124 | LEFT_GUI = 0xe3 125 | LEFT_SHIFT = 0xe1 126 | OEM_102 = 0x64 127 | OPTION = 0xe2 128 | PAGE_DOWN = 0x4e 129 | PAGE_UP = 0x4b 130 | PERIOD = 0x36 131 | PRINT_SCREEN = 0x46 132 | RETURN = 0x28 133 | RIGHT_ALT = 0xe6 134 | RIGHT_ARROW = 0x4f 135 | RIGHT_BRACKET = 0x2f 136 | RIGHT_CONTROL = 0xe4 137 | RIGHT_GUI = 0xe7 138 | RIGHT_SHIFT = 0xe5 139 | SCROLL_LOCK = 0x47 140 | SEMICOLON = 0x30 141 | SPACEBAR = 0x2c 142 | UP_ARROW = 0x52 143 | WINDOWS = 0xe3 144 | 145 | @classmethod 146 | def modifier_bit(cls, keycode): 147 | """Return the modifer bit to be set in an HID keycode report if this is a 148 | modifier key; otherwise return 0.""" 149 | return ( 150 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 151 | ) 152 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_hu.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1d 39 | Z = 0x1c 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x35 76 | ALTGR = 0xe6 77 | COMMA = 0x36 78 | EIGHT = 0x25 79 | ENTER = 0x28 80 | MINUS = 0x38 81 | PAUSE = 0x48 82 | QUOTE = 0x34 83 | SEVEN = 0x24 84 | SHIFT = 0xe1 85 | SPACE = 0x2c 86 | THREE = 0x20 87 | APPLICATION = 0x65 88 | BACKSLASH = 0x31 89 | BACKSPACE = 0x2a 90 | CAPS_LOCK = 0x39 91 | COMMAND = 0xe3 92 | CONTROL = 0xe0 93 | CIRCUMFLEX = 0x20 94 | DELETE = 0x4c 95 | DOWN_ARROW = 0x51 96 | EQUALS = 0x2e 97 | ESCAPE = 0x29 98 | FORWARD_SLASH = 0x2d 99 | GRAVE_ACCENT = 0x27 100 | INSERT = 0x49 101 | KEYPAD_ASTERISK = 0x55 102 | KEYPAD_EIGHT = 0x60 103 | KEYPAD_FIVE = 0x5d 104 | KEYPAD_FORWARD_SLASH = 0x54 105 | KEYPAD_FOUR = 0x5c 106 | KEYPAD_MINUS = 0x56 107 | KEYPAD_NINE = 0x61 108 | KEYPAD_NUMLOCK = 0x53 109 | KEYPAD_ONE = 0x59 110 | KEYPAD_PERIOD = 0x63 111 | KEYPAD_PLUS = 0x57 112 | KEYPAD_SEVEN = 0x5f 113 | KEYPAD_SIX = 0x5e 114 | KEYPAD_THREE = 0x5b 115 | KEYPAD_TWO = 0x5a 116 | KEYPAD_ZERO = 0x62 117 | LEFT_ALT = 0xe2 118 | LEFT_ARROW = 0x50 119 | LEFT_BRACKET = 0x2f 120 | LEFT_CONTROL = 0xe0 121 | LEFT_GUI = 0xe3 122 | LEFT_SHIFT = 0xe1 123 | OEM_102 = 0x64 124 | OPTION = 0xe2 125 | PAGE_DOWN = 0x4e 126 | PAGE_UP = 0x4b 127 | PERIOD = 0x37 128 | PRINT_SCREEN = 0x46 129 | RETURN = 0x28 130 | RIGHT_ALT = 0xe6 131 | RIGHT_ARROW = 0x4f 132 | RIGHT_BRACKET = 0x30 133 | RIGHT_CONTROL = 0xe4 134 | RIGHT_GUI = 0xe7 135 | RIGHT_SHIFT = 0xe5 136 | SCROLL_LOCK = 0x47 137 | SEMICOLON = 0x33 138 | SPACEBAR = 0x2c 139 | UP_ARROW = 0x52 140 | WINDOWS = 0xe3 141 | 142 | @classmethod 143 | def modifier_bit(cls, keycode): 144 | """Return the modifer bit to be set in an HID keycode report if this is a 145 | modifier key; otherwise return 0.""" 146 | return ( 147 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 148 | ) 149 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_it.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x27 76 | ALTGR = 0xe6 77 | COMMA = 0x36 78 | EIGHT = 0x25 79 | ENTER = 0x28 80 | MINUS = 0x38 81 | PAUSE = 0x48 82 | QUOTE = 0x34 83 | SEVEN = 0x24 84 | SHIFT = 0xe1 85 | SPACE = 0x2c 86 | THREE = 0x20 87 | APPLICATION = 0x65 88 | BACKSLASH = 0x35 89 | BACKSPACE = 0x2a 90 | CAPS_LOCK = 0x39 91 | COMMAND = 0xe3 92 | CONTROL = 0xe0 93 | DELETE = 0x4c 94 | DOWN_ARROW = 0x51 95 | EQUALS = 0x30 96 | ESCAPE = 0x29 97 | FORWARD_SLASH = 0x31 98 | GRAVE_ACCENT = 0x33 99 | INSERT = 0x49 100 | KEYPAD_ASTERISK = 0x55 101 | KEYPAD_EIGHT = 0x60 102 | KEYPAD_FIVE = 0x5d 103 | KEYPAD_FORWARD_SLASH = 0x54 104 | KEYPAD_FOUR = 0x5c 105 | KEYPAD_MINUS = 0x56 106 | KEYPAD_NINE = 0x61 107 | KEYPAD_NUMLOCK = 0x53 108 | KEYPAD_ONE = 0x59 109 | KEYPAD_PERIOD = 0x63 110 | KEYPAD_PLUS = 0x57 111 | KEYPAD_SEVEN = 0x5f 112 | KEYPAD_SIX = 0x5e 113 | KEYPAD_THREE = 0x5b 114 | KEYPAD_TWO = 0x5a 115 | KEYPAD_ZERO = 0x62 116 | LEFT_ALT = 0xe2 117 | LEFT_ARROW = 0x50 118 | LEFT_BRACKET = 0x2d 119 | LEFT_CONTROL = 0xe0 120 | LEFT_GUI = 0xe3 121 | LEFT_SHIFT = 0xe1 122 | OEM_102 = 0x64 123 | OPTION = 0xe2 124 | PAGE_DOWN = 0x4e 125 | PAGE_UP = 0x4b 126 | PERIOD = 0x37 127 | PRINT_SCREEN = 0x46 128 | RETURN = 0x28 129 | RIGHT_ALT = 0xe6 130 | RIGHT_ARROW = 0x4f 131 | RIGHT_BRACKET = 0x2e 132 | RIGHT_CONTROL = 0xe4 133 | RIGHT_GUI = 0xe7 134 | RIGHT_SHIFT = 0xe5 135 | SCROLL_LOCK = 0x47 136 | SEMICOLON = 0x2f 137 | SPACEBAR = 0x2c 138 | UP_ARROW = 0x52 139 | WINDOWS = 0xe3 140 | 141 | @classmethod 142 | def modifier_bit(cls, keycode): 143 | """Return the modifer bit to be set in an HID keycode report if this is a 144 | modifier key; otherwise return 0.""" 145 | return ( 146 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 147 | ) 148 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_po.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TIL = 0x31 71 | TWO = 0x1f 72 | FIVE = 0x22 73 | FOUR = 0x21 74 | HOME = 0x4a 75 | NINE = 0x26 76 | ZERO = 0x27 77 | AGUDO = 0x30 78 | ALTGR = 0xe6 79 | COMMA = 0x36 80 | EIGHT = 0x25 81 | ENTER = 0x28 82 | GRAVE = 0x30 83 | MINUS = 0x38 84 | PAUSE = 0x48 85 | QUOTE = 0x34 86 | SEVEN = 0x24 87 | SHIFT = 0xe1 88 | SPACE = 0x2c 89 | THREE = 0x20 90 | TREMA = 0x2f 91 | APPLICATION = 0x65 92 | BACKSLASH = 0x35 93 | BACKSPACE = 0x2a 94 | CAPS_LOCK = 0x39 95 | CIRCUNFLEXO = 0x31 96 | COMMAND = 0xe3 97 | CONTROL = 0xe0 98 | DELETE = 0x4c 99 | DOWN_ARROW = 0x51 100 | EQUALS = 0x2f 101 | ESCAPE = 0x29 102 | FORWARD_SLASH = 0x31 103 | GRAVE_ACCENT = 0x33 104 | INSERT = 0x49 105 | KEYPAD_ASTERISK = 0x55 106 | KEYPAD_EIGHT = 0x60 107 | KEYPAD_FIVE = 0x5d 108 | KEYPAD_FORWARD_SLASH = 0x54 109 | KEYPAD_FOUR = 0x5c 110 | KEYPAD_MINUS = 0x56 111 | KEYPAD_NINE = 0x61 112 | KEYPAD_NUMLOCK = 0x53 113 | KEYPAD_ONE = 0x59 114 | KEYPAD_PERIOD = 0x63 115 | KEYPAD_PLUS = 0x57 116 | KEYPAD_SEVEN = 0x5f 117 | KEYPAD_SIX = 0x5e 118 | KEYPAD_THREE = 0x5b 119 | KEYPAD_TWO = 0x5a 120 | KEYPAD_ZERO = 0x62 121 | LEFT_ALT = 0xe2 122 | LEFT_ARROW = 0x50 123 | LEFT_BRACKET = 0x2d 124 | LEFT_CONTROL = 0xe0 125 | LEFT_GUI = 0xe3 126 | LEFT_SHIFT = 0xe1 127 | OEM_102 = 0x64 128 | OPTION = 0xe2 129 | PAGE_DOWN = 0x4e 130 | PAGE_UP = 0x4b 131 | PERIOD = 0x37 132 | PRINT_SCREEN = 0x46 133 | RETURN = 0x28 134 | RIGHT_ALT = 0xe6 135 | RIGHT_ARROW = 0x4f 136 | RIGHT_BRACKET = 0x2e 137 | RIGHT_CONTROL = 0xe4 138 | RIGHT_GUI = 0xe7 139 | RIGHT_SHIFT = 0xe5 140 | SCROLL_LOCK = 0x47 141 | SEMICOLON = 0x30 142 | SPACEBAR = 0x2c 143 | UP_ARROW = 0x52 144 | WINDOWS = 0xe3 145 | 146 | @classmethod 147 | def modifier_bit(cls, keycode): 148 | """Return the modifer bit to be set in an HID keycode report if this is a 149 | modifier key; otherwise return 0.""" 150 | return ( 151 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 152 | ) 153 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_sw.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | AKUT = 0x2e 72 | FIVE = 0x22 73 | FOUR = 0x21 74 | GRAV = 0x2e 75 | HOME = 0x4a 76 | NINE = 0x26 77 | ZERO = 0x27 78 | ALTGR = 0xe6 79 | COMMA = 0x36 80 | EIGHT = 0x25 81 | ENTER = 0x28 82 | MINUS = 0x38 83 | PAUSE = 0x48 84 | QUOTE = 0x34 85 | SEVEN = 0x24 86 | SHIFT = 0xe1 87 | SPACE = 0x2c 88 | THREE = 0x20 89 | TILDE = 0x30 90 | APPLICATION = 0x65 91 | BACKSLASH = 0x35 92 | BACKSPACE = 0x2a 93 | CAPS_LOCK = 0x39 94 | CIRKUMFLEX = 0x30 95 | COMMAND = 0xe3 96 | CONTROL = 0xe0 97 | DELETE = 0x4c 98 | DOWN_ARROW = 0x51 99 | EQUALS = 0x2d 100 | ESCAPE = 0x29 101 | FORWARD_SLASH = 0x31 102 | GRAVE_ACCENT = 0x33 103 | INSERT = 0x49 104 | KEYPAD_ASTERISK = 0x55 105 | KEYPAD_EIGHT = 0x60 106 | KEYPAD_FIVE = 0x5d 107 | KEYPAD_FORWARD_SLASH = 0x54 108 | KEYPAD_FOUR = 0x5c 109 | KEYPAD_MINUS = 0x56 110 | KEYPAD_NINE = 0x61 111 | KEYPAD_NUMLOCK = 0x53 112 | KEYPAD_ONE = 0x59 113 | KEYPAD_PERIOD = 0x63 114 | KEYPAD_PLUS = 0x57 115 | KEYPAD_SEVEN = 0x5f 116 | KEYPAD_SIX = 0x5e 117 | KEYPAD_THREE = 0x5b 118 | KEYPAD_TWO = 0x5a 119 | KEYPAD_ZERO = 0x62 120 | LEFT_ALT = 0xe2 121 | LEFT_ARROW = 0x50 122 | LEFT_BRACKET = 0x2e 123 | LEFT_CONTROL = 0xe0 124 | LEFT_GUI = 0xe3 125 | LEFT_SHIFT = 0xe1 126 | OEM_102 = 0x64 127 | OMLJUD = 0x30 128 | OPTION = 0xe2 129 | PAGE_DOWN = 0x4e 130 | PAGE_UP = 0x4b 131 | PERIOD = 0x37 132 | PRINT_SCREEN = 0x46 133 | RETURN = 0x28 134 | RIGHT_ALT = 0xe6 135 | RIGHT_ARROW = 0x4f 136 | RIGHT_BRACKET = 0x2f 137 | RIGHT_CONTROL = 0xe4 138 | RIGHT_GUI = 0xe7 139 | RIGHT_SHIFT = 0xe5 140 | SCROLL_LOCK = 0x47 141 | SEMICOLON = 0x30 142 | SPACEBAR = 0x2c 143 | UP_ARROW = 0x52 144 | WINDOWS = 0xe3 145 | 146 | @classmethod 147 | def modifier_bit(cls, keycode): 148 | """Return the modifer bit to be set in an HID keycode report if this is a 149 | modifier key; otherwise return 0.""" 150 | return ( 151 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 152 | ) 153 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_tr.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class Keycode: 14 | A = 0x04 15 | B = 0x05 16 | C = 0x06 17 | D = 0x07 18 | E = 0x08 19 | F = 0x09 20 | G = 0x0a 21 | H = 0x0b 22 | I = 0x0c 23 | J = 0x0d 24 | K = 0x0e 25 | L = 0x0f 26 | M = 0x10 27 | N = 0x11 28 | O = 0x12 29 | P = 0x13 30 | Q = 0x14 31 | R = 0x15 32 | S = 0x16 33 | T = 0x17 34 | U = 0x18 35 | V = 0x19 36 | W = 0x1a 37 | X = 0x1b 38 | Y = 0x1c 39 | Z = 0x1d 40 | ALT = 0xe2 41 | END = 0x4d 42 | F1 = 0x3a 43 | F2 = 0x3b 44 | F3 = 0x3c 45 | F4 = 0x3d 46 | F5 = 0x3e 47 | F6 = 0x3f 48 | F7 = 0x40 49 | F8 = 0x41 50 | F9 = 0x42 51 | F10 = 0x43 52 | F11 = 0x44 53 | F12 = 0x45 54 | F13 = 0x68 55 | F14 = 0x69 56 | F15 = 0x6a 57 | F16 = 0x6b 58 | F17 = 0x6c 59 | F18 = 0x6d 60 | F19 = 0x6e 61 | F20 = 0x6f 62 | F21 = 0x70 63 | F22 = 0x71 64 | F23 = 0x72 65 | F24 = 0x73 66 | GUI = 0xe3 67 | ONE = 0x1e 68 | SIX = 0x23 69 | TAB = 0x2b 70 | TWO = 0x1f 71 | FIVE = 0x22 72 | FOUR = 0x21 73 | HOME = 0x4a 74 | NINE = 0x26 75 | ZERO = 0x27 76 | ALTGR = 0xe6 77 | COMMA = 0x31 78 | EIGHT = 0x25 79 | ENTER = 0x28 80 | MINUS = 0x2e 81 | OEM_8 = 0x2d 82 | PAUSE = 0x48 83 | QUOTE = 0x34 84 | SEVEN = 0x24 85 | SHIFT = 0xe1 86 | SPACE = 0x2c 87 | THREE = 0x20 88 | APPLICATION = 0x65 89 | BACKSLASH = 0x37 90 | BACKSPACE = 0x2a 91 | CAPS_LOCK = 0x39 92 | COMMAND = 0xe3 93 | CONTROL = 0xe0 94 | DELETE = 0x4c 95 | DOWN_ARROW = 0x51 96 | ESCAPE = 0x29 97 | FORWARD_SLASH = 0x36 98 | GRAVE_ACCENT = 0x35 99 | INSERT = 0x49 100 | KEYPAD_ASTERISK = 0x55 101 | KEYPAD_EIGHT = 0x60 102 | KEYPAD_FIVE = 0x5d 103 | KEYPAD_FORWARD_SLASH = 0x54 104 | KEYPAD_FOUR = 0x5c 105 | KEYPAD_MINUS = 0x56 106 | KEYPAD_NINE = 0x61 107 | KEYPAD_NUMLOCK = 0x53 108 | KEYPAD_ONE = 0x59 109 | KEYPAD_PERIOD = 0x63 110 | KEYPAD_PLUS = 0x57 111 | KEYPAD_SEVEN = 0x5f 112 | KEYPAD_SIX = 0x5e 113 | KEYPAD_THREE = 0x5b 114 | KEYPAD_TWO = 0x5a 115 | KEYPAD_ZERO = 0x62 116 | LEFT_ALT = 0xe2 117 | LEFT_ARROW = 0x50 118 | LEFT_BRACKET = 0x2f 119 | LEFT_CONTROL = 0xe0 120 | LEFT_GUI = 0xe3 121 | LEFT_SHIFT = 0xe1 122 | OEM_102 = 0x64 123 | OPTION = 0xe2 124 | PAGE_DOWN = 0x4e 125 | PAGE_UP = 0x4b 126 | PERIOD = 0x38 127 | PRINT_SCREEN = 0x46 128 | RETURN = 0x28 129 | RIGHT_ALT = 0xe6 130 | RIGHT_ARROW = 0x4f 131 | RIGHT_BRACKET = 0x30 132 | RIGHT_CONTROL = 0xe4 133 | RIGHT_GUI = 0xe7 134 | RIGHT_SHIFT = 0xe5 135 | SCROLL_LOCK = 0x47 136 | SEMICOLON = 0x33 137 | SPACEBAR = 0x2c 138 | UP_ARROW = 0x52 139 | WINDOWS = 0xe3 140 | 141 | @classmethod 142 | def modifier_bit(cls, keycode): 143 | """Return the modifer bit to be set in an HID keycode report if this is a 144 | modifier key; otherwise return 0.""" 145 | return ( 146 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 147 | ) 148 | -------------------------------------------------------------------------------- /libraries/keycodes/keycode_win_uk.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Neradoc NeraOnGit@ri1.fr 2 | # SPDX-License-Identifier: MIT 3 | """ 4 | This file was automatically generated using Circuitpython_Keyboard_Layouts 5 | """ 6 | 7 | 8 | __version__ = "0.0.1-alpha.0" 9 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 10 | 11 | 12 | class Keycode: 13 | A = 0x04 14 | B = 0x05 15 | C = 0x06 16 | D = 0x07 17 | E = 0x08 18 | F = 0x09 19 | G = 0x0a 20 | H = 0x0b 21 | I = 0x0c 22 | J = 0x0d 23 | K = 0x0e 24 | L = 0x0f 25 | M = 0x10 26 | N = 0x11 27 | O = 0x12 28 | P = 0x13 29 | Q = 0x14 30 | R = 0x15 31 | S = 0x16 32 | T = 0x17 33 | U = 0x18 34 | V = 0x19 35 | W = 0x1a 36 | X = 0x1b 37 | Y = 0x1c 38 | Z = 0x1d 39 | ALT = 0xe2 40 | END = 0x4d 41 | F1 = 0x3a 42 | F2 = 0x3b 43 | F3 = 0x3c 44 | F4 = 0x3d 45 | F5 = 0x3e 46 | F6 = 0x3f 47 | F7 = 0x40 48 | F8 = 0x41 49 | F9 = 0x42 50 | F10 = 0x43 51 | F11 = 0x44 52 | F12 = 0x45 53 | F13 = 0x68 54 | F14 = 0x69 55 | F15 = 0x6a 56 | F16 = 0x6b 57 | F17 = 0x6c 58 | F18 = 0x6d 59 | F19 = 0x6e 60 | F20 = 0x6f 61 | F21 = 0x70 62 | F22 = 0x71 63 | F23 = 0x72 64 | F24 = 0x73 65 | GUI = 0xe3 66 | ONE = 0x1e 67 | SIX = 0x23 68 | TAB = 0x2b 69 | TWO = 0x1f 70 | FIVE = 0x22 71 | FOUR = 0x21 72 | HOME = 0x4a 73 | NINE = 0x26 74 | ZERO = 0x27 75 | ALTGR = 0xe6 76 | COMMA = 0x36 77 | EIGHT = 0x25 78 | ENTER = 0x28 79 | MINUS = 0x2d 80 | OEM_8 = 0x35 81 | PAUSE = 0x48 82 | QUOTE = 0x31 83 | SEVEN = 0x24 84 | SHIFT = 0xe1 85 | SPACE = 0x2c 86 | THREE = 0x20 87 | APPLICATION = 0x65 88 | BACKSLASH = 0x64 89 | BACKSPACE = 0x2a 90 | CAPS_LOCK = 0x39 91 | COMMAND = 0xe3 92 | CONTROL = 0xe0 93 | DELETE = 0x4c 94 | DOWN_ARROW = 0x51 95 | EQUALS = 0x2e 96 | ESCAPE = 0x29 97 | FORWARD_SLASH = 0x38 98 | GRAVE_ACCENT = 0x34 99 | INSERT = 0x49 100 | KEYPAD_ASTERISK = 0x55 101 | KEYPAD_EIGHT = 0x60 102 | KEYPAD_FIVE = 0x5d 103 | KEYPAD_FORWARD_SLASH = 0x54 104 | KEYPAD_FOUR = 0x5c 105 | KEYPAD_MINUS = 0x56 106 | KEYPAD_NINE = 0x61 107 | KEYPAD_NUMLOCK = 0x53 108 | KEYPAD_ONE = 0x59 109 | KEYPAD_PERIOD = 0x63 110 | KEYPAD_PLUS = 0x57 111 | KEYPAD_SEVEN = 0x5f 112 | KEYPAD_SIX = 0x5e 113 | KEYPAD_THREE = 0x5b 114 | KEYPAD_TWO = 0x5a 115 | KEYPAD_ZERO = 0x62 116 | LEFT_ALT = 0xe2 117 | LEFT_ARROW = 0x50 118 | LEFT_BRACKET = 0x2f 119 | LEFT_CONTROL = 0xe0 120 | LEFT_GUI = 0xe3 121 | LEFT_SHIFT = 0xe1 122 | OPTION = 0xe2 123 | PAGE_DOWN = 0x4e 124 | PAGE_UP = 0x4b 125 | PERIOD = 0x37 126 | PRINT_SCREEN = 0x46 127 | RETURN = 0x28 128 | RIGHT_ALT = 0xe6 129 | RIGHT_ARROW = 0x4f 130 | RIGHT_BRACKET = 0x30 131 | RIGHT_CONTROL = 0xe4 132 | RIGHT_GUI = 0xe7 133 | RIGHT_SHIFT = 0xe5 134 | SCROLL_LOCK = 0x47 135 | SEMICOLON = 0x33 136 | SPACEBAR = 0x2c 137 | UP_ARROW = 0x52 138 | WINDOWS = 0xe3 139 | 140 | @classmethod 141 | def modifier_bit(cls, keycode): 142 | """Return the modifer bit to be set in an HID keycode report if this is a 143 | modifier key; otherwise return 0.""" 144 | return ( 145 | 1 << (keycode - 0xE0) if cls.LEFT_CONTROL <= keycode <= cls.RIGHT_GUI else 0 146 | ) 147 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_mac_fr.py: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | # 3 | # Copyright (c) 2017 Dan Halbert 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in 13 | # all copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | # THE SOFTWARE. 22 | # 23 | 24 | """ 25 | * Author(s): Dan Halbert, Neradoc 26 | """ 27 | 28 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 29 | 30 | 31 | __version__ = "1.0.0-auto.0" 32 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 33 | 34 | 35 | class KeyboardLayout(KeyboardLayoutBase): 36 | """Map ASCII characters to appropriate keypresses on a FR Mac keyboard. 37 | Non-ASCII characters and most control characters will raise an exception. 38 | """ 39 | 40 | # The ASCII_TO_KEYCODE bytes object is used as a table to maps ASCII 0-127 41 | # to the corresponding # keycode on a US 104-key keyboard. 42 | # The user should not normally need to use this table, 43 | # but it is not marked as private. 44 | # 45 | # Because the table only goes to 127, we use the top bit of each byte (ox80) to indicate 46 | # that the shift key should be pressed. So any values 0x{8,9,a,b}* are shifted characters. 47 | # 48 | # The Python compiler will concatenate all these bytes literals into a single bytes object. 49 | # Micropython/CircuitPython will store the resulting bytes constant in flash memory 50 | # if it's in a .mpy file, so it doesn't use up valuable RAM. 51 | # 52 | # \x00 entries have no keyboard key and so won't be sent. 53 | SHIFT_FLAG = 0x80 54 | 55 | ASCII_TO_KEYCODE = ( 56 | b'\x00' # NUL 57 | b'\x00' # SOH 58 | b'\x00' # STX 59 | b'\x00' # ETX 60 | b'\x00' # EOT 61 | b'\x00' # ENQ 62 | b'\x00' # ACK 63 | b'\x00' # BEL \a 64 | b'\x2a' # BS BACKSPACE \b (called DELETE in the usb.org document) 65 | b'\x2b' # TAB \t 66 | b'\x28' # LF \n (called Return or ENTER in the usb.org document) 67 | b'\x00' # VT \v 68 | b'\x00' # FF \f 69 | b'\x00' # CR \r 70 | b'\x00' # SO 71 | b'\x00' # SI 72 | b'\x00' # DLE 73 | b'\x00' # DC1 74 | b'\x00' # DC2 75 | b'\x00' # DC3 76 | b'\x00' # DC4 77 | b'\x00' # NAK 78 | b'\x00' # SYN 79 | b'\x00' # ETB 80 | b'\x00' # CAN 81 | b'\x00' # EM 82 | b'\x00' # SUB 83 | b'\x29' # ESC 84 | b'\x00' # FS 85 | b'\x00' # GS 86 | b'\x00' # RS 87 | b'\x00' # US 88 | 89 | b'\x2c' # ' ' 90 | b'\x25' # ! 91 | b'\x20' # " 92 | b'\xe4' # # 93 | b'\x30' # $ 94 | b'\xb4' # % 95 | b'\x1E' # & 96 | b'\x21' # ' 97 | b'\x22' # ( 98 | b'\x2d' # ) 99 | b'\xb0' # * 100 | b'\xb8' # + 101 | b'\x10' # , 102 | b'\x2E' # - 103 | b'\xb6' # . 104 | b'\xb7' # / 105 | b'\xa7' # 0 106 | b'\x9e' # 1 107 | b'\x9f' # 2 108 | b'\xa0' # 3 109 | b'\xa1' # 4 110 | b'\xa2' # 5 111 | b'\xa3' # 6 112 | b'\xa4' # 7 113 | b'\xa5' # 8 114 | b'\xa6' # 9 115 | b'\x37' # : 116 | b'\x36' # ; 117 | b'\x35' # < 118 | b'\x38' # = 119 | b'\xb5' # > 120 | b'\x90' # ? 121 | b'\x64' # @ 122 | b'\x94' # A 123 | b'\x85' # B 124 | b'\x86' # C 125 | b'\x87' # D 126 | b'\x88' # E 127 | b'\x89' # F 128 | b'\x8a' # G 129 | b'\x8b' # H 130 | b'\x8c' # I 131 | b'\x8d' # J 132 | b'\x8e' # K 133 | b'\x8f' # L 134 | b'\xb3' # M 135 | b'\x91' # N 136 | b'\x92' # O 137 | b'\x93' # P 138 | b'\x84' # Q 139 | b'\x95' # R 140 | b'\x96' # S 141 | b'\x97' # T 142 | b'\x98' # U 143 | b'\x99' # V 144 | b'\x9d' # W 145 | b'\x9b' # X 146 | b'\x9c' # Y 147 | b'\x9a' # Z 148 | b'\xa2' # [ 149 | b'\xb7' # bslash 150 | b'\xad' # ] 151 | b'\x00' # ^ 152 | b'\xaE' # _ 153 | b'\x00' # ` 154 | b'\x14' # a 155 | b'\x05' # b 156 | b'\x06' # c 157 | b'\x07' # d 158 | b'\x08' # e 159 | b'\x09' # f 160 | b'\x0a' # g 161 | b'\x0b' # h 162 | b'\x0c' # i 163 | b'\x0d' # j 164 | b'\x0e' # k 165 | b'\x0f' # l 166 | b'\x33' # m 167 | b'\x11' # n 168 | b'\x12' # o 169 | b'\x13' # p 170 | b'\x04' # q 171 | b'\x15' # r 172 | b'\x16' # s 173 | b'\x17' # t 174 | b'\x18' # u 175 | b'\x19' # v 176 | b'\x1d' # w 177 | b'\x1b' # x 178 | b'\x1c' # y 179 | b'\x1a' # z 180 | b'\x22' # { 181 | b'\x8f' # | 182 | b'\x2d' # } 183 | b'\x00' # ~ 184 | b'\x00' # DEL 185 | ) 186 | 187 | NEED_ALTGR = "[]\\{}|~€" 188 | HIGHER_ASCII = { 189 | 0xe0: 0x27, # à 190 | 0xe7: 0x26, # ç 191 | 0xe8: 0x24, # è 192 | 0xe9: 0x1f, # é 193 | 0xf9: 0x34, # ù 194 | 0x20ac: 0x30, # € 195 | 0xb0: 0xad, # ° 196 | 0xa7: 0x23, # § 197 | 0xa3: 0xb1, # £ 198 | } 199 | COMBINED_KEYS = { 200 | 0xe3: 0x11e1, # ã 201 | 0xc3: 0x11c1, # à 202 | 0xf1: 0x11ee, # ñ 203 | 0xd1: 0x11ce, # Ñ 204 | 0xf5: 0x11ef, # õ 205 | 0xd5: 0x11cf, # Õ 206 | 0x7e: 0x11a0, # ~ 207 | 0xd9: 0x3155, # Ù 208 | 0x60: 0x3120, # ` 209 | 0xec: 0x3169, # ì 210 | 0xcc: 0x3149, # Ì 211 | 0xf2: 0x316f, # ò 212 | 0xd2: 0x314f, # Ò 213 | 0xc0: 0x3141, # À 214 | 0xc8: 0x3145, # È 215 | 0xe2: 0x2f61, # â 216 | 0xea: 0x2f65, # ê 217 | 0xee: 0x2f69, # î 218 | 0xf4: 0x2f6f, # ô 219 | 0xfb: 0x2f75, # û 220 | 0xc2: 0x2f41, #  221 | 0xca: 0x2f45, # Ê 222 | 0xce: 0x2f49, # Î 223 | 0xd4: 0x2f4f, # Ô 224 | 0xdb: 0x2f55, # Û 225 | 0x5e: 0x2f20, # ^ 226 | 0xe4: 0xaf61, # ä 227 | 0xeb: 0xaf65, # ë 228 | 0xef: 0xaf69, # ï 229 | 0xf6: 0xaf6f, # ö 230 | 0xfc: 0xaf75, # ü 231 | 0xff: 0xaf79, # ÿ 232 | 0xc4: 0xaf41, # Ä 233 | 0xcb: 0xaf45, # Ë 234 | 0xcf: 0xaf49, # Ï 235 | 0xd6: 0xaf4f, # Ö 236 | 0xdc: 0xaf55, # Ü 237 | 0xa8: 0xaf20, # ¨ 238 | } 239 | 240 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_us_dvo.py: -------------------------------------------------------------------------------- 1 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 2 | 3 | 4 | __version__ = "0.0.0-auto.0" 5 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 6 | 7 | 8 | # Verbatim copy from keyboard_layout_us, only rewritten the ASCII_TO_KEYCODE table to match the Dvorak keycodes. 9 | class KeyboardLayout(KeyboardLayoutBase): 10 | """Map ASCII characters to appropriate keypresses on a standard US PC keyboard. 11 | Non-ASCII characters and most control characters will raise an exception. 12 | """ 13 | 14 | # The ASCII_TO_KEYCODE bytes object is used as a table to maps ASCII 0-127 15 | # to the corresponding # keycode on a US 104-key keyboard. 16 | # The user should not normally need to use this table, 17 | # but it is not marked as private. 18 | # 19 | # Because the table only goes to 127, we use the top bit of each byte (ox80) to indicate 20 | # that the shift key should be pressed. So any values 0x{8,9,a,b}* are shifted characters. 21 | # 22 | # The Python compiler will concatenate all these bytes literals into a single bytes object. 23 | # Micropython/CircuitPython will store the resulting bytes constant in flash memory 24 | # if it's in a .mpy file, so it doesn't use up valuable RAM. 25 | # 26 | # \x00 entries have no keyboard key and so won't be sent. 27 | SHIFT_FLAG = 0x80 28 | ASCII_TO_KEYCODE = ( 29 | b"\x00" # NUL 30 | b"\x00" # SOH 31 | b"\x00" # STX 32 | b"\x00" # ETX 33 | b"\x00" # EOT 34 | b"\x00" # ENQ 35 | b"\x00" # ACK 36 | b"\x00" # BEL \a 37 | b"\x2a" # BS BACKSPACE \b (called DELETE in the usb.org document) 38 | b"\x2b" # TAB \t 39 | b"\x28" # LF \n (called Return or ENTER in the usb.org document) 40 | b"\x00" # VT \v 41 | b"\x00" # FF \f 42 | b"\x00" # CR \r 43 | b"\x00" # SO 44 | b"\x00" # SI 45 | b"\x00" # DLE 46 | b"\x00" # DC1 47 | b"\x00" # DC2 48 | b"\x00" # DC3 49 | b"\x00" # DC4 50 | b"\x00" # NAK 51 | b"\x00" # SYN 52 | b"\x00" # ETB 53 | b"\x00" # CAN 54 | b"\x00" # EM 55 | b"\x00" # SUB 56 | b"\x29" # ESC 57 | b"\x00" # FS 58 | b"\x00" # GS 59 | b"\x00" # RS 60 | b"\x00" # US 61 | b"\x2c" # SPACE 62 | b"\x9e" # ! 63 | b"\x94" # " 64 | b"\xa0" # # 65 | b"\xa1" # $ 66 | b"\xa2" # % 67 | b"\xa4" # & 68 | b"\x14" # ' 69 | b"\xa6" # ( 70 | b"\xa7" # ) 71 | b"\xa5" # * 72 | b"\xb0" # + 73 | b"\x1a" # , 74 | b"\x34" # - 75 | b"\x08" # . 76 | b"\x2f" # / 77 | b"\x27" # 0 78 | b"\x1e" # 1 79 | b"\x1f" # 2 80 | b"\x20" # 3 81 | b"\x21" # 4 82 | b"\x22" # 5 83 | b"\x23" # 6 84 | b"\x24" # 7 85 | b"\x25" # 8 86 | b"\x26" # 9 87 | b"\x9d" # : 88 | b"\x1d" # ; 89 | b"\x9a" # < 90 | b"\x30" # = 91 | b"\x88" # > 92 | b"\xaf" # ? 93 | b"\x9f" # @ 94 | b"\x84" # A 95 | b"\x91" # B 96 | b"\x8c" # C 97 | b"\x8b" # D 98 | b"\x87" # E 99 | b"\x9c" # F 100 | b"\x98" # G 101 | b"\x8d" # H 102 | b"\x8a" # I 103 | b"\x86" # J 104 | b"\x99" # K 105 | b"\x93" # L 106 | b"\x90" # M 107 | b"\x8f" # N 108 | b"\x96" # O 109 | b"\x95" # P 110 | b"\x92" # R 111 | b"\x9b" # Q 112 | b"\xb3" # S 113 | b"\x8e" # T 114 | b"\x89" # U 115 | b"\xb7" # V 116 | b"\xb6" # W 117 | b"\x85" # X 118 | b"\x97" # Y 119 | b"\xb8" # Z 120 | b"\x2d" # [ 121 | b"\x31" # \ backslash 122 | b"\x2e" # ] 123 | b"\xa3" # ^ 124 | b"\xb4" # _ 125 | b"\x35" # ` 126 | b"\x04" # a 127 | b"\x11" # b 128 | b"\x0c" # c 129 | b"\x0b" # d 130 | b"\x07" # e 131 | b"\x1c" # f 132 | b"\x18" # g 133 | b"\x0d" # h 134 | b"\x0a" # i 135 | b"\x06" # j 136 | b"\x19" # k 137 | b"\x13" # l 138 | b"\x10" # m 139 | b"\x0f" # n 140 | b"\x16" # o 141 | b"\x15" # p 142 | b"\x1b" # q 143 | b"\x12" # r 144 | b"\x33" # s 145 | b"\x0e" # t 146 | b"\x09" # u 147 | b"\x37" # v 148 | b"\x36" # w 149 | b"\x05" # x 150 | b"\x17" # y 151 | b"\x38" # z 152 | b"\xad" # { 153 | b"\xb1" # | 154 | b"\xae" # } 155 | b"\xb5" # ~ 156 | b"\x4c" # DEL DELETE (called Forward Delete in usb.org document) 157 | ) 158 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_br.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\xb5' # '"' 51 | b'\xa0' # '#' 52 | b'\xa1' # '$' 53 | b'\xa2' # '%' 54 | b'\xa4' # '&' 55 | b'\x35' # "'" 56 | b'\xa6' # '(' 57 | b'\xa7' # ')' 58 | b'\xa5' # '*' 59 | b'\xae' # '+' 60 | b'\x36' # ',' 61 | b'\x2d' # '-' 62 | b'\x37' # '.' 63 | b'\x14' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb8' # ':' 75 | b'\x38' # ';' 76 | b'\xb6' # '<' 77 | b'\x2e' # '=' 78 | b'\xb7' # '>' 79 | b'\x1a' # '?' 80 | b'\x9f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x30' # '[' 108 | b'\x64' # '\\' 109 | b'\x31' # ']' 110 | b'\x00' 111 | b'\xad' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\xb0' # '{' 140 | b'\xe4' # '|' 141 | b'\xb1' # '}' 142 | b'\x00' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '/?¢£§ª¬°²³¹º₢' 146 | HIGHER_ASCII = { 147 | 0xb9: 0x1e, # '¹' 148 | 0xb2: 0x1f, # '²' 149 | 0xb3: 0x20, # '³' 150 | 0xa3: 0x21, # '£' 151 | 0xa2: 0x22, # '¢' 152 | 0xac: 0x23, # '¬' 153 | 0xa7: 0x2e, # '§' 154 | 0xb0: 0x08, # '°' 155 | 0xaa: 0x30, # 'ª' 156 | 0xe7: 0x33, # 'ç' 157 | 0xc7: 0xb3, # 'Ç' 158 | 0xba: 0x31, # 'º' 159 | 0x20a2: 0x06, # '₢' 160 | } 161 | COMBINED_KEYS = { 162 | 0xe4: 0xa361, # 'ä' 163 | 0xeb: 0xa365, # 'ë' 164 | 0xef: 0xa369, # 'ï' 165 | 0xf6: 0xa36f, # 'ö' 166 | 0xfc: 0xa375, # 'ü' 167 | 0xff: 0xa379, # 'ÿ' 168 | 0xc4: 0xa341, # 'Ä' 169 | 0xcb: 0xa345, # 'Ë' 170 | 0xcf: 0xa349, # 'Ï' 171 | 0xd6: 0xa34f, # 'Ö' 172 | 0xdc: 0xa355, # 'Ü' 173 | 0xa8: 0xa320, # '¨' 174 | 0xe1: 0x2f61, # 'á' 175 | 0xe9: 0x2f65, # 'é' 176 | 0xed: 0x2f69, # 'í' 177 | 0xf3: 0x2f6f, # 'ó' 178 | 0xfa: 0x2f75, # 'ú' 179 | 0xfd: 0x2f79, # 'ý' 180 | 0xc1: 0x2f41, # 'Á' 181 | 0xc9: 0x2f45, # 'É' 182 | 0xcd: 0x2f49, # 'Í' 183 | 0xd3: 0x2f4f, # 'Ó' 184 | 0xda: 0x2f55, # 'Ú' 185 | 0xdd: 0x2f59, # 'Ý' 186 | 0xb4: 0x2f20, # '´' 187 | 0xe0: 0xaf61, # 'à' 188 | 0xe8: 0xaf65, # 'è' 189 | 0xec: 0xaf69, # 'ì' 190 | 0xf2: 0xaf6f, # 'ò' 191 | 0xf9: 0xaf75, # 'ù' 192 | 0xc0: 0xaf41, # 'À' 193 | 0xc8: 0xaf45, # 'È' 194 | 0xcc: 0xaf49, # 'Ì' 195 | 0xd2: 0xaf4f, # 'Ò' 196 | 0xd9: 0xaf55, # 'Ù' 197 | 0x60: 0xaf20, # '`' 198 | 0xe3: 0x3461, # 'ã' 199 | 0xf5: 0x346f, # 'õ' 200 | 0xf1: 0x346e, # 'ñ' 201 | 0xc3: 0x3441, # 'Ã' 202 | 0xd5: 0x344f, # 'Õ' 203 | 0xd1: 0x344e, # 'Ñ' 204 | 0x7e: 0x3420, # '~' 205 | 0xe2: 0xb461, # 'â' 206 | 0xea: 0xb465, # 'ê' 207 | 0xee: 0xb469, # 'î' 208 | 0xf4: 0xb46f, # 'ô' 209 | 0xfb: 0xb475, # 'û' 210 | 0xc2: 0xb441, # 'Â' 211 | 0xca: 0xb445, # 'Ê' 212 | 0xce: 0xb449, # 'Î' 213 | 0xd4: 0xb44f, # 'Ô' 214 | 0xdb: 0xb455, # 'Û' 215 | 0x5e: 0xb420, # '^' 216 | } 217 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_cz.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\xb4' # '!' 50 | b'\xb3' # '"' 51 | b'\x1b' # '#' 52 | b'\x33' # '$' 53 | b'\xad' # '%' 54 | b'\x06' # '&' 55 | b'\xb1' # "'" 56 | b'\xb0' # '(' 57 | b'\x30' # ')' 58 | b'\x38' # '*' 59 | b'\x1e' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xaf' # '/' 64 | b'\xa7' # '0' 65 | b'\x9e' # '1' 66 | b'\x9f' # '2' 67 | b'\xa0' # '3' 68 | b'\xa1' # '4' 69 | b'\xa2' # '5' 70 | b'\xa3' # '6' 71 | b'\xa4' # '7' 72 | b'\xa5' # '8' 73 | b'\xa6' # '9' 74 | b'\xb7' # ':' 75 | b'\x35' # ';' 76 | b'\x36' # '<' 77 | b'\x2d' # '=' 78 | b'\x37' # '>' 79 | b'\xb6' # '?' 80 | b'\x19' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9d' # 'Y' 106 | b'\x9c' # 'Z' 107 | b'\x09' # '[' 108 | b'\x14' # '\\' 109 | b'\x0a' # ']' 110 | b'\x00' # '^' (Dead key) 111 | b'\xb8' # '_' 112 | b'\x00' # '`' (Dead key) 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1d' # 'y' 138 | b'\x1c' # 'z' 139 | b'\x05' # '{' 140 | b'\x1a' # '|' 141 | b'\x11' # '}' 142 | b'\x1e' # '~' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#$&*<>@[\\]{|}~¤×ß÷Đ𣳀' 146 | HIGHER_ASCII = { 147 | 0x11b: 0x1f, # 'ě' 148 | 0x161: 0x20, # 'š' 149 | 0x10d: 0x21, # 'č' 150 | 0x159: 0x22, # 'ř' 151 | 0x17e: 0x23, # 'ž' 152 | 0xfd: 0x24, # 'ý' 153 | 0xe1: 0x25, # 'á' 154 | 0xed: 0x26, # 'í' 155 | 0xe9: 0x27, # 'é' 156 | 0x20ac: 0x08, # '€' 157 | 0xfa: 0x2f, # 'ú' 158 | 0xf7: 0x2f, # '÷' 159 | 0xd7: 0x30, # '×' 160 | 0x111: 0x16, # 'đ' 161 | 0x110: 0x07, # 'Đ' 162 | 0x142: 0x0e, # 'ł' 163 | 0x141: 0x0f, # 'Ł' 164 | 0x16f: 0x33, # 'ů' 165 | 0xa7: 0x34, # '§' 166 | 0xdf: 0x34, # 'ß' 167 | 0xa4: 0x31, # '¤' 168 | } 169 | COMBINED_KEYS = { 170 | 0x10d: 0x1fe3, # 'č' 171 | 0x10c: 0x1fc3, # 'Č' 172 | 0x10f: 0x1fe4, # 'ď' 173 | 0x10e: 0x1fc4, # 'Ď' 174 | 0x11b: 0x1fe5, # 'ě' 175 | 0x11a: 0x1fc5, # 'Ě' 176 | 0x13e: 0x1fec, # 'ľ' 177 | 0x13d: 0x1fcc, # 'Ľ' 178 | 0x148: 0x1fee, # 'ň' 179 | 0x147: 0x1fce, # 'Ň' 180 | 0x159: 0x1ff2, # 'ř' 181 | 0x158: 0x1fd2, # 'Ř' 182 | 0x161: 0x1ff3, # 'š' 183 | 0x160: 0x1fd3, # 'Š' 184 | 0x165: 0x1ff4, # 'ť' 185 | 0x164: 0x1fd4, # 'Ť' 186 | 0x17e: 0x1ffa, # 'ž' 187 | 0x17d: 0x1fda, # 'Ž' 188 | 0x2c7: 0x1fa0, # 'ˇ' 189 | 0xe2: 0x20e1, # 'â' 190 | 0xc2: 0x20c1, # 'Â' 191 | 0xea: 0x20e5, # 'ê' 192 | 0xca: 0x20c5, # 'Ê' 193 | 0xee: 0x20e9, # 'î' 194 | 0xce: 0x20c9, # 'Î' 195 | 0xf4: 0x20ef, # 'ô' 196 | 0xd4: 0x20cf, # 'Ô' 197 | 0xfb: 0x20f5, # 'û' 198 | 0xdb: 0x20d5, # 'Û' 199 | 0x5e: 0x20a0, # '^' 200 | 0x103: 0x21e1, # 'ă' 201 | 0x102: 0x21c1, # 'Ă' 202 | 0x11f: 0x21e7, # 'ğ' 203 | 0x11e: 0x21c7, # 'Ğ' 204 | 0x2d8: 0x21a0, # '˘' 205 | 0xe5: 0x22e1, # 'å' 206 | 0xc5: 0x22c1, # 'Å' 207 | 0x16f: 0x22f5, # 'ů' 208 | 0x16e: 0x22d5, # 'Ů' 209 | 0xb0: 0x22a0, # '°' 210 | 0x105: 0x23e1, # 'ą' 211 | 0x104: 0x23c1, # 'Ą' 212 | 0x119: 0x23e5, # 'ę' 213 | 0x118: 0x23c5, # 'Ę' 214 | 0x12f: 0x23e9, # 'į' 215 | 0x12e: 0x23c9, # 'Į' 216 | 0x173: 0x23f5, # 'ų' 217 | 0x172: 0x23d5, # 'Ų' 218 | 0x2db: 0x23a0, # '˛' 219 | 0xe0: 0x24e1, # 'à' 220 | 0xc0: 0x24c1, # 'À' 221 | 0xe8: 0x24e5, # 'è' 222 | 0xc8: 0x24c5, # 'È' 223 | 0xec: 0x24e9, # 'ì' 224 | 0xcc: 0x24c9, # 'Ì' 225 | 0xf2: 0x24ef, # 'ò' 226 | 0xd2: 0x24cf, # 'Ò' 227 | 0xf9: 0x24f5, # 'ù' 228 | 0xd9: 0x24d5, # 'Ù' 229 | 0x60: 0x24a0, # '`' 230 | 0x117: 0x25e5, # 'ė' 231 | 0x116: 0x25c5, # 'Ė' 232 | 0x131: 0x25e9, # 'ı' 233 | 0x130: 0x25c9, # 'İ' 234 | 0x17c: 0x25fa, # 'ż' 235 | 0x17b: 0x25da, # 'Ż' 236 | 0xb7: 0x25a0, # '·' 237 | 0xe1: 0x26e1, # 'á' 238 | 0xc1: 0x26c1, # 'Á' 239 | 0x107: 0x26e3, # 'ć' 240 | 0x106: 0x26c3, # 'Ć' 241 | 0xe9: 0x26e5, # 'é' 242 | 0xc9: 0x26c5, # 'É' 243 | 0xed: 0x26e9, # 'í' 244 | 0xcd: 0x26c9, # 'Í' 245 | 0x13a: 0x26ec, # 'ĺ' 246 | 0x139: 0x26cc, # 'Ĺ' 247 | 0x144: 0x26ee, # 'ń' 248 | 0x143: 0x26ce, # 'Ń' 249 | 0xf3: 0x26ef, # 'ó' 250 | 0xd3: 0x26cf, # 'Ó' 251 | 0x155: 0x26f2, # 'ŕ' 252 | 0x154: 0x26d2, # 'Ŕ' 253 | 0x15b: 0x26f3, # 'ś' 254 | 0x15a: 0x26d3, # 'Ś' 255 | 0xfa: 0x26f5, # 'ú' 256 | 0xda: 0x26d5, # 'Ú' 257 | 0xfd: 0x26f9, # 'ý' 258 | 0xdd: 0x26d9, # 'Ý' 259 | 0x17a: 0x26fa, # 'ź' 260 | 0x179: 0x26da, # 'Ź' 261 | 0xb4: 0x26a0, # '´' 262 | 0x151: 0x27ef, # 'ő' 263 | 0x150: 0x27cf, # 'Ő' 264 | 0x171: 0x27f5, # 'ű' 265 | 0x170: 0x27d5, # 'Ű' 266 | 0x2dd: 0x27a0, # '˝' 267 | 0xe4: 0x2de1, # 'ä' 268 | 0xc4: 0x2dc1, # 'Ä' 269 | 0xeb: 0x2de5, # 'ë' 270 | 0xcb: 0x2dc5, # 'Ë' 271 | 0xef: 0x2de9, # 'ï' 272 | 0xcf: 0x2dc9, # 'Ï' 273 | 0xf6: 0x2def, # 'ö' 274 | 0xd6: 0x2dcf, # 'Ö' 275 | 0xfc: 0x2df5, # 'ü' 276 | 0xdc: 0x2dd5, # 'Ü' 277 | 0xff: 0x2df9, # 'ÿ' 278 | 0x178: 0x2dd9, # 'Ÿ' 279 | 0xa8: 0x2da0, # '¨' 280 | 0xe7: 0x2ee3, # 'ç' 281 | 0xc7: 0x2ec3, # 'Ç' 282 | 0x123: 0x2ee7, # 'ģ' 283 | 0x122: 0x2ec7, # 'Ģ' 284 | 0x137: 0x2eeb, # 'ķ' 285 | 0x136: 0x2ecb, # 'Ķ' 286 | 0x13c: 0x2eec, # 'ļ' 287 | 0x13b: 0x2ecc, # 'Ļ' 288 | 0x146: 0x2eee, # 'ņ' 289 | 0x145: 0x2ece, # 'Ņ' 290 | 0x157: 0x2ef2, # 'ŗ' 291 | 0x156: 0x2ed2, # 'Ŗ' 292 | 0x15f: 0x2ef3, # 'ş' 293 | 0x15e: 0x2ed3, # 'Ş' 294 | 0x163: 0x2ef4, # 'ţ' 295 | 0x162: 0x2ed4, # 'Ţ' 296 | 0xb8: 0x2ea0, # '¸' 297 | } 298 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_cz1.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x1e' # '!' 50 | b'\xb3' # '"' 51 | b'\x20' # '#' 52 | b'\x21' # '$' 53 | b'\x22' # '%' 54 | b'\x24' # '&' 55 | b'\xb1' # "'" 56 | b'\x26' # '(' 57 | b'\x27' # ')' 58 | b'\x25' # '*' 59 | b'\x1e' # '+' 60 | b'\x36' # ',' 61 | b'\x2d' # '-' 62 | b'\x37' # '.' 63 | b'\xaf' # '/' 64 | b'\xa7' # '0' 65 | b'\x9e' # '1' 66 | b'\x9f' # '2' 67 | b'\xa0' # '3' 68 | b'\xa1' # '4' 69 | b'\xa2' # '5' 70 | b'\xa3' # '6' 71 | b'\xa4' # '7' 72 | b'\xa5' # '8' 73 | b'\xa6' # '9' 74 | b'\xb7' # ':' 75 | b'\x33' # ';' 76 | b'\x36' # '<' 77 | b'\x2d' # '=' 78 | b'\x37' # '>' 79 | b'\xb6' # '?' 80 | b'\x1f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x2f' # '[' 108 | b'\x31' # '\\' 109 | b'\x30' # ']' 110 | b'\x23' # '^' 111 | b'\xb8' # '_' 112 | b'\x35' # '`' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x00' 140 | b'\xe4' # '|' 141 | b'\x00' 142 | b'\x00' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '!#$%&()*-;<>@[\\]^`¤ß€' 146 | HIGHER_ASCII = { 147 | 0x11b: 0x1f, # 'ě' 148 | 0x161: 0x20, # 'š' 149 | 0x10d: 0x21, # 'č' 150 | 0x159: 0x22, # 'ř' 151 | 0x17e: 0x23, # 'ž' 152 | 0xfd: 0x24, # 'ý' 153 | 0xe1: 0x25, # 'á' 154 | 0xed: 0x26, # 'í' 155 | 0xe9: 0x27, # 'é' 156 | 0x20ac: 0x08, # '€' 157 | 0xfa: 0x2f, # 'ú' 158 | 0x16f: 0x33, # 'ů' 159 | 0xa7: 0x34, # '§' 160 | 0xa4: 0x34, # '¤' 161 | 0xdf: 0x64, # 'ß' 162 | } 163 | COMBINED_KEYS = { 164 | 0xe1: 0x2e61, # 'á' 165 | 0xc1: 0x2e41, # 'Á' 166 | 0x15b: 0x2e73, # 'ś' 167 | 0x15a: 0x2e53, # 'Ś' 168 | 0x107: 0x2e63, # 'ć' 169 | 0x106: 0x2e43, # 'Ć' 170 | 0xe9: 0x2e65, # 'é' 171 | 0xc9: 0x2e45, # 'É' 172 | 0x155: 0x2e72, # 'ŕ' 173 | 0x154: 0x2e52, # 'Ŕ' 174 | 0xed: 0x2e69, # 'í' 175 | 0xcd: 0x2e49, # 'Í' 176 | 0xf3: 0x2e6f, # 'ó' 177 | 0xd3: 0x2e4f, # 'Ó' 178 | 0xfa: 0x2e75, # 'ú' 179 | 0xda: 0x2e55, # 'Ú' 180 | 0xfd: 0x2e79, # 'ý' 181 | 0xdd: 0x2e59, # 'Ý' 182 | 0x13a: 0x2e6c, # 'ĺ' 183 | 0x139: 0x2e4c, # 'Ĺ' 184 | 0x144: 0x2e6e, # 'ń' 185 | 0x143: 0x2e4e, # 'Ń' 186 | 0x17a: 0x2e7a, # 'ź' 187 | 0x179: 0x2e5a, # 'Ź' 188 | 0xb4: 0x2e20, # '´' 189 | 0x10d: 0xae63, # 'č' 190 | 0x10c: 0xae43, # 'Č' 191 | 0x10f: 0xae64, # 'ď' 192 | 0x10e: 0xae44, # 'Ď' 193 | 0x11b: 0xae65, # 'ě' 194 | 0x11a: 0xae45, # 'Ě' 195 | 0x159: 0xae72, # 'ř' 196 | 0x158: 0xae52, # 'Ř' 197 | 0x13e: 0xae6c, # 'ľ' 198 | 0x13d: 0xae4c, # 'Ľ' 199 | 0x148: 0xae6e, # 'ň' 200 | 0x147: 0xae4e, # 'Ň' 201 | 0x161: 0xae73, # 'š' 202 | 0x160: 0xae53, # 'Š' 203 | 0x165: 0xae74, # 'ť' 204 | 0x164: 0xae54, # 'Ť' 205 | 0x17e: 0xae7a, # 'ž' 206 | 0x17d: 0xae5a, # 'Ž' 207 | 0x2c7: 0xae20, # 'ˇ' 208 | 0xe5: 0xb561, # 'å' 209 | 0xc5: 0xb541, # 'Å' 210 | 0x16f: 0xb575, # 'ů' 211 | 0x16e: 0xb555, # 'Ů' 212 | 0xb0: 0xb520, # '°' 213 | 0xe4: 0x3161, # 'ä' 214 | 0xc4: 0x3141, # 'Ä' 215 | 0xeb: 0x3165, # 'ë' 216 | 0xcb: 0x3145, # 'Ë' 217 | 0xef: 0x3169, # 'ï' 218 | 0xcf: 0x3149, # 'Ï' 219 | 0xf6: 0x316f, # 'ö' 220 | 0xd6: 0x314f, # 'Ö' 221 | 0xfc: 0x3175, # 'ü' 222 | 0xdc: 0x3155, # 'Ü' 223 | 0xff: 0x3179, # 'ÿ' 224 | 0x178: 0x3159, # 'Ÿ' 225 | 0xa8: 0x3120, # '¨' 226 | } 227 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_da.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\xa0' # '#' 52 | b'\x21' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x31' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xb1' # '*' 59 | b'\x2d' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x1f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x25' # '[' 108 | b'\x64' # '\\' 109 | b'\x26' # ']' 110 | b'\x00' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x24' # '{' 140 | b'\x2e' # '|' 141 | b'\x27' # '}' 142 | b'\x00' # '~' (Dead key) 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '$@[\\]{|}£µ€' 146 | HIGHER_ASCII = { 147 | 0xa3: 0x20, # '£' 148 | 0xa4: 0xa1, # '¤' 149 | 0x20ac: 0x22, # '€' 150 | 0xe5: 0x2f, # 'å' 151 | 0xc5: 0xaf, # 'Å' 152 | 0xe6: 0x33, # 'æ' 153 | 0xc6: 0xb3, # 'Æ' 154 | 0xf8: 0x34, # 'ø' 155 | 0xd8: 0xb4, # 'Ø' 156 | 0xbd: 0x35, # '½' 157 | 0xa7: 0xb5, # '§' 158 | 0xb5: 0x10, # 'µ' 159 | } 160 | COMBINED_KEYS = { 161 | 0xe1: 0x2e61, # 'á' 162 | 0xe9: 0x2e65, # 'é' 163 | 0xed: 0x2e69, # 'í' 164 | 0xf3: 0x2e6f, # 'ó' 165 | 0xfa: 0x2e75, # 'ú' 166 | 0xfd: 0x2e79, # 'ý' 167 | 0xc1: 0x2e41, # 'Á' 168 | 0xc9: 0x2e45, # 'É' 169 | 0xcd: 0x2e49, # 'Í' 170 | 0xd3: 0x2e4f, # 'Ó' 171 | 0xda: 0x2e55, # 'Ú' 172 | 0xdd: 0x2e59, # 'Ý' 173 | 0xb4: 0x2e20, # '´' 174 | 0xe0: 0xae61, # 'à' 175 | 0xe8: 0xae65, # 'è' 176 | 0xec: 0xae69, # 'ì' 177 | 0xf2: 0xae6f, # 'ò' 178 | 0xf9: 0xae75, # 'ù' 179 | 0xc0: 0xae41, # 'À' 180 | 0xc8: 0xae45, # 'È' 181 | 0xcc: 0xae49, # 'Ì' 182 | 0xd2: 0xae4f, # 'Ò' 183 | 0xd9: 0xae55, # 'Ù' 184 | 0x60: 0xae20, # '`' 185 | 0xe4: 0x3061, # 'ä' 186 | 0xeb: 0x3065, # 'ë' 187 | 0xef: 0x3069, # 'ï' 188 | 0xf6: 0x306f, # 'ö' 189 | 0xfc: 0x3075, # 'ü' 190 | 0xff: 0x3079, # 'ÿ' 191 | 0xc4: 0x3041, # 'Ä' 192 | 0xcb: 0x3045, # 'Ë' 193 | 0xcf: 0x3049, # 'Ï' 194 | 0xd6: 0x304f, # 'Ö' 195 | 0xdc: 0x3055, # 'Ü' 196 | 0xa8: 0x3020, # '¨' 197 | 0xe2: 0xb061, # 'â' 198 | 0xea: 0xb065, # 'ê' 199 | 0xee: 0xb069, # 'î' 200 | 0xf4: 0xb06f, # 'ô' 201 | 0xfb: 0xb075, # 'û' 202 | 0xc2: 0xb041, # 'Â' 203 | 0xca: 0xb045, # 'Ê' 204 | 0xce: 0xb049, # 'Î' 205 | 0xd4: 0xb04f, # 'Ô' 206 | 0xdb: 0xb055, # 'Û' 207 | 0x5e: 0xb020, # '^' 208 | 0xe3: 0x30e1, # 'ã' 209 | 0xf5: 0x30ef, # 'õ' 210 | 0xf1: 0x30ee, # 'ñ' 211 | 0xc3: 0x30c1, # 'Ã' 212 | 0xd5: 0x30cf, # 'Õ' 213 | 0xd1: 0x30ce, # 'Ñ' 214 | 0x7e: 0x30a0, # '~' 215 | } 216 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_de.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\x31' # '#' 52 | b'\xa1' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\xb1' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xb0' # '*' 59 | b'\x30' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x14' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9d' # 'Y' 106 | b'\x9c' # 'Z' 107 | b'\x25' # '[' 108 | b'\x2d' # '\\' 109 | b'\x26' # ']' 110 | b'\x00' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1d' # 'y' 138 | b'\x1c' # 'z' 139 | b'\x24' # '{' 140 | b'\x64' # '|' 141 | b'\x27' # '}' 142 | b'\x30' # '~' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '@[\\]{|}~²³µ€' 146 | HIGHER_ASCII = { 147 | 0xb2: 0x1f, # '²' 148 | 0xa7: 0xa0, # '§' 149 | 0xb3: 0x20, # '³' 150 | 0xdf: 0x2d, # 'ß' 151 | 0x20ac: 0x08, # '€' 152 | 0xfc: 0x2f, # 'ü' 153 | 0xdc: 0xaf, # 'Ü' 154 | 0xf6: 0x33, # 'ö' 155 | 0xd6: 0xb3, # 'Ö' 156 | 0xe4: 0x34, # 'ä' 157 | 0xc4: 0xb4, # 'Ä' 158 | 0xb0: 0xb5, # '°' 159 | 0xb5: 0x10, # 'µ' 160 | } 161 | COMBINED_KEYS = { 162 | 0xe1: 0x2e61, # 'á' 163 | 0xe9: 0x2e65, # 'é' 164 | 0xed: 0x2e69, # 'í' 165 | 0xf3: 0x2e6f, # 'ó' 166 | 0xfa: 0x2e75, # 'ú' 167 | 0xfd: 0x2e79, # 'ý' 168 | 0xc1: 0x2e41, # 'Á' 169 | 0xc9: 0x2e45, # 'É' 170 | 0xcd: 0x2e49, # 'Í' 171 | 0xd3: 0x2e4f, # 'Ó' 172 | 0xda: 0x2e55, # 'Ú' 173 | 0xdd: 0x2e59, # 'Ý' 174 | 0xb4: 0x2e20, # '´' 175 | 0xe0: 0xae61, # 'à' 176 | 0xe8: 0xae65, # 'è' 177 | 0xec: 0xae69, # 'ì' 178 | 0xf2: 0xae6f, # 'ò' 179 | 0xf9: 0xae75, # 'ù' 180 | 0xc0: 0xae41, # 'À' 181 | 0xc8: 0xae45, # 'È' 182 | 0xcc: 0xae49, # 'Ì' 183 | 0xd2: 0xae4f, # 'Ò' 184 | 0xd9: 0xae55, # 'Ù' 185 | 0x60: 0xae20, # '`' 186 | 0xe2: 0x3561, # 'â' 187 | 0xea: 0x3565, # 'ê' 188 | 0xee: 0x3569, # 'î' 189 | 0xf4: 0x356f, # 'ô' 190 | 0xfb: 0x3575, # 'û' 191 | 0xc2: 0x3541, # 'Â' 192 | 0xca: 0x3545, # 'Ê' 193 | 0xce: 0x3549, # 'Î' 194 | 0xd4: 0x354f, # 'Ô' 195 | 0xdb: 0x3555, # 'Û' 196 | 0x5e: 0x3520, # '^' 197 | } 198 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_es.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\x20' # '#' 52 | b'\xa1' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x2d' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xb0' # '*' 59 | b'\x30' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x1f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x2f' # '[' 108 | b'\x35' # '\\' 109 | b'\x30' # ']' 110 | b'\x00' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x34' # '{' 140 | b'\x1e' # '|' 141 | b'\x31' # '}' 142 | b'\x00' # '~' (Dead key) 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#@[\\]{|}¬€' 146 | HIGHER_ASCII = { 147 | 0xb7: 0xa0, # '·' 148 | 0x20ac: 0x22, # '€' 149 | 0xac: 0x23, # '¬' 150 | 0xa1: 0x2e, # '¡' 151 | 0xbf: 0xae, # '¿' 152 | 0xf1: 0x33, # 'ñ' 153 | 0xd1: 0xb3, # 'Ñ' 154 | 0xba: 0x35, # 'º' 155 | 0xaa: 0xb5, # 'ª' 156 | 0xe7: 0x31, # 'ç' 157 | 0xc7: 0xb1, # 'Ç' 158 | } 159 | COMBINED_KEYS = { 160 | 0xe3: 0x21e1, # 'ã' 161 | 0xf1: 0x21ee, # 'ñ' 162 | 0xf5: 0x21ef, # 'õ' 163 | 0xc3: 0x21c1, # 'Ã' 164 | 0xd1: 0x21ce, # 'Ñ' 165 | 0xd5: 0x21cf, # 'Õ' 166 | 0x7e: 0x21a0, # '~' 167 | 0xe0: 0x2f61, # 'à' 168 | 0xe8: 0x2f65, # 'è' 169 | 0xec: 0x2f69, # 'ì' 170 | 0xf2: 0x2f6f, # 'ò' 171 | 0xf9: 0x2f75, # 'ù' 172 | 0xc0: 0x2f41, # 'À' 173 | 0xc8: 0x2f45, # 'È' 174 | 0xcc: 0x2f49, # 'Ì' 175 | 0xd2: 0x2f4f, # 'Ò' 176 | 0xd9: 0x2f55, # 'Ù' 177 | 0x60: 0x2f20, # '`' 178 | 0xe2: 0xaf61, # 'â' 179 | 0xea: 0xaf65, # 'ê' 180 | 0xee: 0xaf69, # 'î' 181 | 0xf4: 0xaf6f, # 'ô' 182 | 0xfb: 0xaf75, # 'û' 183 | 0xc2: 0xaf41, # 'Â' 184 | 0xca: 0xaf45, # 'Ê' 185 | 0xce: 0xaf49, # 'Î' 186 | 0xd4: 0xaf4f, # 'Ô' 187 | 0xdb: 0xaf55, # 'Û' 188 | 0x5e: 0xaf20, # '^' 189 | 0xe1: 0x3461, # 'á' 190 | 0xe9: 0x3465, # 'é' 191 | 0xed: 0x3469, # 'í' 192 | 0xf3: 0x346f, # 'ó' 193 | 0xfa: 0x3475, # 'ú' 194 | 0xfd: 0x3479, # 'ý' 195 | 0xc1: 0x3441, # 'Á' 196 | 0xc9: 0x3445, # 'É' 197 | 0xcd: 0x3449, # 'Í' 198 | 0xd3: 0x344f, # 'Ó' 199 | 0xda: 0x3455, # 'Ú' 200 | 0xdd: 0x3459, # 'Ý' 201 | 0xb4: 0x3420, # '´' 202 | 0xe4: 0xb461, # 'ä' 203 | 0xeb: 0xb465, # 'ë' 204 | 0xef: 0xb469, # 'ï' 205 | 0xf6: 0xb46f, # 'ö' 206 | 0xfc: 0xb475, # 'ü' 207 | 0xff: 0xb479, # 'ÿ' 208 | 0xc4: 0xb441, # 'Ä' 209 | 0xcb: 0xb445, # 'Ë' 210 | 0xcf: 0xb449, # 'Ï' 211 | 0xd6: 0xb44f, # 'Ö' 212 | 0xdc: 0xb455, # 'Ü' 213 | 0xa8: 0xb420, # '¨' 214 | } 215 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_fr.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x38' # '!' 50 | b'\x20' # '"' 51 | b'\x20' # '#' 52 | b'\x30' # '$' 53 | b'\xb4' # '%' 54 | b'\x1e' # '&' 55 | b'\x21' # "'" 56 | b'\x22' # '(' 57 | b'\x2d' # ')' 58 | b'\x31' # '*' 59 | b'\xae' # '+' 60 | b'\x10' # ',' 61 | b'\x23' # '-' 62 | b'\xb6' # '.' 63 | b'\xb7' # '/' 64 | b'\xa7' # '0' 65 | b'\x9e' # '1' 66 | b'\x9f' # '2' 67 | b'\xa0' # '3' 68 | b'\xa1' # '4' 69 | b'\xa2' # '5' 70 | b'\xa3' # '6' 71 | b'\xa4' # '7' 72 | b'\xa5' # '8' 73 | b'\xa6' # '9' 74 | b'\x37' # ':' 75 | b'\x36' # ';' 76 | b'\x64' # '<' 77 | b'\x2e' # '=' 78 | b'\xe4' # '>' 79 | b'\x90' # '?' 80 | b'\x27' # '@' 81 | b'\x94' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\xb3' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x84' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9d' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9a' # 'Z' 107 | b'\x22' # '[' 108 | b'\x25' # '\\' 109 | b'\x2d' # ']' 110 | b'\x26' # '^' 111 | b'\x25' # '_' 112 | b'\x00' # '`' (Dead key) 113 | b'\x14' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x33' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x04' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1d' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1a' # 'z' 139 | b'\x21' # '{' 140 | b'\x23' # '|' 141 | b'\x2e' # '}' 142 | b'\x00' # '~' (Dead key) 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#@[\\]^{|}¤€' 146 | HIGHER_ASCII = { 147 | 0xe9: 0x1f, # 'é' 148 | 0xe8: 0x24, # 'è' 149 | 0xe7: 0x26, # 'ç' 150 | 0xe0: 0x27, # 'à' 151 | 0xb0: 0xad, # '°' 152 | 0x20ac: 0x08, # '€' 153 | 0xa3: 0xb0, # '£' 154 | 0xa4: 0x30, # '¤' 155 | 0xf9: 0x34, # 'ù' 156 | 0xb2: 0x35, # '²' 157 | 0xb5: 0xb1, # 'µ' 158 | 0xa7: 0xb8, # '§' 159 | } 160 | COMBINED_KEYS = { 161 | 0xe3: 0x1fe1, # 'ã' 162 | 0xc3: 0x1fc1, # 'Ã' 163 | 0xf1: 0x1fee, # 'ñ' 164 | 0xd1: 0x1fce, # 'Ñ' 165 | 0xf5: 0x1fef, # 'õ' 166 | 0xd5: 0x1fcf, # 'Õ' 167 | 0x7e: 0x1fa0, # '~' 168 | 0xe0: 0x24e1, # 'à' 169 | 0xe8: 0x24e5, # 'è' 170 | 0xec: 0x24e9, # 'ì' 171 | 0xf2: 0x24ef, # 'ò' 172 | 0xf9: 0x24f5, # 'ù' 173 | 0xc0: 0x24c1, # 'À' 174 | 0xc8: 0x24c5, # 'È' 175 | 0xcc: 0x24c9, # 'Ì' 176 | 0xd2: 0x24cf, # 'Ò' 177 | 0xd9: 0x24d5, # 'Ù' 178 | 0x60: 0x24a0, # '`' 179 | 0xe2: 0x2f61, # 'â' 180 | 0xea: 0x2f65, # 'ê' 181 | 0xee: 0x2f69, # 'î' 182 | 0xf4: 0x2f6f, # 'ô' 183 | 0xfb: 0x2f75, # 'û' 184 | 0xc2: 0x2f41, # 'Â' 185 | 0xca: 0x2f45, # 'Ê' 186 | 0xce: 0x2f49, # 'Î' 187 | 0xd4: 0x2f4f, # 'Ô' 188 | 0xdb: 0x2f55, # 'Û' 189 | 0x5e: 0x2f20, # '^' 190 | 0xe4: 0xaf61, # 'ä' 191 | 0xeb: 0xaf65, # 'ë' 192 | 0xef: 0xaf69, # 'ï' 193 | 0xf6: 0xaf6f, # 'ö' 194 | 0xfc: 0xaf75, # 'ü' 195 | 0xff: 0xaf79, # 'ÿ' 196 | 0xc4: 0xaf41, # 'Ä' 197 | 0xcb: 0xaf45, # 'Ë' 198 | 0xcf: 0xaf49, # 'Ï' 199 | 0xd6: 0xaf4f, # 'Ö' 200 | 0xdc: 0xaf55, # 'Ü' 201 | 0xa8: 0xaf20, # '¨' 202 | } 203 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_hu.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\xa1' # '!' 50 | b'\x9f' # '"' 51 | b'\x1b' # '#' 52 | b'\x33' # '$' 53 | b'\xa2' # '%' 54 | b'\x06' # '&' 55 | b'\x9e' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\x38' # '*' 59 | b'\xa0' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa3' # '/' 64 | b'\x35' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\x36' # ';' 76 | b'\x10' # '<' 77 | b'\xa4' # '=' 78 | b'\x1d' # '>' 79 | b'\xb6' # '?' 80 | b'\x19' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9d' # 'Y' 106 | b'\x9c' # 'Z' 107 | b'\x09' # '[' 108 | b'\x14' # '\\' 109 | b'\x0a' # ']' 110 | b'\x00' # '^' (Dead key) 111 | b'\xb8' # '_' 112 | b'\x24' # '`' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1d' # 'y' 138 | b'\x1c' # 'z' 139 | b'\x05' # '{' 140 | b'\x1a' # '|' 141 | b'\x11' # '}' 142 | b'\x1e' # '~' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#$&*;<>@[\\]`{|}~¤ÄÍ×ßäí÷Đ𣳀' 146 | HIGHER_ASCII = { 147 | 0xf6: 0x27, # 'ö' 148 | 0xd6: 0xa7, # 'Ö' 149 | 0xfc: 0x2d, # 'ü' 150 | 0xdc: 0xad, # 'Ü' 151 | 0xf3: 0x2e, # 'ó' 152 | 0xd3: 0xae, # 'Ó' 153 | 0xc4: 0x08, # 'Ä' 154 | 0x20ac: 0x18, # '€' 155 | 0xcd: 0x0c, # 'Í' 156 | 0x151: 0x2f, # 'ő' 157 | 0x150: 0xaf, # 'Ő' 158 | 0xf7: 0x2f, # '÷' 159 | 0xfa: 0x30, # 'ú' 160 | 0xda: 0xb0, # 'Ú' 161 | 0xd7: 0x30, # '×' 162 | 0xe4: 0x04, # 'ä' 163 | 0x111: 0x16, # 'đ' 164 | 0x110: 0x07, # 'Đ' 165 | 0xed: 0x0d, # 'í' 166 | 0x142: 0x0e, # 'ł' 167 | 0x141: 0x0f, # 'Ł' 168 | 0xe9: 0x33, # 'é' 169 | 0xc9: 0xb3, # 'É' 170 | 0xe1: 0x34, # 'á' 171 | 0xc1: 0xb4, # 'Á' 172 | 0xdf: 0x34, # 'ß' 173 | 0xa7: 0xb5, # '§' 174 | 0x171: 0x31, # 'ű' 175 | 0x170: 0xb1, # 'Ű' 176 | 0xa4: 0x31, # '¤' 177 | } 178 | COMBINED_KEYS = { 179 | 0x164: 0x1fd4, # 'Ť' 180 | 0x17d: 0x1fda, # 'Ž' 181 | 0x10c: 0x1fc3, # 'Č' 182 | 0x11a: 0x1fc5, # 'Ě' 183 | 0x10e: 0x1fc4, # 'Ď' 184 | 0x158: 0x1fd2, # 'Ř' 185 | 0x160: 0x1fd3, # 'Š' 186 | 0x147: 0x1fce, # 'Ň' 187 | 0x165: 0x1ff4, # 'ť' 188 | 0x17e: 0x1ffa, # 'ž' 189 | 0x10d: 0x1fe3, # 'č' 190 | 0x11b: 0x1fe5, # 'ě' 191 | 0x10f: 0x1fe4, # 'ď' 192 | 0x159: 0x1ff2, # 'ř' 193 | 0x161: 0x1ff3, # 'š' 194 | 0x148: 0x1fee, # 'ň' 195 | 0x2c7: 0x1fa0, # 'ˇ' 196 | 0xc2: 0x20c1, # 'Â' 197 | 0xce: 0x20c9, # 'Î' 198 | 0xd4: 0x20cf, # 'Ô' 199 | 0xe2: 0x20e1, # 'â' 200 | 0xee: 0x20e9, # 'î' 201 | 0xf4: 0x20ef, # 'ô' 202 | 0x5e: 0x20a0, # '^' 203 | 0x102: 0x21c1, # 'Ă' 204 | 0x103: 0x21e1, # 'ă' 205 | 0x2d8: 0x21a0, # '˘' 206 | 0x16e: 0x22d5, # 'Ů' 207 | 0x16f: 0x22f5, # 'ů' 208 | 0xb0: 0x22a0, # '°' 209 | 0x104: 0x23c1, # 'Ą' 210 | 0x118: 0x23c5, # 'Ę' 211 | 0x105: 0x23e1, # 'ą' 212 | 0x119: 0x23e5, # 'ę' 213 | 0x2db: 0x23a0, # '˛' 214 | 0x17c: 0x25fa, # 'ż' 215 | 0x17b: 0x25da, # 'Ż' 216 | 0x2d9: 0x25a0, # '˙' 217 | 0x154: 0x26d2, # 'Ŕ' 218 | 0xc1: 0x26c1, # 'Á' 219 | 0x139: 0x26cc, # 'Ĺ' 220 | 0x106: 0x26c3, # 'Ć' 221 | 0xc9: 0x26c5, # 'É' 222 | 0xcd: 0x26c9, # 'Í' 223 | 0x143: 0x26ce, # 'Ń' 224 | 0xd3: 0x26cf, # 'Ó' 225 | 0xda: 0x26d5, # 'Ú' 226 | 0xdd: 0x26d9, # 'Ý' 227 | 0x15a: 0x26d3, # 'Ś' 228 | 0x179: 0x26da, # 'Ź' 229 | 0x155: 0x26f2, # 'ŕ' 230 | 0xe1: 0x26e1, # 'á' 231 | 0x13a: 0x26ec, # 'ĺ' 232 | 0x107: 0x26e3, # 'ć' 233 | 0xe9: 0x26e5, # 'é' 234 | 0xed: 0x26e9, # 'í' 235 | 0x144: 0x26ee, # 'ń' 236 | 0xf3: 0x26ef, # 'ó' 237 | 0xfa: 0x26f5, # 'ú' 238 | 0xfd: 0x26f9, # 'ý' 239 | 0x15b: 0x26f3, # 'ś' 240 | 0x17a: 0x26fa, # 'ź' 241 | 0xb4: 0x26a0, # '´' 242 | 0x150: 0x27cf, # 'Ő' 243 | 0x170: 0x27d5, # 'Ű' 244 | 0x151: 0x27ef, # 'ő' 245 | 0x171: 0x27f5, # 'ű' 246 | 0x2dd: 0x27a0, # '˝' 247 | 0xc4: 0x2dc1, # 'Ä' 248 | 0xcb: 0x2dc5, # 'Ë' 249 | 0xd6: 0x2dcf, # 'Ö' 250 | 0xdc: 0x2dd5, # 'Ü' 251 | 0xe4: 0x2de1, # 'ä' 252 | 0xeb: 0x2de5, # 'ë' 253 | 0xf6: 0x2def, # 'ö' 254 | 0xfc: 0x2df5, # 'ü' 255 | 0xa8: 0x2da0, # '¨' 256 | 0x15e: 0x2ed3, # 'Ş' 257 | 0xc7: 0x2ec3, # 'Ç' 258 | 0x162: 0x2ed4, # 'Ţ' 259 | 0x15f: 0x2ef3, # 'ş' 260 | 0xe7: 0x2ee3, # 'ç' 261 | 0x163: 0x2ef4, # 'ţ' 262 | 0xb8: 0x2ea0, # '¸' 263 | } 264 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_it.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\x34' # '#' 52 | b'\xa1' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x2d' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xb0' # '*' 59 | b'\x30' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x33' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x2f' # '[' 108 | b'\x35' # '\\' 109 | b'\x30' # ']' 110 | b'\xae' # '^' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\xaf' # '{' 140 | b'\xb5' # '|' 141 | b'\xb0' # '}' 142 | b'\x00' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#@[]€{}' 146 | HIGHER_ASCII = { 147 | 0xa3: 0xa0, # '£' 148 | 0x20ac: 0x22, # '€' 149 | 0xec: 0x2e, # 'ì' 150 | 0xe8: 0x2f, # 'è' 151 | 0xe9: 0xaf, # 'é' 152 | 0xf2: 0x33, # 'ò' 153 | 0xe7: 0xb3, # 'ç' 154 | 0xe0: 0x34, # 'à' 155 | 0xb0: 0xb4, # '°' 156 | 0xf9: 0x31, # 'ù' 157 | 0xa7: 0xb1, # '§' 158 | } 159 | COMBINED_KEYS = { 160 | } 161 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_po.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\xa0' # '#' 52 | b'\xa1' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x2d' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xaf' # '*' 59 | b'\x2f' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x1f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x25' # '[' 108 | b'\x35' # '\\' 109 | b'\x26' # ']' 110 | b'\x00' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x24' # '{' 140 | b'\xb5' # '|' 141 | b'\x27' # '}' 142 | b'\x00' 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '@[]{}£§€' 146 | HIGHER_ASCII = { 147 | 0xa3: 0x20, # '£' 148 | 0xa7: 0x21, # '§' 149 | 0x20ac: 0x22, # '€' 150 | 0xab: 0x2e, # '«' 151 | 0xbb: 0xae, # '»' 152 | 0xe7: 0x33, # 'ç' 153 | 0xc7: 0xb3, # 'Ç' 154 | 0xba: 0x34, # 'º' 155 | 0xaa: 0xb4, # 'ª' 156 | } 157 | COMBINED_KEYS = { 158 | 0xe4: 0x2fe1, # 'ä' 159 | 0xeb: 0x2fe5, # 'ë' 160 | 0xef: 0x2fe9, # 'ï' 161 | 0xf6: 0x2fef, # 'ö' 162 | 0xfc: 0x2ff5, # 'ü' 163 | 0xff: 0x2ff9, # 'ÿ' 164 | 0xc4: 0x2fc1, # 'Ä' 165 | 0xcb: 0x2fc5, # 'Ë' 166 | 0xcf: 0x2fc9, # 'Ï' 167 | 0xd6: 0x2fcf, # 'Ö' 168 | 0xdc: 0x2fd5, # 'Ü' 169 | 0xa8: 0x2fa0, # '¨' 170 | 0xe1: 0x3061, # 'á' 171 | 0xe9: 0x3065, # 'é' 172 | 0xed: 0x3069, # 'í' 173 | 0xf3: 0x306f, # 'ó' 174 | 0xfa: 0x3075, # 'ú' 175 | 0xfd: 0x3079, # 'ý' 176 | 0xc1: 0x3041, # 'Á' 177 | 0xc9: 0x3045, # 'É' 178 | 0xcd: 0x3049, # 'Í' 179 | 0xd3: 0x304f, # 'Ó' 180 | 0xda: 0x3055, # 'Ú' 181 | 0xdd: 0x3059, # 'Ý' 182 | 0xb4: 0x3020, # '´' 183 | 0xe0: 0xb061, # 'à' 184 | 0xe8: 0xb065, # 'è' 185 | 0xec: 0xb069, # 'ì' 186 | 0xf2: 0xb06f, # 'ò' 187 | 0xf9: 0xb075, # 'ù' 188 | 0xc0: 0xb041, # 'À' 189 | 0xc8: 0xb045, # 'È' 190 | 0xcc: 0xb049, # 'Ì' 191 | 0xd2: 0xb04f, # 'Ò' 192 | 0xd9: 0xb055, # 'Ù' 193 | 0x60: 0xb020, # '`' 194 | 0xe3: 0x3161, # 'ã' 195 | 0xf5: 0x316f, # 'õ' 196 | 0xf1: 0x316e, # 'ñ' 197 | 0xc3: 0x3141, # 'Ã' 198 | 0xd5: 0x314f, # 'Õ' 199 | 0xd1: 0x314e, # 'Ñ' 200 | 0x7e: 0x3120, # '~' 201 | 0xe2: 0xb161, # 'â' 202 | 0xea: 0xb165, # 'ê' 203 | 0xee: 0xb169, # 'î' 204 | 0xf4: 0xb16f, # 'ô' 205 | 0xfb: 0xb175, # 'û' 206 | 0xc2: 0xb141, # 'Â' 207 | 0xca: 0xb145, # 'Ê' 208 | 0xce: 0xb149, # 'Î' 209 | 0xd4: 0xb14f, # 'Ô' 210 | 0xdb: 0xb155, # 'Û' 211 | 0x5e: 0xb120, # '^' 212 | } 213 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_sw.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x9f' # '"' 51 | b'\xa0' # '#' 52 | b'\x21' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x31' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\xb1' # '*' 59 | b'\x2d' # '+' 60 | b'\x36' # ',' 61 | b'\x38' # '-' 62 | b'\x37' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb7' # ':' 75 | b'\xb6' # ';' 76 | b'\x64' # '<' 77 | b'\xa7' # '=' 78 | b'\xe4' # '>' 79 | b'\xad' # '?' 80 | b'\x1f' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x25' # '[' 108 | b'\x2d' # '\\' 109 | b'\x26' # ']' 110 | b'\x00' 111 | b'\xb8' # '_' 112 | b'\x00' 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x24' # '{' 140 | b'\x64' # '|' 141 | b'\x27' # '}' 142 | b'\x00' # '~' (Dead key) 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '$@[\\]{|}£µ€' 146 | HIGHER_ASCII = { 147 | 0xa3: 0x20, # '£' 148 | 0xa4: 0xa1, # '¤' 149 | 0x20ac: 0x22, # '€' 150 | 0xe5: 0x2f, # 'å' 151 | 0xc5: 0xaf, # 'Å' 152 | 0xf6: 0x33, # 'ö' 153 | 0xd6: 0xb3, # 'Ö' 154 | 0xe4: 0x34, # 'ä' 155 | 0xc4: 0xb4, # 'Ä' 156 | 0xa7: 0x35, # '§' 157 | 0xbd: 0xb5, # '½' 158 | 0xb5: 0x10, # 'µ' 159 | } 160 | COMBINED_KEYS = { 161 | 0xe1: 0x2e61, # 'á' 162 | 0xe9: 0x2e65, # 'é' 163 | 0xed: 0x2e69, # 'í' 164 | 0xf3: 0x2e6f, # 'ó' 165 | 0xfa: 0x2e75, # 'ú' 166 | 0xfd: 0x2e79, # 'ý' 167 | 0xc1: 0x2e41, # 'Á' 168 | 0xc9: 0x2e45, # 'É' 169 | 0xcd: 0x2e49, # 'Í' 170 | 0xd3: 0x2e4f, # 'Ó' 171 | 0xda: 0x2e55, # 'Ú' 172 | 0xdd: 0x2e59, # 'Ý' 173 | 0xb4: 0x2e20, # '´' 174 | 0xe0: 0xae61, # 'à' 175 | 0xe8: 0xae65, # 'è' 176 | 0xec: 0xae69, # 'ì' 177 | 0xf2: 0xae6f, # 'ò' 178 | 0xf9: 0xae75, # 'ù' 179 | 0xc0: 0xae41, # 'À' 180 | 0xc8: 0xae45, # 'È' 181 | 0xcc: 0xae49, # 'Ì' 182 | 0xd2: 0xae4f, # 'Ò' 183 | 0xd9: 0xae55, # 'Ù' 184 | 0x60: 0xae20, # '`' 185 | 0xe4: 0x3061, # 'ä' 186 | 0xeb: 0x3065, # 'ë' 187 | 0xef: 0x3069, # 'ï' 188 | 0xf6: 0x306f, # 'ö' 189 | 0xfc: 0x3075, # 'ü' 190 | 0xff: 0x3079, # 'ÿ' 191 | 0xc4: 0x3041, # 'Ä' 192 | 0xcb: 0x3045, # 'Ë' 193 | 0xcf: 0x3049, # 'Ï' 194 | 0xd6: 0x304f, # 'Ö' 195 | 0xdc: 0x3055, # 'Ü' 196 | 0xa8: 0x3020, # '¨' 197 | 0xe2: 0xb061, # 'â' 198 | 0xea: 0xb065, # 'ê' 199 | 0xee: 0xb069, # 'î' 200 | 0xf4: 0xb06f, # 'ô' 201 | 0xfb: 0xb075, # 'û' 202 | 0xc2: 0xb041, # 'Â' 203 | 0xca: 0xb045, # 'Ê' 204 | 0xce: 0xb049, # 'Î' 205 | 0xd4: 0xb04f, # 'Ô' 206 | 0xdb: 0xb055, # 'Û' 207 | 0x5e: 0xb020, # '^' 208 | 0xe3: 0x30e1, # 'ã' 209 | 0xf5: 0x30ef, # 'õ' 210 | 0xf1: 0x30ee, # 'ñ' 211 | 0xc3: 0x30c1, # 'Ã' 212 | 0xd5: 0x30cf, # 'Õ' 213 | 0xd1: 0x30ce, # 'Ñ' 214 | 0x7e: 0x30a0, # '~' 215 | } 216 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_tr.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Neradoc NeraOnGit@ri1.fr 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | This file was automatically generated using Circuitpython_Keyboard_Layouts 6 | """ 7 | 8 | 9 | __version__ = "0.0.0-auto.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 14 | class KeyboardLayout(KeyboardLayoutBase): 15 | ASCII_TO_KEYCODE = ( 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x00' 24 | b'\x2a' # BACKSPACE 25 | b'\x2b' # '\t' 26 | b'\x28' # '\n' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x00' 43 | b'\x29' # ESC 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x00' 48 | b'\x2c' # ' ' 49 | b'\x9e' # '!' 50 | b'\x35' # '"' 51 | b'\x20' # '#' 52 | b'\x21' # '$' 53 | b'\xa2' # '%' 54 | b'\xa3' # '&' 55 | b'\x9f' # "'" 56 | b'\xa5' # '(' 57 | b'\xa6' # ')' 58 | b'\x2d' # '*' 59 | b'\xa1' # '+' 60 | b'\x31' # ',' 61 | b'\x2e' # '-' 62 | b'\x38' # '.' 63 | b'\xa4' # '/' 64 | b'\x27' # '0' 65 | b'\x1e' # '1' 66 | b'\x1f' # '2' 67 | b'\x20' # '3' 68 | b'\x21' # '4' 69 | b'\x22' # '5' 70 | b'\x23' # '6' 71 | b'\x24' # '7' 72 | b'\x25' # '8' 73 | b'\x26' # '9' 74 | b'\xb8' # ':' 75 | b'\xb1' # ';' 76 | b'\x35' # '<' 77 | b'\xa7' # '=' 78 | b'\x1e' # '>' 79 | b'\xad' # '?' 80 | b'\x14' # '@' 81 | b'\x84' # 'A' 82 | b'\x85' # 'B' 83 | b'\x86' # 'C' 84 | b'\x87' # 'D' 85 | b'\x88' # 'E' 86 | b'\x89' # 'F' 87 | b'\x8a' # 'G' 88 | b'\x8b' # 'H' 89 | b'\x8c' # 'I' 90 | b'\x8d' # 'J' 91 | b'\x8e' # 'K' 92 | b'\x8f' # 'L' 93 | b'\x90' # 'M' 94 | b'\x91' # 'N' 95 | b'\x92' # 'O' 96 | b'\x93' # 'P' 97 | b'\x94' # 'Q' 98 | b'\x95' # 'R' 99 | b'\x96' # 'S' 100 | b'\x97' # 'T' 101 | b'\x98' # 'U' 102 | b'\x99' # 'V' 103 | b'\x9a' # 'W' 104 | b'\x9b' # 'X' 105 | b'\x9c' # 'Y' 106 | b'\x9d' # 'Z' 107 | b'\x25' # '[' 108 | b'\x2d' # '\\' 109 | b'\x26' # ']' 110 | b'\x00' 111 | b'\xae' # '_' 112 | b'\x00' # '`' (Dead key) 113 | b'\x04' # 'a' 114 | b'\x05' # 'b' 115 | b'\x06' # 'c' 116 | b'\x07' # 'd' 117 | b'\x08' # 'e' 118 | b'\x09' # 'f' 119 | b'\x0a' # 'g' 120 | b'\x0b' # 'h' 121 | b'\x0c' # 'i' 122 | b'\x0d' # 'j' 123 | b'\x0e' # 'k' 124 | b'\x0f' # 'l' 125 | b'\x10' # 'm' 126 | b'\x11' # 'n' 127 | b'\x12' # 'o' 128 | b'\x13' # 'p' 129 | b'\x14' # 'q' 130 | b'\x15' # 'r' 131 | b'\x16' # 's' 132 | b'\x17' # 't' 133 | b'\x18' # 'u' 134 | b'\x19' # 'v' 135 | b'\x1a' # 'w' 136 | b'\x1b' # 'x' 137 | b'\x1c' # 'y' 138 | b'\x1d' # 'z' 139 | b'\x24' # '{' 140 | b'\x2e' # '|' 141 | b'\x27' # '}' 142 | b'\x00' # '~' (Dead key) 143 | b'\x00' 144 | ) 145 | NEED_ALTGR = '#$<>@[\\]i{|}£½ßæ€₺' 146 | HIGHER_ASCII = { 147 | 0xa3: 0x1f, # '£' 148 | 0xbd: 0x22, # '½' 149 | 0x20ac: 0x08, # '€' 150 | 0x20ba: 0x17, # '₺' 151 | 0x131: 0x0c, # 'ı' 152 | 0x11f: 0x2f, # 'ğ' 153 | 0x11e: 0xaf, # 'Ğ' 154 | 0xfc: 0x30, # 'ü' 155 | 0xdc: 0xb0, # 'Ü' 156 | 0xe6: 0x04, # 'æ' 157 | 0xdf: 0x16, # 'ß' 158 | 0x15f: 0x33, # 'ş' 159 | 0x15e: 0xb3, # 'Ş' 160 | 0x130: 0xb4, # 'İ' 161 | 0xe9: 0xb5, # 'é' 162 | 0xf6: 0x36, # 'ö' 163 | 0xd6: 0xb6, # 'Ö' 164 | 0xe7: 0x37, # 'ç' 165 | 0xc7: 0xb7, # 'Ç' 166 | } 167 | COMBINED_KEYS = { 168 | 0xe2: 0xa061, # 'â' 169 | 0xea: 0xa065, # 'ê' 170 | 0xee: 0xa0131, # 'î' 171 | 0xf4: 0xa06f, # 'ô' 172 | 0xfb: 0xa075, # 'û' 173 | 0xc2: 0xa041, # 'Â' 174 | 0xca: 0xa045, # 'Ê' 175 | 0xce: 0xa0130, # 'Î' 176 | 0xd4: 0xa04f, # 'Ô' 177 | 0xdb: 0xa055, # 'Û' 178 | 0x5e: 0xa020, # '^' 179 | 0xe4: 0x2fe1, # 'ä' 180 | 0xeb: 0x2fe5, # 'ë' 181 | 0xef: 0x2f1b1, # 'ï' 182 | 0xf6: 0x2fef, # 'ö' 183 | 0xfc: 0x2ff5, # 'ü' 184 | 0xc4: 0x2fc1, # 'Ä' 185 | 0xcb: 0x2fc5, # 'Ë' 186 | 0xcf: 0x2f1b0, # 'Ï' 187 | 0xd6: 0x2fcf, # 'Ö' 188 | 0xdc: 0x2fd5, # 'Ü' 189 | 0xa8: 0x2fa0, # '¨' 190 | 0xe3: 0x30e1, # 'ã' 191 | 0xf5: 0x30ef, # 'õ' 192 | 0xf1: 0x30ee, # 'ñ' 193 | 0xc3: 0x30c1, # 'Ã' 194 | 0xd5: 0x30cf, # 'Õ' 195 | 0xd1: 0x30ce, # 'Ñ' 196 | 0x7e: 0x30a0, # '~' 197 | 0xe1: 0x33e1, # 'á' 198 | 0xe9: 0x33e5, # 'é' 199 | 0xed: 0x331b1, # 'í' 200 | 0xf3: 0x33ef, # 'ó' 201 | 0xfa: 0x33f5, # 'ú' 202 | 0xc1: 0x33c1, # 'Á' 203 | 0xc9: 0x33c5, # 'É' 204 | 0xcd: 0x331b0, # 'Í' 205 | 0xd3: 0x33cf, # 'Ó' 206 | 0xda: 0x33d5, # 'Ú' 207 | 0xb4: 0x33a0, # '´' 208 | 0xe0: 0x31e1, # 'à' 209 | 0xe8: 0x31e5, # 'è' 210 | 0xec: 0x311b1, # 'ì' 211 | 0xf2: 0x31ef, # 'ò' 212 | 0xf9: 0x31f5, # 'ù' 213 | 0xc0: 0x31c1, # 'À' 214 | 0xc8: 0x31c5, # 'È' 215 | 0xcc: 0x311b0, # 'Ì' 216 | 0xd2: 0x31cf, # 'Ò' 217 | 0xd9: 0x31d5, # 'Ù' 218 | 0x60: 0x31a0, # '`' 219 | } 220 | -------------------------------------------------------------------------------- /libraries/layouts/keyboard_layout_win_uk.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Neradoc NeraOnGit@ri1.fr 2 | # SPDX-License-Identifier: MIT 3 | """ 4 | This file was automatically generated using Circuitpython_Keyboard_Layouts 5 | """ 6 | from adafruit_hid.keyboard_layout_base import KeyboardLayoutBase 7 | 8 | 9 | __version__ = "0.0.1-alpha.0" 10 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 11 | 12 | 13 | class KeyboardLayout(KeyboardLayoutBase): 14 | ASCII_TO_KEYCODE = ( 15 | b'\x00' 16 | b'\x00' 17 | b'\x00' 18 | b'\x00' 19 | b'\x00' 20 | b'\x00' 21 | b'\x00' 22 | b'\x00' 23 | b'\x2a' # BACKSPACE 24 | b'\x2b' # '\t' 25 | b'\x28' # '\n' 26 | b'\x00' 27 | b'\x00' 28 | b'\x00' 29 | b'\x00' 30 | b'\x00' 31 | b'\x00' 32 | b'\x00' 33 | b'\x00' 34 | b'\x00' 35 | b'\x00' 36 | b'\x00' 37 | b'\x00' 38 | b'\x00' 39 | b'\x00' 40 | b'\x00' 41 | b'\x00' 42 | b'\x29' # ESC 43 | b'\x00' 44 | b'\x00' 45 | b'\x00' 46 | b'\x00' 47 | b'\x2c' # ' ' 48 | b'\x9e' # '!' 49 | b'\x9f' # '"' 50 | b'\x31' # '#' 51 | b'\xa1' # '$' 52 | b'\xa2' # '%' 53 | b'\xa4' # '&' 54 | b'\x34' # "'" 55 | b'\xa6' # '(' 56 | b'\xa7' # ')' 57 | b'\xa5' # '*' 58 | b'\xae' # '+' 59 | b'\x36' # ',' 60 | b'\x2d' # '-' 61 | b'\x37' # '.' 62 | b'\x38' # '/' 63 | b'\x27' # '0' 64 | b'\x1e' # '1' 65 | b'\x1f' # '2' 66 | b'\x20' # '3' 67 | b'\x21' # '4' 68 | b'\x22' # '5' 69 | b'\x23' # '6' 70 | b'\x24' # '7' 71 | b'\x25' # '8' 72 | b'\x26' # '9' 73 | b'\xb3' # ':' 74 | b'\x33' # ';' 75 | b'\xb6' # '<' 76 | b'\x2e' # '=' 77 | b'\xb7' # '>' 78 | b'\xb8' # '?' 79 | b'\xb4' # '@' 80 | b'\x84' # 'A' 81 | b'\x85' # 'B' 82 | b'\x86' # 'C' 83 | b'\x87' # 'D' 84 | b'\x88' # 'E' 85 | b'\x89' # 'F' 86 | b'\x8a' # 'G' 87 | b'\x8b' # 'H' 88 | b'\x8c' # 'I' 89 | b'\x8d' # 'J' 90 | b'\x8e' # 'K' 91 | b'\x8f' # 'L' 92 | b'\x90' # 'M' 93 | b'\x91' # 'N' 94 | b'\x92' # 'O' 95 | b'\x93' # 'P' 96 | b'\x94' # 'Q' 97 | b'\x95' # 'R' 98 | b'\x96' # 'S' 99 | b'\x97' # 'T' 100 | b'\x98' # 'U' 101 | b'\x99' # 'V' 102 | b'\x9a' # 'W' 103 | b'\x9b' # 'X' 104 | b'\x9c' # 'Y' 105 | b'\x9d' # 'Z' 106 | b'\x2f' # '[' 107 | b'\x31' # '\\' 108 | b'\x30' # ']' 109 | b'\xa3' # '^' 110 | b'\xad' # '_' 111 | b'\x35' # '`' 112 | b'\x04' # 'a' 113 | b'\x05' # 'b' 114 | b'\x06' # 'c' 115 | b'\x07' # 'd' 116 | b'\x08' # 'e' 117 | b'\x09' # 'f' 118 | b'\x0a' # 'g' 119 | b'\x0b' # 'h' 120 | b'\x0c' # 'i' 121 | b'\x0d' # 'j' 122 | b'\x0e' # 'k' 123 | b'\x0f' # 'l' 124 | b'\x10' # 'm' 125 | b'\x11' # 'n' 126 | b'\x12' # 'o' 127 | b'\x13' # 'p' 128 | b'\x14' # 'q' 129 | b'\x15' # 'r' 130 | b'\x16' # 's' 131 | b'\x17' # 't' 132 | b'\x18' # 'u' 133 | b'\x19' # 'v' 134 | b'\x1a' # 'w' 135 | b'\x1b' # 'x' 136 | b'\x1c' # 'y' 137 | b'\x1d' # 'z' 138 | b'\xaf' # '{' 139 | b'\xe4' # '|' 140 | b'\xb0' # '}' 141 | b'\xb1' # '~' 142 | b'\x00' 143 | ) 144 | NEED_ALTGR = '\\¦áéíóú€' 145 | HIGHER_ASCII = { 146 | 0xa3: 0xa0, # '£' 147 | 0x20ac: 0x21, # '€' 148 | 0xe9: 0x08, # 'é' 149 | 0xfa: 0x18, # 'ú' 150 | 0xed: 0x0c, # 'í' 151 | 0xf3: 0x12, # 'ó' 152 | 0xe1: 0x04, # 'á' 153 | 0xac: 0xb5, # '¬' 154 | 0xa6: 0x35, # '¦' 155 | } 156 | COMBINED_KEYS = { 157 | } 158 | -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | click 2 | natsort 3 | requests 4 | semver 5 | xmltodict 6 | -------------------------------------------------------------------------------- /requirements-modules.txt: -------------------------------------------------------------------------------- 1 | Adafruit-Circuitpython-HID 2 | -------------------------------------------------------------------------------- /tests/batch_test_generator.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "##########################################################" 4 | echo "# US ##############################################" 5 | python3 -m generator -k _xml/win/kbdlayout-info-us.xml -o 6 | echo "# KEYCODE ##############################################" 7 | python3 tests/compare_keycodes.py -l new -r old _build/generated/keycode_win_us.py generator/keycode_us_ref.py 8 | echo "# LAYOUT ##############################################" 9 | python3 tests/compare_layouts.py -l new -r old _build/generated/keyboard_layout_win_us.py tests/reference/keyboard_layout_us.py 10 | 11 | echo "##########################################################" 12 | echo "# FR ##############################################" 13 | python3 -m generator -k _xml/win/kbdlayout-info-fr.xml -o 14 | echo "# LAYOUT ##############################################" 15 | python3 tests/compare_layouts.py -l new -r old _build/generated/keyboard_layout_win_fr.py libraries/layouts/keyboard_layout_win_fr.py 16 | echo "# WRITE ##############################################" 17 | python3 tests/keyboard_test.py _build/generated/keyboard_layout_win_fr.py 18 | 19 | echo "##########################################################" 20 | echo "# DE ##############################################" 21 | python3 -m generator -k _xml/win/kbdlayout-info-de.xml -o 22 | echo "# LAYOUT ##############################################" 23 | python3 tests/compare_layouts.py -l new -r old _build/generated/keyboard_layout_win_de.py libraries/layouts/keyboard_layout_win_de.py 24 | 25 | echo "##########################################################" 26 | echo "# CZ ##############################################" 27 | python3 -m generator -k _xml/win/kbdlayout-info-cz.xml -o 28 | echo "# WRITE ##############################################" 29 | python3 tests/keyboard_test.py _build/generated/keyboard_layout_win_cz.py 30 | -------------------------------------------------------------------------------- /tests/batch_test_press_keys.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python3 -m generator -k _xml/win/kbdlayout-info-us.xml -o 4 | python3 tests/keyboard_test.py _build/generated/keyboard_layout_win_us.py 5 | 6 | python3 -m generator -k _xml/win/kbdlayout-info-fr.xml -o 7 | python3 tests/keyboard_test.py _build/generated/keyboard_layout_win_fr.py 8 | 9 | python3 -m generator -k _xml/win/kbdlayout-info-cz.xml -o 10 | python3 tests/keyboard_test.py _build/generated/keyboard_layout_win_cz.py 11 | -------------------------------------------------------------------------------- /tests/compare_keycodes.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import click 4 | import importlib.util 5 | import xmltodict 6 | sys.path.append("libraries/common") 7 | sys.path.append("libraries/layouts") 8 | sys.path.append("libraries/keycodes") 9 | 10 | def load_module(file, name): 11 | spec = importlib.util.spec_from_file_location(name, file) 12 | foo = importlib.util.module_from_spec(spec) 13 | spec.loader.exec_module(foo) 14 | return foo 15 | 16 | @click.group(invoke_without_command=True) 17 | @click.argument("keycodes", nargs=2) 18 | @click.option("--lname", "-l", default="left") 19 | @click.option("--rname", "-r", default="right") 20 | def main(keycodes, lname, rname): 21 | print(keycodes) 22 | left = load_module(keycodes[0], "left") 23 | right = load_module(keycodes[1], "right") 24 | 25 | lnames = set(dir(left.Keycode)) 26 | rnames = set(dir(right.Keycode)) 27 | 28 | print("-"*70) 29 | print(sorted(lnames - rnames)) 30 | print("-"*70) 31 | print(sorted(rnames - lnames)) 32 | print("-"*70) 33 | 34 | for x in lnames & rnames: 35 | if x.upper() != x or x[0] == "_": 36 | continue 37 | lk = getattr(left.Keycode, x) 38 | rk = getattr(right.Keycode, x) 39 | if lk != rk: 40 | print(f"{x}: {lk} ≠ {rk}") 41 | 42 | 43 | if __name__ == "__main__": 44 | main() 45 | -------------------------------------------------------------------------------- /tests/compare_layouts.py: -------------------------------------------------------------------------------- 1 | import os 2 | import importlib.util 3 | import click 4 | import sys 5 | sys.path.append("libraries/common") 6 | sys.path.append("libraries/layouts") 7 | sys.path.append("libraries/keycodes") 8 | 9 | def load_module(file, name): 10 | spec = importlib.util.spec_from_file_location(name, file) 11 | foo = importlib.util.module_from_spec(spec) 12 | spec.loader.exec_module(foo) 13 | return foo 14 | 15 | @click.group(invoke_without_command=True) 16 | @click.argument("keycodes", nargs=2) 17 | @click.option("--lname", "-l", default="left") 18 | @click.option("--rname", "-r", default="right") 19 | def main(keycodes, lname, rname): 20 | print(keycodes) 21 | left = load_module(keycodes[0], "left") 22 | right = load_module(keycodes[1], "right") 23 | 24 | lASCII = left.KeyboardLayout.ASCII_TO_KEYCODE 25 | rASCII = right.KeyboardLayout.ASCII_TO_KEYCODE 26 | 27 | for x in range(len(lASCII)): 28 | c = chr(x) 29 | if lASCII[x] != rASCII[x]: 30 | print(f"{x}/{repr(c)}: {repr(lASCII[x])} ≠ {repr(rASCII[x])}") 31 | 32 | if left.KeyboardLayout.NEED_ALTGR != right.KeyboardLayout.NEED_ALTGR: 33 | print("NEED_ALTGR") 34 | print(" ", left.KeyboardLayout.NEED_ALTGR) 35 | print(" ", right.KeyboardLayout.NEED_ALTGR) 36 | 37 | lHIGH = left.KeyboardLayout.HIGHER_ASCII 38 | rHIGH = right.KeyboardLayout.HIGHER_ASCII 39 | 40 | for H in lHIGH: 41 | if H not in rHIGH: 42 | print(f"Only {lname} :", repr(H), hex(lHIGH[H])) 43 | for H in rHIGH: 44 | if H not in lHIGH: 45 | print(f"Only {rname}:", repr(H), hex(rHIGH[H])) 46 | elif rHIGH[H] != lHIGH[H]: 47 | print("Different :", repr(H), hex(lHIGH[H]), hex(rHIGH[H])) 48 | 49 | 50 | if __name__ == "__main__": 51 | main() 52 | -------------------------------------------------------------------------------- /tests/keyboard_test.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import click 4 | 5 | class Keyboard: 6 | def __init__(self, *whatever): 7 | self.chars = [] 8 | self.codes = [] 9 | def press(self, *keycodes): 10 | for x in keycodes: 11 | self.codes.append(x) 12 | #print(" +", ["0x"+f"{k:02x}".upper() for k in keycodes], end="") 13 | def release(self, *keycodes): 14 | pass 15 | #print(" -", ["0x"+f"{k:02x}".upper() for k in keycodes], end="") 16 | def release_all(self): 17 | self.chars.append(self.codes) 18 | self.codes = [] 19 | #print(" ;") 20 | def send(self, *keycodes): 21 | self.chars.append(keycodes) 22 | #print(" <", ["0x"+f"{k:02x}".upper() for k in keycodes], ">") 23 | def start(self): 24 | self.chars = [] 25 | self.codes = [] 26 | 27 | 28 | def show_list(source): 29 | out = [] 30 | for x in source: 31 | if isinstance(x, int): 32 | out.append(f"0x{x:02x}") 33 | elif isinstance(x, list): 34 | out.append(show_list(x)) 35 | else: 36 | out.append(repr(x)) 37 | return "[" + " ".join(out) + "]" 38 | 39 | 40 | @click.group(invoke_without_command=True) 41 | @click.argument("keycodes", nargs=1) 42 | def main(keycodes): 43 | print(keycodes) 44 | 45 | keyboard = Keyboard() 46 | sys.path.append(os.path.dirname(keycodes)) 47 | sys.path.append("libraries/common") 48 | sys.path.append("libraries/layouts") 49 | sys.path.append("libraries/keycodes") 50 | 51 | layout_name = os.path.basename(keycodes)[:-3] 52 | layout_module = __import__(layout_name) 53 | layout = layout_module.KeyboardLayout(keyboard) 54 | 55 | sys.path.append("generator") 56 | from keycode_us_ref import Keycode as K 57 | 58 | SHIFT = 0xE1 59 | ALTGR = 0xE6 60 | 61 | print("="*70) 62 | TESTS00 = ( 63 | ( 64 | [K.E, [SHIFT, K.E], [SHIFT, K.SEVEN], [K.ONE], [SHIFT, K.TWO], K.SPACE], 65 | "eE&1@ " 66 | ), 67 | ) 68 | TESTSFR = ( 69 | ( 70 | [K.E, [SHIFT, K.E], K.ONE, [K.SHIFT, K.ONE], [ALTGR, K.ZERO], K.SPACE], 71 | "eE&1@ " 72 | ), 73 | # not 0x2F 0x2C 74 | ([[ALTGR, K.NINE]], "^"), 75 | ([[ALTGR, K.NINE], K.E, 0x2F, K.E], "^eê"), # fr 76 | ([[ALTGR, K.TWO], K.SPACE, [ALTGR, K.TWO], [SHIFT, K.N]], "~Ñ"), # fr 77 | ([[SHIFT, 0x2F], K.O, 0x2F, [SHIFT, K.E]], "öÊ"), # fr 78 | ) 79 | TESTSCZ = ( 80 | ( 81 | [K.E, [SHIFT, K.E], [ALTGR, K.C], [SHIFT, K.ONE], [ALTGR, K.V], K.SPACE], 82 | "eE&1@ " 83 | ), 84 | # not 0x2F 0x2C 85 | ([[ALTGR, K.THREE], K.SPACE], "^"), 86 | ([[ALTGR, K.THREE], K.SPACE, K.E, [ALTGR, K.THREE], K.E], "^eê"), # fr 87 | ([[ALTGR, K.MINUS], K.O, [ALTGR, K.THREE], [SHIFT, K.E]], "öÊ"), # fr 88 | # note: ů = pas de altgr en solo 89 | ([0x33, [ALTGR, K.EQUALS], [SHIFT, K.G], [ALTGR, K.ZERO], K.SPACE], "ůĢ˝"), # cz 90 | ) 91 | 92 | if layout_name.endswith("fr"): 93 | TESTS = TESTSFR 94 | elif layout_name.endswith("cz"): 95 | TESTS = TESTSCZ 96 | else: 97 | TESTS = TESTS00 98 | 99 | for a, b in TESTS: 100 | try: 101 | a = show_list([ x if isinstance(x, list) else [x] for x in a ]) 102 | keyboard.start() 103 | layout.write(b) 104 | print(a) 105 | chars = show_list(keyboard.chars) 106 | if a != chars: 107 | click.secho(chars, fg="red") 108 | else: 109 | click.secho(chars, fg="green") 110 | except ValueError as er: 111 | click.secho(er, fg="red") 112 | 113 | 114 | if __name__ == "__main__": 115 | main() 116 | -------------------------------------------------------------------------------- /tests/make_generated_mpy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir -p _build/generated 4 | mkdir -p _build/compiled 5 | 6 | for thingy in `find _build/generated`; do 7 | if [[ "$thingy" == *.py ]]; then 8 | echo $thingy 9 | mpy-cross $thingy 10 | MPYNAME=`echo $thingy | sed -e 's/\.py$/.mpy/'` 11 | mv "$MPYNAME" "_build/compiled/" 12 | fi 13 | done 14 | 15 | mpy-cross libraries/common/keyboard_layout.py 16 | mv libraries/common/keyboard_layout.mpy "_build/compiled/" 17 | -------------------------------------------------------------------------------- /tests/make_validated.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "-c to copy the files to libraries/" 4 | 5 | LISTE="fr:fr gr:de br:br sw:sw da:da cz1:cz1 cz:cz hu:hu tuq:tr it:it po:po sp:es" 6 | 7 | for LL in $LISTE; do 8 | IFS=":" 9 | read -ra AA <<< "$LL" 10 | FILE=${AA[0]} 11 | LANG=${AA[1]} 12 | IFS=" " 13 | echo https://kbdlayout.info/kbd$FILE + _${FILE}_ _${LANG}_ 14 | # python3 -m generator -k _xml/win/kbdlayout-info-$lang.xml -o 15 | python3 -m generator -o -k https://kbdlayout.info/kbd"$FILE" --lang "$LANG" 16 | if [[ "$1" == "-c" ]] 17 | then 18 | cp -v _build/generated/keyboard_layout_win_$LANG.py libraries/layouts/ 19 | cp -v _build/generated/keycode_win_$LANG.py libraries/keycodes/ 20 | fi 21 | done 22 | -------------------------------------------------------------------------------- /tests/reference/keyboard_layout.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2017 Dan Halbert for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """ 6 | `keyboard_layout.KeyboardLayoutBase` 7 | ======================================================= 8 | 9 | * Author(s): Dan Halbert, AngainorDev, Neradoc 10 | """ 11 | 12 | 13 | __version__ = "3.0.0-auto.0" 14 | __repo__ = "https://github.com/Neradoc/Circuitpython_Keyboard_Layouts.git" 15 | 16 | 17 | class KeyboardLayoutBase: 18 | """Base class for keyboard layouts. Uses the tables defined in the subclass 19 | to map UTF-8 characters to appropriate keypresses. 20 | 21 | Non-supported characters and most control characters will raise an exception. 22 | """ 23 | 24 | # We use the top bit of each byte (0x80) to indicate 25 | # that the shift key should be pressed 26 | SHIFT_FLAG = 0x80 27 | ALTGR_FLAG = 0x80 28 | SHIFT_CODE = 0xE1 29 | RIGHT_ALT_CODE = 0xE6 30 | ASCII_TO_KEYCODE = () 31 | NEED_ALTGR = "" 32 | HIGHER_ASCII = {} 33 | COMBINED_KEYS = {} 34 | 35 | def __init__(self, keyboard): 36 | """Specify the layout for the given keyboard. 37 | 38 | :param keyboard: a Keyboard object. Write characters to this keyboard when requested. 39 | 40 | Example:: 41 | 42 | kbd = Keyboard(usb_hid.devices) 43 | layout = KeyboardLayout(kbd) 44 | """ 45 | self.keyboard = keyboard 46 | 47 | def _write(self, keycode, altgr=False): 48 | """Type a key combination based on shift bit and altgr bool 49 | 50 | :param keycode: int value of the keycode, with the shift bit. 51 | :param altgr: bool indicating if the altgr key should be pressed too. 52 | """ 53 | # Add altgr modifier if needed 54 | if altgr: 55 | self.keyboard.press(self.RIGHT_ALT_CODE) 56 | # If this is a shifted char, clear the SHIFT flag and press the SHIFT key. 57 | if keycode & self.SHIFT_FLAG: 58 | keycode &= ~self.SHIFT_FLAG 59 | self.keyboard.press(self.SHIFT_CODE) 60 | self.keyboard.press(keycode) 61 | self.keyboard.release_all() 62 | 63 | def write(self, string): 64 | """Type the string by pressing and releasing keys on my keyboard. 65 | 66 | :param string: A string of ASCII characters. 67 | :raises ValueError: if any of the characters has no keycode 68 | (such as some control characters). 69 | 70 | Example:: 71 | 72 | # Write abc followed by Enter to the keyboard 73 | layout.write('abc\\n') 74 | """ 75 | for char in string: 76 | # find easy ones first 77 | keycode = self._char_to_keycode(char) 78 | if keycode > 0: 79 | self._write(keycode, char in self.NEED_ALTGR) 80 | # find combined keys 81 | elif ord(char) in self.COMBINED_KEYS: 82 | # first key (including shift bit) 83 | cchar = self.COMBINED_KEYS[ord(char)] 84 | self._write(cchar >> 8, cchar & self.ALTGR_FLAG) 85 | # second key (removing the altgr bit) 86 | char = chr(cchar & 0xFF & (~self.ALTGR_FLAG)) 87 | keycode = self._char_to_keycode(char) 88 | # assume no altgr needed for second key 89 | self._write(keycode, False) 90 | else: 91 | raise ValueError( 92 | "No keycode available for character {letter} ({num}/0x{num:02x}).".format( 93 | letter=repr(char), num=ord(char) 94 | ) 95 | ) 96 | 97 | def keycodes(self, char): 98 | """Return a tuple of keycodes needed to type the given character. 99 | 100 | :param char: A single UTF8 character in a string. 101 | :type char: str of length one. 102 | :returns: tuple of Keycode keycodes. 103 | :raises ValueError: if there is no keycode for ``char``. 104 | 105 | Examples:: 106 | 107 | # Returns (Keycode.TAB,) 108 | keycodes('\t') 109 | # Returns (Keycode.A,) 110 | keycode('a') 111 | # Returns (Keycode.SHIFT, Keycode.A) 112 | keycode('A') 113 | # Raises ValueError with a US layout because it's an unknown character 114 | keycode('é') 115 | """ 116 | keycode = self._char_to_keycode(char) 117 | if keycode == 0: 118 | raise ValueError( 119 | "No keycode available for character {letter} ({num}/0x{num:02x}).".format( 120 | letter=repr(char), num=ord(char) 121 | ) 122 | ) 123 | 124 | codes = [] 125 | if char in self.NEED_ALTGR: 126 | codes.append(self.RIGHT_ALT_CODE) 127 | if keycode & self.SHIFT_FLAG: 128 | codes.extend((self.SHIFT_CODE, keycode & ~self.SHIFT_FLAG)) 129 | else: 130 | codes.append(keycode) 131 | 132 | return codes 133 | 134 | def _above128char_to_keycode(self, char): 135 | """Return keycode for above 128 ascii codes. 136 | 137 | A character can be indexed by the char itself or its int ord() value. 138 | 139 | :param char_val: ascii char value 140 | :return: keycode, with modifiers if needed 141 | """ 142 | if ord(char) in self.HIGHER_ASCII: 143 | return self.HIGHER_ASCII[ord(char)] 144 | if char in self.HIGHER_ASCII: 145 | return self.HIGHER_ASCII[char] 146 | return 0 147 | 148 | def _char_to_keycode(self, char): 149 | """Return the HID keycode for the given ASCII character, with the SHIFT_FLAG possibly set. 150 | 151 | If the character requires pressing the Shift key, the SHIFT_FLAG bit is set. 152 | You must clear this bit before passing the keycode in a USB report. 153 | """ 154 | char_val = ord(char) 155 | if char_val > len(self.ASCII_TO_KEYCODE): 156 | return self._above128char_to_keycode(char) 157 | keycode = self.ASCII_TO_KEYCODE[char_val] 158 | return keycode 159 | -------------------------------------------------------------------------------- /tests/reference/keyboard_layout_us.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2017 Dan Halbert for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """ 6 | `adafruit_hid.keyboard_layout_us.KeyboardLayoutUS` 7 | ======================================================= 8 | 9 | * Author(s): Dan Halbert 10 | """ 11 | 12 | from keyboard_layout import KeyboardLayoutBase 13 | 14 | 15 | class KeyboardLayout(KeyboardLayoutBase): 16 | """Map ASCII characters to appropriate keypresses on a standard US PC keyboard. 17 | 18 | Non-ASCII characters and most control characters will raise an exception. 19 | """ 20 | 21 | # The ASCII_TO_KEYCODE bytes object is used as a table to maps ASCII 0-127 22 | # to the corresponding # keycode on a US 104-key keyboard. 23 | # The user should not normally need to use this table, 24 | # but it is not marked as private. 25 | # 26 | # Because the table only goes to 127, we use the top bit of each byte (ox80) to indicate 27 | # that the shift key should be pressed. So any values 0x{8,9,a,b}* are shifted characters. 28 | # 29 | # The Python compiler will concatenate all these bytes literals into a single bytes object. 30 | # Micropython/CircuitPython will store the resulting bytes constant in flash memory 31 | # if it's in a .mpy file, so it doesn't use up valuable RAM. 32 | # 33 | # \x00 entries have no keyboard key and so won't be sent. 34 | ASCII_TO_KEYCODE = ( 35 | b"\x00" # NUL 36 | b"\x00" # SOH 37 | b"\x00" # STX 38 | b"\x00" # ETX 39 | b"\x00" # EOT 40 | b"\x00" # ENQ 41 | b"\x00" # ACK 42 | b"\x00" # BEL \a 43 | b"\x2a" # BS BACKSPACE \b (called DELETE in the usb.org document) 44 | b"\x2b" # TAB \t 45 | b"\x28" # LF \n (called Return or ENTER in the usb.org document) 46 | b"\x00" # VT \v 47 | b"\x00" # FF \f 48 | b"\x00" # CR \r 49 | b"\x00" # SO 50 | b"\x00" # SI 51 | b"\x00" # DLE 52 | b"\x00" # DC1 53 | b"\x00" # DC2 54 | b"\x00" # DC3 55 | b"\x00" # DC4 56 | b"\x00" # NAK 57 | b"\x00" # SYN 58 | b"\x00" # ETB 59 | b"\x00" # CAN 60 | b"\x00" # EM 61 | b"\x00" # SUB 62 | b"\x29" # ESC 63 | b"\x00" # FS 64 | b"\x00" # GS 65 | b"\x00" # RS 66 | b"\x00" # US 67 | b"\x2c" # SPACE 68 | b"\x9e" # ! x1e|SHIFT_FLAG (shift 1) 69 | b"\xb4" # " x34|SHIFT_FLAG (shift ') 70 | b"\xa0" # # x20|SHIFT_FLAG (shift 3) 71 | b"\xa1" # $ x21|SHIFT_FLAG (shift 4) 72 | b"\xa2" # % x22|SHIFT_FLAG (shift 5) 73 | b"\xa4" # & x24|SHIFT_FLAG (shift 7) 74 | b"\x34" # ' 75 | b"\xa6" # ( x26|SHIFT_FLAG (shift 9) 76 | b"\xa7" # ) x27|SHIFT_FLAG (shift 0) 77 | b"\xa5" # * x25|SHIFT_FLAG (shift 8) 78 | b"\xae" # + x2e|SHIFT_FLAG (shift =) 79 | b"\x36" # , 80 | b"\x2d" # - 81 | b"\x37" # . 82 | b"\x38" # / 83 | b"\x27" # 0 84 | b"\x1e" # 1 85 | b"\x1f" # 2 86 | b"\x20" # 3 87 | b"\x21" # 4 88 | b"\x22" # 5 89 | b"\x23" # 6 90 | b"\x24" # 7 91 | b"\x25" # 8 92 | b"\x26" # 9 93 | b"\xb3" # : x33|SHIFT_FLAG (shift ;) 94 | b"\x33" # ; 95 | b"\xb6" # < x36|SHIFT_FLAG (shift ,) 96 | b"\x2e" # = 97 | b"\xb7" # > x37|SHIFT_FLAG (shift .) 98 | b"\xb8" # ? x38|SHIFT_FLAG (shift /) 99 | b"\x9f" # @ x1f|SHIFT_FLAG (shift 2) 100 | b"\x84" # A x04|SHIFT_FLAG (shift a) 101 | b"\x85" # B x05|SHIFT_FLAG (etc.) 102 | b"\x86" # C x06|SHIFT_FLAG 103 | b"\x87" # D x07|SHIFT_FLAG 104 | b"\x88" # E x08|SHIFT_FLAG 105 | b"\x89" # F x09|SHIFT_FLAG 106 | b"\x8a" # G x0a|SHIFT_FLAG 107 | b"\x8b" # H x0b|SHIFT_FLAG 108 | b"\x8c" # I x0c|SHIFT_FLAG 109 | b"\x8d" # J x0d|SHIFT_FLAG 110 | b"\x8e" # K x0e|SHIFT_FLAG 111 | b"\x8f" # L x0f|SHIFT_FLAG 112 | b"\x90" # M x10|SHIFT_FLAG 113 | b"\x91" # N x11|SHIFT_FLAG 114 | b"\x92" # O x12|SHIFT_FLAG 115 | b"\x93" # P x13|SHIFT_FLAG 116 | b"\x94" # Q x14|SHIFT_FLAG 117 | b"\x95" # R x15|SHIFT_FLAG 118 | b"\x96" # S x16|SHIFT_FLAG 119 | b"\x97" # T x17|SHIFT_FLAG 120 | b"\x98" # U x18|SHIFT_FLAG 121 | b"\x99" # V x19|SHIFT_FLAG 122 | b"\x9a" # W x1a|SHIFT_FLAG 123 | b"\x9b" # X x1b|SHIFT_FLAG 124 | b"\x9c" # Y x1c|SHIFT_FLAG 125 | b"\x9d" # Z x1d|SHIFT_FLAG 126 | b"\x2f" # [ 127 | b"\x31" # \ backslash 128 | b"\x30" # ] 129 | b"\xa3" # ^ x23|SHIFT_FLAG (shift 6) 130 | b"\xad" # _ x2d|SHIFT_FLAG (shift -) 131 | b"\x35" # ` 132 | b"\x04" # a 133 | b"\x05" # b 134 | b"\x06" # c 135 | b"\x07" # d 136 | b"\x08" # e 137 | b"\x09" # f 138 | b"\x0a" # g 139 | b"\x0b" # h 140 | b"\x0c" # i 141 | b"\x0d" # j 142 | b"\x0e" # k 143 | b"\x0f" # l 144 | b"\x10" # m 145 | b"\x11" # n 146 | b"\x12" # o 147 | b"\x13" # p 148 | b"\x14" # q 149 | b"\x15" # r 150 | b"\x16" # s 151 | b"\x17" # t 152 | b"\x18" # u 153 | b"\x19" # v 154 | b"\x1a" # w 155 | b"\x1b" # x 156 | b"\x1c" # y 157 | b"\x1d" # z 158 | b"\xaf" # { x2f|SHIFT_FLAG (shift [) 159 | b"\xb1" # | x31|SHIFT_FLAG (shift \) 160 | b"\xb0" # } x30|SHIFT_FLAG (shift ]) 161 | b"\xb5" # ~ x35|SHIFT_FLAG (shift `) 162 | b"\x4c" # DEL DELETE (called Forward Delete in usb.org document) 163 | ) 164 | -------------------------------------------------------------------------------- /tests/reference/usbif_keycode_scancode.py: -------------------------------------------------------------------------------- 1 | usbif_keycode_scancode = [ 2 | (0x01, 0, "ErrorRollOver"), 3 | (0x02, 0, "POSTFail"), 4 | (0x03, 0, "ErrorUndefined"), 5 | (0x04, 31, "a and A"), 6 | (0x05, 50, "b and B"), 7 | (0x06, 48, "c and C"), 8 | (0x07, 33, "d and D"), 9 | (0x08, 19, "e and E"), 10 | (0x09, 34, "f and F"), 11 | (0x0A, 35, "g and G"), 12 | (0x0B, 36, "h and H"), 13 | (0x0C, 24, "i and I"), 14 | (0x0D, 37, "j and J"), 15 | (0x0E, 38, "k and K"), 16 | (0x0F, 39, "l and L"), 17 | (0x10, 52, "m and M"), 18 | (0x11, 51, "n and N"), 19 | (0x12, 25, "o and O"), 20 | (0x13, 26, "p and P"), 21 | (0x14, 17, "q and Q"), 22 | (0x15, 20, "r and R"), 23 | (0x16, 32, "s and S"), 24 | (0x17, 21, "t and T"), 25 | (0x18, 23, "u and U"), 26 | (0x19, 49, "v and V"), 27 | (0x1A, 18, "w and W"), 28 | (0x1B, 47, "x and X"), 29 | (0x1C, 22, "y and Y"), 30 | (0x1D, 46, "z and Z"), 31 | (0x1E, 2, "1 and !"), 32 | (0x1F, 3, "2 and @"), 33 | (0x20, 4, "3 and #"), 34 | (0x21, 5, "4 and $"), 35 | (0x22, 6, "5 and %"), 36 | (0x23, 7, "6 and ∧"), 37 | (0x24, 8, "7 and &"), 38 | (0x25, 9, "8 and *"), 39 | (0x26, 10, "9 and ("), 40 | (0x27, 11, "0 and )"), 41 | (0x28, 43, "Return (ENTER)"), 42 | (0x29, 110, "ESCAPE"), 43 | (0x2A, 15, "DELETE (Backspace)"), 44 | (0x2B, 16, "Tab"), 45 | (0x2C, 61, "Spacebar"), 46 | (0x2D, 12, "- and (underscore)"), 47 | (0x2E, 13, "= and +"), 48 | (0x2F, 27, "[ and {"), 49 | (0x30, 28, "] and }"), 50 | (0x31, 29, "\and |"), 51 | (0x32, 42, "Non-US # and ̃"), 52 | (0x33, 40, "; and :"), 53 | (0x34, 41, "‘ and “"), 54 | (0x35, 1, "Grave Accent and Tilde"), 55 | (0x36, 53, ", and <"), 56 | (0x37, 54, ". and >"), 57 | (0x38, 55, "/ and ?"), 58 | (0x39, 30, "Caps Lock"), 59 | (0x3A, 112, "F1"), 60 | (0x3B, 113, "F2"), 61 | (0x3C, 114, "F3"), 62 | (0x3D, 115, "F4"), 63 | (0x3E, 116, "Keyboard F5"), 64 | (0x3F, 117, "Keyboard F6"), 65 | (0x40, 118, "Keyboard F7"), 66 | (0x41, 119, "Keyboard F8"), 67 | (0x42, 120, "Keyboard F9"), 68 | (0x43, 121, "Keyboard F10"), 69 | (0x44, 122, "Keyboard F11"), 70 | (0x45, 123, "Keyboard F12"), 71 | (0x46, 124, "Keyboard PrintScreen"), 72 | (0x47, 125, "Keyboard Scroll Lock"), 73 | (0x48, 126, "Keyboard Pause"), 74 | (0x49, 75, "Keyboard Insert"), 75 | (0x4A, 80, "Keyboard Home"), 76 | (0x4B, 85, "Keyboard PageUp"), 77 | (0x4C, 76, "Keyboard Delete Forward"), 78 | (0x4D, 81, "Keyboard End"), 79 | (0x4E, 86, "Keyboard PageDown"), 80 | (0x4F, 89, "Keyboard RightArrow"), 81 | (0x50, 79, "Keyboard LeftArrow"), 82 | (0x51, 84, "Keyboard DownArrow"), 83 | (0x52, 83, "Keyboard UpArrow"), 84 | (0x53, 90, "Keypad Num Lock and Clear"), 85 | (0x54, 95, "Keypad /"), 86 | (0x55, 100, "Keypad *"), 87 | (0x56, 105, "Keypad -"), 88 | (0x57, 106, "Keypad +"), 89 | (0x58, 108, "Keypad ENTER"), 90 | (0x59, 93, "Keypad 1 and End"), 91 | (0x5A, 98, "Keypad 2 and Down Arrow"), 92 | (0x5B, 103, "Keypad 3 and PageDn"), 93 | (0x5C, 92, "Keypad 4 and Left Arrow"), 94 | (0x5D, 97, "Keypad 5"), 95 | (0x5E, 102, "Keypad 6 and Right Arrow"), 96 | (0x5F, 91, "Keypad 7 and Home"), 97 | (0x60, 96, "Keypad 8 and Up Arrow"), 98 | (0x61, 101, "Keypad 9 and PageUp"), 99 | (0x62, 99, "Keypad 0 and Insert"), 100 | (0x63, 104, "Keypad . and Delete"), 101 | (0x64, 45, "Non-US \and |"), 102 | (0x65, 129, "Application"), 103 | (0x66, 0, "Power"), 104 | (0x67, 0, "Keypad ="), 105 | (0x68, 0, "F13"), 106 | (0x69, 0, "F14"), 107 | (0x6A, 0, "F15"), 108 | (0x6B, 0, "F16"), 109 | (0x6C, 0, "F17"), 110 | (0x6D, 0, "F18"), 111 | (0x6E, 0, "F19"), 112 | (0x6F, 0, "F20"), 113 | (0x70, 0, "F21"), 114 | (0x71, 0, "F22"), 115 | (0x72, 0, "F23"), 116 | (0x73, 0, "F24"), 117 | (0x74, 0, "Execute"), 118 | (0x75, 0, "Help"), 119 | (0x76, 0, "Menu"), 120 | (0x77, 0, "Select"), 121 | (0x78, 0, "Stop"), 122 | (0x79, 0, "Again"), 123 | (0x7A, 0, "Undo"), 124 | (0x7B, 0, "Cut"), 125 | (0x7C, 0, "Copy"), 126 | (0x7D, 0, "Paste"), 127 | (0x7E, 0, "Find"), 128 | (0x7F, 0, "Mute"), 129 | (0x80, 0, "Volume Up"), 130 | (0x81, 0, "Volume Down"), 131 | (0x82, 0, "Locking Caps Lock"), 132 | (0x83, 0, "Locking Num Lock"), 133 | (0x84, 0, "Locking Scroll Lock"), 134 | (0x85, 107, "Keypad Comma"), 135 | (0x86, 0, "Keypad Equal Sign"), 136 | (0x87, 56, "International1"), 137 | (0x88, 0, "International2"), 138 | (0x89, 0, "International3"), 139 | (0x8A, 0, "International4"), 140 | (0x8B, 0, "International5"), 141 | (0x8C, 0, "International6"), 142 | (0x8D, 0, "International7"), 143 | (0x8E, 0, "International8"), 144 | (0x8F, 0, "International9"), 145 | (0x90, 0, "LANG1"), 146 | (0x91, 0, "LANG2"), 147 | (0x92, 0, "LANG3"), 148 | (0x93, 0, "LANG4"), 149 | (0x94, 0, "LANG5"), 150 | (0x95, 0, "LANG6"), 151 | (0x96, 0, "LANG7"), 152 | (0x97, 0, "LANG8"), 153 | (0x98, 0, "LANG9"), 154 | (0x99, 0, "Alternate Erase"), 155 | (0x9A, 0, "SysReq/Attention"), 156 | (0x9B, 0, "Cancel"), 157 | (0x9C, 0, "Clear"), 158 | (0x9D, 0, "Prior"), 159 | (0x9E, 0, "Return"), 160 | (0x9F, 0, "Separator"), 161 | (0xA0, 0, "Out"), 162 | (0xA1, 0, "Oper"), 163 | (0xA2, 0, "Clear/Again"), 164 | (0xA3, 0, "CrSel/Props"), 165 | (0xA4, 0, "ExSel"), 166 | (0xB0, 0, "Keypad 00"), 167 | (0xB1, 0, "Keypad 000"), 168 | (0xB2, 0, "Thousands Separator"), 169 | (0xB3, 0, "Decimal Separator"), 170 | (0xB4, 0, "Currency Unit"), 171 | (0xB5, 0, "Currency Sub-unit"), 172 | (0xB6, 0, "Keypad ("), 173 | (0xB7, 0, "Keypad )"), 174 | (0xB8, 0, "Keypad {"), 175 | (0xB9, 0, "Keypad }"), 176 | (0xBA, 0, "Keypad Tab"), 177 | (0xBB, 0, "Keypad Backspace"), 178 | (0xBC, 0, "Keypad A"), 179 | (0xBD, 0, "Keypad B"), 180 | (0xBE, 0, "Keypad C"), 181 | (0xBF, 0, "Keypad D"), 182 | (0xC0, 0, "Keypad E"), 183 | (0xC1, 0, "Keypad F"), 184 | (0xC2, 0, "Keypad XOR"), 185 | (0xC3, 0, "Keypad ∧"), 186 | (0xC4, 0, "Keypad %"), 187 | (0xC5, 0, "Keypad <"), 188 | (0xC6, 0, "Keypad >"), 189 | (0xC7, 0, "Keypad &"), 190 | (0xC8, 0, "Keypad &&"), 191 | (0xC9, 0, "Keypad |"), 192 | (0xCA, 0, "Keypad ||"), 193 | (0xCB, 0, "Keypad :"), 194 | (0xCC, 0, "Keypad #"), 195 | (0xCD, 0, "Keypad Space"), 196 | (0xCE, 0, "Keypad @"), 197 | (0xCF, 0, "Keypad !"), 198 | (0xD0, 0, "Keypad Memory Store"), 199 | (0xD1, 0, "Keypad Memory Recall"), 200 | (0xD2, 0, "Keypad Memory Clear"), 201 | (0xD3, 0, "Keypad Memory Add"), 202 | (0xD4, 0, "Keypad Memory Subtract"), 203 | (0xD5, 0, "Keypad Memory Multiply"), 204 | (0xD6, 0, "Keypad Memory Divide"), 205 | (0xD7, 0, "Keypad +/-"), 206 | (0xD8, 0, "Keypad Clear"), 207 | (0xD9, 0, "Keypad Clear Entry"), 208 | (0xDA, 0, "Keypad Binary"), 209 | (0xDB, 0, "Keypad Octal"), 210 | (0xDC, 0, "Keypad Decimal"), 211 | (0xDD, 0, "Keypad Hexadecimal"), 212 | (0xE0, 58, "LeftControl"), 213 | (0xE1, 44, "LeftShift"), 214 | (0xE2, 60, "LeftAlt"), 215 | (0xE3, 127, "Left GUI"), 216 | (0xE4, 64, "RightControl"), 217 | (0xE5, 57, "RightShift"), 218 | (0xE6, 62, "RightAlt"), 219 | (0xE7, 128, "Right GUI"), 220 | ] 221 | -------------------------------------------------------------------------------- /tests/simple_layout_ords.py: -------------------------------------------------------------------------------- 1 | import os 2 | import importlib.util 3 | import click 4 | import sys 5 | sys.path.append("libraries/common") 6 | sys.path.append("libraries/layouts") 7 | sys.path.append("libraries/keycodes") 8 | 9 | def load_module(file, name): 10 | spec = importlib.util.spec_from_file_location(name, file) 11 | foo = importlib.util.module_from_spec(spec) 12 | spec.loader.exec_module(foo) 13 | return foo 14 | 15 | @click.group(invoke_without_command=True) 16 | @click.argument("keyboard_layout", nargs=1) 17 | def main(keyboard_layout): 18 | print(keyboard_layout) 19 | layout = load_module(keyboard_layout, "layout") 20 | 21 | ASCII = layout.KeyboardLayout.ASCII_TO_KEYCODE 22 | hîģh_äşčìÆí = layout.KeyboardLayout.HIGHER_ASCII 23 | ČÔMBÏŅĖĎ_ĶËÝŠ = layout.KeyboardLayout.COMBINED_KEYS 24 | 25 | total_char = len(hîģh_äşčìÆí) + len(ČÔMBÏŅĖĎ_ĶËÝŠ) 26 | unicode_chars = 0 27 | 28 | print("Higher ASCII") 29 | for x in hîģh_äşčìÆí: 30 | oo = ord(x) 31 | if oo >= 256: 32 | unicode_chars += 1 33 | print("-", x, f"{oo:04x}", "*" * (oo // 256)) 34 | 35 | print("Combined Keys") 36 | for x in ČÔMBÏŅĖĎ_ĶËÝŠ: 37 | oo = ord(x) 38 | if oo >= 256: 39 | unicode_chars += 1 40 | print("-", x, f"{oo:04x}", "*" * (oo // 256)) 41 | 42 | print("Unicode above ASCII: {pct:.1f}%".format(pct = 100 * unicode_chars / total_char)) 43 | 44 | if __name__ == "__main__": 45 | main() 46 | --------------------------------------------------------------------------------