Poniższe podejście jest nieco skomplikowane, ale to jest to, czego bym użył. Powinien być odporny nawet wtedy, gdy występuje skomplikowana interakcja między menedżerem okien a GTK +, gdy okno jest mapowane - na przykład, gdy niektóre panele są automatycznie ukrywane.
Podstawową ideą jest stworzenie przezroczystego okna bez dekoracji dla każdego ekranu, uzyskanie jego geometrii (rozmiaru i położenia) podczas mapowania (na przykład przy użyciu wywołania zwrotnego map-event
) i natychmiastowe ich zniszczenie. Dzięki temu uzyskasz użyteczny obszar na każdym ekranie. Następnie możesz użyć istniejącego podejścia gdk_screen_get_monitor_geometry()
, aby określić, w jaki sposób obszar użytkowy jest podzielony między monitory, jeśli takie istnieją.
W szczegółach:
Zastosowanie gdk_display_get_default()
uzyskać wyświetlanie domyślnej, a następnie gdk_display_get_n_screens()
aby dowiedzieć się, ile ma ekrany.
Utwórz nowe okno dla każdego ekranu, używając gtk_window_new()
, przesuwając okna do odpowiednich ekranów za pomocą gtk_window_set_screen()
. Odepnij okna, używając gtk_window_set_decorated(,FALSE)
, zmaksymalizuj je, używając gtk_window_maximize(,TRUE)
, i uczyń je przezroczystymi przy użyciu gtk_window_set_opacity(,0.0)
. Podłącz sygnał map-event
do programu obsługi wywołania zwrotnego (używając g_signal_connect()
). Pokaż okno, używając gtk_widget_show()
.
obsługi
Sygnał musi zadzwonić gtk_window_get_position()
i/lub gtk_window_get_size()
aby uzyskać pozycję i/lub wielkość nowo odwzorowanym okna, a następnie zniszczyć okno używając gtk_widget_destroy()
.
Należy pamiętać, że w praktyce potrzebne jest tylko jedno okno. Osobiście użyłbym prostej pętli. Podejrzewam, że z powodu dziwactw/błędów menedżera okien jest o wiele bardziej odporne na tworzenie nowego okna dla każdego ekranu, niż po prostu przesuwanie tego samego okna między ekranami. Okazuje się, że jest to łatwiejsze, ponieważ można użyć pojedynczej prostej funkcji wywołania zwrotnego, aby uzyskać obszar użytkowy dla każdego ekranu.
Tak jak powiedziałem, jest to dość zawiłe. Z drugiej strony, standardowa aplikacja nie powinna przejmować się rozmiarami ekranu; powinien po prostu zrobić to, o co prosi użytkownik lub menedżer okien. Z tego powodu nie zdziwiłbym się, gdyby nie było lepszych możliwości zdobycia tych informacji. Rozmiar ekranu może się zmieniać w dowolnym momencie, na przykład, gdy użytkownik obraca swój ekran lub zmienia rozdzielczość wyświetlania.
Czy chcesz udostępnić rozwiązanie? –
proszę przeczytać wpis - dla dodatkowej pomocy zobacz tutaj http://bit.ly/1t8MY1H –
Mam kod źródłowy x-tile, nie jestem manekinem. Ale czy łatwiej jest dostrzec kilka wywołań systemowych w porównaniu do wyszukiwania pełnego kodu źródłowego, nie sądzisz? –