Следующий подход немного запутан, но это то, что я бы использовал. Он должен быть надежным даже при наличии сложного взаимодействия между оконным менеджером и 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()
.
Обратите внимание, что на практике вам нужно только одно окно. Я лично использовал бы простой цикл. Я подозреваю, что из-за странностей/ошибок диспетчера окон гораздо более надежно создавать новое окно для каждого экрана, а не просто перемещать одно и то же окно между экранами. Оказывается, это проще, так как вы можете использовать одну простую функцию обратного вызова для получения полезной области для каждого экрана.
Как я уже сказал, это довольно запутанно. С другой стороны, стандартное приложение не должно заботиться о размерах экрана; он должен просто делать то, что спрашивает пользователь или менеджер окон. Из-за этого я не удивлюсь, если нет лучшего способа узнать эту информацию. Размер экрана может измениться в любой момент, например, если пользователь поворачивает свой дисплей или изменяет разрешение дисплея.
Не согласен ли вы с решением? –
, пожалуйста, прочитайте сообщение - для дополнительной помощи см. Здесь http://bit.ly/1t8MY1H –
У меня есть исходный код x-tile, я не манекен. Но его легче увидеть несколько системных вызовов по сравнению с поиском полного исходного кода, как вы думаете? –