Niecały tydzień temu pod wpisem "Minimalizm nade wszystko" pojawił się komentarz Blogrysa, w którym ów narzeka na brak opcji powtórzenia zrzutu ekranu tego samego obszaru co ostatnio, bez konieczności ponownego wskazywania czegokolwiek myszą.
Niniejszym pokazuję i omawiam w jaki sposób można osiągnąć pożądany efekt bez opuszczania krainy rozwiązań minimalnych.
Zaczniemy od końca, czyli jak wyglądało moje oryginalne rozwiązanie:
Pod klawisz skrótu podkładamy komendę maim -s -u | xclip -selection clipboard -t image/png, która składa się z dwóch kawałków:
maimto maleńki program (nazwa jest skrótem od angielskiego make image), który potrafi robić zrzuty ekranu w różnych formatach i posługując się różnymi metodami wskazywania, o który kawałek ekranu nam chodzi. W tym przypadku używamy opcji-soznaczającejselectczyli wybór myszą, oraz dodatkowo-udo ukrycia kursora tejże myszy, żeby się nie wtranżalał między wódkę a brzeg pucharu.xclipz kolei zapisuje dane do schowka systemowego (opcja-selection clipboard), dodatkowo wymuszamy formatpng.
Proste? Proste. Intuicyjne? Niekoniecznie. Ale działa.
No i teraz przychodzi taki Borys, cały na biało i mówi, że się nie da powtórzyć screenshota z tego samego obszaru, bezklikowo.
Nie da się: żyć wiecznie, uniknąć płacenia podatków oraz - podobno - założyć hełmu na lewą stronę, choć z tym ostatnim to też kwestia dyskusyjna, bo raz, kwestia twardości głowy, a dwa, jak się kogoś bardzo nie lubi to i hełm, i parasol, wiadomo.
O czym to ja. A, właśnie. Powtórka screenshota.
Najpierw trzeba sobie zapisać koordynaty oryginalnego screenshota.
Bo bez kamieni nie ma budulca, bez budulca nie ma pałacu...

Jak? Aplikacja maim nie potrafi zwrócić współrzędnych wybranych przez użytkownika, musimy więc dodać do zestawu trzeci klocek pod tytułem slop - to program, który pozwala zaznaczyć myszą prostokątny obszar, a następnie zwraca współrzędne tego obszaru, w formacie szerokość x wysokość + x + y (tylko bez spacji), o tak:
slop
203x168+1132+700
To znaczy, że użytkownik wybrał myszą obszar o rozmiarze 203 na 168 pikseli, z górnym lewym narożnikiem w punkcie 1132 x 700.
Co nam to daje?
Okazuje się, że maim akceptuje również parametr -g (geometria), o wartości sformatowanej identycznie jak to, co wypluwa slop. Przypadek? Nie wydaje mnie się.
Dalej już prosto. Dwa skrypty: jeden czeka aż użytkownik zaznaczy prostokąt, potem zapisuje współrzędne do lokalnego pliku i robi zrzut ekranu (do schowka). Drugi - czyta współrzędne z tegoż pliku i robi zrzut ekranu (też do schowka). Jeden skrypt nazwałem tinyshot-select, drugi zaś tinyshot-repeat. Zawartość jak następuje:
#!/usr/bin/env bash
set -euo pipefail
### TINYSHOT - SELECT ###
cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}"
geometry_file="$cache_dir/tinyshot-geometry"
mkdir -p "$cache_dir"
geom="$(slop -f '%wx%h+%x+%y')"
printf '%s\n' "$geom" >"$geometry_file"
maim -u -g "$geom" | xclip -selection clipboard -t image/png
#!/usr/bin/env bash
set -euo pipefail
### TINYSHOT - REPEAT ###
cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}"
geometry_file="$cache_dir/tinyshot-geometry"
if [[ ! -s "$geometry_file" ]]; then
printf 'tinyshot-repeat: no saved geometry found at %s\n' "$geometry_file" >&2
exit 1
fi
geom="$(<"$geometry_file")"
maim -u -g "$geom" | xclip -selection clipboard -t image/png
Podpinam jeden skrypt pod jeden skrót klawiszowy, drugi pod drugi - i już. Wszystko za darmo, przy użyciu standardowych linuksowych narzędzi i bez potrzeby robienia doktoratów z ekranozrzucologii stosowanej.
Kolejnym ulepszeniem mogłoby być automagiczne zapisywanie zrzutów do plików (o przyjaznych nazwach typu tinyshot-20260602.131739.319.png) zamiast tylko do schowka. Ale już mi się nie chciało dalej kombinować.
Smacznego!
-- Kuchcik
Ja nie linuksowiec, więc nie bij.
A po co dwa skrypty? A nie jeden?
W sensie wykonać rzut ostatniej pozycji, poczekaj x czasu i wykryj czy użytkownik wykonał znowu myszą i zaznaczył nowy obszar, jeśli tak wykonaj rzut jeszcze raz i nadpisz poprzedni.
A jeśli użytkownik wykonał dubelclick (da się na klawiaturze?), to zrób rzut całego ekranu.
Przeczytaj komentarz Borysa z oryginalnego wpisu (link w treści). Używa(ł) on opcji powtórnego zrzutu tego samego obszaru do „skanowania” książek zabezpieczonych DRM. A więc: pierwszą stronę zrzucamy tradycyjnie, zaznaczając prostokąt, a do kolejnych już nie musimy nic zaznaczać, bo okienko przeglądarki się nie rusza. To są dwie osobne funkcje (a więc i skrypty) i dlatego powinny być podpięte pod dwa różne skróty. W przeciwnym razie skąd skrypt ma „wiedzieć” czy użytkownik chce znów zrzucić ten sam obszar co poprzednio, czy nowy? Oczywiście można zamiast tego całość zamknąć w jednym skrypcie (z parametrem), ale to już technikalia.
No właśnie:
1) uruchamiasz skrypt
2) robisz rzut ostatniego obszaru (przy założeniu, iż jestem już na n+1 stronie książki), jeśli to jest pierwsze użycie, przechodzisz do pkt. 3
3) robisz sleep powiedzmy na 10s i czekasz, czy użytkownik zaznaczy nowy obszar
4A) użytkownik nie zaznaczył nowego obszaru – kończysz skrypt
4B) użytkownik zaznacza obszar
5) robisz rzut obszaru z pkt. 4B i usuwasz rzut z pkt. 2
6) kończysz program
——
Przy takim algorytmie, wydaje mi się, iż powinno działać jako jeden skrypt. Ja po prostu odwróciłem kolejność logiki. Ja najpierw działa jak by to był n+1 rzut, a dopiero potem zachowuję jak by to był pierwszy rzut.
Znakomity pomysł! Dzięki! Ja nie będę chyba tworzył katalogu .cache, tylko zapisywał prosto do .tinyshot-geometry w $HOME.
To, jak połączyłeś maim, slop i xclip jest, swoją drogą, świetną ilustracją uniksowej/linuksowej filozofii „one program does one thing and does it well”.
Pozwolę sobie na dygresję do wpisu:
Dawno się tak nie uśmiałem czytając wpis na czyimś blogu xD. Czułem się, jakbym obserwował spotkanie pod blokiem i przedstawianie swoich racji (nikt nie będzie nam mówił że białe jest białe i czarne jest czarne). Nie w jakimś złym tego słowa znaczeniu, bardzo sympatycznie 😀
tak w ogole to po co tyle kombinujecie :-0 aczkolwiek, rozumiem to. Ja z kolei bardzo doceniam Gradię (https://gradia.alexandervanhee.be/), ma wszystko to, czego mi brakowało po przejściu z Win11 na Ubuntu (greenshot).