diff --git a/.gitignore b/.gitignore index 9ad72d7..0634960 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ Thumbs.db /.qmake.cache /.qmake.stash CMakeFiles/ +build/ # qtcreator generated files *.pro.user* diff --git a/CMakeLists.txt b/CMakeLists.txt index 48f61d8..8ac2d9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,10 +53,15 @@ add_compile_definitions( DEFAULT_ACCENT_BLUE=115 ) -find_package(Qt6 6.5 COMPONENTS Quick Svg REQUIRED) # QTBUG-55199 +find_package(Qt6 COMPONENTS Quick Svg Widgets REQUIRED) + +# Qt Policy setzen, damit die Warnung verschwindet +qt_policy(SET QTP0001 NEW) set(HIDAPI_WITH_LIBUSB FALSE) set(BUILD_SHARED_LIBS FALSE) add_subdirectory(hidapi) add_subdirectory(src) + +target_link_libraries(rangoli PRIVATE Qt6::Widgets) diff --git a/LINUX_PERMISSIONS.md b/LINUX_PERMISSIONS.md new file mode 100644 index 0000000..184f277 --- /dev/null +++ b/LINUX_PERMISSIONS.md @@ -0,0 +1,189 @@ +# Linux Permissions for Rangoli Keyboard Mapper + +## Problems and Solutions + +### Problem 1: Segmentation Fault due to HID Permissions + +On Linux, Rangoli may crash with a "Segmentation fault (core dumped)" when running without sudo while trying to access HID devices (keyboards). This happens because regular users don't have direct access to HID devices by default. + +### Problem 2: Qt6 Wayland Menu Crash + +On some Linux systems running Wayland, Rangoli may crash due to a Qt6 bug in menu creation. The program automatically detects this and falls back to X11 backend. + +## Solution + +The solution is to install udev rules that grant your user access to Rangoli keyboards without requiring sudo. + +### Automatic Installation (Recommended) + +1. **Run the installation script:** + ```bash + ./install-udev-rules.sh + ``` + +2. **Unplug and replug your keyboard** or restart your system. + +3. **Rangoli should now work without sudo and automatically handle Wayland compatibility.** + +### Manual Installation + +If you prefer to install the udev rules manually: + +1. **Copy the udev rules:** + ```bash + sudo cp udev/99-rangoli-keyboards.rules /etc/udev/rules.d/ + sudo chmod 644 /etc/udev/rules.d/99-rangoli-keyboards.rules + ``` + +2. **Reload udev rules:** + ```bash + sudo udevadm control --reload-rules + sudo udevadm trigger + ``` + +3. **Add your user to the appropriate group (for SSH access):** + ```bash + # Ubuntu/Debian: + sudo usermod -aG plugdev $USER + + # Fedora/RHEL/CentOS: + sudo usermod -aG input $USER + ``` + +4. **Log out and log back in** (or restart your system). + +5. **Unplug and replug your keyboard.** + +## Supported Devices + +The udev rules support all Rangoli keyboards with vendor ID `258a`. This includes all currently supported models. + +## Troubleshooting + +### Rangoli still crashes + +1. **Check if udev rules are installed:** + ```bash + ls -la /etc/udev/rules.d/99-rangoli-keyboards.rules + ``` + +2. **Check your group membership:** + ```bash + groups $USER + ``` + You should see `plugdev` (Ubuntu/Debian) or `input` (Fedora/RHEL) in the list. + +3. **Check if your keyboard is detected:** + ```bash + lsusb | grep 258a + ``` + +4. **Restart your system** instead of just unplugging the keyboard. + +### For SSH/Remote Access + +If you want to use Rangoli over SSH: + +1. **Make sure you're in the appropriate group:** + ```bash + # Ubuntu/Debian: + groups $USER | grep plugdev + + # Fedora/RHEL: + groups $USER | grep input + ``` + +2. **If not, add yourself:** + ```bash + # Ubuntu/Debian: + sudo usermod -aG plugdev $USER + + # Fedora/RHEL: + sudo usermod -aG input $USER + ``` + +3. **Log out and log back in:** + ```bash + exit # End SSH session + # Then reconnect via SSH + ``` + +### Debugging + +To check if the udev rules are working: + +1. **Monitor udev events:** + ```bash + sudo udevadm monitor --property + ``` + +2. **Unplug and replug your keyboard** and observe the output. + +3. **Check device properties:** + ```bash + # Find your device + lsusb | grep 258a + + # Check udev properties (replace X:Y with Bus:Device) + udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/X/Y) + ``` + +## Technical Details + +### What the udev rules do + +The [`udev/99-rangoli-keyboards.rules`](udev/99-rangoli-keyboards.rules) file contains rules that: + +1. **Identify all HID devices with vendor ID 258a** +2. **Add TAG+="uaccess"** - Grants access for physically present users +3. **Set GROUP="plugdev"/"input", MODE="660"** - Enables access for group members (important for SSH) + +### Why 99-rangoli-keyboards.rules? + +- **99-** ensures our rules run after standard system rules +- **rangoli-keyboards** makes the file's purpose clear +- **.rules** is the required extension for udev rules + +### Security Considerations + +This solution: +- ✅ Only grants access to Rangoli keyboards (vendor ID 258a) +- ✅ Requires physical access or plugdev group membership +- ✅ Follows Linux security standards +- ✅ Avoids the need to run as root + +## Alternative Solutions + +### Temporary Solution (not recommended) + +You can temporarily run Rangoli with sudo: +```bash +sudo ./build/src/rangoli +``` + +**Disadvantages:** +- Security risk (program runs as root) +- Inconvenient (requires sudo every time) +- Can cause file permission issues + +### System-wide Permission (not recommended) + +You could grant all users access to all HID devices, but this is a security risk. + +## Support + +If you continue to have problems: + +1. **Check system logs:** + ```bash + journalctl -f + ``` + +2. **Run Rangoli in debug mode** (if available) + +3. **Create an issue** with the following information: + - Linux distribution and version + - Output of `lsusb | grep 258a` + - Output of `groups $USER` + - Contents of `/etc/udev/rules.d/99-rangoli-keyboards.rules` + - Relevant system logs \ No newline at end of file diff --git a/LINUX_PERMISSIONS_GER.md b/LINUX_PERMISSIONS_GER.md new file mode 100644 index 0000000..6c60993 --- /dev/null +++ b/LINUX_PERMISSIONS_GER.md @@ -0,0 +1,189 @@ +# Linux-Berechtigungen für Rangoli Keyboard Mapper + +## Probleme und Lösungen + +### Problem 1: Speicherzugriffsfehler durch HID-Berechtigungen + +Unter Linux kann Rangoli ohne sudo mit einem "Speicherzugriffsfehler" abstürzen, wenn es versucht, auf HID-Geräte (Tastaturen) zuzugreifen. Dies liegt daran, dass normale Benutzer standardmäßig keinen direkten Zugriff auf HID-Geräte haben. + +### Problem 2: Qt6 Wayland Menü-Absturz + +Auf einigen Linux-Systemen mit Wayland kann Rangoli aufgrund eines Qt6-Bugs bei der Menü-Erstellung abstürzen. Das Programm erkennt dies automatisch und wechselt zum X11-Backend. + +## Lösung + +Die Lösung besteht darin, udev-Regeln zu installieren, die Ihrem Benutzer Zugriff auf Rangoli-Tastaturen gewähren, ohne sudo zu benötigen. + +### Automatische Installation (Empfohlen) + +1. **Führen Sie das Installationsscript aus:** + ```bash + ./install-udev-rules.sh + ``` + +2. **Stecken Sie Ihre Tastatur ab und wieder an** oder starten Sie das System neu. + +3. **Rangoli sollte jetzt ohne sudo funktionieren und automatisch Wayland-Kompatibilität handhaben.** + +### Manuelle Installation + +Falls Sie die udev-Regeln manuell installieren möchten: + +1. **Kopieren Sie die udev-Regeln:** + ```bash + sudo cp udev/99-rangoli-keyboards.rules /etc/udev/rules.d/ + sudo chmod 644 /etc/udev/rules.d/99-rangoli-keyboards.rules + ``` + +2. **Laden Sie die udev-Regeln neu:** + ```bash + sudo udevadm control --reload-rules + sudo udevadm trigger + ``` + +3. **Fügen Sie Ihren Benutzer zur entsprechenden Gruppe hinzu (für SSH-Zugriff):** + ```bash + # Ubuntu/Debian: + sudo usermod -aG plugdev $USER + + # Fedora/RHEL/CentOS: + sudo usermod -aG input $USER + ``` + +4. **Melden Sie sich ab und wieder an** (oder starten Sie das System neu). + +5. **Stecken Sie Ihre Tastatur ab und wieder an.** + +## Unterstützte Geräte + +Die udev-Regeln unterstützen alle Rangoli-Tastaturen mit der Vendor ID `258a`. Dies umfasst alle derzeit unterstützten Modelle. + +## Fehlerbehebung + +### Rangoli stürzt immer noch ab + +1. **Überprüfen Sie, ob die udev-Regeln installiert sind:** + ```bash + ls -la /etc/udev/rules.d/99-rangoli-keyboards.rules + ``` + +2. **Überprüfen Sie Ihre Gruppenmitgliedschaft:** + ```bash + groups $USER + ``` + Sie sollten `plugdev` (Ubuntu/Debian) oder `input` (Fedora/RHEL) in der Liste sehen. + +3. **Überprüfen Sie, ob Ihre Tastatur erkannt wird:** + ```bash + lsusb | grep 258a + ``` + +4. **Starten Sie das System neu** anstatt nur die Tastatur abzustecken. + +### Für SSH/Remote-Zugriff + +Wenn Sie Rangoli über SSH verwenden möchten: + +1. **Stellen Sie sicher, dass Sie in der entsprechenden Gruppe sind:** + ```bash + # Ubuntu/Debian: + groups $USER | grep plugdev + + # Fedora/RHEL: + groups $USER | grep input + ``` + +2. **Falls nicht, fügen Sie sich hinzu:** + ```bash + # Ubuntu/Debian: + sudo usermod -aG plugdev $USER + + # Fedora/RHEL: + sudo usermod -aG input $USER + ``` + +3. **Melden Sie sich ab und wieder an:** + ```bash + exit # SSH-Sitzung beenden + # Dann erneut per SSH verbinden + ``` + +### Debugging + +Um zu überprüfen, ob die udev-Regeln funktionieren: + +1. **Überwachen Sie udev-Ereignisse:** + ```bash + sudo udevadm monitor --property + ``` + +2. **Stecken Sie Ihre Tastatur ab und wieder an** und beobachten Sie die Ausgabe. + +3. **Überprüfen Sie die Geräteeigenschaften:** + ```bash + # Finden Sie Ihr Gerät + lsusb | grep 258a + + # Überprüfen Sie die udev-Eigenschaften (ersetzen Sie X:Y mit Bus:Device) + udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/X/Y) + ``` + +## Technische Details + +### Was die udev-Regeln tun + +Die [`udev/99-rangoli-keyboards.rules`](udev/99-rangoli-keyboards.rules) Datei enthält Regeln, die: + +1. **Alle HID-Geräte mit Vendor ID 258a identifizieren** +2. **TAG+="uaccess" hinzufügen** - Gewährt Zugriff für physisch anwesende Benutzer +3. **GROUP="plugdev"/"input", MODE="660" setzen** - Ermöglicht Zugriff für Gruppenmitglieder (wichtig für SSH) + +### Warum 99-rangoli-keyboards.rules? + +- **99-** stellt sicher, dass unsere Regeln nach den Standard-Systemregeln ausgeführt werden +- **rangoli-keyboards** macht den Zweck der Datei klar +- **.rules** ist die erforderliche Erweiterung für udev-Regeln + +### Sicherheitsüberlegungen + +Diese Lösung: +- ✅ Gewährt nur Zugriff auf Rangoli-Tastaturen (Vendor ID 258a) +- ✅ Erfordert physischen Zugang oder plugdev-Gruppenmitgliedschaft +- ✅ Folgt Linux-Sicherheitsstandards +- ✅ Vermeidet die Notwendigkeit, als root zu laufen + +## Alternative Lösungen + +### Temporäre Lösung (nicht empfohlen) + +Sie können Rangoli temporär mit sudo ausführen: +```bash +sudo ./build/src/rangoli +``` + +**Nachteile:** +- Sicherheitsrisiko (Programm läuft als root) +- Unbequem (sudo bei jedem Start erforderlich) +- Kann zu Dateiberechtigungsproblemen führen + +### Systemweite Berechtigung (nicht empfohlen) + +Sie könnten allen Benutzern Zugriff auf alle HID-Geräte gewähren, aber das ist ein Sicherheitsrisiko. + +## Support + +Falls Sie weiterhin Probleme haben: + +1. **Überprüfen Sie die Systemlogs:** + ```bash + journalctl -f + ``` + +2. **Führen Sie Rangoli im Debug-Modus aus** (falls verfügbar) + +3. **Erstellen Sie ein Issue** mit folgenden Informationen: + - Linux-Distribution und Version + - Ausgabe von `lsusb | grep 258a` + - Ausgabe von `groups $USER` + - Inhalt von `/etc/udev/rules.d/99-rangoli-keyboards.rules` + - Relevante Systemlogs \ No newline at end of file diff --git a/OUTPUT_FILE b/OUTPUT_FILE new file mode 100644 index 0000000..6a25194 --- /dev/null +++ b/OUTPUT_FILE @@ -0,0 +1 @@ +12117548880564222:0 \ No newline at end of file diff --git a/README.md b/README.md index 66fffd4..b945a04 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,33 @@ There is no guarantee that it will work with your keyboard. There is no official - GCC >= 9.4.0 / Clang >= 5 - Ninja >= 1.10.2 +#### Fedora Linux + +Install the required packages: + +```bash +# Development tools and Qt6 +sudo dnf install cmake ninja-build gcc-c++ git + +# Qt6 packages +sudo dnf install qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtsvg-devel + +# HID development libraries (for hidapi) +sudo dnf install libudev-devel libusb1-devel + +# Optional: Additional Qt6 tools +sudo dnf install qt6-qttools-devel +``` + +#### Other Linux Distributions + +For Ubuntu/Debian: +```bash +sudo apt install build-essential cmake ninja-build git +sudo apt install qt6-base-dev qt6-declarative-dev qt6-svg-dev +sudo apt install libudev-dev libusb-1.0-0-dev +``` + ### Clone Rangoli uses [hidapi](https://github.com/libusb/hidapi). It has been included as a submodule. @@ -100,6 +127,21 @@ cmake --build build --parallel - Windows: `.\build\src\rangoli.exe` - MacOS: `open ./build/src/rangoli.app` +### Linux Permissions + +On Linux, Rangoli requires access to HID devices. If you get a segmentation fault when running without sudo, you need to install udev rules: + +```bash +# Run the installation script +./install-udev-rules.sh + +# Then unplug and replug your keyboard, or restart your system +``` + +For detailed instructions and troubleshooting, see: +- [Linux Permissions Guide (English)](LINUX_PERMISSIONS_EN.md) +- [Linux Berechtigungen (Deutsch)](LINUX_PERMISSIONS.md) + ## Bugs and Support If you want to report an issue or sugggest a feature, please report it by creating a [GitHub issue](https://github.com/rnayabed/rangoli/issues). diff --git a/hidapi b/hidapi index 4ebce6b..f18d2c0 160000 --- a/hidapi +++ b/hidapi @@ -1 +1 @@ -Subproject commit 4ebce6b5059b086d05ca7e091ce04a5fd08ac3ac +Subproject commit f18d2c0768bed300d13758dd9f52b57163c0498f diff --git a/install-udev-rules.sh b/install-udev-rules.sh new file mode 100755 index 0000000..553e6e0 --- /dev/null +++ b/install-udev-rules.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Rangoli Keyboard Mapper - udev Rules Installation Script +# This script installs udev rules to allow non-root access to Rangoli keyboards + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +UDEV_RULES_FILE="$SCRIPT_DIR/udev/99-rangoli-keyboards.rules" +UDEV_RULES_DEST="/etc/udev/rules.d/99-rangoli-keyboards.rules" + +echo "Rangoli Keyboard Mapper - udev Rules Installation" +echo "==================================================" + +# Check if running as root +if [[ $EUID -eq 0 ]]; then + echo "Error: This script should NOT be run as root." + echo "It will automatically ask for sudo permission when needed." + exit 1 +fi + +# Check if udev rules file exists +if [[ ! -f "$UDEV_RULES_FILE" ]]; then + echo "Error: udev rules file not found: $UDEV_RULES_FILE" + exit 1 +fi + +echo "Installing udev rules for Rangoli keyboards..." + +# Copy udev rules file +sudo cp "$UDEV_RULES_FILE" "$UDEV_RULES_DEST" +echo "✓ udev rules copied to $UDEV_RULES_DEST" + +# Set correct permissions +sudo chmod 644 "$UDEV_RULES_DEST" +echo "✓ Permissions set" + +# Reload udev rules +sudo udevadm control --reload-rules +echo "✓ udev rules reloaded" + +# Trigger udev +sudo udevadm trigger +echo "✓ udev trigger executed" + +# Add user to appropriate group for remote access support +# Different distributions use different groups for HID access +HID_GROUP="" +if getent group plugdev > /dev/null 2>&1; then + HID_GROUP="plugdev" +elif getent group input > /dev/null 2>&1; then + HID_GROUP="input" +fi + +if [ -n "$HID_GROUP" ]; then + if ! groups "$USER" | grep -q "$HID_GROUP"; then + echo + echo "Adding user '$USER' to '$HID_GROUP' group for SSH access..." + sudo usermod -aG "$HID_GROUP" "$USER" + echo "✓ User added to $HID_GROUP group" + echo + echo "IMPORTANT: You must log out and log back in (or restart your system)" + echo " for the group membership to take effect." + else + echo "✓ User is already in the $HID_GROUP group" + fi +else + echo "⚠ Warning: No suitable HID group (plugdev/input) found." + echo " SSH access may not work." +fi + +echo +echo "Installation completed!" +echo +echo "Next steps:" +echo "1. Unplug and replug your Rangoli keyboard" +echo "2. Or restart your system" +echo "3. Rangoli should now work without sudo" +echo +echo "If you connect via SSH, make sure you have logged out and back in" +echo "so that the group membership takes effect." \ No newline at end of file diff --git a/keyboards/258a/configs/150.json b/keyboards/258a/configs/150.json new file mode 100644 index 0000000..326f695 --- /dev/null +++ b/keyboards/258a/configs/150.json @@ -0,0 +1,606 @@ +{ + "pid": "150", + "name": "RKM75 2.4G", + "enabled": true, + "keyMapEnabled": true, + "lightEnabled": true, + "rgb": true, + "top": [38, 25], + "bottom": [732, 267], + "keys": [ + { + "bIndex": 0, + "keyCode": "Key_Escape", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 6, + "keyCode": "Key_F1", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 12, + "keyCode": "Key_F2", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 18, + "keyCode": "Key_F3", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 24, + "keyCode": "Key_F4", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 30, + "keyCode": "Key_F5", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 36, + "keyCode": "Key_F6", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 42, + "keyCode": "Key_F7", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 48, + "keyCode": "Key_F8", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 54, + "keyCode": "Key_F9", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 60, + "keyCode": "Key_F10", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 66, + "keyCode": "Key_F11", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 72, + "keyCode": "Key_F12", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 78, + "keyCode": "Key_Delete", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 90, + "keyCode": "Key_Insert", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 96, + "keyCode": "Key_Print_Screen", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 1, + "keyCode": "Key_Back_Quote", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 7, + "keyCode": "Key_1", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 13, + "keyCode": "Key_2", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 19, + "keyCode": "Key_3", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 25, + "keyCode": "Key_4", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 31, + "keyCode": "Key_5", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 37, + "keyCode": "Key_6", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 43, + "keyCode": "Key_7", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 49, + "keyCode": "Key_8", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 55, + "keyCode": "Key_9", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 61, + "keyCode": "Key_0", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 67, + "keyCode": "Key_Hyphen", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 73, + "keyCode": "Key_Equals", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 79, + "keyCode": "Key_Backspace", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 91, + "keyCode": "Key_Num_Lock", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 97, + "keyCode": "Key_Num_Divide", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 103, + "keyCode": "Key_Num_Multiply", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 109, + "keyCode": "Key_Num_Substract", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 108, + "keyCode": "Key_Page_Down", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 102, + "keyCode": "Key_Page_Up", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 2, + "keyCode": "Key_Tab", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 8, + "keyCode": "Key_Q", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 14, + "keyCode": "Key_W", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 20, + "keyCode": "Key_E", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 26, + "keyCode": "Key_R", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 32, + "keyCode": "Key_T", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 38, + "keyCode": "Key_Y", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 44, + "keyCode": "Key_U", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 50, + "keyCode": "Key_I", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 56, + "keyCode": "Key_O", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 62, + "keyCode": "Key_P", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 68, + "keyCode": "Key_Left_Bracket", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 74, + "keyCode": "Key_Right_Bracket", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 80, + "keyCode": "Key_Back_Slash", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 92, + "keyCode": "Key_Num_7", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 98, + "keyCode": "Key_Num_8", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 104, + "keyCode": "Key_Num_9", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 110, + "keyCode": "Key_Num_Add", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 3, + "keyCode": "Key_Caps_Lock", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 9, + "keyCode": "Key_A", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 15, + "keyCode": "Key_S", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 21, + "keyCode": "Key_D", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 27, + "keyCode": "Key_F", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 33, + "keyCode": "Key_G", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 39, + "keyCode": "Key_H", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 45, + "keyCode": "Key_J", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 51, + "keyCode": "Key_K", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 57, + "keyCode": "Key_L", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 63, + "keyCode": "Key_Semi_Colon", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 69, + "keyCode": "Key_Quote", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 93, + "keyCode": "Key_Num_4", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 99, + "keyCode": "Key_Num_5", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 105, + "keyCode": "Key_Num_6", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 4, + "keyCode": "Key_Left_Shift", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 10, + "keyCode": "Key_Z", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 16, + "keyCode": "Key_X", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 22, + "keyCode": "Key_C", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 28, + "keyCode": "Key_V", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 34, + "keyCode": "Key_B", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 40, + "keyCode": "Key_N", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 46, + "keyCode": "Key_M", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 52, + "keyCode": "Key_Comma", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 58, + "keyCode": "Key_Dot", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 64, + "keyCode": "Key_Slash", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 82, + "keyCode": "Key_Right_Shift", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 88, + "keyCode": "Key_Up", + "top": [57, 72], + "bottom": [79, 94] + }, + { + "bIndex": 94, + "keyCode": "Key_Num_1", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 100, + "keyCode": "Key_Num_2", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 106, + "keyCode": "Key_Num_3", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 5, + "keyCode": "Key_Left_Control", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 11, + "keyCode": "Key_Left_Super", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 17, + "keyCode": "Key_Left_Alt", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 35, + "keyCode": "Key_Space", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 53, + "keyCode": "Key_Right_Alt", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 59, + "keyCode": "Key_Fn", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 65, + "keyCode": "Key_Right_Control", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 83, + "keyCode": "Key_Left", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 89, + "keyCode": "Key_Down", + "top": [57, 72], + "bottom": [79, 94] + }, + { + "bIndex": 95, + "keyCode": "Key_Right", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 101, + "keyCode": "Key_Num_0", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 107, + "keyCode": "Key_Num_Decimal_Point", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 81, + "keyCode": "Key_Enter", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 112, + "keyCode": "Key_Num_Enter", + "top": [213, 72], + "bottom": [235, 94] + } + ] +} diff --git a/keyboards/258a/configs/171.json b/keyboards/258a/configs/171.json new file mode 100644 index 0000000..8b1560a --- /dev/null +++ b/keyboards/258a/configs/171.json @@ -0,0 +1,90 @@ +{ + "pid":"171", + "name":"RK-H81RGB", + "rgb":true, + "top":[37, 49], + "bottom":[808, 345], + "keys":[ + { "bIndex":0, "keyCode":"Key_Escape", "top":[37, 49], "bottom":[69, 85] }, + { "bIndex":6, "keyCode":"Key_F1", "top":[96, 49], "bottom":[128, 85] }, + { "bIndex":12, "keyCode":"Key_F2", "top":[145, 49], "bottom":[177, 85] }, + { "bIndex":18, "keyCode":"Key_F3", "top":[194, 49], "bottom":[226, 85] }, + { "bIndex":24, "keyCode":"Key_F4", "top":[241, 49], "bottom":[273, 85] }, + { "bIndex":30, "keyCode":"Key_F5", "top":[301, 49], "bottom":[333, 85] }, + { "bIndex":36, "keyCode":"Key_F6", "top":[349, 49], "bottom":[381, 85] }, + { "bIndex":42, "keyCode":"Key_F7", "top":[396, 49], "bottom":[428, 85] }, + { "bIndex":48, "keyCode":"Key_F8", "top":[444, 49], "bottom":[476, 85] }, + { "bIndex":54, "keyCode":"Key_F9", "top":[504, 49], "bottom":[536, 85] }, + { "bIndex":60, "keyCode":"Key_F10", "top":[552, 49], "bottom":[584, 85] }, + { "bIndex":66, "keyCode":"Key_F11", "top":[601, 49], "bottom":[633, 85] }, + { "bIndex":72, "keyCode":"Key_F12", "top":[650, 49], "bottom":[682, 85] }, + { "bIndex":84, "keyCode":"Key_Delete", "top":[707, 49], "bottom":[739, 85] }, + { "bIndex":1, "keyCode":"Key_Back_Quote", "top":[37, 109], "bottom":[69, 145] }, + { "bIndex":7, "keyCode":"Key_1", "top":[86, 109], "bottom":[118, 145] }, + { "bIndex":13, "keyCode":"Key_2", "top":[133, 110], "bottom":[165, 146] }, + { "bIndex":19, "keyCode":"Key_3", "top":[180, 110], "bottom":[212, 146] }, + { "bIndex":25, "keyCode":"Key_4", "top":[229, 110], "bottom":[261, 146] }, + { "bIndex":31, "keyCode":"Key_5", "top":[277, 110], "bottom":[309, 146] }, + { "bIndex":37, "keyCode":"Key_6", "top":[325, 111], "bottom":[357, 147] }, + { "bIndex":43, "keyCode":"Key_7", "top":[373, 111], "bottom":[405, 147] }, + { "bIndex":49, "keyCode":"Key_8", "top":[421, 111], "bottom":[453, 147] }, + { "bIndex":55, "keyCode":"Key_9", "top":[469, 110], "bottom":[501, 146] }, + { "bIndex":61, "keyCode":"Key_0", "top":[516, 110], "bottom":[548, 146] }, + { "bIndex":67, "keyCode":"Key_Hyphen", "top":[564, 110], "bottom":[596, 146] }, + { "bIndex":73, "keyCode":"Key_Equals", "top":[612, 110], "bottom":[644, 146] }, + { "bIndex":79, "keyCode":"Key_Backspace", "top":[662, 109], "bottom":[740, 145] }, + { "bIndex":91, "keyCode":"Key_Home", "top":[776, 109], "bottom":[808, 145] }, + { "bIndex":2, "keyCode":"Key_Tab", "top":[39, 157], "bottom":[93, 193] }, + { "bIndex":8, "keyCode":"Key_Q", "top":[110, 157], "bottom":[142, 193] }, + { "bIndex":14, "keyCode":"Key_W", "top":[157, 157], "bottom":[189, 193] }, + { "bIndex":20, "keyCode":"Key_E", "top":[205, 157], "bottom":[237, 193] }, + { "bIndex":26, "keyCode":"Key_R", "top":[253, 157], "bottom":[285, 193] }, + { "bIndex":32, "keyCode":"Key_T", "top":[300, 157], "bottom":[332, 193] }, + { "bIndex":38, "keyCode":"Key_Y", "top":[348, 157], "bottom":[380, 193] }, + { "bIndex":44, "keyCode":"Key_U", "top":[396, 157], "bottom":[428, 193] }, + { "bIndex":50, "keyCode":"Key_I", "top":[445, 157], "bottom":[477, 193] }, + { "bIndex":56, "keyCode":"Key_O", "top":[492, 157], "bottom":[524, 193] }, + { "bIndex":62, "keyCode":"Key_P", "top":[540, 157], "bottom":[572, 193] }, + { "bIndex":68, "keyCode":"Key_Left_Bracket", "top":[588, 157], "bottom":[620, 193] }, + { "bIndex":74, "keyCode":"Key_Right_Bracket", "top":[637, 157], "bottom":[669, 193] }, + { "bIndex":80, "keyCode":"Key_Back_Slash", "top":[684, 157], "bottom":[740, 193] }, + { "bIndex":92, "keyCode":"Key_Page_Up", "top":[776, 157], "bottom":[808, 193] }, + { "bIndex":3, "keyCode":"Key_Caps_Lock", "top":[39, 205], "bottom":[105, 241] }, + { "bIndex":9, "keyCode":"Key_A", "top":[121, 204], "bottom":[153, 240] }, + { "bIndex":15, "keyCode":"Key_S", "top":[169, 204], "bottom":[201, 240] }, + { "bIndex":21, "keyCode":"Key_D", "top":[216, 204], "bottom":[248, 240] }, + { "bIndex":27, "keyCode":"Key_F", "top":[265, 204], "bottom":[297, 240] }, + { "bIndex":33, "keyCode":"Key_G", "top":[313, 205], "bottom":[345, 241] }, + { "bIndex":39, "keyCode":"Key_H", "top":[361, 205], "bottom":[393, 241] }, + { "bIndex":45, "keyCode":"Key_J", "top":[409, 205], "bottom":[441, 241] }, + { "bIndex":51, "keyCode":"Key_K", "top":[456, 205], "bottom":[488, 241] }, + { "bIndex":57, "keyCode":"Key_L", "top":[505, 205], "bottom":[537, 241] }, + { "bIndex":63, "keyCode":"Key_Semi_Colon", "top":[552, 205], "bottom":[584, 241] }, + { "bIndex":69, "keyCode":"Key_Quote", "top":[600, 205], "bottom":[632, 241] }, + { "bIndex":4, "keyCode":"Key_Left_Shift", "top":[39, 252], "bottom":[129, 288] }, + { "bIndex":10, "keyCode":"Key_Z", "top":[145, 252], "bottom":[177, 288] }, + { "bIndex":16, "keyCode":"Key_X", "top":[193, 252], "bottom":[225, 288] }, + { "bIndex":22, "keyCode":"Key_C", "top":[241, 252], "bottom":[273, 288] }, + { "bIndex":28, "keyCode":"Key_V", "top":[288, 252], "bottom":[320, 288] }, + { "bIndex":34, "keyCode":"Key_B", "top":[337, 252], "bottom":[369, 288] }, + { "bIndex":40, "keyCode":"Key_N", "top":[385, 253], "bottom":[417, 289] }, + { "bIndex":46, "keyCode":"Key_M", "top":[433, 253], "bottom":[465, 289] }, + { "bIndex":52, "keyCode":"Key_Comma", "top":[481, 253], "bottom":[513, 289] }, + { "bIndex":58, "keyCode":"Key_Dot", "top":[528, 253], "bottom":[560, 289] }, + { "bIndex":64, "keyCode":"Key_Slash", "top":[576, 253], "bottom":[608, 289] }, + { "bIndex":82, "keyCode":"Key_Right_Shift", "top":[625, 253], "bottom":[693, 289] }, + { "bIndex":88, "keyCode":"Key_Up", "top":[718, 262], "bottom":[750, 298] }, + { "bIndex":5, "keyCode":"Key_Left_Control", "top":[39, 300], "bottom":[81, 336] }, + { "bIndex":11, "keyCode":"Key_Left_Super", "top":[99, 300], "bottom":[141, 336] }, + { "bIndex":17, "keyCode":"Key_Left_Alt", "top":[157, 300], "bottom":[201, 336] }, + { "bIndex":35, "keyCode":"Key_Space", "top":[216, 300], "bottom":[502, 336] }, + { "bIndex":59, "keyCode":"Key_Right_Alt", "top":[516, 300], "bottom":[548, 336] }, + { "bIndex":65, "keyCode":"Key_Fn", "top":[564, 300], "bottom":[596, 336] }, + { "bIndex":77, "keyCode":"Key_Right_Control", "top":[612, 300], "bottom":[644, 336] }, + { "bIndex":83, "keyCode":"Key_Left", "top":[670, 309], "bottom":[702, 345] }, + { "bIndex":89, "keyCode":"Key_Down", "top":[718, 309], "bottom":[750, 345] }, + { "bIndex":93, "keyCode":"Key_Page_Down", "top":[776, 205], "bottom":[808, 241] }, + { "bIndex":95, "keyCode":"Key_Right", "top":[766, 309], "bottom":[798, 345] }, + { "bIndex":81, "keyCode":"Key_Enter", "top":[648, 205], "bottom":[742, 241] } + ] +} diff --git a/keyboards/258a/configs/1ac.json b/keyboards/258a/configs/1ac.json new file mode 100644 index 0000000..ccd2fc6 --- /dev/null +++ b/keyboards/258a/configs/1ac.json @@ -0,0 +1,606 @@ +{ + "pid": "1ac", + "name": "RKM75 Wired", + "enabled": true, + "keyMapEnabled": true, + "lightEnabled": true, + "rgb": true, + "top": [38, 25], + "bottom": [732, 267], + "keys": [ + { + "bIndex": 0, + "keyCode": "Key_Escape", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 6, + "keyCode": "Key_F1", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 12, + "keyCode": "Key_F2", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 18, + "keyCode": "Key_F3", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 24, + "keyCode": "Key_F4", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 30, + "keyCode": "Key_F5", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 36, + "keyCode": "Key_F6", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 42, + "keyCode": "Key_F7", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 48, + "keyCode": "Key_F8", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 54, + "keyCode": "Key_F9", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 60, + "keyCode": "Key_F10", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 66, + "keyCode": "Key_F11", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 72, + "keyCode": "Key_F12", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 78, + "keyCode": "Key_Delete", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 90, + "keyCode": "Key_Insert", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 96, + "keyCode": "Key_Print_Screen", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 1, + "keyCode": "Key_Back_Quote", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 7, + "keyCode": "Key_1", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 13, + "keyCode": "Key_2", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 19, + "keyCode": "Key_3", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 25, + "keyCode": "Key_4", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 31, + "keyCode": "Key_5", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 37, + "keyCode": "Key_6", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 43, + "keyCode": "Key_7", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 49, + "keyCode": "Key_8", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 55, + "keyCode": "Key_9", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 61, + "keyCode": "Key_0", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 67, + "keyCode": "Key_Hyphen", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 73, + "keyCode": "Key_Equals", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 79, + "keyCode": "Key_Backspace", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 91, + "keyCode": "Key_Num_Lock", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 97, + "keyCode": "Key_Num_Divide", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 103, + "keyCode": "Key_Num_Multiply", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 109, + "keyCode": "Key_Num_Substract", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 108, + "keyCode": "Key_Page_Down", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 102, + "keyCode": "Key_Page_Up", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 2, + "keyCode": "Key_Tab", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 8, + "keyCode": "Key_Q", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 14, + "keyCode": "Key_W", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 20, + "keyCode": "Key_E", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 26, + "keyCode": "Key_R", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 32, + "keyCode": "Key_T", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 38, + "keyCode": "Key_Y", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 44, + "keyCode": "Key_U", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 50, + "keyCode": "Key_I", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 56, + "keyCode": "Key_O", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 62, + "keyCode": "Key_P", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 68, + "keyCode": "Key_Left_Bracket", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 74, + "keyCode": "Key_Right_Bracket", + "top": [553, 23], + "bottom": [575, 45] + }, + { + "bIndex": 80, + "keyCode": "Key_Back_Slash", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 92, + "keyCode": "Key_Num_7", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 98, + "keyCode": "Key_Num_8", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 104, + "keyCode": "Key_Num_9", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 110, + "keyCode": "Key_Num_Add", + "top": [213, 72], + "bottom": [235, 94] + }, + { + "bIndex": 3, + "keyCode": "Key_Caps_Lock", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 9, + "keyCode": "Key_A", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 15, + "keyCode": "Key_S", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 21, + "keyCode": "Key_D", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 27, + "keyCode": "Key_F", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 33, + "keyCode": "Key_G", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 39, + "keyCode": "Key_H", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 45, + "keyCode": "Key_J", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 51, + "keyCode": "Key_K", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 57, + "keyCode": "Key_L", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 63, + "keyCode": "Key_Semi_Colon", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 69, + "keyCode": "Key_Quote", + "top": [514, 23], + "bottom": [536, 45] + }, + { + "bIndex": 93, + "keyCode": "Key_Num_4", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 99, + "keyCode": "Key_Num_5", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 105, + "keyCode": "Key_Num_6", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 4, + "keyCode": "Key_Left_Shift", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 10, + "keyCode": "Key_Z", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 16, + "keyCode": "Key_X", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 22, + "keyCode": "Key_C", + "top": [184, 23], + "bottom": [206, 45] + }, + { + "bIndex": 28, + "keyCode": "Key_V", + "top": [223, 23], + "bottom": [245, 45] + }, + { + "bIndex": 34, + "keyCode": "Key_B", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 40, + "keyCode": "Key_N", + "top": [310, 23], + "bottom": [332, 45] + }, + { + "bIndex": 46, + "keyCode": "Key_M", + "top": [349, 23], + "bottom": [371, 45] + }, + { + "bIndex": 52, + "keyCode": "Key_Comma", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 58, + "keyCode": "Key_Dot", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 64, + "keyCode": "Key_Slash", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 82, + "keyCode": "Key_Right_Shift", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 88, + "keyCode": "Key_Up", + "top": [57, 72], + "bottom": [79, 94] + }, + { + "bIndex": 94, + "keyCode": "Key_Num_1", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 100, + "keyCode": "Key_Num_2", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 106, + "keyCode": "Key_Num_3", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 5, + "keyCode": "Key_Left_Control", + "top": [58, 23], + "bottom": [80, 45] + }, + { + "bIndex": 11, + "keyCode": "Key_Left_Super", + "top": [106, 23], + "bottom": [128, 45] + }, + { + "bIndex": 17, + "keyCode": "Key_Left_Alt", + "top": [145, 23], + "bottom": [167, 45] + }, + { + "bIndex": 35, + "keyCode": "Key_Space", + "top": [271, 23], + "bottom": [293, 45] + }, + { + "bIndex": 53, + "keyCode": "Key_Right_Alt", + "top": [389, 23], + "bottom": [411, 45] + }, + { + "bIndex": 59, + "keyCode": "Key_Fn", + "top": [437, 23], + "bottom": [459, 45] + }, + { + "bIndex": 65, + "keyCode": "Key_Right_Control", + "top": [476, 23], + "bottom": [498, 45] + }, + { + "bIndex": 83, + "keyCode": "Key_Left", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 89, + "keyCode": "Key_Down", + "top": [57, 72], + "bottom": [79, 94] + }, + { + "bIndex": 95, + "keyCode": "Key_Right", + "top": [97, 72], + "bottom": [119, 94] + }, + { + "bIndex": 101, + "keyCode": "Key_Num_0", + "top": [135, 72], + "bottom": [157, 94] + }, + { + "bIndex": 107, + "keyCode": "Key_Num_Decimal_Point", + "top": [174, 72], + "bottom": [196, 94] + }, + { + "bIndex": 81, + "keyCode": "Key_Enter", + "top": [601, 23], + "bottom": [623, 45] + }, + { + "bIndex": 112, + "keyCode": "Key_Num_Enter", + "top": [213, 72], + "bottom": [235, 94] + } + ] +} diff --git a/keyboards/258a/configs/224.json b/keyboards/258a/configs/224.json new file mode 100644 index 0000000..684f649 --- /dev/null +++ b/keyboards/258a/configs/224.json @@ -0,0 +1,115 @@ +{ + "pid":"224", + "name":"S98-BLau-DE96_QWERTZ", + "enabled":true, + "keyMapEnabled":true, + "lightEnabled":true, + "rgb":true, + "top":[33, 33], + "bottom":[1739, 576], + "keys":[ + { "bIndex":0, "keyCode":"Key_Escape", "top":[38, 38], "bottom":[117, 117] }, + { "bIndex":6, "keyCode":"Key_F1", "top":[388, 38], "bottom":[280, 117] }, + { "bIndex":12, "keyCode":"Key_F2", "top":[290, 38], "bottom":[364, 117] }, + { "bIndex":18, "keyCode":"Key_F3", "top":[370, 38], "bottom":[450, 117] }, + { "bIndex":24, "keyCode":"Key_F4", "top":[454, 38], "bottom":[530, 117] }, + { "bIndex":30, "keyCode":"Key_F5", "top":[578, 38], "bottom":[654, 117] }, + { "bIndex":36, "keyCode":"Key_F6", "top":[660, 38], "bottom":[738, 117] }, + { "bIndex":42, "keyCode":"Key_F7", "top":[744, 38], "bottom":[820, 117] }, + { "bIndex":48, "keyCode":"Key_F8", "top":[828, 38], "bottom":[904, 117] }, + { "bIndex":54, "keyCode":"Key_F9", "top":[950, 38], "bottom":[1028, 117] }, + { "bIndex":60, "keyCode":"Key_F10", "top":[1034, 38], "bottom":[1111, 117] }, + { "bIndex":66, "keyCode":"Key_F11", "top":[1118, 38], "bottom":[1193, 117] }, + { "bIndex":72, "keyCode":"Key_F12", "top":[1199, 38], "bottom":[1276, 117] }, + { "bIndex":78, "keyCode":"Key_Delete", "top":[1306, 38], "bottom":[1382, 117] }, + + { "bIndex":1, "keyCode":"Key_Back_Quote", "top":[38, 142], "bottom":[116, 121] }, + { "bIndex":7, "keyCode":"Key_1", "top":[121, 142], "bottom":[200, 121] }, + { "bIndex":13, "keyCode":"Key_2", "top":[388, 142], "bottom":[280, 121] }, + { "bIndex":19, "keyCode":"Key_3", "top":[288, 142], "bottom":[364, 121] }, + { "bIndex":25, "keyCode":"Key_4", "top":[370, 142], "bottom":[466, 121] }, + { "bIndex":31, "keyCode":"Key_5", "top":[452, 142], "bottom":[528, 121] }, + { "bIndex":37, "keyCode":"Key_6", "top":[534, 142], "bottom":[610, 121] }, + { "bIndex":43, "keyCode":"Key_7", "top":[616, 142], "bottom":[696, 121] }, + { "bIndex":49, "keyCode":"Key_8", "top":[702, 142], "bottom":[780, 121] }, + { "bIndex":55, "keyCode":"Key_9", "top":[786, 142], "bottom":[862, 121] }, + { "bIndex":61, "keyCode":"Key_0", "top":[868, 142], "bottom":[944, 121] }, + { "bIndex":67, "keyCode":"Key_Hyphen", "top":[952, 142], "bottom":[1028, 121] }, + { "bIndex":73, "keyCode":"Key_Equals", "top":[1034, 142], "bottom":[1111, 121] }, + { "bIndex":79, "keyCode":"Key_Backspace", "top":[1118, 142], "bottom":[1276, 121] }, + { "bIndex":91, "keyCode":"Key_Home", "top":[1306, 142], "bottom":[1382, 121] }, + { "bIndex":103, "keyCode":"Key_Num_Lock", "top":[1410, 142], "bottom":[1486, 121] }, + { "bIndex":109, "keyCode":"Key_Num_Divide", "top":[1492, 142], "bottom":[1570, 121] }, + { "bIndex":115, "keyCode":"Key_Num_Multiply", "top":[1576, 142], "bottom":[1652, 121] }, + { "bIndex":121, "keyCode":"Key_Num_Substract", "top":[1658, 142], "bottom":[1734, 121] }, + + { "bIndex":2, "keyCode":"Key_Tab", "top":[38, 228], "bottom":[158, 302] }, + { "bIndex":8, "keyCode":"Key_Q", "top":[164, 228], "bottom":[240, 302] }, + { "bIndex":14, "keyCode":"Key_W", "top":[246, 228], "bottom":[320, 302] }, + { "bIndex":20, "keyCode":"Key_E", "top":[326, 228], "bottom":[404, 302] }, + { "bIndex":26, "keyCode":"Key_R", "top":[410, 228], "bottom":[486, 302] }, + { "bIndex":32, "keyCode":"Key_T", "top":[496, 228], "bottom":[572, 302] }, + { "bIndex":38, "keyCode":"Key_Y", "top":[578, 228], "bottom":[654, 302] }, + { "bIndex":44, "keyCode":"Key_U", "top":[660, 228], "bottom":[738, 302] }, + { "bIndex":50, "keyCode":"Key_I", "top":[744, 228], "bottom":[820, 302] }, + { "bIndex":56, "keyCode":"Key_O", "top":[826, 228], "bottom":[902, 302] }, + { "bIndex":62, "keyCode":"Key_P", "top":[910, 228], "bottom":[986, 302] }, + { "bIndex":68, "keyCode":"Key_Left_Bracket", "top":[992, 228], "bottom":[1068, 302] }, + { "bIndex":74, "keyCode":"Key_Right_Bracket", "top":[1074, 228], "bottom":[1150, 302] }, + { "bIndex":81, "keyCode":"Key_Enter", "top":[1156, 228], "bottom":[1276, 388] }, + { "bIndex":97, "keyCode":"Key_Page_Up", "top":[1306, 228], "bottom":[1382, 302] }, + { "bIndex":104, "keyCode":"Key_Num_7", "top":[1410, 228], "bottom":[1486, 302] }, + { "bIndex":110, "keyCode":"Key_Num_8", "top":[1492, 228], "bottom":[1570, 302] }, + { "bIndex":116, "keyCode":"Key_Num_9", "top":[1576, 228], "bottom":[1652, 302] }, + { "bIndex":122, "keyCode":"Key_Num_Add", "top":[1658, 228], "bottom":[1734, 388] }, + + { "bIndex":3, "keyCode":"Key_Caps_Lock", "top":[38, 310], "bottom":[178, 388] }, + { "bIndex":9, "keyCode":"Key_A", "top":[184, 310], "bottom":[260, 388] }, + { "bIndex":15, "keyCode":"Key_S", "top":[266, 310], "bottom":[342, 388] }, + { "bIndex":21, "keyCode":"Key_D", "top":[348, 310], "bottom":[424, 388] }, + { "bIndex":27, "keyCode":"Key_F", "top":[432, 310], "bottom":[510, 388] }, + { "bIndex":33, "keyCode":"Key_G", "top":[516, 310], "bottom":[592, 388] }, + { "bIndex":39, "keyCode":"Key_H", "top":[598, 310], "bottom":[674, 388] }, + { "bIndex":45, "keyCode":"Key_J", "top":[680, 310], "bottom":[758, 388] }, + { "bIndex":51, "keyCode":"Key_K", "top":[764, 310], "bottom":[840, 388] }, + { "bIndex":57, "keyCode":"Key_L", "top":[848, 310], "bottom":[916, 388] }, + { "bIndex":63, "keyCode":"Key_Semi_Colon", "top":[930, 310], "bottom":[1006, 388] }, + { "bIndex":69, "keyCode":"Key_Quote", "top":[1012, 310], "bottom":[1088, 388] }, + { "bIndex":80, "keyCode":"Key_Back_Slash", "top":[1095, 310], "bottom":[1170, 388] }, + { "bIndex":98, "keyCode":"Key_Page_Down", "top":[1306, 310], "bottom":[1382, 388] }, + { "bIndex":105, "keyCode":"Key_Num_4", "top":[1410, 310], "bottom":[1486, 388] }, + { "bIndex":111, "keyCode":"Key_Num_5", "top":[1492, 310], "bottom":[1570, 388] }, + { "bIndex":117, "keyCode":"Key_Num_6", "top":[1576, 310], "bottom":[1652, 388] }, + + { "bIndex":4, "keyCode":"Key_Left_Shift", "top":[38, 395], "bottom":[135, 470] }, + { "bIndex":10, "keyCode":"Key_Z", "top":[226, 395], "bottom":[302, 470] }, + { "bIndex":16, "keyCode":"Key_X", "top":[310, 395], "bottom":[386, 470] }, + { "bIndex":22, "keyCode":"Key_C", "top":[392, 395], "bottom":[468, 470] }, + { "bIndex":28, "keyCode":"Key_V", "top":[474, 395], "bottom":[550, 470] }, + { "bIndex":34, "keyCode":"Key_B", "top":[556, 395], "bottom":[632, 470] }, + { "bIndex":40, "keyCode":"Key_N", "top":[638, 395], "bottom":[714, 470] }, + { "bIndex":46, "keyCode":"Key_M", "top":[724, 395], "bottom":[800, 470] }, + { "bIndex":52, "keyCode":"Key_Comma", "top":[806, 395], "bottom":[882, 470] }, + { "bIndex":58, "keyCode":"Key_Dot", "top":[888, 395], "bottom":[964, 470] }, + { "bIndex":64, "keyCode":"Key_Slash", "top":[970, 395], "bottom":[1046, 470] }, + { "bIndex":82, "keyCode":"Key_Right_Shift", "top":[1052, 395], "bottom":[1194, 470] }, + { "bIndex":94, "keyCode":"Key_Up", "top":[1222, 414], "bottom":[1300, 490] }, + { "bIndex":106, "keyCode":"Key_Num_1", "top":[1410, 395], "bottom":[1486, 470] }, + { "bIndex":112, "keyCode":"Key_Num_2", "top":[1492, 395], "bottom":[1570, 470] }, + { "bIndex":118, "keyCode":"Key_Num_3", "top":[1576, 395], "bottom":[1652, 470] }, + + { "bIndex":5, "keyCode":"Key_Left_Control", "top":[38, 476], "bottom":[136, 552] }, + { "bIndex":11, "keyCode":"Key_Left_Super", "top":[144, 476], "bottom":[240, 552] }, + { "bIndex":17, "keyCode":"Key_Left_Alt", "top":[246, 476], "bottom":[344, 552] }, + { "bIndex":35, "keyCode":"Key_Space", "top":[350, 476], "bottom":[863, 552] }, + { "bIndex":53, "keyCode":"Key_Right_Alt", "top":[869, 476], "bottom":[945, 552] }, + { "bIndex":59, "keyCode":"Key_Fn", "top":[950, 476], "bottom":[1030, 552] }, + { "bIndex":83, "keyCode":"Key_Right_Control", "top":[1032, 476], "bottom":[1110, 552] }, + { "bIndex":89, "keyCode":"Key_Left", "top":[1140, 498], "bottom":[1217, 575] }, + { "bIndex":95, "keyCode":"Key_Down", "top":[1222, 498], "bottom":[1300, 575] }, + { "bIndex":101, "keyCode":"Key_Right", "top":[1302, 498], "bottom":[1380, 575] }, + { "bIndex":107, "keyCode":"Key_Num_0", "top":[1410, 476], "bottom":[1570, 552] }, + { "bIndex":119, "keyCode":"Key_Num_Decimal_Point", "top":[1576, 476], "bottom":[1652, 552] }, + { "bIndex":124, "keyCode":"Key_Num_Enter", "top":[1658, 395], "bottom":[1734, 552] } + ] +} \ No newline at end of file diff --git a/keyboards/258a/configs/d7.json b/keyboards/258a/configs/d7.json new file mode 100644 index 0000000..2bc0be9 --- /dev/null +++ b/keyboards/258a/configs/d7.json @@ -0,0 +1,90 @@ +{ + "pid":"d7", + "name":"RK70S", + "enabled":true, + "keyMapEnabled":true, + "lightEnabled":true, + "rgb":true, + "top":[12, 43], + "bottom":[709, 247], + "keys":[ + { "bIndex":1, "keyCode":"Key_Escape", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":2, "keyCode":"Key_Tab", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":3, "keyCode":"Multimedia_Play_Pause", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":4, "keyCode":"Multimedia_Volume_Up", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":5, "keyCode":"Multimedia_Volume_Down", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":7, "keyCode":"Key_Back_Quote", "top":[12, 44], "bottom":[39, 75] }, + { "bIndex":8, "keyCode":"Key_Tab", "top":[13, 87], "bottom":[60, 118] }, + { "bIndex":9, "keyCode":"Key_Caps_Lock", "top":[13, 130], "bottom":[70, 161] }, + { "bIndex":10, "keyCode":"Key_Left_Shift", "top":[13, 172], "bottom":[91, 203] }, + { "bIndex":11, "keyCode":"Key_Left_Control", "top":[13, 215], "bottom":[49, 246] }, + { "bIndex":13, "keyCode":"Key_1", "top":[54, 44], "bottom":[81, 75] }, + { "bIndex":99, "keyCode":"Key_Insert", "top":[638, 45], "bottom":[665, 76] }, + { "bIndex":93, "keyCode":"Key_Pause", "top":[638, 130], "bottom":[665, 161] }, + { "bIndex":98, "keyCode":"Key_Delete", "top":[638, 87], "bottom":[665, 118] }, + { "bIndex":19, "keyCode":"Key_2", "top":[96, 44], "bottom":[123, 75] }, + { "bIndex":25, "keyCode":"Key_3", "top":[138, 44], "bottom":[165, 75] }, + { "bIndex":31, "keyCode":"Key_4", "top":[179, 44], "bottom":[206, 75] }, + { "bIndex":37, "keyCode":"Key_5", "top":[221, 44], "bottom":[248, 75] }, + { "bIndex":43, "keyCode":"Key_6", "top":[262, 44], "bottom":[289, 75] }, + { "bIndex":55, "keyCode":"Key_7", "top":[305, 44], "bottom":[332, 75] }, + { "bIndex":61, "keyCode":"Key_8", "top":[346, 44], "bottom":[373, 75] }, + { "bIndex":67, "keyCode":"Key_9", "top":[388, 44], "bottom":[415, 75] }, + { "bIndex":73, "keyCode":"Key_0", "top":[430, 44], "bottom":[457, 75] }, + { "bIndex":79, "keyCode":"Key_Hyphen", "top":[471, 44], "bottom":[498, 75] }, + { "bIndex":85, "keyCode":"Key_Equals", "top":[513, 44], "bottom":[540, 75] }, + { "bIndex":91, "keyCode":"Key_Backspace", "top":[556, 43], "bottom":[622, 74] }, + { "bIndex":106, "keyCode":"Key_End", "top":[679, 87], "bottom":[706, 118] }, + { "bIndex":108, "keyCode":"Key_Home", "top":[680, 44], "bottom":[707, 75] }, + { "bIndex":14, "keyCode":"Key_Q", "top":[75, 87], "bottom":[102, 118] }, + { "bIndex":20, "keyCode":"Key_W", "top":[117, 87], "bottom":[144, 118] }, + { "bIndex":26, "keyCode":"Key_E", "top":[158, 87], "bottom":[185, 118] }, + { "bIndex":32, "keyCode":"Key_R", "top":[200, 87], "bottom":[227, 118] }, + { "bIndex":38, "keyCode":"Key_T", "top":[242, 87], "bottom":[269, 118] }, + { "bIndex":50, "keyCode":"Key_Y", "top":[284, 87], "bottom":[311, 118] }, + { "bIndex":56, "keyCode":"Key_U", "top":[325, 87], "bottom":[352, 118] }, + { "bIndex":62, "keyCode":"Key_I", "top":[367, 87], "bottom":[394, 118] }, + { "bIndex":68, "keyCode":"Key_O", "top":[409, 87], "bottom":[436, 118] }, + { "bIndex":74, "keyCode":"Key_P", "top":[450, 87], "bottom":[477, 118] }, + { "bIndex":80, "keyCode":"Key_Left_Bracket", "top":[492, 87], "bottom":[519, 118] }, + { "bIndex":86, "keyCode":"Key_Right_Bracket", "top":[534, 87], "bottom":[561, 118] }, + { "bIndex":92, "keyCode":"Key_Back_Slash", "top":[576, 87], "bottom":[622, 118] }, + { "bIndex":100, "keyCode":"Key_Page_Down", "top":[680, 173], "bottom":[707, 204] }, + { "bIndex":99, "keyCode":"Key_Page_Up", "top":[680, 130], "bottom":[707, 161] }, + { "bIndex":15, "keyCode":"Key_A", "top":[86, 130], "bottom":[113, 161] }, + { "bIndex":21, "keyCode":"Key_S", "top":[127, 130], "bottom":[154, 161] }, + { "bIndex":27, "keyCode":"Key_D", "top":[169, 130], "bottom":[196, 161] }, + { "bIndex":33, "keyCode":"Key_F", "top":[211, 130], "bottom":[238, 161] }, + { "bIndex":39, "keyCode":"Key_G", "top":[253, 130], "bottom":[280, 161] }, + { "bIndex":51, "keyCode":"Key_H", "top":[294, 130], "bottom":[321, 161] }, + { "bIndex":57, "keyCode":"Key_J", "top":[336, 130], "bottom":[363, 161] }, + { "bIndex":63, "keyCode":"Key_K", "top":[378, 130], "bottom":[405, 161] }, + { "bIndex":69, "keyCode":"Key_L", "top":[419, 130], "bottom":[446, 161] }, + { "bIndex":75, "keyCode":"Key_Semi_Colon", "top":[461, 130], "bottom":[488, 161] }, + { "bIndex":81, "keyCode":"Key_Quote", "top":[502, 130], "bottom":[529, 161] }, + { "bIndex":88, "keyCode":"Key_Right_Shift", "top":[524, 172], "bottom":[622, 203] }, + { "bIndex":16, "keyCode":"Key_Z", "top":[107, 172], "bottom":[134, 203] }, + { "bIndex":22, "keyCode":"Key_X", "top":[148, 172], "bottom":[175, 203] }, + { "bIndex":28, "keyCode":"Key_C", "top":[190, 172], "bottom":[217, 203] }, + { "bIndex":34, "keyCode":"Key_V", "top":[232, 172], "bottom":[259, 203] }, + { "bIndex":40, "keyCode":"Key_B", "top":[273, 172], "bottom":[300, 203] }, + { "bIndex":52, "keyCode":"Key_N", "top":[315, 172], "bottom":[342, 203] }, + { "bIndex":58, "keyCode":"Key_M", "top":[357, 172], "bottom":[384, 203] }, + { "bIndex":64, "keyCode":"Key_Comma", "top":[398, 172], "bottom":[425, 203] }, + { "bIndex":70, "keyCode":"Key_Dot", "top":[440, 172], "bottom":[467, 203] }, + { "bIndex":76, "keyCode":"Key_Slash", "top":[482, 172], "bottom":[509, 203] }, + { "bIndex":94, "keyCode":"Key_Up", "top":[638, 172], "bottom":[665, 203] }, + { "bIndex":17, "keyCode":"Key_Left_Super", "top":[66, 215], "bottom":[102, 246] }, + { "bIndex":23, "keyCode":"Key_Left_Alt", "top":[118, 215], "bottom":[153, 246] }, + { "bIndex":35, "keyCode":"Key_Space", "top":[170, 215], "bottom":[414, 246] }, + { "bIndex":53, "keyCode":"Key_Space", "top":[433, 215], "bottom":[465, 246] }, + { "bIndex":65, "keyCode":"Key_Right_Alt", "top":[433, 215], "bottom":[465, 246] }, + { "bIndex":71, "keyCode":"Key_Fn", "top":[486, 215], "bottom":[518, 246] }, + { "bIndex":77, "keyCode":"Key_Right_Control", "top":[539, 216], "bottom":[571, 247] }, + { "bIndex":89, "keyCode":"Key_Left", "top":[597, 216], "bottom":[624, 247] }, + { "bIndex":95, "keyCode":"Key_Down", "top":[638, 216], "bottom":[665, 247] }, + { "bIndex":97, "keyCode":"Key_Home", "top":[38, 85], "bottom":[61, 111] }, + { "bIndex":101, "keyCode":"Key_Right", "top":[679, 216], "bottom":[706, 247] }, + { "bIndex":93, "keyCode":"Key_Enter", "top":[545, 129], "bottom":[622, 160] } + ] +} diff --git a/keyboards/258a/images/150.png b/keyboards/258a/images/150.png new file mode 100644 index 0000000..ff6863b Binary files /dev/null and b/keyboards/258a/images/150.png differ diff --git a/keyboards/258a/images/1ac.png b/keyboards/258a/images/1ac.png new file mode 100644 index 0000000..ff6863b Binary files /dev/null and b/keyboards/258a/images/1ac.png differ diff --git a/keyboards/258a/images/224.png b/keyboards/258a/images/224.png new file mode 100644 index 0000000..481be92 Binary files /dev/null and b/keyboards/258a/images/224.png differ diff --git a/keyboards/258a/images/d7.png b/keyboards/258a/images/d7.png new file mode 100644 index 0000000..05b73dd Binary files /dev/null and b/keyboards/258a/images/d7.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 03be0ba..f5d5ec5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,7 +48,43 @@ elseif(APPLE) list(APPEND SOURCE_LIST ${MACOS_APP_ICON}) endif() -qt_add_executable(rangoli ${SOURCE_LIST}) +# Ressourcen definieren +qt_add_resources(RANGOLI_RESOURCES + resources.qrc +) + +qt_add_executable(rangoli ${SOURCE_LIST} ${RANGOLI_RESOURCES}) + +# Linux: udev writer kopieren +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + add_custom_command( + TARGET rangoli POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_CURRENT_SOURCE_DIR}/${LINUX_UDEV_RULE_WRITER_NAME}" + "${CMAKE_CURRENT_BINARY_DIR}/${LINUX_UDEV_RULE_WRITER_NAME}" + ) + + # Installationsziel + install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/${LINUX_UDEV_RULE_WRITER_NAME}" + DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + +# Keyboards-Ordner kopieren +add_custom_command( + TARGET rangoli POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_SOURCE_DIR}/keyboards" + "${CMAKE_CURRENT_BINARY_DIR}/keyboards" +) + +if (APPLE) + install(DIRECTORY "${CMAKE_SOURCE_DIR}/keyboards" + DESTINATION ${CMAKE_INSTALL_PREFIX}) +else() + install(DIRECTORY "${CMAKE_SOURCE_DIR}/keyboards" + DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + set_source_files_properties(${MACOS_APP_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" @@ -58,6 +94,7 @@ set_source_files_properties(GlobalProps.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE ) +# QML Modul qt_add_qml_module(rangoli URI Rangoli VERSION ${VERSION} @@ -91,9 +128,11 @@ endif() target_compile_options(rangoli PRIVATE -Wall -Wextra -Werror) +# Libraries target_link_libraries(rangoli PRIVATE Qt6::Quick Qt6::Svg - PRIVATE hidapi::hidapi) + PRIVATE hidapi::hidapi +) install(TARGETS rangoli BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX} diff --git a/src/keycode.h b/src/keycode.h index 0a747d2..f028e16 100644 --- a/src/keycode.h +++ b/src/keycode.h @@ -135,6 +135,7 @@ class KeyCode { Key_Num_Decimal_Point = 0x6300, Key_Num_Lock = 0x5300, Key_Num_Enter = 0x5800, + Key_102ND = 0x6400, Key_Fn = 0xb000, diff --git a/src/main.cpp b/src/main.cpp index 9e03241..d3dbba6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,7 +11,7 @@ * GNU General Public License for more details. */ -#include +#include #include #include #include @@ -19,6 +19,7 @@ #include #include #include +#include #include "keyboardconfiguratorcontroller.h" #include "mainwindowcontroller.h" #include "settingscontroller.h" @@ -29,6 +30,17 @@ using namespace Qt::Literals::StringLiterals; int main(int argc, char *argv[]) { + // Workaround for Qt6 Wayland menu crash on some systems + // Automatically fallback to X11 if running on Wayland + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + QString waylandDisplay = env.value("WAYLAND_DISPLAY"); + QString qtPlatform = env.value("QT_QPA_PLATFORM"); + + if (!waylandDisplay.isEmpty() && qtPlatform.isEmpty()) { + qputenv("QT_QPA_PLATFORM", "xcb"); + qInfo() << "Detected Wayland session, using X11 backend to avoid Qt6 menu crashes"; + } + if (MessageHandler::init()) { qInstallMessageHandler(MessageHandler::handler); @@ -53,7 +65,7 @@ int main(int argc, char *argv[]) KeyboardConfiguratorController keyboardConfiguratorController; SettingsController settingsController; - QGuiApplication app(argc, argv); + QApplication app(argc, argv); qInfo() << "Platform:" << app.platformName(); qInfo() << "Qt" << qVersion(); diff --git a/src/mainwindowcontroller.cpp b/src/mainwindowcontroller.cpp index 17e85f0..597482b 100644 --- a/src/mainwindowcontroller.cpp +++ b/src/mainwindowcontroller.cpp @@ -25,14 +25,15 @@ MainWindowController::MainWindowController(QObject *parent) m_interruptClose{true}, m_confirmQuitDialogVisible{false}, m_alwaysShowSystemTrayIcon{false}, m_closeToSystemTrayIcon{false}, m_startToSystemTrayIcon{false}, m_keyboardsScanning{true}, m_toolTipDelay{1000}, m_toolTipTimeout{15000}, m_linuxUdevPopupProceedButtonEnabled{true} -{} +{ +} -void MainWindowController::showEnhancedDialog(QObject* object, const EnhancedDialog &dialog) +void MainWindowController::showEnhancedDialog(QObject *object, const EnhancedDialog &dialog) { - emit qvariant_cast - (qmlEngine(object) - ->rootContext() - ->contextProperty(u"mainWindowController"_s))->loadEnhancedDialog(dialog); + emit qvariant_cast(qmlEngine(object) + ->rootContext() + ->contextProperty(u"mainWindowController"_s)) + ->loadEnhancedDialog(dialog); } QString MainWindowController::macOSPermissionNotice() @@ -129,67 +130,60 @@ void MainWindowController::init() m_profiles->registerProfiles(); - m_keyboardConfiguratorController = qvariant_cast - (qmlEngine(this) - ->rootContext() - ->contextProperty(u"keyboardConfiguratorController"_s)); + m_keyboardConfiguratorController = qvariant_cast(qmlEngine(this) + ->rootContext() + ->contextProperty(u"keyboardConfiguratorController"_s)); - QPointer m_settingsController = qvariant_cast - (qmlEngine(this) - ->rootContext() - ->contextProperty(u"settingsController"_s)); + QPointer m_settingsController = qvariant_cast(qmlEngine(this) + ->rootContext() + ->contextProperty(u"settingsController"_s)); m_settingsController->init(); m_keyboardConfiguratorController->init(); - HIDConnection& connection = HIDConnection::getInstance(); + HIDConnection &connection = HIDConnection::getInstance(); - connect(&connection, &HIDConnection::HIDColInitFailed, this, [this](){ - showFatalError(tr("Unable to open HID Cols Config file"), - tr("The program will now exit.")); - }, Qt::SingleShotConnection); + connect(&connection, &HIDConnection::HIDColInitFailed, this, [this]() + { showFatalError(tr("Unable to open HID Cols Config file"), + tr("The program will now exit.")); }, Qt::SingleShotConnection); - connect(&connection, &HIDConnection::HIDAPIInitFailed, this, [this](){ - showFatalError(tr("Unable to initialise HID API"), - tr("Please check if you have permissions and restart Rangoli. " - "The program will now exit.")); - }, Qt::SingleShotConnection); + connect(&connection, &HIDConnection::HIDAPIInitFailed, this, [this]() + { showFatalError(tr("Unable to initialise HID API"), + tr("Please check if you have permissions and restart Rangoli. " + "The program will now exit.")); }, Qt::SingleShotConnection); connect(&connection, &HIDConnection::initSuccessful, this, &MainWindowController::refreshKeyboards, Qt::SingleShotConnection); connect(&connection, &HIDConnection::keyboardConnected, - this, [this](const Keyboard& keyboard){ + this, [this](const Keyboard &keyboard) + { m_connectedKeyboards->append(keyboard); - emit adjustOptionsSize(m_connectedKeyboards->rowCount()); - }); + emit adjustOptionsSize(m_connectedKeyboards->rowCount()); }); connect(&connection, &HIDConnection::keyboardDisconnected, - this, [this](const KeyboardUSBID& id){ + this, [this](const KeyboardUSBID &id) + { m_connectedKeyboards->remove(id); - emit adjustOptionsSize(m_connectedKeyboards->rowCount()); - }); + emit adjustOptionsSize(m_connectedKeyboards->rowCount()); }); connect(&connection, &HIDConnection::keyboardsScanComplete, - this, [this](){ + this, [this]() + { m_keyboardsScanning = false; - emit keyboardsScanningChanged(); - }); + emit keyboardsScanningChanged(); }); if (m_settingsController->applyDefaultProfileOnStartup()) { - connect(&connection, &HIDConnection::keyboardsScanComplete, - this, [this](){ - QSettings settings; + connect(&connection, &HIDConnection::keyboardsScanComplete, this, [this]() + { qInfo() << "Apply default profile"; for (int i = 0 ; i < m_connectedKeyboards->keyboards().size(); i++) { - m_keyboardConfiguratorController->load(i); - m_keyboardConfiguratorController->applyDefaultProfile(); - } - }, Qt::SingleShotConnection); + loadKeyboardWithDefaultProfile(i); + } }, Qt::SingleShotConnection); } QDir keyboards{u"keyboards"_s}; @@ -218,15 +212,14 @@ void MainWindowController::init() connection.start(); #ifdef Q_OS_LINUX - if (!QFile::exists(QStringLiteral(LINUX_UDEV_RULES_PATH)) - || !m_settingsController->udevRulesWritten()) + if (!QFile::exists(QStringLiteral(LINUX_UDEV_RULES_PATH)) || !m_settingsController->udevRulesWritten()) { qInfo() << "Show Linux udev prompt"; emit openLinuxUdevPopup(); } #endif - if(m_settingsController->firstTimeUse()) + if (m_settingsController->firstTimeUse()) { qInfo() << "First time use"; @@ -239,26 +232,24 @@ void MainWindowController::init() tr("Would you like to check for updates on startup?\n" "No user data is collected whatsoever.\n\n" "You can always change this in settings."), - EnhancedDialog::ButtonsType::YES_NO - }; + EnhancedDialog::ButtonsType::YES_NO}; - d.setOnAccepted([m_settingsController](){ + d.setOnAccepted([m_settingsController]() + { m_settingsController->setCheckForUpdatesOnStartup(true); - m_settingsController->checkForUpdates(true); - }); + m_settingsController->checkForUpdates(true); }); - d.setOnRejected([m_settingsController](){ - m_settingsController->setCheckForUpdatesOnStartup(false); - }); + d.setOnRejected([m_settingsController]() + { m_settingsController->setCheckForUpdatesOnStartup(false); }); - d.setOnClosed([m_settingsController](){ + d.setOnClosed([m_settingsController]() + { m_settingsController->save(); - m_settingsController->setFirstTimeUse(false); - }); + m_settingsController->setFirstTimeUse(false); }); emit loadEnhancedDialog(d); } - else if(m_settingsController->checkForUpdatesOnStartup()) + else if (m_settingsController->checkForUpdatesOnStartup()) { m_settingsController->checkForUpdates(true); } @@ -280,6 +271,13 @@ void MainWindowController::refreshKeyboards() emit HIDConnection::getInstance().refreshKeyboards(m_connectedKeyboards); } +void MainWindowController::loadKeyboardWithDefaultProfile(const int &index) +{ + m_keyboardConfiguratorController->load(index); + + m_keyboardConfiguratorController->applyDefaultProfile(); +} + void MainWindowController::loadKeyboard(const int &index) { m_keyboardConfiguratorController->load(index); @@ -292,7 +290,8 @@ void MainWindowController::loadKeyboard(const int &index) void MainWindowController::setInterruptClose(const bool &interruptClose) { - if (m_interruptClose == interruptClose) return; + if (m_interruptClose == interruptClose) + return; m_interruptClose = interruptClose; emit interruptCloseChanged(); @@ -306,7 +305,6 @@ void MainWindowController::closeInterrupted() return; } - if (!m_confirmQuitDialogVisible) { qInfo() << "Show unsaved changes prompt"; @@ -317,14 +315,16 @@ void MainWindowController::closeInterrupted() tr("There are unsaved changes. Are you sure you want to quit?"), EnhancedDialog::ButtonsType::YES_NO); - d.setOnAccepted([this](){quit();}); - d.setOnRejected([this](){m_confirmQuitDialogVisible = false;}); + d.setOnAccepted([this]() + { quit(); }); + d.setOnRejected([this]() + { m_confirmQuitDialogVisible = false; }); emit loadEnhancedDialog(d); } } -void MainWindowController::setTheme(const int& theme) +void MainWindowController::setTheme(const int &theme) { if (theme == Theme::System) { @@ -345,7 +345,8 @@ void MainWindowController::setTheme(const int& theme) void MainWindowController::setAlwaysShowSystemTrayIcon(const bool &alwaysShowSystemTrayIcon) { - if(m_alwaysShowSystemTrayIcon == alwaysShowSystemTrayIcon) return; + if (m_alwaysShowSystemTrayIcon == alwaysShowSystemTrayIcon) + return; m_alwaysShowSystemTrayIcon = alwaysShowSystemTrayIcon; emit alwaysShowSystemTrayIconChanged(); @@ -353,7 +354,8 @@ void MainWindowController::setAlwaysShowSystemTrayIcon(const bool &alwaysShowSys void MainWindowController::setCloseToSystemTrayIcon(const bool &closeToSystemTrayIcon) { - if(m_closeToSystemTrayIcon == closeToSystemTrayIcon) return; + if (m_closeToSystemTrayIcon == closeToSystemTrayIcon) + return; m_closeToSystemTrayIcon = closeToSystemTrayIcon; emit closeToSystemTrayIconChanged(); @@ -362,179 +364,130 @@ void MainWindowController::setCloseToSystemTrayIcon(const bool &closeToSystemTra void MainWindowController::launchLinuxUdevWriter() { qInfo() << "Launch Linux udev writer"; - setLinuxUdevPopupProceedButtonEnabled(false); - if (!QFile::exists(QStringLiteral(LINUX_UDEV_RULE_WRITER_NAME))) - { - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Unable to find udev rule writer.") - }); - + // Absolute path to udev writer + QString udevWriterPath = QDir(QCoreApplication::applicationDirPath()) + .filePath(LINUX_UDEV_RULE_WRITER_NAME); + if (!QFile::exists(udevWriterPath)) { + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("Unable to find udev rule writer.") + }); setLinuxUdevPopupProceedButtonEnabled(true); return; } - QString exitOK{u"0"_s}; - QString exitKeyboardsReadFailed{u"1"_s}; - QString exitRuleWriteFailed{u"2"_s}; + QString exitOK{"0"}; + QString exitKeyboardsReadFailed{"1"}; + QString exitRuleWriteFailed{"2"}; + + QString outputPath = QDir(QCoreApplication::applicationDirPath()) + .filePath("udev-rule-writer_OUTPUT"); QString oldID; - QString outputPath{QStringLiteral("%1_OUTPUT").arg(QStringLiteral(LINUX_UDEV_RULE_WRITER_NAME))}; QFile oldOutput{outputPath}; - - if (oldOutput.exists()) - { - if (!oldOutput.open(QIODevice::ReadOnly)) - { - qCritical() << "Failed to old output" << outputPath; - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Unable to read old ID.") - }); - + if (oldOutput.exists()) { + if (!oldOutput.open(QIODevice::ReadOnly)) { + qCritical() << "Failed to read old output:" << outputPath; + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("Unable to read old ID.") + }); setLinuxUdevPopupProceedButtonEnabled(true); return; } - oldID = oldOutput.readAll().split(':').at(0); - oldOutput.close(); } - QPointer udevWriter{new QProcess{this}}; - connect(udevWriter, &QProcess::finished, this, - [this, outputPath, exitOK, exitKeyboardsReadFailed, exitRuleWriteFailed, oldID] - (int exitCode, QProcess::ExitStatus exitStatus) { - Q_UNUSED(exitStatus) - Q_UNUSED(exitCode) + // Keep QProcess as member so it doesn't get destroyed immediately + udevWriterProcess.reset(new QProcess(this)); + connect(udevWriterProcess.get(), &QProcess::finished, this, + [this, outputPath, exitOK, exitKeyboardsReadFailed, exitRuleWriteFailed, oldID](int /*exitCode*/, QProcess::ExitStatus) { setLinuxUdevPopupProceedButtonEnabled(true); QFile output{outputPath}; - - if (!output.open(QIODevice::ReadOnly)) - { - qCritical() << "Failed to new output" << outputPath; - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("The udev rules writer failed to run. Did you provide incorrect password?") - }); + if (!output.open(QIODevice::ReadOnly)) { + qCritical() << "Failed to read output:" << outputPath; + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("The udev rules writer failed to run. Did you provide incorrect password?") + }); return; } QByteArray outRaw = output.readAll(); - qDebug() << "Output File raw:" << outRaw; - output.close(); QList outputs{outRaw.split(':')}; - qDebug() << "Outputs length:" << outputs.length(); - - QString newID = outputs.at(0); - qDebug() << "New ID:" << newID; - qDebug() << "Old ID:" << oldID; - - if (newID == oldID) - { - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("The udev rules writer failed to run. Did you provide incorrect password?") - }); - return; - } - - if (outputs.length() != 2) - { - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Malformed output from udev writer.") - }); + if (outputs.size() != 2 || outputs.at(0) == oldID) { + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("The udev rules writer failed to run. Did you provide incorrect password?") + }); return; } QString newExitCode = outputs.at(1); - qDebug() << "New exit code:" << newExitCode; - - if (newExitCode == exitOK) - { + if (newExitCode == exitOK) { emit closeLinuxUdevPopup(); - - emit loadEnhancedDialog(EnhancedDialog { - tr("Successful"), - tr("udev rules have been applied and reloaded! Enjoy Rangoli!") - }); - - qvariant_cast - (qmlEngine(this) - ->rootContext() - ->contextProperty(u"settingsController"_s))->setUdevRulesWritten(true); - } - else if (newExitCode == exitKeyboardsReadFailed) - { - qCritical() << "Failed to read keyboards information"; - - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Failed to read keyboards information") - }); - } - else if (newExitCode == exitRuleWriteFailed) - { - qCritical() << "Malformed output from udev writer"; - - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Malformed output from udev writer.") - }); - } - else - { - qCritical() << "Malformed exit code from udev writer"; - - emit loadEnhancedDialog(EnhancedDialog { - tr("Error"), - tr("Malformed exit code from udev writer.") - }); + emit loadEnhancedDialog(EnhancedDialog{ + tr("Successful"), + tr("udev rules have been applied and reloaded! Enjoy Rangoli!") + }); + auto settings = qvariant_cast(qmlEngine(this) + ->rootContext() + ->contextProperty(u"settingsController"_s)); + if (settings) { + settings->setUdevRulesWritten(true); + } + } else if (newExitCode == exitKeyboardsReadFailed) { + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("Failed to read keyboards information") + }); + } else if (newExitCode == exitRuleWriteFailed) { + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("Malformed output from udev writer.") + }); + } else { + emit loadEnhancedDialog(EnhancedDialog{ + tr("Error"), + tr("Malformed exit code from udev writer.") + }); } }); - connect(udevWriter, &QProcess::errorOccurred, this, - [this](QProcess::ProcessError error){ - + connect(udevWriterProcess.get(), &QProcess::errorOccurred, this, + [this](QProcess::ProcessError error) { setLinuxUdevPopupProceedButtonEnabled(true); - - qCritical() << "Failed to start" << LINUX_TERMINAL << ". Error Code:" << error; - - if (error == QProcess::FailedToStart) - { - emit loadEnhancedDialog(EnhancedDialog{ - tr("Unable to start udev rules writer"), - tr("You need to have '%1' installed!").arg(LINUX_TERMINAL) - }); - } - else - { - emit loadEnhancedDialog(EnhancedDialog{ - tr("Unable to start udev rules writer."), - tr("Error Code: %1").arg(QString::number(error)) - }); - } + qCritical() << "Failed to start pkexec. Error:" << error; + emit loadEnhancedDialog(EnhancedDialog{ + tr("Unable to start udev rules writer"), + tr("You need to have 'pkexec' installed and properly configured!") + }); }); - udevWriter->start(QStringLiteral(LINUX_TERMINAL), QStringList() << u"-e"_s << - QStringLiteral("echo -n \"\\033]0;%1\\007\" && sudo ./%2 %3 %4 %5 %6 %7 %8") - .arg(tr("Rangoli - Create udev Rules"), - QStringLiteral(LINUX_UDEV_RULE_WRITER_NAME), - QStringLiteral("%1/keyboards").arg(QDir::currentPath()), - QStringLiteral(LINUX_UDEV_RULES_PATH), - outputPath, exitOK, exitKeyboardsReadFailed, exitRuleWriteFailed)); + // Start pkexec + udevWriterProcess->start(QStringLiteral("pkexec"), QStringList{ + udevWriterPath, + QStringLiteral("%1/keyboards").arg(QDir::currentPath()), + LINUX_UDEV_RULES_PATH, + outputPath, + exitOK, + exitKeyboardsReadFailed, + exitRuleWriteFailed + }); } + void MainWindowController::setLinuxUdevPopupProceedButtonEnabled(const bool &linuxUdevPopupProceedButtonEnabled) { - if (m_linuxUdevPopupProceedButtonEnabled == linuxUdevPopupProceedButtonEnabled) return; + if (m_linuxUdevPopupProceedButtonEnabled == linuxUdevPopupProceedButtonEnabled) + return; m_linuxUdevPopupProceedButtonEnabled = linuxUdevPopupProceedButtonEnabled; emit linuxUdevPopupProceedButtonEnabledChanged(); @@ -545,16 +498,16 @@ void MainWindowController::openKeyboardsSupportStatusList() QDesktopServices::openUrl(QUrl(QStringLiteral(KEYBOARDS_SUPPORT_STATUS_LIST))); } -void MainWindowController::showFatalError(const QString& title, const QString& message) +void MainWindowController::showFatalError(const QString &title, const QString &message) { EnhancedDialog d{title, message}; qCritical() << message; - d.setOnAccepted([this](){ + d.setOnAccepted([this]() + { setCloseToSystemTrayIcon(false); - quit(); - }); + quit(); }); emit loadEnhancedDialog(d); } diff --git a/src/mainwindowcontroller.h b/src/mainwindowcontroller.h index 7d50cb0..3693a6e 100644 --- a/src/mainwindowcontroller.h +++ b/src/mainwindowcontroller.h @@ -109,6 +109,7 @@ public slots: void init(); void quit(); void refreshKeyboards(); + void loadKeyboardWithDefaultProfile(const int &index); void loadKeyboard(const int& index); void setInterruptClose(const bool& interruptClose); void closeInterrupted(); @@ -142,7 +143,7 @@ private slots: const int m_toolTipTimeout; bool m_linuxUdevPopupProceedButtonEnabled; - + std::unique_ptr udevWriterProcess; }; #endif // MAINWINDOWCONTROLLER_H diff --git a/src/resources.qrc b/src/resources.qrc index e500a54..4d3f8b0 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -22,4 +22,14 @@ GlobalProps.qml EnhancedButton.qml + + Main.qml + EnhancedButton.qml + EnhancedDialog.qml + KeyboardMenuButton.qml + KeyboardConfigurator.qml + Settings.qml + Hyperlink.qml + GlobalProps.qml + diff --git a/udev/99-rangoli-keyboards.rules b/udev/99-rangoli-keyboards.rules new file mode 100644 index 0000000..7e4addb --- /dev/null +++ b/udev/99-rangoli-keyboards.rules @@ -0,0 +1,21 @@ +# udev rules for Rangoli Keyboard Mapper +# This file allows unprivileged users to access Rangoli keyboards without sudo +# +# Installation: +# 1. Copy this file to /etc/udev/rules.d/99-rangoli-keyboards.rules +# 2. Run: sudo udevadm control --reload-rules && sudo udevadm trigger +# 3. Replug your keyboard or restart your system +# +# For remote access (SSH), also add your user to the appropriate group: +# Ubuntu/Debian: sudo usermod -aG plugdev $USER +# Fedora/RHEL: sudo usermod -aG input $USER +# Then log out and log back in. + +# HIDAPI/hidraw - Allow access to all keyboards with Vendor ID 258a +# Try plugdev first (Ubuntu/Debian), fallback to input (Fedora/RHEL) +KERNEL=="hidraw*", ATTRS{idVendor}=="258a", TAG+="uaccess", GROUP="plugdev", MODE="660" +KERNEL=="hidraw*", ATTRS{idVendor}=="258a", TAG+="uaccess", GROUP="input", MODE="660" + +# HIDAPI/libusb - Allow access to all keyboards with Vendor ID 258a +SUBSYSTEMS=="usb", ATTRS{idVendor}=="258a", TAG+="uaccess", GROUP="plugdev", MODE="660" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="258a", TAG+="uaccess", GROUP="input", MODE="660" \ No newline at end of file