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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синхронное перемещение двух окон  (Прочитано 4470 раз)
andrew.k
Гость
« : Октябрь 20, 2010, 22:47 »

Задача: есть редактор сообщений. который состоит из двух отдельных окон. "Шапка", где выставляются атрибуты сообщения и сам редактор в котором правится текст. Оба окна это разные процессы. Шапка - несекретный процесс, редактор - секретный.
Действите происходит в недружественной среде МСВС Улыбающийся
Соответственно необходимо сделать так, чтобы два отдельных окна выглядели как одно. Т.е. при перемещении "шапки", окно редактора должно перемещаться вслед.
Как сделал. При перемещении "шапки" вычисляю куда нужно подвинуть редактор и отсылаю эти координаты редактору.
Он получив их перемещает себя.
Проблемы:
1. Не получается отслеживать перемещение окна. Так как тасканием окна занимается оконный менеджер, то я получаю событие о перемещении только в момент отпускания окна "на новом" месте. В этот момент редактор перескакивает куда надо.
Такое решение меня не устраивает, но другое найти не удалось.
Т.е. видимо надо как-то взаимодействовать с Х11 и получать координаты от него, но как это сделать. В ассистенте были какие-то классы или методы, что-то с "X11Events" но разобраться не удалось, так как нет примера. Кто решал подобную задачу? Помогите, направьте.
2. Вторую проблему, которую вызывает подобная организация, это то, что отрисовкой оформления окна занимается тоже не кути, а оконный менеджер и делает он это в произвольный момент времени. Т.е. в момент когда окно создано и возникло событие о перемещении окна оно может еще быть с рамкой, а может без. Соответственно неправильно определяются высота окна и ширина или позиция (а почему?) и окно редактора оказывается сдвинутым на 4 пиксела. Иногда и на другое значение. Иногда позиционируется точно. Т.е. совершенно случайно. Решить это можно видимо при момощи таймера, например, но это будет заметно и не красиво. Как отследить отрисовку оформления окна? Вопрос №2!

 Непонимающий
Записан
DpoHro
Гость
« Ответ #1 : Октябрь 21, 2010, 08:05 »

1. Не получается отслеживать перемещение окна. Так как тасканием окна занимается оконный менеджер, то я получаю событие о перемещении только в момент отпускания окна "на новом" месте. В этот момент редактор перескакивает куда надо.
Такое решение меня не устраивает, но другое найти не удалось.
Т.е. видимо надо как-то взаимодействовать с Х11 и получать координаты от него, но как это сделать. В ассистенте были какие-то классы или методы, что-то с "X11Events" но разобраться не удалось, так как нет примера. Кто решал подобную задачу? Помогите, направьте.
Кури разбор очереди иксовой.
В кутях есть у виджета помоему x11event, но оно вроде работает только толи на события самого окна либо при активном окне, не помню точно но у меня были проблемы с моей задачей.
Я пошел другим путем и стал использовать XLib для своих нужд.
Выкури это http://www.linux.org.ru/wiki/en/NETWM


Цитировать
2. Вторую проблему,
...
Соответственно неправильно определяются высота окна и ширина или позиция (а почему?) и окно редактора оказывается сдвинутым на 4 пиксела. Иногда и на другое значение. Иногда позиционируется точно. Т.е. совершенно случайно. Решить это можно видимо при момощи таймера, например, но это будет заметно и не красиво. Как отследить отрисовку оформления окна?

Не знаю как отследить отрисовку, видимо если сделаешь разбор очереди сообщений то получится.

По поводу смещения. В МСВС все через жопу, это древний RedHat. Мне надо было из своего приложения расставить кучу окон vncviewer-а мозайкой, каскадом и так и эдак, убрать их из таскбара и т.п., для этого нужно было научиться искать id этих окон. В отдельном потоке я это все делаю, ид находятся.
xprop кажет мне совсем другие ид а у меня как правило ид отличаются на +-2. Дело в том, что elk (а может и другие оконные манагеры) походу для приложения создает свое окно и вставляет в себя окно приложения, вся красота (бордер, заголовок) отрисовывается в елкшном окне в которое вставлено твое. Как то так, и ты получаешь координаты походу без учета бордера и заголовка. Если я правильно понял о чем речь идет.

В МСВС, по крайней мере в той версии с которой работал я, были проблемы с многопоточностью, в частности с совместным вызовом ф-ций xlib относящихся к окнам, возникали ошибки.
Мне кажется, что если удастся тебе сделать все приемлемо по таймеру, делай по таймеру )) Иначе долго провозиться можно ))
« Последнее редактирование: Октябрь 21, 2010, 08:07 от DpoHro » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Октябрь 21, 2010, 09:23 »

Если я правильно понял, у вас внешне эти 2 окна должны выглядеть как одно.
Первое с декорациями, а второе как под-окно в пределах первого и без декораций?
Если так, то вы идёте довольно-таки сложным путём.
Можно сделать может и не проще, но совершенно не завязываясь на WM:
1. В процессе, который создаёт под-окно, получаете win_id окна и передаёте его первому процессу, например, через XSelection.
2. Первый процесс получает win_id под-окна, получает его размеры и встраивает его.

Когда-то давно я всё это проделывал, правда на Motif/Xt.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #3 : Октябрь 22, 2010, 12:03 »

Если я правильно понял, у вас внешне эти 2 окна должны выглядеть как одно.
Первое с декорациями, а второе как под-окно в пределах первого и без декораций?
Если так, то вы идёте довольно-таки сложным путём.
Можно сделать может и не проще, но совершенно не завязываясь на WM:
1. В процессе, который создаёт под-окно, получаете win_id окна и передаёте его первому процессу, например, через XSelection.
2. Первый процесс получает win_id под-окна, получает его размеры и встраивает его.

Когда-то давно я всё это проделывал, правда на Motif/Xt.

Полагаю, что понял правильно. И похоже твой метод хорош. Не мог бы описать подробнее. Возможно есть рабочий пример?
Что такое XSelection?
Кратко. Задача получить редактор в котором шапка несекретная и редактор секретный.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Октябрь 22, 2010, 12:29 »

Цитировать
Не мог бы описать подробнее. Возможно есть рабочий пример?
Посмотри на QX11EmbedWidget и QX11EmbedContainer. Он использует XEmbed Protocol. Как раз то, что тебе нужно. Мне же когда-то пришлось самому всё это делать на Motif/Xt/Xlib, когда этого протокола не было и в помине.

Цитировать
Что такое XSelection?
Это механизм обмена данными между X11 клиентами. Подробнее тут.
На нём реализован clipboard в X-ах. Можешь использовать любой другой механизм. Причём наверняка уже используешь, коли пытался синхронизировать окна.
« Последнее редактирование: Октябрь 22, 2010, 13:03 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #5 : Октябрь 22, 2010, 13:52 »

Цитировать
Не мог бы описать подробнее. Возможно есть рабочий пример?
Посмотри на QX11EmbedWidget и QX11EmbedContainer. Он использует XEmbed Protocol. Как раз то, что тебе нужно. Мне же когда-то пришлось самому всё это делать на Motif/Xt/Xlib, когда этого протокола не было и в помине.

Да. Похоже это то что нужно! Сейчас буду изучать. Мне приходили мысли по этому поводу, не знал с чего начать. Теперь есть с чего Улыбающийся Спасибо.
Попробовал. Получилось. но если на виджете который встраивается есть редакторы текста (QLineEdit, QTextEdit), то они не работают. Просто висят и не получают фокус, не позволяют редактировать текст. QPushButton прекрасно встроился и работает.
Контейнер на косоль пишет ошибку:
X error of failed request: BadWindow (invalid Window Parameter )
далее подробности об ошибки.

В чем может быть проблема?
« Последнее редактирование: Октябрь 22, 2010, 15:05 от andrew.k » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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