Gtk: получить полезную площадь каждого монитора (исключая панели) - PullRequest
7 голосов
/ 08 апреля 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 июня 2012

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

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

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

...