feat(hypr): add force switching of workspace

useful for going from special workspace to normal workspace
This commit is contained in:
kenji
2025-12-28 12:13:41 -06:00
parent d74fa4e552
commit 161c6337a4
3 changed files with 69 additions and 0 deletions
+2
View File
@@ -7,6 +7,8 @@
./hypr/animation.nix
./hypr/misc.nix
./hypr/input.nix
./scripts.nix
];
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
+41
View File
@@ -0,0 +1,41 @@
{pkgs, ...}: let
hakase-workspace-switch-force = pkgs.writeShellScriptBin "hakase-workspace-switch-force" ''
# Define binary paths to ensure they work regardless of environment PATH
HYPRCTL="${pkgs.hyprland}/bin/hyprctl"
JQ="${pkgs.jq}/bin/jq"
# Get the special workspace name
special_workspace=$($HYPRCTL monitors -j | $JQ -r '.[] | select(.focused) | .specialWorkspace.name')
# Strip the "special:" prefix (Nix escape: ''${var#*:})
workspace_name=''${special_workspace#*:}
# Get the target workspace number from argument
chosen_workspace_num=$1
if [[ -z ''${chosen_workspace_num} ]]; then
echo "Usage: $(basename "$0") [number]"
exit 1
fi
# Check if we are actually in a special workspace
if [[ "''${special_workspace}" == *"special"* ]]; then
echo "[LOG] workspace is ''${special_workspace}"
# Toggle the special workspace OFF
$HYPRCTL dispatch togglespecialworkspace "''${workspace_name}"
# Switch to the requested normal workspace
$HYPRCTL dispatch workspace "''${chosen_workspace_num}"
else
echo "[ERR] workspace is not special"
exit 1
fi
exit 0
'';
in {
home.packages = [
hakase-workspace-switch-force
];
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# flow
# check workspace
# if the workspace is a special workspace, toggle it off
# switch to workspace based on the chosen num
special_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .specialWorkspace.name')
workspace_name=${special_workspace#*:}
chosen_workspace_num=$1
if [[ -z ${chosen_workspace_num} ]]; then
echo "Usage: $0 [number]"
exit 1
fi
if [[ "${special_workspace}" == *"special"* ]]; then
echo "[LOG] workspace is ${special_workspace}"
hyprctl dispatch togglespecialworkspace "${workspace_name}"
hyprctl dispatch workspace "${chosen_workspace_num}"
else
echo "[ERR] workspace is not special"
exit 1
fi
exit 0