Обнаружение событий мыши со всего экрана в Linux - PullRequest
0 голосов
/ 06 марта 2012

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

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

Ответы [ 2 ]

1 голос
/ 12 марта 2012

«Решение», которое я видел в некоторых местах, состоит в том, чтобы выбрать ButtonPressEvent для каждого окна во всем дереве X-окон, используя XSelectInput, а также выбрав SubstructureNotifyMask, чтобы узнать о новых окнах.Известно, что этот метод нарушает работу некоторых программ (предотвращая распространение событий мыши из окна, клиент которого не выбрал ButtonPressEvent), поэтому используйте его на свой страх и риск.Кроме того, он не будет работать, если другой клиент имеет захват указателя.

Вы можете сохранить захват указателя с помощью GrabModeSync навсегда и позволить событиям мыши переходить в окно, которое обычно получает их, вызывая XAllowEvents (event_mode = ReplayPointer).Если вы сохраняете полный захват указателя все время, это ужасно сломает все ваши программы, потому что они ожидают, что смогут захватить указатель.Вы можете получить одну комбинацию кнопка + модификатор с помощью XGrabButton, но я подозреваю, что ваш оконный менеджер может помешать этому на практике (что может быть хорошим аргументом для изменения вашего оконного менеджера, чтобы он уведомлял вас о событиях или непосредственно делал все, что вам нужно).

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

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

1 голос
/ 11 марта 2012

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

Если вы просто хотите определить, не занят ли пользователь, есть способ сделать это с помощью расширения заставки X.

XScreenSaverInfo screen_saver_info = { 0, };

XScreenSaverQueryInfo(xdisplay,
                      xroot,
                      &screen_saver_info);

if (screen_saver_info.idle > your_idle_threshold)
      // screen is idle.    

Обратите внимание, что вы должны инициировать расширение при открытии дисплея,

int event_base, error_base;
XScreenSaverQueryExtension(xdisplay, &event_base, &error_base)

"man XScreenSaverQueryInfo" содержит немного больше деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...