次のアプローチは少し複雑ですが、私が使用するのはそれです。ウィンドウがマップされている場合、たとえば一部のパネルが自動的に非表示になっている場合など、ウィンドウマネージャーと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つだけであることに注意してください。私は個人的に単純なループを使用します。ウィンドウマネージャーの奇妙な点やバグが原因で、画面間で同じウィンドウを移動するよりも、画面ごとに新しいウィンドウを作成する方がはるかに堅牢であると思われます。単一の単純なコールバック関数を使用して各画面の使用可能領域を取得できるため、これも簡単であることがわかります。
私が言ったように、これはかなり複雑です。一方、標準のアプリケーションは画面サイズを気にする必要はありません。ユーザーまたはウィンドウマネージャーが要求することを実行するだけです。そのため、この情報を見つけるためのより良い施設がなくても驚かないでしょう。画面サイズは、ユーザーがディスプレイを回転させたり、ディスプレイの解像度を変更したりした場合など、いつでも変更される可能性があります。