Russian Qt Forum
Ноябрь 24, 2024, 13:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: сделать окно активным  (Прочитано 14585 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« : Октябрь 12, 2008, 23:26 »

это обсуждали в qt-interest. Окно (в X11 по крайней мере) средствами Qt нельзя сделать выше других (чтобы это работало в 100% случаев). Нужно использовать платформенно-зависимый код для общения с window manager'ом, и для каждой платформы оборачивать его ifdef-ами. В X11 используйте NETWM.
Записан
ритт
Гость
« Ответ #1 : Октябрь 13, 2008, 00:00 »

это к чему было?

вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру, код будет не платформо-зависимым, а оконно-менеджеро-зависимым. причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.
используйте КДЕ Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Октябрь 13, 2008, 06:22 »

Нужно ориентироваться на самые основные: KDE, Gnome, XFCE. Кстати, начиная с 4 версии, KDE доступен и для винды.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lana
Гость
« Ответ #3 : Октябрь 13, 2008, 11:14 »

Спасибо.

это обсуждали в qt-interest. Окно (в X11 по крайней мере) средствами Qt нельзя сделать выше других (чтобы это работало в 100% случаев). Нужно использовать платформенно-зависимый код для общения с window manager'ом, и для каждой платформы оборачивать его ifdef-ами. В X11 используйте NETWM.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Октябрь 13, 2008, 16:18 »

это к чему было?

вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру

X сервер создаёт почву для работы wm.

вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру, код будет не платформо-зависимым, а оконно-менеджеро-зависимым. причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.
используйте КДЕ Улыбающийся

Если wm netwm-совместим (большинство современных wm, в т.ч. и KWin), то нас недолжно волновать, что

причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.

достаточно дёрнуть атом _NET_ACTIVE_WINDOW для нашего окна, и всё остальное должен сделать wm.

Это будет решение для X11. Для винды нужно писать, как я уже говорил, другой код и оборачивать его в #ifdef

Вообще, если интересно как это работает со стороны клиента, то можно посмотреть код fspanel - это предок fbpanel, прога на чистом Xlib, и использует X11 вызовы для работы с netwm-совместимым wm-ом.
Записан
shadone
Гость
« Ответ #5 : Октябрь 19, 2008, 01:34 »

Вышенаписанное верно. Хочу только добавить что в Qt есть функции для управления окном - QWidget::activateWindow() и QWidget::raise()
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Ноябрь 19, 2008, 12:00 »

Вышенаписанное верно. Хочу только добавить что в Qt есть функции для управления окном - QWidget::activateWindow() и QWidget::raise()

Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...
Правда в винде другой баг - если окно имеет флаг Qt::Tools, то при клике по десктопу оно пропадает Грустный
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
shadone
Гость
« Ответ #7 : Ноябрь 26, 2008, 16:31 »

Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...

будет ли это работать зависит от реализации window manager'а т.к. общего стандарта поведения в X11-мире нет.

Правда в винде другой баг - если окно имеет флаг Qt::Tools, то при клике по десктопу оно пропадает Грустный
я видел подобное поведение в некоторых window manager в X11 (и это не баг т.к. опять же поведение зависит от реализации window manager'а), но не в винде - проверил сейчас в windows xp в примере examples/widgets/windowflags - окна с типом Qt::Tool не пропадают при потере фокуса. Если вы можете воспроизвести проблему, создайте таску в task-tracker.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Ноябрь 26, 2008, 18:10 »

Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...

будет ли это работать зависит от реализации window manager'а т.к. общего стандарта поведения в X11-мире нет.

http://www.prog.org.ru/topic_7365_0.html
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Ноябрь 26, 2008, 19:13 »

я видел подобное поведение в некоторых window manager в X11 (и это не баг т.к. опять же поведение зависит от реализации window manager'а), но не в винде - проверил сейчас в windows xp в примере examples/widgets/windowflags - окна с типом Qt::Tool не пропадают при потере фокуса. Если вы можете воспроизвести проблему, создайте таску в task-tracker.

Окно пропадает не при потере фокуса (такого я тоже ни разу не видел), а именно при клике по десктопу и только в винде. У меня при этом parent=0, т.к. окно главное. Думаю, что это все таки баг. Какой бы ни был WM, нет причин самостоятельно скрывать окна.
Тролям написал, но они что то не расчехляются...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
shadone
Гость
« Ответ #10 : Ноябрь 26, 2008, 20:45 »

достаточно дёрнуть атом _NET_ACTIVE_WINDOW для нашего окна, и всё остальное должен сделать wm.

ой, я пропустил это предложение. Никогда не отправляйте сообщения с временной меткой CurrentTime! не забывайте указывать корректную временную метку которую можно получить из QX11Info::appUserTime().

вкратце - система передачи фокуса в X11 основана на временных метках (timestamp) которые хранятся для каждого (top-level) окна (в свойстве _NET_WM_USERTIME) и которые отмечают время когда пользователь последний раз взаимодействовал с этим окном. На основе этих меток windowmanager решает какое из окон должно иметь фокус.

Вот пример взаимодействия пользователя с системой: имеется терминальное приложение где пользователь набирает команду запуска приложения xclock, и каждый раз когда пользователь нажимает клавишу на клавиатуре терминал сообщает windowmanager'у об обновлении временной метки. Далее пользователь нажимает enter для запуска приложения, это приложение создает окно (но пока его не показывает на экране!) и отмечает меткой время создания окна, и затем показывает окно на экране (XMapWindow), после чего windowmanager ищет окно с самой свежей временной меткой, "поднимает" его и передает ему фокус. Но система X11 сетевая и асинхронная, поэтому еще до того как xclock создаст свое окно, либо между созданием окна и его отображанием на экране пользователь может продолжать взаимодействовать с терминальным приложением, вследствии чего его временная метка будет более новая, соответственно после отображения окна xclock на экране он не должен перехватить фокус.

Поэтому в пользовательском приложении есть два способа поднять окно - XRaiseWindow/XSetInputFocus или же послать сообщение  _NET_ACTIVE_WINDOW корневому окну. Проблема в том что не гарантируется что windowmanager поддерживает любой из этих способов (и существует много "поломанных" WM который криво реализуют стандарт netwm (kwin не исключение Подмигивающий. Qt использует первый способ.


Окно пропадает не при потере фокуса (такого я тоже ни разу не видел), а именно при клике по десктопу и только в винде. У меня при этом parent=0, т.к. окно главное. Думаю, что это все таки баг. Какой бы ни был WM, нет причин самостоятельно скрывать окна.
Тролям написал, но они что то не расчехляются...

такого поведения я у себя тоже не вижу. какой номер таски?
« Последнее редактирование: Ноябрь 26, 2008, 20:47 от ddenis » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Ноябрь 26, 2008, 21:04 »

Денис Д. вы ли это? Улыбающийся

ой, я пропустил это предложение. Никогда не отправляйте сообщения с временной меткой CurrentTime! не забывайте указывать корректную временную метку которую можно получить из QX11Info::appUserTime().

вкратце - система передачи фокуса в X11 основана на временных метках (timestamp) которые хранятся для каждого (top-level) окна (в свойстве _NET_WM_USERTIME) и которые отмечают время когда пользователь последний раз взаимодействовал с этим окном. На основе этих меток windowmanager решает какое из окон должно иметь фокус.

Всё верно, но разве это важно для окна, которое активизируется насильно через _NET_ACTIVE_WINDOW?

А где в KWin кривости netwm? Чтобы знать на будущее.
Записан
shadone
Гость
« Ответ #12 : Ноябрь 26, 2008, 21:14 »

Денис Д. вы ли это? Улыбающийся
ммм. как видно из ника это я. Либо я не понял вопроса Улыбающийся

Всё верно, но разве это важно для окна, которое активизируется насильно через _NET_ACTIVE_WINDOW?
все равно важно передать правильную временную метку иначе окно будет активировано насильно невзирая на то что пользователь в данный момент печатает что-то в другом окне. Мне бы такое поведение ооооочень сильно не понравилось.

А где в KWin кривости netwm? Чтобы знать на будущее.
сходу ничего не вспоминается кроме неподдержки _NET_WM_USER_TIME_WINDOW и во всех случаях работающей возможности отключить функциональности окна (например убрать кнопку закрытия окна), хм. хотя это не относится к спецификации netwm.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Ноябрь 26, 2008, 21:16 »

Денис Д. вы ли это? Улыбающийся
ммм. как видно из ника это я. Либо я не понял вопроса Улыбающийся

Всегда приятно видеть отечественных сотрудников Троллтеха! Подмигивающий
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Ноябрь 26, 2008, 21:22 »

Раз уж пошла такая пьянка, м.б. активацию окон в Qt сделать через netwm? Потому что чем только люди не занимаются под иксами, чтобы окна активизировать Улыбающийся Тут уже несколько тем было. Да и на лоре тоже. Очень, очень животрепещущая тема.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.107 секунд. Запросов: 22.