Приложение Qt X11 настроено как Always on Top

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

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

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

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

Спасибо.


person Anony    schedule 01.06.2012    source источник


Ответы (2)


Для начала давайте разберемся с терминологией. Установленное вами свойство «Всегда сверху» не является функцией X11, а является частью стандартного набора так называемых «подсказок» оконного менеджера, указанных как часть 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 не определяет политику, такую ​​​​как «Всегда поверх», не может сообщить Windows, что окно действительно должно оставаться сверху. Вы также можете запустить Exceed в «полноэкранном» режиме, когда он открывает целое окно, в котором все клиенты X11 работают на своем собственном маленьком рабочем столе. Работающий в нем WM будет управлять только клиентами X11, но опять же не может передавать свою информацию в Windows.

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

person datenwolf    schedule 05.06.2012

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

person JMBise    schedule 01.06.2012
comment
Справочная информация: Always On Top — это функция не приложения (в отличие, скажем, от Windows), а оконного менеджера, который упорядочивает окна на экране. Если оконный менеджер проигнорирует вашу подсказку, вы ничего не сможете сделать. - person Aaron Digulla; 01.06.2012
comment
@AaronDigulla Я попробовал оконный менеджер openbox в Ubuntu, и мое приложение работает локально в Ubuntu, как предполагается, но когда я настраиваю XServer для использования оконного менеджера openbox, свойство Always On Top моего приложения игнорируется. Точно так же родной MS Windows Window Manager работает локально, но XServer, использующий MS Windows Window, не работает. - person Anony; 01.06.2012
comment
Если вы используете Exceed, у вас либо все окна X11 находятся в одном окне рабочего стола, либо вы можете получить одно окно X11 в отдельном окне рабочего стола. В первом случае Always on top, очевидно, работает только в одном окне рабочего стола, потому что Windows понятия не имеет, что происходит. В последнем случае это может работать, но только если Exceed поддерживает эту функцию (поскольку в этом случае Exceed заменит удаленный оконный менеджер). - person Aaron Digulla; 01.06.2012
comment
@AaronDigulla, приложение работает в собственном окне рабочего стола (Exceed находится в многооконном режиме). Даже в режиме одного окна пробовал, тоже не работает. - person Anony; 01.06.2012
comment
Как сказал @JMBise: Exceed не поддерживает эту функцию. - person Aaron Digulla; 01.06.2012