7

gdk_screen_get_monitor_geometryを使用すると、2つ以上が単一の画面として使用されている場合でも、ピクセル単位の総面積と各モニターの相対位置を取得できます。

ただし、各モニターの使用可能領域(つまり、パネルを除く)を取得したいと思います。私が見つけたのは_NET_WORKAREAだけですが、それはすべてのモニターにまたがる1つの巨大な領域です。解像度と配置によっては、この領域内にパネルがある場合があります。

各モニターの実際の使用可能領域を取得するにはどうすればよいですか?理想的には、Gtk / Gdkのみを使用し、X11固有のものは何も使用しません。

4

2 に答える 2

2

次のアプローチは少し複雑ですが、私が使用するのはそれです。ウィンドウがマップされている場合、たとえば一部のパネルが自動的に非表示になっている場合など、ウィンドウマネージャーとGTK+の間に複雑な相互作用がある場合でも堅牢である必要があります。

基本的な考え方は、画面ごとに装飾のない透明な最大化ウィンドウを作成し、マップされたときにそのジオメトリ(サイズと位置)を取得して(たとえば、map-eventコールバックを使用して)、すぐに破棄することです。これにより、各画面内の使用可能な領域が得られます。次に、既存のgdk_screen_get_monitor_geometry()アプローチを使用して、使用可能な領域がモニター間でどのように分割されているかを判別できます(存在する場合)。

詳細に:

を使用gdk_display_get_default()してデフォルトの表示を取得し、次にgdk_display_get_n_screens()画面の数を確認します。

を使用して各画面に新しいウィンドウを作成し、を使用してウィンドウをそれぞれの画面gtk_window_new()に移動しますgtk_window_set_screen()。を使用してウィンドウの装飾をgtk_window_set_decorated(,FALSE)解除し、を使用してウィンドウを最大化しgtk_window_maximize(,TRUE)、を使用してウィンドウを透明にしgtk_window_set_opacity(,0.0)ます。map-eventシグナルをコールバックハンドラーに接続します(を使用g_signal_connect())。を使用してウィンドウを表示しますgtk_widget_show()

シグナルハンドラは、を呼び出したり、新しくマップされたウィンドウの位置やサイズを取得しgtk_window_get_position()たりしてから、を使用してウィンドウを破棄する必要があります。gtk_window_get_size()gtk_widget_destroy()

実際には、必要なウィンドウは1つだけであることに注意してください。私は個人的に単純なループを使用します。ウィンドウマネージャーの奇妙な点やバグが原因で、画面間で同じウィンドウを移動するよりも、画面ごとに新しいウィンドウを作成する方がはるかに堅牢であると思われます。単一の単純なコールバック関数を使用して各画面の使用可能領域を取得できるため、これも簡単であることがわかります。

私が言ったように、これはかなり複雑です。一方、標準のアプリケーションは画面サイズを気にする必要はありません。ユーザーまたはウィンドウマネージャーが要求することを実行するだけです。そのため、この情報を見つけるためのより良い施設がなくても驚かないでしょう。画面サイズは、ユーザーがディスプレイを回転させたり、ディスプレイの解像度を変更したりした場合など、いつでも変更される可能性があります。

于 2012-06-24T04:59:33.377 に答える
1

結局、私はxlibを直接使用することになり、上記のようなさまざまな「トリック」は、最終的には、多くの場合、奇妙なコーナーケースで長期的に失敗し、KISSの原則に従わなかった。

私が使用したソリューションは、X-Tileコードベースにあります。

于 2012-07-15T23:27:34.460 に答える