長らくX11とi3wmを使っていたが、重い腰を上げてWaylandに入門してみた。
Hyprland、Sway等、wl-toolsベースのWaylandコンポジタを使用している場合、スクリーンショット/スクリーンキャストを撮るには、grim や wf-recorder 等のツールを使う。 小さなユーティリティを柔軟に組み合わせて目的を達成するやり方が面白かったのでここにメモする。
- slurp - 画面領域を選択するためのシンプルなツール
- wl-clipboard - クリップボードを扱うためのコマンドラインユーティリティ ※
wl-paste
,wl-copy
コマンドが含まれる。 - grim - スクリーンショットユーティリティ
- wf-recorder - スクリーンレコーダー
- wl-screenrec - ハードウェアエンコーディングをサポートするハイパフォーマンスなスクリーンレコーダー
Arch Linuxを使っている場合はpacmanまたはお使いのAURヘルパーでかんたんにインストールできる。
$ paru -S slurp grim wl-clipboard wl-clipboard wf-recorder
画面全体のスクリーンショットは grim、スクリーンキャストは wf-recorder または wl-screenrec を使う。
grim screenshot.png
wf-recorder -f screencast.mp4
画面領域を選択するには、 slurp を使う。単に slurp
コマンドを起動するとマウスカーソルが「+」の形になり、適当な領域をマウスでドラッグすると <x>,<y> <width>x<height>
の形式で選択した領域の座標が標準出力される。
grim、wf-recorderには、いずれも画面領域の座標を指定できるオプション -g "<x>,<y> <width>x<height>"
があるので slurp の出力結果をそのまま渡せば、指定した画面領域のスクリーンショット/スクリーンキャストを撮ることができる。
# 選択した画面領域のスクリーンショットを撮る
grim -g "$(slurp)" screenshot.png
# または:
slurp | grim -g - screenshot.png
# 選択した画面領域のスクリーンキャストを撮る
wf-recorder -g "$(slurp)" -f screencast.mp4
# または:
slurp | wf-recorder -g - -f screencast.mp4
テキストやバイナリをクリップボードに格納するには wl-clipboard に含まれる wl-copy
コマンドを使う。
echo hello | wl-copy # テキスト "hello" をクリップボードに格納する。
wl-copy < picture.png # 画像ファイルの中身をクリップボードに格納する。
grim
はファイル名の代わりに -
を指定されるとスクリーンショットの画像データを標準出力する。
slurp | grim -g - - | wl-copy
SwayやHyprlandを使っている場合は、付属する制御用のコマンド swaymsg / hyprctl を使ってアクティブウィンドウの状態を取得できる。
結果はJSONで出力されるので、jq のユーティリティを使って<x>,<y> <width>x<height>
書式の文字列を作れば、grim 等のコマンドに渡せる。
$ swaymsg -t get_tree |
jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' |
grim -g - screenshot.png
注: swaymsg の出力形式はstdoutの接続先がパイプではなくコンソールの場合、JSONにならない場合がある。
$ hyprctl -j activewindow |
jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' |
grim -g - screenshot.png
メモ:
jq のデバッグが大変なときは、対話的に jq の評価結果が確認できる ijq やJSONのオブジェクトを折りたたんで less のように閲覧できる jlessをなどのツールを使う手もある。
オールインワンのアプリケーションを使う方法もあるが、小さなユーティリティをコマンドラインで組み合わせて目的を達成するやり方がLinuxらしい感じがして面白いと思った。 それぞれのコマンドの組み合わせ方まとめると下記のようになる。
-
画面領域を指定する
- 全画面
- マウスで領域を選択する: slurp
- アクティブウィンドウの領域を取得する: swaymsg や hyprctl など
-
スクリーンに映っている領域の画像/動画を取得する
- スクリーンショットを取得する: grim
- スクリーンレコードを取得する: wf-recorder または wl-screenrec
-
出力する
- ファイルに保存する:
grim <filename>
,wf-recorder -f <filename>
- クリップボードに格納する: wl-copy
- ファイルに保存する:
SwayやHyprlandの設定でキーボードショートカットを割り当てたり、 dmenuの代替であるbemenu を使って全画面を取得するか選択領域を取得するか選ばせる簡易的なメニューを作ってアレンジするのも便利だと思った。
ほぼArch Wikiの内容そのままですごめんなさい Arch Wikiいつもお世話になってます!