diff --git a/.config/hypr/configs/Keybinds.conf b/.config/hypr/configs/Keybinds.conf index 1ddbc81a..b309b74b 100644 --- a/.config/hypr/configs/Keybinds.conf +++ b/.config/hypr/configs/Keybinds.conf @@ -62,7 +62,7 @@ bindd = $mainMod CTRL, O, toggle active window opacity, exec, hyprctl setprop ac bindd = $mainMod SHIFT, K, search keybinds, exec, $scriptsDir/KeyBinds.sh bindd = $mainMod SHIFT, A, animations menu, exec, $scriptsDir/Animations.sh bindd = $mainMod SHIFT, O, change oh-my-zsh theme, exec, $UserScripts/ZshChangeTheme.sh -bindlnd = ALT_L, SHIFT_L, switch keyboard layout globally, exec, $scriptsDir/SwitchKeyboardLayout.sh +bindlnd = ALT_L, SHIFT_L, switch keyboard layout globally, exec, $scriptsDir/KeyboardLayout.sh switch bindlnd = SHIFT_L, ALT_L, switch keyboard layout per-window, exec, $scriptsDir/Tak0-Per-Window-Switch.sh bindd = $mainMod ALT, C, calculator, exec, $UserScripts/RofiCalc.sh diff --git a/.config/hypr/scripts/KeyboardLayout.sh b/.config/hypr/scripts/KeyboardLayout.sh new file mode 100755 index 00000000..32767593 --- /dev/null +++ b/.config/hypr/scripts/KeyboardLayout.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ## +# This is for changing kb_layouts. Set kb_layouts in "$HOME/.config/hypr/UserConfigs/UserSettings.conf" + +notif_icon="$HOME/.config/swaync/images/ja.png" +SCRIPTSDIR="$HOME/.config/hypr/scripts" + +# Refined ignore list with patterns or specific device names +ignore_patterns=( + "--(avrcp)" + "Bluetooth Speaker" + "Other Device + Name" + ) + + +# Function to get keyboard names +get_keyboard_names() { + hyprctl devices -j | jq -r '.keyboards[].name' +} + +# Function to check if a device matches any ignore pattern +is_ignored() { + local device_name=$1 + for pattern in "${ignore_patterns[@]}"; do + if [[ "$device_name" == *"$pattern"* ]]; then + return 0 # Device matches ignore pattern + fi + done + return 1 # Device does not match any ignore pattern +} + +# Function to get current layout info +get_current_layout_info() { + local found_kb=false + + # Read from the first non-ignored layout + while read -r name; do + if ! is_ignored "$name"; then + found_kb=true + local layout_mapping_str=$(hyprctl devices -j | + jq -r ".keyboards[] | select(.name==\"$name\").layout") + IFS="," read -r -a layout_mapping <<<"$layout_mapping_str" + + local variant_mapping_str=$(hyprctl devices -j | + jq -r ".keyboards[] | select(.name==\"$name\").variant") + IFS="," read -r -a variant_mapping <<<"$variant_mapping_str" + + layout_index=$(hyprctl devices -j | + jq -r ".keyboards[] | select(.name==\"$name\").active_layout_index") + break + fi + done <<< "$(get_keyboard_names)" + + $found_kb && return 0 + return 1 +} + +# Function to change keyboard layout +change_layout() { + local error_found=false + + while read -r name; do + if is_ignored "$name"; then + echo "Skipping ignored device: $name" + continue + fi + + echo "Switching layout for $name to $new_layout..." + hyprctl switchxkblayout "$name" "$next_index" + if [ $? -ne 0 ]; then + echo "Error while switching layout for $name." >&2 + error_found=true + fi + done <<< "$(get_keyboard_names)" + + $error_found && return 1 + return 0 +} + + +# Stores values in layout_mapping, variant_mapping and layout_index +if ! get_current_layout_info; then + echo "Could not get current layout information." >&2 + echo "There might not be any keyboards available, \ + or some were unnecessarily set as ignored." >&2 + notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed" + echo "Exiting $0 $@" >&2 + exit 1 +fi + +current_layout=${layout_mapping[layout_index]} +current_variant=${variant_mapping[layout_index]} + +if [[ "$1" == "status" ]]; then + echo "$current_layout${current_variant:+($current_variant)}" +elif [[ "$1" == "switch" ]]; then + echo "Current layout: $current_layout($current_variant)" + + layout_count=${#layout_mapping[@]} + echo "Number of layouts: $layout_count" + + next_index=$(( (layout_index + 1) % layout_count )) + new_layout="${layout_mapping[next_index]}" + new_variant="${variant_mapping[next_index]}" + echo "Next layout: $new_layout" + + # Execute layout change and notify + if ! change_layout; then + notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed" + echo "Layout change failed." >&2 + exit 1 + else + notify-send -u low -i "$notif_icon" " kb_layout: $new_layout${new_variant:+($new_variant)}" + echo "Layout change notification sent." + fi +else + echo "Usage: $0 {status|switch}" +fi diff --git a/.config/hypr/scripts/SwitchKeyboardLayout.sh b/.config/hypr/scripts/SwitchKeyboardLayout.sh deleted file mode 100755 index 18a9517e..00000000 --- a/.config/hypr/scripts/SwitchKeyboardLayout.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env bash -# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ## -# This is for changing kb_layouts. Set kb_layouts in $settings_file - -layout_file="$HOME/.cache/kb_layout" -settings_file="$HOME/.config/hypr/UserConfigs/UserSettings.conf" -notif_icon="$HOME/.config/swaync/images/ja.png" - -# Refined ignore list with patterns or specific device names -ignore_patterns=( - "--(avrcp)" - "Bluetooth Speaker" - "Other Device - Name" - ) - - -# Create layout file with default layout if it does not exist -if [ ! -f "$layout_file" ]; then - echo "Creating layout file..." - default_layout=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2 | tr -d '[:space:]' | cut -d ',' -f 1 2>/dev/null) - default_layout=${default_layout:-"us"} # Default to 'us' layout - echo "$default_layout" > "$layout_file" - echo "Default layout set to $default_layout" -fi - -current_layout=$(cat "$layout_file") -echo "Current layout: $current_layout" - -# Read available layouts from settings file -if [ -f "$settings_file" ]; then - kb_layout_line=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2) - # Remove leading and trailing spaces around each layout - kb_layout_line=$(echo "$kb_layout_line" | tr -d '[:space:]') - IFS=',' read -r -a layout_mapping <<< "$kb_layout_line" -else - echo "Settings file not found!" - exit 1 -fi - -layout_count=${#layout_mapping[@]} -echo "Number of layouts: $layout_count" - -# Find current layout index and calculate next layout -for ((i = 0; i < layout_count; i++)); do - if [ "$current_layout" == "${layout_mapping[i]}" ]; then - current_index=$i - break - fi -done - -next_index=$(( (current_index + 1) % layout_count )) -new_layout="${layout_mapping[next_index]}" -echo "Next layout: $new_layout" - -# Function to get keyboard names -get_keyboard_names() { - hyprctl devices -j | jq -r '.keyboards[].name' -} - -# Function to check if a device matches any ignore pattern -is_ignored() { - local device_name=$1 - for pattern in "${ignore_patterns[@]}"; do - if [[ "$device_name" == *"$pattern"* ]]; then - return 0 # Device matches ignore pattern - fi - done - return 1 # Device does not match any ignore pattern -} - -# Function to change keyboard layout -change_layout() { - local error_found=false - - while read -r name; do - if is_ignored "$name"; then - echo "Skipping ignored device: $name" - continue - fi - - echo "Switching layout for $name to $new_layout..." - hyprctl switchxkblayout "$name" "$next_index" - if [ $? -ne 0 ]; then - echo "Error while switching layout for $name." >&2 - error_found=true - fi - done <<< "$(get_keyboard_names)" - - $error_found && return 1 - return 0 -} - -# Execute layout change and notify -if ! change_layout; then - notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed" - echo "Layout change failed." >&2 - exit 1 -else - notify-send -u low -i "$notif_icon" " kb_layout: $new_layout" - echo "Layout change notification sent." -fi - -echo "$new_layout" > "$layout_file" diff --git a/.config/waybar/ModulesCustom b/.config/waybar/ModulesCustom index f4c871f7..cb390c0f 100644 --- a/.config/waybar/ModulesCustom +++ b/.config/waybar/ModulesCustom @@ -90,10 +90,10 @@ }, "custom/keyboard": { - "exec": "cat $HOME/.cache/kb_layout", + "exec": "$HOME/.config/hypr/scripts/KeyboardLayout.sh status", "interval": 1, "format": " {}", - "on-click": "$HOME/.config/hypr/scripts/SwitchKeyboardLayout.sh", + "on-click": "$HOME/.config/hypr/scripts/KeyboardLayout.sh switch", }, "custom/light_dark": {