#!/usr/bin/env bash # ================================================== # KoolDots (2026) # Project URL: https://github.com/LinuxBeginnings # License: GNU GPLv3 # SPDX-License-Identifier: GPL-3.0-or-later # ================================================== # Waybar module for Hyprland layouts IFS=$'\n\t' SCRIPTSDIR="${XDG_CONFIG_HOME:-$HOME/.config}/hypr/scripts" rofi_config="${XDG_CONFIG_HOME:-$HOME/.config}/rofi/config-layout.rasi" change_layout="${SCRIPTSDIR}/ChangeLayout.sh" layouts=(dwindle scrolling monocle master) layout_icon() { case "$1" in dwindle) echo "šŸ„³" ;; scrolling) echo "šŸ…‚" ;; monocle) echo "šŸ„¼" ;; master) echo "ā“œ" ;; *) echo "󰹑" ;; esac } layout_name() { case "$1" in dwindle) echo "Dwindle" ;; scrolling) echo "Scrolling" ;; monocle) echo "Monocle" ;; master) echo "Master" ;; *) echo "Unknown" ;; esac } get_layout() { local layout if [[ -x "$change_layout" ]]; then layout="$("$change_layout" --quiet current 2>/dev/null || true)" if [[ -n "$layout" ]]; then printf '%s\n' "$layout" return fi fi hyprctl -j activeworkspace 2>/dev/null | jq -r '.tiledLayout // .tiled_layout // "unknown"' 2>/dev/null } next_layout() { local current="$1" local i for i in "${!layouts[@]}"; do if [[ "${layouts[i]}" == "$current" ]]; then echo "${layouts[((i + 1) % ${#layouts[@]})]}" return fi done echo "${layouts[0]}" } refresh_waybar() { pkill -RTMIN+8 waybar 2>/dev/null || true } set_layout() { local target="$1" "$change_layout" "$target" && refresh_waybar } show_status() { local current icon name tooltip current="$(get_layout)" icon="$(layout_icon "$current")" name="$(layout_name "$current")" tooltip="Workspace layout: ${name} (${icon})\n\nLeft click: Select layout for active workspace\nRight click: Cycle active workspace layout\n\nOptions:\nšŸ„³ Dwindle\nšŸ…‚ Scrolling\nšŸ„¼ Monocle\nā“œ Master" printf '{"text":"%s","tooltip":"%s","class":"%s"}\n' "$icon" "$tooltip" "$current" } show_menu() { local current default_row choice target i local options=() current="$(get_layout)" default_row=0 for i in "${!layouts[@]}"; do local layout="${layouts[i]}" local prefix=" " if [[ "$layout" == "$current" ]]; then prefix="ā— " default_row="$i" fi options+=("${prefix}$(layout_icon "$layout") $(layout_name "$layout")") done if pgrep -x rofi >/dev/null; then pkill rofi return 0 fi choice="$(printf '%s\n' "${options[@]}" | rofi -i -dmenu -p "Workspace layout" -mesg "Select layout for this workspace" -selected-row "$default_row" -config "$rofi_config")" [[ -z "$choice" ]] && exit 0 case "$choice" in *Dwindle*) target="dwindle" ;; *Scrolling*) target="scrolling" ;; *Monocle*) target="monocle" ;; *Master*) target="master" ;; *) exit 1 ;; esac set_layout "$target" } case "${1:-status}" in status) show_status ;; menu) show_menu ;; next|toggle) set_layout "$(next_layout "$(get_layout)")" ;; dwindle|scrolling|monocle|master) set_layout "$1" ;; *) echo "Usage: $(basename "$0") [status|menu|next|dwindle|scrolling|monocle|master]" >&2 exit 1 ;; esac