2010-04-08 7 views
7

Korzystając z gdk_screen_get_monitor_geometry, mogę uzyskać całkowity obszar w pikselach i względną pozycję każdego monitora, nawet jeśli są dwa lub więcej używane jako pojedynczy ekran.Gtk: uzyskaj użyteczny obszar każdego monitora (z wyłączeniem paneli)

Jednak chcę uzyskać obszar użytkowy (czyli z wyłączeniem paneli) każdego monitora. Jedyne, co znalazłem, to _NET_WORKAREA, ale jest to jeden olbrzymi obszar rozciągający się na wszystkie monitory. W zależności od rozdzielczości i rozmieszczenia w tym obszarze mogą znajdować się panele.

Jak mogę uzyskać rzeczywisty obszar użytkowy każdego monitora? Idealnie, używając tylko Gtk/Gdk, nic specyficznego dla X11.

Odpowiedz

1

W końcu skończyłem używając Xlib bezpośrednio, różne "sztuczki" takie jak te sugerowane powyżej skończyły się ostatecznie w dłuższej perspektywie zawiodły często w dziwnych przypadkach narożnych i nigdy nie były zgodne z zasadą KISS.

Rozwiązanie, którego użyłem, znajduje się w bazie kodu X-Tile.

+1

Czy chcesz udostępnić rozwiązanie? –

+0

proszę przeczytać wpis - dla dodatkowej pomocy zobacz tutaj http://bit.ly/1t8MY1H –

+1

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? –

1

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.

+0

To jest bardzo sprytne, ale chciałbym wiedzieć, czy może istnieć podejście, które działa * synchronicznie *, tj.bez potrzeby zezwolenia cyklowi zdarzeń. – zwol

+0

Należy pamiętać, że nie wszystkie komputery są ze sobą połączone, więc możliwe jest ustawienie opacity jako no-op. – ssokolow

+0

@Zack: Jeśli nie chcesz, aby pętla zdarzeń aplikacji _current_ była uruchamiana, rozwidnij proces potomny i zwróć regiony przez potok jako tekst. –