Как мне получить окно, в котором в данный момент находится курсор над ним с X11? - PullRequest
7 голосов
/ 23 декабря 2010

Как я могу получить верхнее окно, над которым находится курсор на сервере X11?

Окно не обязательно должно быть «активным» (выбрано, открыто и т. Д.), Просто курсор должен плавать поверх него.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 23 декабря 2010

Вы можете использовать XQueryPointer(), чтобы получить положение мыши. Затем получите список окон, используя XQueryTree(). XQueryTree() возвращает список окон в правильном z-порядке, так что вы можете просто перебирать все окна до тех пор, пока не найдете окно, ограничивающее прямоугольник которого находится под указателем, XGetWindowAttributes() даст вам все необходимое для определения ограничивающего прямоугольника. Я не уверен, что вы будете делать с фасонными окнами.

Я не работал с X11 в течение нескольких лет, так что это может быть довольно неуклюжим подходом, но он должен работать. У меня также больше нет моих книг O'Reilly X11, вы захотите получить книгу первой из этой серии, если вы собираетесь работать с низкоуровневыми материалами X11; Я думаю, что в наши дни вся серия доступна бесплатно онлайн.

3 голосов
/ 23 декабря 2010

Я не программировал X11 более десяти лет, так что простите, если я ошибаюсь.

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

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

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

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

...