Событие X11, когда приложение теряет фокус

Есть ли событие XAppFocusOut, похожее на Windows WM_ACTIVATEAPP или applicationDidResignActive или какой-либо другой способ получать уведомления, когда приложение теряет фокус? Предпочтительно решение XCB.

Чтобы уточнить: меня интересует событие, когда приложение, а не окно, теряет фокус.

Спасибо.


person Community    schedule 15.07.2015    source источник
comment
возможный дубликат FocusIn/FocusOut не создан   -  person Eugene Sh.    schedule 15.07.2015
comment
как это дубликат? Меня интересует событие, когда приложение, а не окно, теряет фокус   -  person    schedule 15.07.2015
comment
X не имеет (или не понимает) концепции приложений, отличной от окон. У него есть концепция клиентов с подключениями — любое данное окно принадлежит конкретному клиенту и будет очищено, если клиент (соединение) исчезнет, ​​но у клиентов нет фокуса или чего-либо еще, связанного непосредственно с ними.   -  person Chris Dodd    schedule 15.07.2015
comment
@ChrisDodd Я знаю, но мне все равно нужно знать, когда окно теряет фокус не, потому что другое окно, о котором я знаю (которое я создал), получает фокус.   -  person    schedule 15.07.2015
comment
@ЕвгенийШ. - Мне это не кажется обманом - этот вопрос был узко сосредоточен на том, как X-сервер, работающий без оконного менеджера, справляется с фокусом.   -  person Andrew Henle    schedule 15.07.2015
comment
Лучшее, что вы можете сделать, это следить за всеми своими окнами самостоятельно. Когда ВСЕ окна в вашем приложении сфокусированы, тогда приложение не в фокусе. Я не уверен, но я думаю, что вам может понадобиться включить тайм-аут, чтобы поймать случаи, когда вы получаете фокус до фокусировки.   -  person slebetman    schedule 15.07.2015
comment
@slebetman хорошая идея - после деактивации окна я запускаю таймер обратного отсчета: если другое окно становится активным до истечения времени ожидания, таймер отключается, в противном случае запускается событие app_deactivated и таймер отключается. Если вы опубликуете это, я приму ответ (кажется разумным выбором).   -  person    schedule 17.07.2015


Ответы (1)


Вам нужно событие FocusOut X.

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

Чтобы получать события FocusIn или FocusOut, установите бит FocusChangeMask в атрибуте маски события окна.

person Andrew Henle    schedule 15.07.2015
comment
Это говорит вам, когда окно теряет фокус. Меня интересует событие, когда окно теряет фокус в результате фокусировки, скажем, значка на рабочем столе или другого окна из другого приложения, но не как результат переключения между окнами моего собственного приложения. - person ; 16.07.2015
comment
@cap — для этого вам нужно надежно отслеживать ВСЕ окна, созданные этим приложением. Некоторые идеи о том, как это сделать, приведены здесь: unix.stackexchange.com/questions/5478/ - person Andrew Henle; 16.07.2015
comment
Я обнаружил, что FocusOut ненадежен в Kwin 4.x, поэтому я использовал другое решение: мониторинг _NET_ACTIVE_WINDOW, подписавшись на события PropertyNotify в корневое окно. - person ssokolow; 02.01.2017