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