«Решение», которое я видел в некоторых местах, состоит в том, чтобы выбрать ButtonPressEvent для каждого окна во всем дереве X-окон, используя XSelectInput, а также выбрав SubstructureNotifyMask, чтобы узнать о новых окнах.Известно, что этот метод нарушает работу некоторых программ (предотвращая распространение событий мыши из окна, клиент которого не выбрал ButtonPressEvent), поэтому используйте его на свой страх и риск.Кроме того, он не будет работать, если другой клиент имеет захват указателя.
Вы можете сохранить захват указателя с помощью GrabModeSync навсегда и позволить событиям мыши переходить в окно, которое обычно получает их, вызывая XAllowEvents (event_mode = ReplayPointer).Если вы сохраняете полный захват указателя все время, это ужасно сломает все ваши программы, потому что они ожидают, что смогут захватить указатель.Вы можете получить одну комбинацию кнопка + модификатор с помощью XGrabButton, но я подозреваю, что ваш оконный менеджер может помешать этому на практике (что может быть хорошим аргументом для изменения вашего оконного менеджера, чтобы он уведомлял вас о событиях или непосредственно делал все, что вам нужно).
Если все используемые вами программы поддерживают AT-SPI (они, вероятно, нет), и у вас включена функция вспомогательных технологий, вы можете получать уведомления о событиях мыши от AT-SPI.Это ничего не сломает, но оно не будет работать для некоторых программ.
Так что на самом деле не существует хорошего решения, но, возможно, одно из этих неработающих решений будет работать в нужных вам обстоятельствах, примененных вограниченным образом или с огромным отказом от ответственности.