最近、久しぶりにRaspberryPiを使用したら、「あれ?スクリーンショットの画像が真っ暗になるぞ?」と焦りました😭
スクリーンショットが真っ黒になっている
「もしかして、ハードや設定がおかしくなった?」とドキドキします。これは、OSのアップデートで起こった大きな変化、Wayland(ウェイランド)の採用が原因になっていました。
Wayland(ウェイランド)は、LinuxなどのUNIX系OSで、アプリケーションの画面描画や入力処理を司る新しいディスプレイサーバプロトコルです。長年にわたりLinuxのウィンドウシステムとして使われてきたX Window System(X11)の後継となることを目指して開発されました。
なぜscrot
は動かなくなったのか?
X11からWaylandへの移行
これまでのRaspberryPi(OS)で主流だったのはX11という表示システムでした。このX11では、アプリケーションが他のウィンドウの内容を比較的簡単にキャプチャすることができていました。変更されたWaylandはX11に比べて以下の特徴があります。
- モダンで高性能
- セキュリティが大幅に強化
- プライバシー保護を重視
変更というよりもモダナイズと言ったほうがいいのかもしれません。
Waylandの新しい「お作法」とは?
Waylandは「スクリーン全体を勝手に撮るなんて、プライバシー的にどうなの?」という考え方を採用しています。そのため、コンポジター(Waylandのウィンドウマネージャー)が許可したツールでしか画面情報にアクセスできなくなりました😨
つまり、X11では、ディスプレイサーバ(Xサーバ)とウィンドウマネージャーが別々の役割を担っていましたが、Waylandでは、これらの機能をコンポジタと呼ばれる1つのプログラムに統合しています。
例えるなら、「写真を撮るには、警備員(コンポジター)に許可をもらって専用カメラを使わないといけない」というルールができたようなものです。これが、従来のX11ベースのツールが機能しなくなった理由となります。
grim
と slurp
を組み合わせた新しい方法
新しくなってもちゃんと手段は存在します。Waylandでは、きちんと作法を守ってスクリーンショットを撮るためのツールがあり、それがgrim
とslurp
となります。
ツールの特徴
インストールと使い方
1. まずはインストール!
ターミナルを開いて、以下のコマンドを実行しましょう。
$ sudo apt update $ sudo apt install grim slurp
これで準備完了です!
2. 画面全体をキャプチャ(grim
単体)
一番シンプルなのがgrim
単体での使用です。実行すると、即座に画面全体がファイルとして保存されます。
$ grim ~/Pictures/my_full_screen.png
問題なくスクリーンショットが作成できました
ファイル名を変えれば、連番での保存も簡単にできます。
3. 範囲を指定してキャプチャ(slurp
+ grim
)
今までのscrot -s
と同じように、マウスで範囲指定して撮りたい場合は、slurp
と組み合わせます。
役割分担
slurp
… どの範囲を撮るか座標を決定grim
… その情報を受け取って実際にキャプチャ
これらをパイプ(|
)でつなぐのが、Wayland時代のスマートなやり方です!
$ slurp | grim -g - ~/Pictures/partial_capture.png
このコマンドを実行すると…
- 画面が少し暗くなる
- 十字カーソルが表示される
- 撮りたい場所をドラッグして囲む
- 自動的にファイルが保存される
キーボードで打ち込む量はあるものの、慣れた操作感になると思います。
指定エリアのスクリーンショットも可能
4. 遅延撮影でメニューも撮れる!(sleep
+ grim
)
メニューやドロップダウンを開いた状態でスクリーンショットを撮りたい時は、sleepコマンドと組み合わせて遅延撮影ができます。
$ sleep 5 && grim ~/Pictures/delayed_capture.png
このコマンドを実行すると、5秒後に自動的にスクリーンショットが撮影されます。その間にメニューを開いたり、ツールチップを表示したスクリーンが可能です。
遅延した画面も問題なく作成できます
便利な活用テクニック
ショートカットキーの設定
流石に毎回ターミナルでコマンドを打つのが面倒なので、以下の方法で効率化できます。
シェルのエイリアス設定(~/.bashrc
に追加)
alias screenshot-full='grim ~/Pictures/screenshot_$(date +%Y%m%d_%H%M%S).png' alias screenshot-area='slurp | grim -g - ~/Pictures/screenshot_$(date +%Y%m%d_%H%M%S).png' alias screenshot-delay='sleep 5 && grim ~/Pictures/screenshot_delayed_$(date +%Y%m%d_%H%M%S).png'
設定後はsource ~/.bashrcを行うか、ターミナルを再起動すると使えるようになります。
使用例
- screenshot-full → 即座に全画面撮影
- screenshot-area → マウスで範囲選択して撮影
- screenshot-delay → 5秒待ってから撮影
デスクトップ環境のショートカットキー設定
上記の設定が終わったら、お使いのデスクトップ環境の設定から、上記のAliasを任意のキーに割り当ててください。
クリップボードへの直接コピー
wl-clipboard
パッケージと組み合わせることで、ファイル保存せずに直接クリップボードへコピーも可能です。
$ grim - | wl-copy
おわりに
Waylandの採用によって変更がありましたが、grim
とslurp
を使いこなせば、以前同様にスクリーンショットを作成することができますね!
少し苦言をいうよすれば、scrotがデフォルトでインストールされている点でしょうか。使えないならインストールしなくても…
あと、なぜ今まで気が付かなかったのかというと、リモートデスクトップ接続でRaspberryPiを使用しているからでした💦たまには本体で触るのも大切なのかもしれません。