[英]My xlib code can listen to keyboard events but it fails for some windows
我有這個代碼來監聽活動窗口的鍵盤事件:
#include<X11/Xlib.h>
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <thread>
using namespace std;
#define IR_MODE 8192
#define SHIFT_MODE 16
#define US_MODE 0
static int ErrorHandler (Display *display, XErrorEvent *error)
{
cout<< "An error ocurred. We don't know anything.";
return 0;
}
int main()
{
Display *d = XOpenDisplay(0);
if(d == 0)
{
cout<< "Cannot open display\n";
exit(0);
}
Window root = DefaultRootWindow(d);
XSetErrorHandler(ErrorHandler);
Window current_window;
int rev;
XGetInputFocus(d,¤t_window,&rev);
XSelectInput(d,current_window, KeyPressMask | KeyReleaseMask | FocusChangeMask);
while(true)
{
XEvent e;
XNextEvent(d, &e);
switch(e.type)
{
case FocusOut:
XGetInputFocus(d,¤t_window,&rev);
if(current_window == PointerRoot || current_window == None)
{
current_window = root;
}
XSelectInput(d,current_window, KeyPressMask | KeyReleaseMask | FocusChangeMask);
break;
case KeyPress:
{
cout<< "key pressed\n";
break;
}
case KeyRelease:
cout<< "key released\n";
break;
}
}
XCloseDisplay(d);//*/
}
它適用於許多窗戶。 但它失敗了一些窗口,特別是對於gnome應用程序,例如nautilus。 為什么會發生這種情況?如何解決問題?
該程序只是試圖在不干擾任何東西的情況下聽鍵盤。 好像鍵盤正在被點擊一樣:程序不打算丟失語言布局信息。 當按下某個鍵時,會選擇一些信息,包括ASCII碼,並根據語言布局將其附加到鍵事件,然后發送鍵事件。 該程序需要關鍵事件及其附帶的信息。 所以該程序並不打算采用Grab鍵盤。 它不關心活動或聚焦窗口。 它只是試圖聽到鍵,即使程序的窗口沒有活動。 有些程序會定期檢查XQueryKeymap
,但我不打算使用它。 因為它耗盡了CPU,然后它不僅僅是一個公平的傾聽者。 此外,如果檢查不頻繁,某些鍵可能會逃脫。
我猜你的程序不適用於使用xinput2的GTK3窗口。 如果沒有--disable-xinput
構建GTK3,情況就是如此。
AFAIK XSelectInput()
不能與xinput2一起使用,這樣的窗口需要XISelectEvents()
。
查看Mutter源代碼中的meta_core_select_events()
函數。 它適用於xinput2和傳統窗口。 這個補丁也許有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.