2010-04-08 3 views
7

Используя gdk_screen_get_monitor_geometry, я могу получить общую площадь в пикселях и относительное положение каждого монитора, даже если в качестве одного экрана используются два или более.Gtk: получить полезную площадь каждого монитора (за исключением панелей)

Тем не менее, я хочу получить полезную площадь (т. Е. Исключая панели) каждого монитора. Единственное, что я нашел, это _NET_WORKAREA, но это одна гигантская область, простирающаяся на всех мониторах. В зависимости от разрешения и расположения в этой области могут быть панели.

Как я могу получить фактическую полезную площадь каждого монитора? В идеале, используя только Gtk/Gdk, ничего X11-специфического.

ответ

1

В конце концов я в конечном итоге использовал xlib, различные «трюки», подобные предложенным выше, в конечном итоге оказались неудачными в конечном счете часто с нечетными угловыми случаями и никогда не соблюдали принцип KISS.

Решение, которое я использовал, находится в базе кода X-Tile.

+1

Не согласен ли вы с решением? –

+0

, пожалуйста, прочитайте сообщение - для дополнительной помощи см. Здесь http://bit.ly/1t8MY1H –

+1

У меня есть исходный код x-tile, я не манекен. Но его легче увидеть несколько системных вызовов по сравнению с поиском полного исходного кода, как вы думаете? –

1

Следующий подход немного запутан, но это то, что я бы использовал. Он должен быть надежным даже при наличии сложного взаимодействия между оконным менеджером и 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().

Обратите внимание, что на практике вам нужно только одно окно. Я лично использовал бы простой цикл. Я подозреваю, что из-за странностей/ошибок диспетчера окон гораздо более надежно создавать новое окно для каждого экрана, а не просто перемещать одно и то же окно между экранами. Оказывается, это проще, так как вы можете использовать одну простую функцию обратного вызова для получения полезной области для каждого экрана.

Как я уже сказал, это довольно запутанно. С другой стороны, стандартное приложение не должно заботиться о размерах экрана; он должен просто делать то, что спрашивает пользователь или менеджер окон. Из-за этого я не удивлюсь, если нет лучшего способа узнать эту информацию. Размер экрана может измениться в любой момент, например, если пользователь поворачивает свой дисплей или изменяет разрешение дисплея.

+0

Это очень умно, но я хотел бы знать, может ли быть подход, который работает * синхронно *, т. Е.без необходимости цитировать цикл событий. – zwol

+0

Имейте в виду, что не все рабочие столы составлены, поэтому возможно, что opacity-setting будет no-op. – ssokolow

+0

@Zack: Если вы не хотите, чтобы цикл событий приложения _current_ выполнял цикл, разворачивайте дочерний процесс и возвращайте регионы через канал в виде текста. –