aboutsummaryrefslogtreecommitdiffstats
path: root/config/hypr/scripts/Tak0-Per-Window-Switch.sh
diff options
context:
space:
mode:
Diffstat (limited to 'config/hypr/scripts/Tak0-Per-Window-Switch.sh')
-rwxr-xr-xconfig/hypr/scripts/Tak0-Per-Window-Switch.sh105
1 files changed, 79 insertions, 26 deletions
diff --git a/config/hypr/scripts/Tak0-Per-Window-Switch.sh b/config/hypr/scripts/Tak0-Per-Window-Switch.sh
index 04baebe0..eba3b380 100755
--- a/config/hypr/scripts/Tak0-Per-Window-Switch.sh
+++ b/config/hypr/scripts/Tak0-Per-Window-Switch.sh
@@ -1,3 +1,4 @@
+#!/usr/bin/env bash
# ==================================================
# KoolDots (2026)
# Project URL: https://github.com/LinuxBeginnings
@@ -16,28 +17,65 @@
# 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")"
+SCRIPT_PATH="$(readlink -f "$0")"
+
+# Detect active Hyprland config mode
+config_home="${XDG_CONFIG_HOME:-$HOME/.config}"
+hypr_dir="$config_home/hypr"
+lua_entry="$hypr_dir/hyprland.lua"
+legacy_lua_entry="$config_home/hyprland.lua"
+
+if [[ -f "$lua_entry" || -f "$legacy_lua_entry" ]]; then
+ hypr_config_mode="lua"
+else
+ hypr_config_mode="conf"
+fi
# 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
+# Function to get layouts from config files
+get_layouts() {
+ local layouts=""
+ if [[ "$hypr_config_mode" == "lua" ]]; then
+ local lua_user="$hypr_dir/UserConfigs/user_settings.lua"
+ local lua_sys="$hypr_dir/configs/system_settings.lua"
+ local lua_legacy_sys="$hypr_dir/UserConfigs/system_settings.lua"
+ local lua_pristine_sys="$hypr_dir/lua/settings.lua"
+ if [[ -f "$lua_user" ]] && grep -q 'kb_layout' "$lua_user" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$lua_user" | sed -n 's/.*kb_layout\s*=\s*"\([^"]*\)".*/\1/p' | head -n1)
+ elif [[ -f "$lua_sys" ]] && grep -q 'kb_layout' "$lua_sys" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$lua_sys" | sed -n 's/.*kb_layout\s*=\s*"\([^"]*\)".*/\1/p' | head -n1)
+ elif [[ -f "$lua_legacy_sys" ]] && grep -q 'kb_layout' "$lua_legacy_sys" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$lua_legacy_sys" | sed -n 's/.*kb_layout\s*=\s*"\([^"]*\)".*/\1/p' | head -n1)
+ elif [[ -f "$lua_pristine_sys" ]] && grep -q 'kb_layout' "$lua_pristine_sys" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$lua_pristine_sys" | sed -n 's/.*kb_layout\s*=\s*"\([^"]*\)".*/\1/p' | head -n1)
+ fi
+ else
+ local conf_user="$hypr_dir/UserConfigs/UserSettings.conf"
+ local conf_sys="$hypr_dir/configs/SystemSettings.conf"
+ if [[ -f "$conf_user" ]] && grep -q 'kb_layout' "$conf_user" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$conf_user" | cut -d '=' -f2 | tr -d '[:space:]' | head -n1)
+ elif [[ -f "$conf_sys" ]] && grep -q 'kb_layout' "$conf_sys" 2>/dev/null; then
+ layouts=$(grep 'kb_layout' "$conf_sys" | cut -d '=' -f2 | tr -d '[:space:]' | head -n1)
+ fi
+ fi
+ echo "$layouts" | tr ',' ' '
+}
+
+raw_layouts=$(get_layouts)
+if [[ -z "$raw_layouts" ]]; then
+ echo "Error: cannot find kb_layout in configuration files." >&2
+ exit 1
fi
-kb_layouts=($(grep 'kb_layout' "$CFG_FILE" | cut -d '=' -f2 | tr -d '[:space:]' | tr ',' ' '))
+
+kb_layouts=($raw_layouts)
count=${#kb_layouts[@]}
+
# Get current active window ID
get_win() {
hyprctl activewindow -j | jq -r '.address // .id'
@@ -51,7 +89,7 @@ get_keyboards() {
# Save window-specific layout
save_map() {
local W=$1 L=$2
- grep -v "^${W}:" "$MAP_FILE" > "$MAP_FILE.tmp"
+ grep -v "^${W}:" "$MAP_FILE" > "$MAP_FILE.tmp" 2>/dev/null
echo "${W}:${L}" >> "$MAP_FILE.tmp"
mv "$MAP_FILE.tmp" "$MAP_FILE"
}
@@ -60,7 +98,7 @@ save_map() {
load_map() {
local W=$1
local E
- E=$(grep "^${W}:" "$MAP_FILE")
+ E=$(grep "^${W}:" "$MAP_FILE" 2>/dev/null)
[[ -n "$E" ]] && echo "${E#*:}" || echo "${kb_layouts[0]}"
}
@@ -68,16 +106,17 @@ load_map() {
do_switch() {
local IDX=$1
for kb in $(get_keyboards); do
- hyprctl switchxkblayout "$kb" "$IDX" 2>/dev/null
+ hyprctl switchxkblayout "$kb" "$IDX" >/dev/null 2>&1
done
}
# Toggle layout for current window only
cmd_toggle() {
local W=$(get_win)
- [[ -z "$W" ]] && return
+ [[ -z "$W" || "$W" == "null" ]] && return
local CUR=$(load_map "$W")
- local i NEXT
+ local i=0
+ local NEXT
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$CUR" ]]; then
i=$idx
@@ -93,7 +132,7 @@ cmd_toggle() {
# Restore layout on focus
cmd_restore() {
local W=$(get_win)
- [[ -z "$W" ]] && return
+ [[ -z "$W" || "$W" == "null" ]] && return
local LAY=$(load_map "$W")
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$LAY" ]]; then
@@ -106,23 +145,37 @@ cmd_restore() {
# Listen to focus events and restore window-specific layouts
subscribe() {
local SOCKET2="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
+ if [[ ! -S "$SOCKET2" ]]; then
+ # Fallback if HYPRLAND_INSTANCE_SIGNATURE is not set correctly in this subshell
+ local sig=$(hyprctl instances -j | jq -r '.[0].instance' 2>/dev/null)
+ SOCKET2="$XDG_RUNTIME_DIR/hypr/$sig/.socket2.sock"
+ fi
+
[[ -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
+ if [[ "$line" =~ ^activewindow ]]; then
+ cmd_restore
+ fi
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 ;;
+ --listener)
+ subscribe
+ ;;
+ toggle|"")
+ # Ensure only one listener
+ if ! pgrep -f "$SCRIPT_NAME.*--listener" >/dev/null; then
+ "$SCRIPT_PATH" --listener &
+ fi
+ cmd_toggle
+ ;;
+ *)
+ echo "Usage: $SCRIPT_NAME [toggle]" >&2; exit 1
+ ;;
esac
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage