Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sheepla/2dee9cee224b992cf9912f926b59cbd5 to your computer and use it in GitHub Desktop.
Save sheepla/2dee9cee224b992cf9912f926b59cbd5 to your computer and use it in GitHub Desktop.
小さな道具を組み合わせてWayland環境でスクリーンショット/スクリーンキャストを撮る

📸小さな道具を組み合わせてWayland環境でスクリーンショット/スクリーンキャストを撮る

長らくX11とi3wmを使っていたが、重い腰を上げてWaylandに入門してみた。

Hyprland、Sway等、wl-toolsベースのWaylandコンポジタを使用している場合、スクリーンショット/スクリーンキャストを撮るには、grimwf-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> の形式で選択した領域の座標が標準出力される。

grimwf-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)

SwayやHyprlandを使っている場合は、付属する制御用のコマンド swaymsghyprctl を使ってアクティブウィンドウの状態を取得できる。 結果はJSONで出力されるので、jq のユーティリティを使って<x>,<y> <width>x<height> 書式の文字列を作れば、grim 等のコマンドに渡せる。

🌳 Sway

$ swaymsg -t get_tree | 
    jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | 
    grim -g - screenshot.png

: swaymsg の出力形式はstdoutの接続先がパイプではなくコンソールの場合、JSONにならない場合がある。

💧 Hyprland

$ 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らしい感じがして面白いと思った。 それぞれのコマンドの組み合わせ方まとめると下記のようになる。

  1. 画面領域を指定する

    1. 全画面
    2. マウスで領域を選択する: slurp
    3. アクティブウィンドウの領域を取得する: swaymsghyprctl など
  2. スクリーンに映っている領域の画像/動画を取得する

    1. スクリーンショットを取得する: grim
    2. スクリーンレコードを取得する: wf-recorder または wl-screenrec
  3. 出力する

    1. ファイルに保存する: grim <filename>, wf-recorder -f <filename>
    2. クリップボードに格納する: wl-copy

SwayやHyprlandの設定でキーボードショートカットを割り当てたり、 dmenuの代替であるbemenu を使って全画面を取得するか選択領域を取得するか選ばせる簡易的なメニューを作ってアレンジするのも便利だと思った。

参考

ほぼArch Wikiの内容そのままですごめんなさい Arch Wikiいつもお世話になってます!

Arch Wiki - スクリーンショット # Wayland

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment