diff --git a/sway/.config/sway/config b/sway/.config/sway/config index 52dc207..07fa2f1 100644 --- a/sway/.config/sway/config +++ b/sway/.config/sway/config @@ -40,7 +40,7 @@ seat seat0 xcursor_theme catppuccin-mocha-lavender-cursors 25 # Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) # output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill -output * bg ~/.config/background.jpg fill +output * bg ~/.config/sway/wallpaper.jpg fill # # Example configuration: diff --git a/sway/.config/sway/grimshot.sh b/sway/.config/sway/grimshot.sh new file mode 100755 index 0000000..d90b5b7 --- /dev/null +++ b/sway/.config/sway/grimshot.sh @@ -0,0 +1,168 @@ +#!/bin/sh + +## Grimshot: a helper for screenshots within sway +## Requirements: +## - `grim`: screenshot utility for wayland +## - `slurp`: to select an area +## - `swaymsg`: to read properties of current window +## - `wl-copy`: clipboard utility +## - `jq`: json utility to parse swaymsg output +## - `notify-send`: to show notifications +## Those are needed to be installed, if unsure, run `grimshot check` +## +## See `man 1 grimshot` or `grimshot usage` for further details. + +getTargetDirectory() { + test -f "${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs" && \ + . "${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs" + + echo "${XDG_SCREENSHOTS_DIR:-${XDG_PICTURES_DIR:-$HOME/.cache/}}" +} + +NOTIFY=no +CURSOR= + +while [ $# -gt 0 ]; do + key="$1" + + case $key in + -n|--notify) + NOTIFY=yes + shift # past argument + ;; + -c|--cursor) + CURSOR=yes + shift # past argument + ;; + *) # unknown option + break # done with parsing --flags + ;; + esac +done + +ACTION=${1:-usage} +SUBJECT=${2:-screen} +FILE=${3:-$(getTargetDirectory)/$(date -Ins).png} + +if [ "$ACTION" != "save" ] && [ "$ACTION" != "copy" ] && [ "$ACTION" != "check" ]; then + echo "Usage:" + echo " grimshot [--notify] [--cursor] (copy|save) [active|screen|output|area|window] [FILE|-]" + echo " grimshot check" + echo " grimshot usage" + echo "" + echo "Commands:" + echo " copy: Copy the screenshot data into the clipboard." + echo " save: Save the screenshot to a regular file or '-' to pipe to STDOUT." + echo " check: Verify if required tools are installed and exit." + echo " usage: Show this message and exit." + echo "" + echo "Targets:" + echo " active: Currently active window." + echo " screen: All visible outputs." + echo " output: Currently active output." + echo " area: Manually select a region." + echo " window: Manually select a window." + exit +fi + +notify() { + notify-send -t 3000 -a grimshot "$@" +} +notifyOk() { + [ "$NOTIFY" = "no" ] && return + + TITLE=${2:-"Screenshot"} + MESSAGE=${1:-"OK"} + notify "$TITLE" "$MESSAGE" +} +notifyError() { + if [ $NOTIFY = "yes" ]; then + TITLE=${2:-"Screenshot"} + MESSAGE=${1:-"Error taking screenshot with grim"} + notify -u critical "$TITLE" "$MESSAGE" + else + echo "$1" + fi +} + +die() { + MSG=${1:-Bye} + notifyError "Error: $MSG" + exit 2 +} + +check() { + COMMAND=$1 + if command -v "$COMMAND" > /dev/null 2>&1; then + RESULT="OK" + else + RESULT="NOT FOUND" + fi + echo " $COMMAND: $RESULT" +} + +takeScreenshot() { + FILE=$1 + GEOM=$2 + OUTPUT=$3 + if [ -n "$OUTPUT" ]; then + grim ${CURSOR:+-c} -o "$OUTPUT" "$FILE" || die "Unable to invoke grim" + elif [ -z "$GEOM" ]; then + grim ${CURSOR:+-c} "$FILE" || die "Unable to invoke grim" + else + grim ${CURSOR:+-c} -g "$GEOM" "$FILE" || die "Unable to invoke grim" + fi +} + +if [ "$ACTION" = "check" ] ; then + echo "Checking if required tools are installed. If something is missing, install it to your system and make it available in PATH..." + check grim + check slurp + check swaymsg + check wl-copy + check jq + check notify-send + exit +elif [ "$SUBJECT" = "area" ] ; then + GEOM=$(slurp -d) + # Check if user exited slurp without selecting the area + if [ -z "$GEOM" ]; then + exit 1 + fi + WHAT="Area" +elif [ "$SUBJECT" = "active" ] ; then + FOCUSED=$(swaymsg -t get_tree | jq -r 'recurse(.nodes[]?, .floating_nodes[]?) | select(.focused)') + GEOM=$(echo "$FOCUSED" | jq -r '.rect | "\(.x),\(.y) \(.width)x\(.height)"') + APP_ID=$(echo "$FOCUSED" | jq -r '.app_id') + WHAT="$APP_ID window" +elif [ "$SUBJECT" = "screen" ] ; then + GEOM="" + WHAT="Screen" +elif [ "$SUBJECT" = "output" ] ; then + GEOM="" + OUTPUT=$(swaymsg -t get_outputs | jq -r '.[] | select(.focused)' | jq -r '.name') + WHAT="$OUTPUT" +elif [ "$SUBJECT" = "window" ] ; then + GEOM=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp) + # Check if user exited slurp without selecting the area + if [ -z "$GEOM" ]; then + exit 1 + fi + WHAT="Window" +else + die "Unknown subject to take a screen shot from" "$SUBJECT" +fi + +if [ "$ACTION" = "copy" ] ; then + takeScreenshot - "$GEOM" "$OUTPUT" | wl-copy --type image/png || die "Clipboard error" + notifyOk "$WHAT copied to buffer" +else + if takeScreenshot "$FILE" "$GEOM" "$OUTPUT"; then + TITLE="Screenshot of $SUBJECT" + MESSAGE=$(basename "$FILE") + notifyOk "$MESSAGE" "$TITLE" + echo "$FILE" + else + notifyError "Error taking screenshot with grim" + fi +fi diff --git a/sway/.config/sway/grimshot_watermark.sh b/sway/.config/sway/grimshot_watermark.sh new file mode 100755 index 0000000..fd466bd --- /dev/null +++ b/sway/.config/sway/grimshot_watermark.sh @@ -0,0 +1,22 @@ +#!/bin/sh +FILE=$(date "+%Y-%m-%d"T"%H:%M:%S").png +# Get the picture from maim +grimshot --notify save area ~/Pictures/src.png +# add shadow, round corner, border and watermark +convert $HOME/Pictures/src.png \ + \( +clone -alpha extract \ + -draw 'fill black polygon 0,0 0,8 8,0 fill white circle 8,8 8,0' \ + \( +clone -flip \) -compose Multiply -composite \ + \( +clone -flop \) -compose Multiply -composite \ + \) -alpha off -compose CopyOpacity -composite $HOME/Pictures/output.png +# +convert $HOME/Pictures/output.png -bordercolor none -border 20 \( +clone -background black -shadow 80x8+15+15 \) \ + +swap -background transparent -layers merge +repage $HOME/Pictures/$FILE +# +composite -gravity Southeast ~/.config/sway/watermark.png $HOME/Pictures/$FILE $HOME/Pictures/$FILE +# +# # Send the Picture to clipboard +wl-copy < $HOME/Pictures/$FILE +# +# # remove the other pictures +rm $HOME/Pictures/src.png $HOME/Pictures/output.png diff --git a/sway/.config/sway/wallpaper.jpg b/sway/.config/sway/wallpaper.jpg new file mode 100644 index 0000000..18df612 Binary files /dev/null and b/sway/.config/sway/wallpaper.jpg differ