A Wayland native snapshot editing tool, inspired by Snappy on macOS
Go to file
2020-01-05 16:17:19 -05:00
.github/workflows revert:"chore(ci): run clang format during build" 2020-01-01 14:56:26 -05:00
.vscode chore(vscode): update launcher 2020-01-04 18:46:10 -05:00
docs/images docs(readme): update documentation 2019-12-28 19:50:47 -05:00
include feat(text): add controls in toggle panel 2020-01-05 16:17:19 -05:00
protocol wip(copy): handle data control protocol 2020-01-05 15:37:19 -05:00
res feat(text): add controls in toggle panel 2020-01-05 16:17:19 -05:00
src feat(text): add controls in toggle panel 2020-01-05 16:17:19 -05:00
.clang-format works, next is screencopy 2019-11-24 23:07:44 -05:00
.gitignore git: ignore glade backup file 2019-12-17 22:26:35 -05:00
LICENSE Initial commit 2019-11-19 00:21:06 -05:00
meson_options.txt feat: init project 2019-11-19 00:23:34 -05:00
meson.build feat(paint): introduce text paint 2020-01-03 23:53:08 -05:00
README.md docs(readme): update documentation 2020-01-04 15:13:23 -05:00
swappy.1.scd docs(man): update man page 2020-01-04 15:33:37 -05:00

swappy

A Wayland native snapshot and editor tool, inspired by Snappy on macOS. Works great with grim, slurp and sway. Also works with other screenshot tools if you use the -f option. See below.

Wayland code was largely taken from grim and requires a compositor that implements the wlr-screencopy-unstable-v1 protocol.

You can use this tool in two ways, either use it as the output of grim (recommended) or grab the geometry yourself (wayland code is still WIP).

Screenshot

Swappy Screenshot

Example usage

Output of grim (or any tool outputing a PNG file):

grim -g "$(slurp)" - | swappy -f -

Swappshot a PNG file (good for compositors not supporting screencopy protocol):

swappy -f "~/Desktop/my-gnome-saved-file.png"

Swappshot a region:

swappy -g "100,100 200x200"

Select a region and swappshot it:

swappy -g "$(slurp)"

Grab a swappshot from a specific window under Sway, using swaymsg and jq:

grim -g "$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)" - | swappy -f -
# Or
swappy -g "$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)"

Keyboard Shortcuts

  • Ctrl+b: Toggle Paint Panel

  • b: Switch to Brush
  • t: Switch to Text
  • r: Switch to Rectangle
  • o: Switch to Ellipse
  • a: Switch to Arrow

  • R: Use Red Color
  • G: Use Green Color
  • B: Use Blue Color
  • C: Use Custom Color
  • Minus: Reduce Stroke Size
  • Plus: Increase Stroke Size
  • Equal: Reset Stroke Size
  • k: Clear Paints (cannot be undone)

  • Ctrl+z: Undo
  • Ctrl+Shift+z or Ctrl+y: Redo
  • Ctrl+s: Save to file (see man page)
  • Ctrl+c: Copy to clipboard
  • Escape or q: Quit swappy

Limitations

  • Copy: Copy to clipboard won't work if you close swappy (the content of the clipboard is lost). This because GTK 3.24 has not implemented persistent storage. We need to do it on the Wayland level, or wait for GTK 4. For now, Paste your Swappshot where you want to before you close the app.

Installation

Building from source

Install dependencies:

  • meson
  • wayland
  • cairo
  • pango
  • gtk

Optional dependencies:

  • wayland-protocols (for the -g option to work with wlr-screencopy-unstable-v1 protocol).
  • libnotify (not get notified when swappshot is copied or saved).
  • scdoc to generate the man page

Then run:

meson build
ninja -C build

Contributing

Pull requests are welcome.

License

MIT