2012-06-01 3 views
1

В настоящее время я пытаюсь выполнить приложение Qt X11 на удаленном XServer (Exceed). Для того, чтобы окно приложения всегда поверх других дисплеев, я использую ниже заявление:Приложение Qt X11 настроено как всегда сверху

MainWindow->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Tool); 

Если я исполняю мое приложение на Windows 7 и Ubuntu операционной системы на местном уровне, он выполняет, как «Всегда сверху» заявление. Однако, когда я направляю отображаемую информацию на удаленный XServer (Exceed x64 v14), он начинает выполняться без свойства «Всегда поверх». Он отстает от других дисплеев, когда он потерял фокус.

Есть ли какая-либо дополнительная конфигурация, которую я должен сделать в Qt-коде или в продукте Exceed?

Спасибо.

ответ

1

Прежде всего, давайте получить некоторую терминологию из пути. Свойство «Всегда на вершине», которое вы установили, не является особенностью X11, но является частью стандартного набора так называемых оконных менеджеров «Hints», которые указаны как часть Inter-Client-Communication-Manual и Extended-Window-Manager -Подсказки.

X11 не занимается размещением окон на экране, это то, что делает менеджер окон. В вашей обычной системе X11 вы получаете оконный менеджер, совместимый с ICCCM/EWMH, который контролирует все окна, и все хорошо. Это также работает со всеми видами переадресации, поскольку для сервера X11 не имеет значения, к какому способу подключены клиенты, и все связи между клиентами происходят через сервер X11.

Теперь в вашем случае вы используете Exceed, который является сервером X11, работающим поверх рабочего стола Microsoft Windows. Windows делает все свое управление окнами, и такие вещи, как «Always-On-Top», являются частью политики управления окнами Windows. Однако, поскольку X11 не определяет политику, но только метод любой информации ICCCM/EWMH будет никогда перейти к управлению Windows-окнами. Все Windows видит безликие окна верхнего уровня, созданные Exceed для отдельных клиентов.

Теперь вы можете запустить X11 WM в пределах Exceed, но этот WM тогда живет только в X11, и поскольку X11 не определяет политику, как «Always-On-Top», не имеет возможности сказать Windows, что на самом деле должно оставаться окно наверху. Вы можете запустить Exceed также в режиме «Полноэкранный режим», где открывается все окно, в котором все клиенты X11 работают на своем маленьком рабочем столе. Входящий в нее WM будет управлять только клиентами X11, но снова не сможет передать свою информацию в Windows.

Что вам действительно нужно, это какой-то обход, который будет подключаться к Exceed параллельно и синхронизирует свойства окна Windows (политика) с ICCCM/EWMH на стороне X11. Такая программа вполне осуществима, но я не знаю о какой-либо имеющейся у вас программе.

+0

Супер комментарий спасибо! – yatg

2

X11 Forwarding не поддерживает эту функцию

+2

Фон: «Always On Top» не является особенностью приложения (в отличие, скажем, от Windows), а от диспетчера окон, который устраивает окна на экране. Если диспетчер окон игнорирует ваш намек, вы ничего не можете сделать. –

+0

@AaronDigulla Я попробовал оконный менеджер Openbox на Ubuntu, и мое приложение работает как предполагаемое локально в Ubuntu, но когда я настраиваю XServer для использования диспетчера окон Openbox, свойство Always On Top моего приложения игнорируется. Аналогично, локальный MS Windows Window Manager работает локально, но XServer с использованием MS Windows Window не работает. – Anony

+0

Если вы используете Exceed, вы либо имеете все окна X11 в одном окне рабочего стола, либо можете получить одно окно X11 в своем рабочем окне. В первом случае «Always on top», очевидно, работает только внутри окна отдельного рабочего стола, потому что Windows не знает, что происходит.В последнем случае он может работать, но только если функция Exceed поддерживает эту функцию (поскольку в этом случае Exceed заменит диспетчер оконных окон). –

Смежные вопросы