LINUX.ORG.RU

Как на X11 определить, что окно перемещается мышью?

 , ,


0

2

Здравствуйте,

Я так понимаю, что X11 не посылает никаких информирующих сообщений, когда пользователь перемещает окно мышью. Напрашивается использование таймера, но в моем случае таймер в момент перемещения окна тоже перестает тикать - такое чувство, что цикл обработки сообщений в этот момент замирает. Можно как-то обнаружить, что пользователь перемещает окно и получить текущее положение окна?



Последнее исправление: Dimez (всего исправлений: 1)
Ответ на: комментарий от u-235

Сообщение ConfigureNotify не приходит?

Приходит, но только когда перестаешь перемещать окно, т.е. отпускаешь кнопку мыши. Но мне надо ловить именно процесс перемещения.

Odin_KG
() автор топика
Ответ на: комментарий от u-235

Верно, иксы сами мышью не перемещают ничего, это делает оконный менеджер. Оконных менеджеров разных десятки и больше, кто-то может и шлёт оповещения про мышь куда-то (в своём собственном формате), большинство этого скорее всего не делают.

А зачем знать что окно именно мышью перемещается? Это точно существенно? При желании можно придумать костыли с асинхронным опросом состояния мыши и эвристическим угадыванием происходящего.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

Или я может быть неправильно понял вопрос и дело не в мыши. ConfigureNotify приходить должен, конечно, если окно действительно двигается. А оно двигается? Запусти xev и подвигай ему окно, в консоли не будет спама ConfigureNotify?

firkax ★★★★★
()

Как работают wm. Надо часть работы с окнами повторить.

Ловить собятия только, когда левая кнопка мыши нажата.
Отслеживать substructurenotifymask для root(или родительского) окна.
    -> Проверять id окна, изменение позиции (x,y,w,h).
Закончить ловить собятия, когда левая кнопка релизнулась.
arrecck ★★★
()
Ответ на: комментарий от firkax

При желании можно придумать костыли с асинхронным опросом состояния мыши и эвристическим угадыванием происходящего.

А потом искренние удивления, от чего кикад $SOFTWARE_NAME с вялендом не дружит.

MagicMirror ★★★
()
Ответ на: комментарий от arrecck

Мне нравится эта идея с SubstructureNotifyMask. Надо будет проверить. Спасибо за совет!

Odin_KG
() автор топика
Ответ на: комментарий от firkax

А зачем знать что окно именно мышью перемещается? Это точно существенно?

Обойтись можно, но этот момент у меня в Windows и Mac работает. Хотелось бы, чтобы и на Linux работал.

Odin_KG
() автор топика
Ответ на: комментарий от MagicMirror

А потом искренние удивления, от чего кикад $SOFTWARE_NAME с вялендом не дружит.

Никто уже не удивляется, что вяленд криво спроектирован и имеет куцые реализации.

u-235
()
Ответ на: комментарий от u-235

Где ты тут видишь иксовые подпорки?

Сам почитаешь, не маленький.

И зачем вообще ты сюда припёрся с вяленым?

Тебя спросить забыл.

MagicMirror ★★★
()

Даже интересно, что за задача такая. Окно инструментов хочется перемещать вслед за родительским окном?

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Даже интересно, что за задача такая.

Панель инструментов можно отцеплять от общего интерфейса и возвращать обратно. Вот для возвращения, которое практически похоже на Drag & Drop целого окна, мне это и нужно. В момент выполнения этой операции я высвечиваю «target», куда можно прицепить панель, к тому же он реагирует когда панель находится над ним. Вот с этим и проблема.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

То есть если окно двигают клавиатурой (а в некоторых wm это может быть и единственный способ) - то твой обработчик срабатывать не должен?

И про xev ты протестил или как?

firkax ★★★★★
()
Ответ на: комментарий от firkax

То есть если окно двигают клавиатурой (а в некоторых wm это может быть и единственный способ) - то твой обработчик срабатывать не должен?

Не должен

И про xev ты протестил или как?

Пока ничего не делал - закончу текущую задачу и буду проверять

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Для отлепляемых панелей инструментов обычно используется другой тип окна. В интерфейсах на qt часто есть такие панели, например в freecad. Ты решаешь типовую задачу, кмк.

legolegs ★★★★★
()
Ответ на: комментарий от Odin_KG

Приходит, но только когда перестаешь перемещать окно, т.е. отпускаешь кнопку мыши

Интересно, что у тебя за wm?
Мне такого поведения удалось добиться только в xfwm при помощи опции Hide content of windows when moving, что в принципе понятно, так как там окно сразу перемещается в конечную точку.

arax ★★★
()
Ответ на: комментарий от MagicMirror

Да нет удивлений. С ним просто вообще ничего не дружит.

zx_gamer ★★★
()

Пожалуйста, не ставь пробел между предложением и знаком вопроса. Это портит тему в трекере.

Dimez ★★★★★
()
Ответ на: комментарий от arax

Интересно, что у тебя за wm?

Я эксперементировал на Fedora X11 PLasma KDE 5.10.5. Это старая версия.

Мне такого поведения удалось добиться только в xfwm при помощи опции

Вы правы в том, что в новых версиях всё это работает нормально

Odin_KG
() автор топика
Ответ на: комментарий от Dimez

Пожалуйста, не ставь пробел между предложением и знаком вопроса. Это портит тему в трекере.

Честно говоря, я всегда перед знаком вопроса ставлю пробел. Я постараюсь запомнить это ваше замечание, но могу случайно забыть. Имеет смысл всё же подправить этот момент на сайте, чтобы лишний пробел ничего не портил.

Odin_KG
() автор топика
Ответ на: комментарий от firkax

И про xev ты протестил или как?

Собственно, отладчик и так ловил ConfigureNotify только в момент отпускания кнопки мыши. Но я всё же проверил и через xev - результат не изменился.

Однако общая реакция здесь мне показала, что проблема может быть в том, что я использую старую версию Fedora. И да… на новой Debian всё заработало, и сообщение ConfigureNotify стало приходить в момент перемещения окна. Правда, вылезла проблема с тем, что теперь нет нормального способа определить момент окончания перетаскивания окна, поэтому ничего умнее как задействовать таймер я не придумал. Но в общем сейчас работает, и меня это устраивает.

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

Odin_KG
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.