【问题标题】:capture mouse with Xlib用 Xlib 捕捉鼠标
【发布时间】:2012-05-05 21:04:45
【问题描述】:

我想编写一个简单的 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;
}

相关:

X11: How do I REALLY grab the mouse pointer?

【问题讨论】:

    标签: c xlib


    【解决方案1】:

    如果你想改变鼠标移动时的行为,我建议你玩输入属性而不是尝试在程序中进行处理。

    • 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 的源代码)。

    【讨论】:

    • 谢谢。倒轴只是一个例子,我想添加一些更花哨的东西:)
    【解决方案2】:

    当您的程序接收到鼠标事件时,它会接收到事件的副本;副本也被发送到正在监听这些事件的其他程序(请参阅XSelectInput(3))。如果不使用XGrabPointer(3) 获取鼠标的独占所有权,则无法覆盖它,这将阻止其他程序接收任何 鼠标事件。简而言之,你实际上不能做你想做的事。

    还请注意,如果客户端在其不传播掩码中为它的一个窗口指定了PointerMotion,您将不会在其窗口内收到任何指针运动事件(同样,除非您进行抓取)。

    【讨论】:

    • 谢谢。在完美的情况下,我想在 X 输入层处理鼠标事件“之前”获取它们(但与鼠标驱动程序混淆可能太低了)。你知道这是否可能吗?
    • X11 通常不提供这种级别的控制;如果你不能用 XInput API 来做,你确实需要在驱动程序或至少服务器插件的级别上做。 X11 在这方面不是很灵活。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多