6

マウスの動作を変更する単純な 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: どうすれば本当にマウス ポインターをつかむことができますか?

4

2 に答える 2

6

プログラムがマウス イベントを受け取ると、イベントのコピーを受け取ります。コピーは、それらのイベントをリッスンしている他のプログラムにも送信されます ( を参照XSelectInput(3))。マウスの排他的な所有権を取得するために使用せずにこれをオーバーライドすることはできません。これにより、他のプログラムがマウス イベントXGrabPointer(3)を受信できなくなります。要するに、やろうとしていることを実際に行うことはできません。

PointerMotionまた、クライアントがそのウィンドウの 1 つに対して伝播禁止マスクを指定している場合、そのウィンドウ内でポインター モーション イベントを受信しないことにも注意してください(グラブを実行しない限り)。

于 2012-04-25T07:47:29.093 に答える
2

If you want to change the behavior of the mouse when it is being moved, I suggest you to play with the input properties instead of trying to do the processing in your program.

  • 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
  • There's also the 'Coordinate Transformation Matrix' property but for some reason it's not working for me right now.

You don't need to call the xinput program yourself: you can use Xlib calls (look at xinput's source code).

于 2012-04-25T13:19:19.943 に答える