Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

capture mouse with Xlib

Tags:

c

xlib

I want to write a simple Xlib program changing the mouse behavior (to give an example, invert vertical movement). I have a problem with capturing the events.

I would like the code to

  • capture changes in the controllers position (I move mouse upward, MotionEvent)
  • calculate new cursor position (new_x -= difference_x)
  • set new cursor position ( move pointer down, XWarpPointer, prevent event generation here)

The code below should capture a motion event every time the mouse is moved, but it generates the event only when the pointer moves from one window to another... How to capture all the movement events?

#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;
}

Related:

X11: How do I REALLY grab the mouse pointer?

like image 248
Jakub M. Avatar asked Apr 25 '12 07:04

Jakub M.


1 Answers

When your program receives mouse events, it receives a copy of the events; copies are also sent to other programs that are listening for those events (see XSelectInput(3)). You cannot override this without using XGrabPointer(3) to take exclusive ownership of the mouse, which will prevent other programs from receiving any mouse events. In short, you can't actually do what you are trying to do.

Note also that if a client has specified PointerMotion in its do-not-propagate mask for one of its windows, you will not receive any pointer motion events within its window (again, unless you do a grab).

like image 103
geekosaur Avatar answered Sep 23 '22 02:09

geekosaur