NixOS-Config/home-manager/sway/swayshot.nix

88 lines
2.7 KiB
Nix
Raw Normal View History

2024-08-24 22:16:51 -04:00
{pkgs, ...}: {
home.packages = let
# Use grim and slurp to take screenshots in multiple ways
swayShot = let
border = import ../common/border.nix;
colors = import ../common/colors.nix;
2024-08-24 22:16:51 -04:00
in pkgs.writeScriptBin "swayshot" ''
# Swappy
handle_swappy() {
# Create an imv window to act as a static screen
grim -t jpeg - | imv -w "GlobalShot" - & imv_pid=$!
# Capture the screenshot of the selected area and save to a temporary file
selected_area=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"'\
| XCURSOR_SIZE=40 slurp -w ${border.weight} -c ${colors.prime} -B 00000066 -b 00000099)
temp_file=$(mktemp -u).png
grim -g "$selected_area" "$temp_file"
# Kill the imv window
kill $imv_pid
# Copy the screenshot to the clipboard
swappy -f - < "$temp_file"
# Clean up the temporary file
rm "$temp_file"
}
# Current
handle_current() {
# Take a screenshot and save it to the temporary file
temp_file=$(mktemp -u).png
grim -o $(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .name') "$temp_file"
# Check if the screenshot was successfully taken
if [ $? -eq 0 ]; then
# Copy the screenshot to the clipboard
wl-copy < "$temp_file"
# Show a notification with the screenshot
notify-send -i "$temp_file" "Current screen copied."
# Remove the temporary file
rm "$temp_file"
else
# If the screenshot capture failed, show an error notification
notify-send "Error: Unable to capture screenshot."
fi
}
# All screens
handle_all() {
# Take a screenshot and save it to the temporary file
temp_file=$(mktemp -u).png
grim -t jpeg "$temp_file"
# Check if the screenshot was successfully taken
if [ $? -eq 0 ]; then
# Copy the screenshot to the clipboard
wl-copy < "$temp_file"
# Show a notification with the screenshot
notify-send -i "$temp_file" "All screen copied."
# Remove the temporary file
rm "$temp_file"
else
# If the screenshot capture failed, show an error notification
notify-send "Error: Unable to capture screenshot."
fi
}
# Check for command-line arguments
if [ "$1" == "--swappy" ]; then
handle_swappy
elif [ "$1" == "--current" ]; then
handle_current
elif [ "$1" == "--all" ]; then
handle_all
else
echo "Please use the arguments swappy, current, or all."
fi
'';
in with pkgs; [
swayShot
];
}