JaKooLit / Debian-Hyprland

Automated Hyprland installer for Debian 13 Trixie and Debian SID (unstable)
GNU General Public License v3.0
683 stars 64 forks source link

[bug] Keyboard Layout Switching Fails for Some Devices #132

Closed luanlouzada closed 1 month ago

luanlouzada commented 1 month ago

Description When attempting to switch keyboard layouts using the provided script, the command hyprctl switchxkblayout "at-translated-set-2-keyboard" "$new_layout" fails with the error device not found. This occurs because the specified device name does not match the actual device names in the system.

Steps to Reproduce Use the provided script to switch keyboard layouts. Observe the error message indicating that the device was not found. Notice that the layout change only partially works for some devices. Expected Behavior The script should successfully switch the keyboard layout for all connected keyboard devices.

Actual Behavior The script fails to switch the keyboard layout for the specified device at-translated-set-2-keyboard, but switches for other devices with different names.

Environment Hyprland version: 0.41.2-45 Operating System: Kali 2024.2 Additional configuration: [Any other relevant configuration details] Solution The issue is resolved by modifying the script to iterate over all connected keyboard devices and switch the layout for each one. Here is the updated script:

`#!/bin/bash

/ ---- 💫 https://github.com/JaKooLit 💫 ---- /

This is for changing kb_layouts. Set kb_layouts in $settings_file

layout_f="$HOME/.cache/kb_layout" settings_file="$HOME/.config/hypr/UserConfigs/UserSettings.conf" notif="$HOME/.config/swaync/images/bell.png"

echo "Starting script..."

Check if ~/.cache/kb_layout exists and create it with a default layout from Settings.conf if not found

if [ ! -f "$layout_f" ]; then echo "Creating layout file as it does not exist..." default_layout=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2 | cut -d ',' -f 1 2>/dev/null) if [ -z "$default_layout" ]; then default_layout="us" # Default to 'us' layout if Settings.conf or 'kb_layout' is not found fi echo "$default_layout" > "$layout_f" echo "Default layout set to $default_layout" fi

current_layout=$(cat "$layout_f") echo "Current layout: $current_layout"

Read keyboard layout settings from Settings.conf

if [ -f "$settings_file" ]; then echo "Reading keyboard layout settings from $settings_file..." kb_layout_line=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2) IFS=',' read -ra layout_mapping <<< "$kb_layout_line" echo "Available layouts: ${layout_mapping[@]}" else echo "Settings file not found!" exit 1 fi

layout_count=${#layout_mapping[@]} echo "Number of layouts: $layout_count"

Find the index of the current layout in the mapping

for ((i = 0; i < layout_count; i++)); do if [ "$current_layout" == "${layout_mapping[i]}" ]; then current_index=$i echo "Current layout index: $current_index" break fi done

Calculate the index of the next layout

next_index=$(( (current_index + 1) % layout_count )) new_layout="${layout_mapping[next_index]}" echo "Next layout: $new_layout"

Created by T-Crypt

get_keyboard_names() { hyprctl devices -j | jq -r '.keyboards[].name' }

change_layout() { local got_error=false

while read -r name; do
    echo "Switching layout for $name to $new_layout..."
    hyprctl switchxkblayout "$name" "$new_layout"
    if [[ $? -eq 0 ]]; then
        echo "Switched the layout for $name."
    else
        >&2 echo "Error while switching the layout for $name."
        got_error=true
    fi
done <<< "$(get_keyboard_names)"

if [ "$got_error" = true ]; then
    >&2 echo "Some errors were found during the process..."
    return 1
fi

return 0 # All layouts had been cycled successfully

}

if ! change_layout; then notify-send -u low -t 2000 'Keyboard layout' 'Error: Layout change failed'

&2 echo "Layout change failed." exit 1 else

Notification for the new keyboard layout

notify-send -u low -i "$notif" "new KB_Layout: $new_layout" echo "Layout change notification sent." fi

echo "$new_layout" > "$layout_f" `

This solution iterates over all connected keyboard devices and updates the layout for each one, ensuring that the layout switch works for all keyboards identified by hyprctl.

JaKooLit commented 1 month ago

Thanks for the updated script. Can you make a PR here pls

https://github.com/JaKooLit/Hyprland-Dots/tree/development

JaKooLit commented 1 month ago

https://github.com/JaKooLit/Hyprland-Dots/pull/388