#! /usr/bin/env sh # A hyprland script for a laptop-external-monitor setup, toggling between which is in use # Launch at startup to make hyprland disable the internal monitor if an external monitor is detected and enabled # Additionally it's called with a keybind to switch between a laptop monitor and an external display # Ideally the conditional monitor behaviour was instead done directly in hyprland.conf, but I'm not sure whether that's possible # # Relevant info: # - hyprctl monitors: identifies currently enabled monitors # - hyprctl monitors all: identifies ALL connected monitors - including those not in use # # Suggested use: # Add this line somewhere after the regular monitor configuration in hyprland.conf: # exec = /path/to/hyprland-monitors-toggle.sh # Add a keybind to run this script on demand: # bind =,SomeKeyHere, exec, /path/to/hyprland-monitors-toggle.sh #move_all_workspaces_to_monitor() { # TARGET_MONITOR="$1" # hyprctl workspaces | grep ^workspace | cut --delimiter ' ' --fields 3 | xargs -I '{}' hyprctl dispatch moveworkspacetomonitor '{}' "$TARGET_MONITOR" # # Previous approach # #hyprctl swapactiveworkspaces $EXTERNAL_MONITOR $INTERNAL_MONITOR #} # TODO: Detect these instead of hardcoding them INTERNAL_MONITOR="eDP-1" EXTERNAL_MONITOR="HDMI-A-1" # NUM_MONITORS=$(hyprctl monitors all | grep --count Monitor) # NUM_MONITORS_ACTIVE=$(hyprctl monitors | grep --count Monitor) # Make sure all # if [ "$NUM_MONITORS_ACTIVE" -eq 1 ]; then # move_all_workspaces_to_monitor $INTERNAL_MONITOR # exit # fi MIRROR_SETTING=$(hyprctl monitors all -j | jq -r '.[] | select(.name == "HDMI-A-1") | .mirrorOf') # # For dynamically toggling which monitor is active later via a keybind # if [ "$NUM_MONITORS" -gt 1 ]; then # Handling multiple monitors # if hyprctl monitors | cut --delimiter ' ' --fields 2 | grep --quiet ^$EXTERNAL_MONITOR; then # hyprctl keyword monitor $INTERNAL_MONITOR,preferred,0x0,1 # move_all_workspaces_to_monitor $INTERNAL_MONITOR # hyprctl keyword monitor "$EXTERNAL_MONITOR, disable" # else # hyprctl keyword monitor $EXTERNAL_MONITOR,preferred,0x0,1 # move_all_workspaces_to_monitor $EXTERNAL_MONITOR # hyprctl keyword monitor "$INTERNAL_MONITOR, disable" # fi # else # If the external monitor is disconnected without running this script first, it might become the case that no monitor is on - therefore turn on the laptop monitor! # hyprctl keyword monitor $INTERNAL_MONITOR,preferred,0x0,1 # move_all_workspaces_to_monitor $INTERNAL_MONITOR # fi echo setting: echo $MIRROR_SETTING if [ "$MIRROR_SETTING" = "none" ]; then echo "mirroring..." hyprctl keyword monitor "$EXTERNAL_MONITOR, preferred, auto, 1, mirror, $INTERNAL_MONITOR" else hyprctl keyword monitor "$EXTERNAL_MONITOR, disable" # shortly disable monitor so waybar recognizes the new monitor again # TODO: find better solution hyprctl keyword monitor "$EXTERNAL_MONITOR, preferred, auto, 1" fi