maomaowm/docs/screenshot.md

6.1 KiB

title description
Screenshots Example screenshot keybindings and capture workflows for mangowm.

mangowm does not include a built-in screenshot tool. This keeps the compositor lean. Instead, compose your own workflow from small Wayland utilities and bind them to keys;

Tool Purpose
grim Capture the screen or a region to a file
slurp Interactively select a region for grim
wl-copy Copy screenshots directly to the clipboard
satty Annotate screenshots before saving
wayfreeze Freeze the screen before capture

Install the required with your package manager or from source.

grim writes to the file path you give it, but will not create missing directories. Create one first:

mkdir -p ~/Pictures/Screenshots

Any directory works. ~/Pictures/Screenshots/ is just a convention.

Quick Binds

Short, single-step commands can be placed directly in config.conf with spawn_shell. No script file needed.

Fullscreen

Captures the entire display.

bind=NONE,Print,spawn_shell,grim $HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png

Region

Select an area with slurp before capturing.

bind=SHIFT,Print,spawn_shell,g=$(slurp -d) && [ -n "$g" ] && grim -g "$g" $HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png

Pointer

Captures the full screen including the cursor.

bind=ALT,Print,spawn_shell,grim -c $HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png

Clipboard

Captures to a temporary file and copies the image to the clipboard; no file is saved.

bind=CTRL,Print,spawn_shell,f=$(mktemp -t screenshot-XXXXXX.png) && grim "$f" && wl-copy < "$f" && rm -f "$f"

Annotate

Captures and opens satty for drawing before saving.

bind=SUPER,Print,spawn_shell,f=$HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png && grim "$f" && satty --filename "$f" --output-filename "$f" --actions-on-enter save-to-file --early-exit

Script Binds

When a command involves multi-step logic, geometry parsing, FIFOs, or screen freezing, move it into a script and invoke it with spawn instead of spawn_shell.

Create the scripts directory first:

mkdir -p ~/.config/mango/scripts/screenshot

Window

Uses mmsg (ships with mango) to capture the focused window.

~/.config/mango/scripts/screenshot/window.sh:

#!/usr/bin/env bash
geometry=$(mmsg -x | awk '/x / {x=$3} /y / {y=$3} /width / {w=$3} /height / {h=$3} END {print x","y" "w"x"h}')
[ -z "$geometry" ] && exit 1
grim -g "$geometry" "$HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png"
bind=CTRL+SHIFT,Print,spawn,$HOME/.config/mango/scripts/screenshot/window.sh

Freeze

Freezes the screen with wayfreeze before capturing.

~/.config/mango/scripts/screenshot/freeze.sh:

#!/usr/bin/env bash
pipe=$(mktemp -u).fifo
mkfifo "$pipe"
wayfreeze --after-freeze-timeout 100 --after-freeze-cmd "echo > $pipe" &
wayfreeze_pid=$!
read -r < "$pipe"
grim "$HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png"
kill "$wayfreeze_pid" 2>/dev/null
rm -f "$pipe"
bind=CTRL+SUPER,Print,spawn,$HOME/.config/mango/scripts/screenshot/freeze.sh

Freeze + Region

Freeze, then select a region with slurp. Cleans up on cancel.

~/.config/mango/scripts/screenshot/freeze-region.sh:

#!/usr/bin/env bash
pipe=$(mktemp -u).fifo
mkfifo "$pipe"
wayfreeze --after-freeze-timeout 100 --after-freeze-cmd "echo > $pipe" &
wayfreeze_pid=$!
read -r < "$pipe"
geometry=$(slurp -d)
if [[ -z "$geometry" ]]; then
  kill "$wayfreeze_pid" 2>/dev/null
  rm -f "$pipe"
  exit 1
fi
grim -g "$geometry" "$HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png"
kill "$wayfreeze_pid" 2>/dev/null
rm -f "$pipe"
bind=SHIFT+SUPER,Print,spawn,$HOME/.config/mango/scripts/screenshot/freeze-region.sh

Make all three scripts executable:

chmod +x ~/.config/mango/scripts/screenshot/*.sh

All-in-One Script

Prefer fewer files? A single script with subcommands covers every mode above. Place it in the same directory and use it in place of the individual scripts.

~/.config/mango/scripts/screenshot/screenshot.sh:

#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$HOME/Pictures/Screenshots"
filepath="$HOME/Pictures/Screenshots/$(date +%Y%m%d%H%M%S).png"

case "${1:-fullscreen}" in
  region)
    g=$(slurp -d); [ -z "$g" ] && exit 1
    grim -g "$g" "$filepath" ;;
  window)
    g=$(mmsg -x | awk '/x / {x=$3} /y / {y=$3} /width / {w=$3} /height / {h=$3} END {print x","y" "w"x"h}')
    [ -z "$g" ] && exit 1
    grim -g "$g" "$filepath" ;;
  freeze)
    p=$(mktemp -u).fifo; mkfifo "$p"
    wayfreeze --after-freeze-timeout 100 --after-freeze-cmd "echo > $p" & wp=$!
    read -r < "$p"; grim "$filepath"
    kill "$wp" 2>/dev/null; rm -f "$p" ;;
  freeze-region)
    p=$(mktemp -u).fifo; mkfifo "$p"
    wayfreeze --after-freeze-timeout 100 --after-freeze-cmd "echo > $p" & wp=$!
    read -r < "$p"; g=$(slurp -d)
    if [ -z "$g" ]; then kill "$wp" 2>/dev/null; rm -f "$p"; exit 1; fi
    grim -g "$g" "$filepath"
    kill "$wp" 2>/dev/null; rm -f "$p" ;;
  annotate)
    grim "$filepath"; satty --filename "$filepath" --output-filename "$filepath" --actions-on-enter save-to-file --early-exit ;;
  *) grim "$filepath" ;;
esac

Make the script executable:

chmod +x ~/.config/mango/scripts/screenshot/screenshot.sh

Then add the binds to config.conf:

bind=NONE,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh fullscreen
bind=SHIFT,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh region
bind=CTRL+SHIFT,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh window
bind=CTRL+SUPER,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh freeze
bind=SHIFT+SUPER,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh freeze-region
bind=SUPER,Print,spawn,$HOME/.config/mango/scripts/screenshot/screenshot.sh annotate