73 lines
2.5 KiB
Bash
Executable File
73 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Toggle the active workspace between the master layout and the layout it had before
|
|
|
|
set -uo pipefail
|
|
|
|
# Usage: omarchy-toggle-master
|
|
#
|
|
# Goes through Omarchy's o.workspace_mode and its saved-mode files, like
|
|
# omarchy-hyprland-workspace-layout-toggle (SUPER + W), so the layout survives
|
|
# a reload or login and the two keys agree on what the workspace is: SUPER + W
|
|
# on a master workspace cycles on to dwindle. The layout master replaced is
|
|
# kept under STATE_DIR and restored by the next press; without one, the
|
|
# workspace goes back to the default layout. Named workspaces are skipped for
|
|
# the same reason Omarchy skips them: their negative id is read as a relative
|
|
# selector.
|
|
|
|
STATE="${XDG_STATE_HOME:-$HOME/.local/state}/omarchy"
|
|
MODES_DIR="$STATE/workspace-layouts"
|
|
STATE_DIR="$STATE/master-toggle"
|
|
|
|
# Same replace-in-place notification as Omarchy's layout toggle, sharing its
|
|
# id file, so switching with either key leaves one current notification.
|
|
notify_layout() {
|
|
local state="$STATE/workspace-layout-notification"
|
|
local last id
|
|
[[ -r $state ]] && read -r last <"$state"
|
|
if id=$(omarchy-notification-send -p -r "${last:-0}" -g $'\U000f10ac' "$1") && [[ $id =~ ^[0-9]+$ ]]; then
|
|
mkdir -p "$(dirname "$state")" && printf '%s\n' "$id" >"$state"
|
|
fi
|
|
}
|
|
|
|
WORKSPACE=$(hyprctl activeworkspace -j | jq -r '.id')
|
|
[[ $WORKSPACE =~ ^[0-9]+$ ]] || exit 1
|
|
MODE_FILE="$MODES_DIR/$WORKSPACE.lua"
|
|
PREVIOUS_FILE="$STATE_DIR/$WORKSPACE"
|
|
|
|
CURRENT=$(omarchy-hyprland-workspace-layout-current)
|
|
DEFAULT=$(omarchy-hyprland-workspace-layout-default)
|
|
|
|
if [[ $CURRENT == master ]]; then
|
|
NEW=$(cat "$PREVIOUS_FILE" 2>/dev/null)
|
|
[[ $NEW =~ ^(dwindle|scrolling|floating)$ ]] || NEW=$DEFAULT
|
|
else
|
|
NEW=master
|
|
fi
|
|
|
|
APPLY="o.workspace_mode({ workspace = \"$WORKSPACE\", mode = \"$NEW\" })"
|
|
if ! hyprctl eval "$APPLY" >/dev/null 2>&1; then
|
|
notify_layout "$(omarchy-i18n layout.needsReload)"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $NEW == master ]]; then
|
|
mkdir -p "$STATE_DIR" && printf '%s\n' "$CURRENT" >"$PREVIOUS_FILE"
|
|
# A layout change fires no event, so Ghostty is made the master here
|
|
# (hypr/master.lua).
|
|
hyprctl eval 'require("hypr.master").enforce()' >/dev/null
|
|
else
|
|
rm -f "$PREVIOUS_FILE"
|
|
fi
|
|
|
|
# Back on the default, the workspace follows it again (as Omarchy does).
|
|
if [[ $NEW == "$DEFAULT" ]]; then
|
|
rm -f "$MODE_FILE"
|
|
else
|
|
mkdir -p "$MODES_DIR" && printf '%s\n' "$APPLY" >"$MODE_FILE"
|
|
fi
|
|
|
|
notify_layout "Workspace layout: $NEW"
|
|
omarchy-shell -q omarchy.workspaces refresh
|
|
omarchy-shell -q omarchy.dock refresh
|