我想编写一个简单的Xlib程序来改变鼠标行为(举一个例子,反转垂直移动)。我在捕获事件时遇到了问题。
我想要代码
MotionEvent
)new_x -= difference_x
)XWarpPointer
,阻止事件生成)下面的代码应该在每次移动鼠标时捕获一个动作事件,但只有当指针从一个窗口移动到另一个窗口时它才会生成事件...如何捕获所有移动事件?
#include "X11/Xlib.h"
#include "stdio.h"
int main(int argc, char *argv[])
{
Display *display;
Window root_window;
XEvent event;
display = XOpenDisplay(0);
root_window = XRootWindow(display, 0);
XSelectInput(display, root_window, PointerMotionMask );
while(1) {
XNextEvent( display, &event );
switch( event.type ) {
case MotionNotify:
printf("x %d y %d\n", event.xmotion.x, event.xmotion.y );
break;
}
}
return 0;
}
相关:
答案 0 :(得分:5)
当您的程序收到鼠标事件时,它会收到事件的副本;副本也会发送到正在侦听这些事件的其他程序(请参阅XSelectInput(3)
)。如果不使用XGrabPointer(3)
获取鼠标的独占所有权,则无法覆盖此操作,这将阻止其他程序接收任何鼠标事件。简而言之,你实际上无法做你想做的事。
另请注意,如果客户端在其窗口之一的do-not-propagate掩码中指定了PointerMotion
,则不会在其窗口中收到任何指针运动事件(再次,除非您执行抓取)
答案 1 :(得分:2)
如果您想在移动鼠标时更改鼠标的行为,我建议您使用输入属性,而不是尝试在程序中进行处理。
xinput --list
xinput --list-props 'USB Optical Mouse'
xinput --set-prop 'USB Optical Mouse' 'Evdev Axis Inversion' 1 0
xinput --set-prop 'USB Optical Mouse' 'Evdev Axes Swap' 1
您无需亲自调用xinput
程序:您可以使用Xlib调用(查看xinput
的源代码)。