1 ポイント 投稿者 GN⁺ 2024-10-15 | 1件のコメント | WhatsAppで共有
  • clipscreenは、画面の特定領域をミラーリングする仮想モニターを作成し、その領域を緑色の長方形で表示するシンプルなX11アプリケーション
  • Google Meet、Microsoft Teams、Jitsi Meetのような画面共有ツールで、全画面や個別ウィンドウの代わりに仮想モニターを共有できる
  • 共有したいウィンドウを緑色の枠内に移動するだけでよいため、複数のウィンドウを個別に共有したり、共有対象を切り替えたりする必要が減る
  • 実行は./clipscreen <width>x<height>+<x>+<y>形式で、hacksawslopを併用すると対話的な領域選択も可能
  • Linuxとxorgでのみテストされており、ほかのシステムで動作するかは保証されていない

clipscreenの機能

  • clipscreenは、画面の一部を複製する仮想モニターを生成するアプリケーション
  • 指定した画面領域は緑色の長方形で強調表示される
  • ユーザーは通常のビデオ会議の画面共有ツールで、この仮想モニターを共有できる
    • 例: Google Meet
    • Microsoft Teams
    • Jitsi Meet

画面共有の仕組み

  • 画面全体を共有したり個別のウィンドウを別々に共有したりする代わりに、clipscreenが作成した仮想モニターを共有する
  • 共有したいウィンドウは緑色の枠内へ移動すればよい
  • 複数のウィンドウを扱う際に、共有ウィンドウを何度も切り替えなくてよい方式

ビルド要件

  • システムには次の項目が必要
    • X11開発ライブラリ

      • Cairoグラフィックライブラリ
      • Cコンパイラ、例: gcc
      • Ubuntu 24.04では次のコマンドで必要なライブラリをインストールできる
apt-get install libx11-dev xserver-xorg-dev xorg-dev libcairo2-dev gcc
- ビルドは次のコマンドで実行する
make
- アプリケーションは**Linuxとxorg**でのみテストされており、ほかのシステムで動作するかは確実ではない

使い方

  • コンパイルした実行ファイルは次の形式で実行する
./clipscreen <width>x<height>+<x>+<y>
  • 引数はオーバーレイと仮想モニターの位置とサイズを指定する
    • <width>: オーバーレイと仮想モニターの幅
    • <height>: オーバーレイと仮想モニターの高さ
    • <x>: オーバーレイと仮想モニターの左上のx座標
    • <y>: オーバーレイと仮想モニターの左上のy座標
  • 例は次のとおり
./clipscreen 800x600+100+100
  • このコマンドは、画面の(100, 100)位置から始まる800x600のオーバーレイウィンドウを生成する

対話的な領域選択と終了

  • 領域を対話的に選択するには、hacksawまたはslopと一緒に実行できる
./clipscreen $(hacksaw)
./clipscreen $(slop)
  • 関連ツール
  • 終了するには、アプリケーションを実行しているターミナルでCtrl+Cを押せばよい

1件のコメント

 
GN⁺ 2024-10-15
Hacker News のコメント
  • 49インチのウルトラワイドモニターで Google Meet の画面共有が不便だった。ウィンドウ1つか画面全体しか共有できず、画面の一部領域は共有できなかったため。
    そこで xrandr 拡張を使って特定の領域を仮想モニターとしてミラーリングし、その仮想モニターを共有できる小さなツールを作った。
    詳細はブログ記事にある: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...
    • 大きな画面を使えるときには本当に便利そう。27インチ画面は49インチほど作業領域が広くないので、別の Xephyr ウィンドウを DISPLAY 9 として立ち上げ、その画面に複数のウィンドウを載せるスクリプトを使っている。
      デモ環境としてこのように使っている: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
  • これがどれほど単純かが気に入った。コメントを除けば C++ 100行そこそこなので、こういう点のせいで Wayland より X11 のほうを好むようになる。
    • コードが少し変だ。XLib イベントループがなく、SIGINT を受けるまでループ内で sleep(100) を呼んでいる。
      そのため、特に理由もなく CPU 使用率が高くなる可能性がある。
    • Wayland では xdg-desktop-portal API でキャプチャを開始すると、ユーザーに通知を表示し、キャプチャする領域を選ばせてくれる。
    • 既存の物理ディスプレイと重なる仮想 Xrandr ディスプレイを作るのは、ほとんど他のウィンドウシステムでは簡単にはできない、優雅な X.org の持ち芸に近い。
      SIGINT 以外の方法で終了すると仮想出力だけが残り、オーバーレイウィンドウは消えることがあり、少し不格好だが大きな問題ではない。ただし、コード行数を品質やエレガンスの尺度として過度に見ないほうがいい。
      この方法は Wayland ではそのままでは不可能だ。その代わり Wayland では、そもそもこのツールが不要かもしれない。権限のないプロセスが画面をキャプチャする標準的な方法はデスクトップポータルであり、少なくとも KDE は画面の矩形キャプチャを含め、さまざまなキャプチャオプションをサポートしている。X.org アプリを実行中でも、XWaylandVideoBridge のおかげで可能だと思われる。
      D-Bus があちこちで使われるのはあまりうれしくないが、org.freedesktop.impl.portal.ScreenCast の実装を差し替えれば、望む画面キャプチャ動作をほぼ置き換えられる点はよい。各アプリがキャプチャ対象の選択機能をばらばらに実装するよりは良い方向だと思う。
    • コードが非常に少ないのは、エラー処理と妥当性チェックがほとんどないためだ。
      X11 がハックしやすくて格好いい、という意味ではないわけではないが、完璧な使い方だけを前提にしないなら、コードは肥大化して複雑になり、その分堅牢になる。
      例えば ./clipscreen 1 2 3 4 を実行してみればいい。
    • 欠点が多いという数十年にわたる議論を否定するつもりはないが、X11 が今となっては利用可能なデスクトップグラフィックス環境の中で最も単純でハックしやすい環境のように見えるほどになったのは驚きだ。
      何かいじりたければすぐにできる。ICCCM は90年代初頭にさんざん批判されたが、他方にはそれに相当するものがなく、今でもウィンドウマネージャー領域では新しい試みが出続けている。
  • Zoom では画面やウィンドウを1つだけでなく、複数共有できたと記憶している。共有したいウィンドウをクリックするときに SHFT キーを押せばよい。
    • こういう機能はいったいどうやって見つけるのだろう?
  • これは文字どおり xrandr だけでもできる。
    xrandr --setmonitor screenshare 2560/1x1440/1+0+0 none
    • 選択を対話式にしたいなら、こうすればよい。
      geo=$(slop -f '%w/1x%h/1+%x+%y') && xrandr --setmonitor screenshare "$geo" none
    • 公平に言えば、このツールも結局その作業とオーバーレイを C++ でやっているものだ。
      それでも見事なワンライナーだ。
  • OBS でも Wayland を含むどのプラットフォームでも、これができるのではないか? いくつかコメントを読んでいると、多くの人が OBS を知らないのか、それとも自分が OBS の機能を過大評価しているように思える。
    • おそらく可能だろう。OBS を使ったことはないが、おそらく 20KB のバイナリよりは少し大きいはずだ。
    • 可能ではあるが、もう少し手間がかかる。GUI で複数の手順を踏む必要があり、会議の前に毎回調整しなければならないなら、かなり面倒になる。
    • OBS はウィンドウ1つかアプリのクライアント領域だけを共有できるようにしてくれる。
  • 49インチモニターでは、OBS、マウス追従スクリプト、ノートPC画面上の OBS プレビューウィンドウを組み合わせ、ノートPC画面全体を共有している。
    そうすると、他の人がノートPCで見るのに適したウィンドウサイズかどうかが分かり、プレビューがマウスを追従しながら、ズームレベルとマウス境界をその場で調整できる。
    OBS プレビューウィンドウは起動時にメインの OBS ウィンドウなしで開くので、その後はメインの OBS ウィンドウやアプリを見る必要も操作する必要もなく、スタンドアロンのように感じられる点がよい。
    https://github.com/BlankSourceCode/obs-zoom-to-mouse
  • KDE 6.1、Wayland、Chromium で Jitsi のようなサービスの共有ボタンを押すと、まず Entire Screen 共有オプションが出て、続いて Full WorkspaceNew Virtual OutputRectangular Region、そしてディスプレイ一覧のあるダイアログが表示される。
    Rectangular Region は選択した画面の一部を共有でき、New Virtual Output は KDE Display Configuration に表示される仮想画面を即座に作成する。この仮想画面は既存の物理ディスプレイ上に重ねて配置される場合もあれば、そうでない場合もある。
  • 本当に素晴らしい。Linux ではまさにこのユースケースのために、当社は Meet ではなく Zoom を選んだ。
    • 自分でビルドしたあと、GIMP で画面全体のスクリーンショットを撮って、必要な幅・高さ・x/y 座標を調べ、Google Meet でテストしてみた。完璧に動作した。
  • xzoom でもこれができ、1倍以上の拡大も可能だが、何か自分が見落としている利点があるのだろうか?
  • なぜ現在のビデオ会議プラットフォームで、いまだにこの要望が満たされていないのか気になる。巨大モニターはますます一般的になっているし、特にこういうツールを作る開発者にとってはなおさらだろうに。
    • OBS で回避する方法がそれほど難しくないからかもしれない。