Wayland & MangoWC 環境でのスクリーンショットの撮りかた
grim と slurp というツールを使って、MangoWC 上でスクリーンショットを撮る方法を説明します。元ネタは下記のサイトです。
- Taking Screenshots on Waylandhttps://seeminglyrandom.net/posts/wayland-screenshot/
このリンク先の方法は Sway での使用を前提としていますが、それを MangoWC で使えるように改造します。
概要
ここでは次のように設定します。ご覧のとおり Windows を意識しております。
- PrtSc キーでフルスクリーンを撮る
- Super(Win) + PrtSc キーでフォーカスウィンドウを撮る ※
- Super(Win) + Shift + S キーで指定範囲を撮る
※ Alt + PrtSc にすれば Windows に合わせられると思ったんですが、なぜかその組み合わせはスルーされてしまって何事も起きませんでした。
grim と slurp のインストール
Wayland コンポジター上でスクリーンショットを撮るのに grim を使います。また、マウスドラッグで範囲を指定するのに slurp を使います。どちらも packages からインストール可能です。
# pkg install -y grim slurp
grim と slurp の使いかた
まずはコマンドラインから使ってみます。スクリーンショット保存用のディレクトリを作り
% mkdir ~/ss/
フルスクリーンのショットを撮って ~/ss/fullscreen.png に保存。
% grim ~/ss/fullscreen.png
slurp と組み合わせると、Windows の「Win + Shift + S」ばりにマウスドラッグで範囲を指定して撮ることができます。
% grim -g "$(slurp)" ~/ss/slurp.png
「{x},{y} {w}x{h}」という書式により範囲を細かく指定することもできます。
% grim -g "100,0 1024x768" ~/ss/manual.png
フォーカスウィンドウを撮るにはちょっと工夫が必要です。MangoWC のプロセス間通信 (IPC) 機能を使ってフォーカスウィンドウのジオメトリを取得し、それを set コマンドで分割し、必要なところだけ取り出して「{x},{y} {w}x{h}」形式に整形します。
フォーカスウィンドウのジオメトリは mmsg -x コマンドで取得できます。このコマンドの詳細については MangoWC 公式 Wiki の IPC のページを参照してください。
- mango ipc (mmsg)https://github.com/DreamMaoMao/mangowc/wiki/mango-ipc-(mmsg)
% mmsg -x
eDP-1 x 1068
eDP-1 y 35
eDP-1 width 842
eDP-1 height 515
これを set コマンドと組み合わせると、mmsg-x の出力をスペースで分割してシェル変数 $1, $2, $3, ... に格納することができます。
% set -- $(mmsg -x)
% echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12}
eDP-1 x 1068 eDP-1 y 35 eDP-1 width 842 eDP-1 height 515
というわけで、$3、$6、$9、${12} を使って書式を整えて、さっきと同じように grim -g に渡せば、フォーカスウィンドウのボーダーできっちりスクショすることができます。
% grim -g "$3,$6 ${9}x${12}" ~/ss/focuswindow.png
MangoWC 版 screenshot.sh
以上をふまえて、元ネタ版の screenshot.sh を MangoWC 版の screenshot.sh に改造します。コマンドライン引数として reg をとったら範囲指定、win をとったらフォーカスウィンドウ、all ならフルスクリーンを撮るようにします。
#!/bin/sh
mode="$1"
opath=~/ss
[ ! -d $opath ] && mkdir -p $opath
ofile=$opath/grim-$(date +%Y%m%d-%H%M%S).png
case $mode in
reg*)
grim -g "$(slurp)" $ofile
;;
win*)
set -- $(mmsg -x)
grim -g "$3,$6 ${9}x${12}" $ofile
;;
all)
grim $ofile
;;
*)
echo >&2 "usage: screenshot.sh <reg(ion)|win(dow)|all>"
exit 1
esac
このあとの説明の都合上、このスクリプトを ~/bin/ に置くことにします。そしてこのスクリプトに実行可能属性を付けます。
% chmod +x ~/bin/screenshot.sh
キーバインドの設定
あとは screenshot.sh にキーをバインドするだけです。MangoWC の設定ファイルの適当な位置に次の 5 行を追加します。
# screenshot
bind=NONE,Print,spawn_shell,~/bin/screenshot.sh all
bind=SUPER,Print,spawn_shell,~/bin/screenshot.sh win
bind=SUPER+SHIFT,s,spawn_shell,~/bin/screenshot.sh reg
layerrule=noanim:1,noblur:1,layer_name:selection
5 行目は 公式 Wiki からの受け売りで意味はよくわかってませんが、画面がきっちり静止した状態で撮影するための設定みたいです。
撮った画像は ~/ss/grim-<日付>-<時刻>.png に保存されます。