blob: 04baebe0a8254b429d726b848c0d2ff3bc6a243a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# ==================================================
# KoolDots (2026)
# Project URL: https://github.com/LinuxBeginnings
# License: GNU GPLv3
# SPDX-License-Identifier: GPL-3.0-or-later
# ==================================================
##################################################################
# #
# #
# TAK_0'S Per-Window-Switch #
# #
# #
# #
# Just a little script that I made to switch keyboard layouts #
# per-window instead of global switching for the more #
# smooth and comfortable workflow. #
# #
##################################################################
# This is for changing kb_layouts. Set kb_layouts in
MAP_FILE="$HOME/.cache/kb_layout_per_window"
USER_CFG="$HOME/.config/hypr/UserConfigs/UserSettings.conf"
SYS_CFG="$HOME/.config/hypr/configs/SystemSettings.conf"
ICON="$HOME/.config/swaync/images/ja.png"
SCRIPT_NAME="$(basename "$0")"
# Ensure map file exists
touch "$MAP_FILE"
# Read layouts from config
if grep -q 'kb_layout' "$USER_CFG" 2>/dev/null; then
CFG_FILE="$USER_CFG"
elif grep -q 'kb_layout' "$SYS_CFG" 2>/dev/null; then
CFG_FILE="$SYS_CFG"
else
echo "Error: cannot find kb_layout in UserSettings.conf nor SystemSettings.conf" >&2
exit 1
fi
kb_layouts=($(grep 'kb_layout' "$CFG_FILE" | cut -d '=' -f2 | tr -d '[:space:]' | tr ',' ' '))
count=${#kb_layouts[@]}
# Get current active window ID
get_win() {
hyprctl activewindow -j | jq -r '.address // .id'
}
# Get available keyboards
get_keyboards() {
hyprctl devices -j | jq -r '.keyboards[].name'
}
# Save window-specific layout
save_map() {
local W=$1 L=$2
grep -v "^${W}:" "$MAP_FILE" > "$MAP_FILE.tmp"
echo "${W}:${L}" >> "$MAP_FILE.tmp"
mv "$MAP_FILE.tmp" "$MAP_FILE"
}
# Load layout for window (fallback to default)
load_map() {
local W=$1
local E
E=$(grep "^${W}:" "$MAP_FILE")
[[ -n "$E" ]] && echo "${E#*:}" || echo "${kb_layouts[0]}"
}
# Switch layout for all keyboards to layout index
do_switch() {
local IDX=$1
for kb in $(get_keyboards); do
hyprctl switchxkblayout "$kb" "$IDX" 2>/dev/null
done
}
# Toggle layout for current window only
cmd_toggle() {
local W=$(get_win)
[[ -z "$W" ]] && return
local CUR=$(load_map "$W")
local i NEXT
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$CUR" ]]; then
i=$idx
break
fi
done
NEXT=$(( (i+1) % count ))
do_switch "$NEXT"
save_map "$W" "${kb_layouts[NEXT]}"
notify-send -u low -i "$ICON" "kb_layout: ${kb_layouts[NEXT]}"
}
# Restore layout on focus
cmd_restore() {
local W=$(get_win)
[[ -z "$W" ]] && return
local LAY=$(load_map "$W")
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$LAY" ]]; then
do_switch "$idx"
break
fi
done
}
# Listen to focus events and restore window-specific layouts
subscribe() {
local SOCKET2="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
[[ -S "$SOCKET2" ]] || {
echo "Error: Hyprland socket not found." >&2
exit 1
}
socat -u UNIX-CONNECT:"$SOCKET2" - | while read -r line; do
[[ "$line" =~ ^activewindow ]] && cmd_restore
done
}
# Ensure only one listener
if ! pgrep -f "$SCRIPT_NAME.*--listener" >/dev/null; then
subscribe --listener &
fi
# CLI
case "$1" in
toggle|"") cmd_toggle ;;
*) echo "Usage: $SCRIPT_NAME [toggle]" >&2; exit 1 ;;
esac
|