2012-04-25 2 views
4

Я хочу написать простую программу Xlib, изменяющую поведение мыши (чтобы привести пример, инвертируйте вертикальное движение). У меня проблема с захватом событий.захват мыши с Xlib

Я хотел бы код для

  • изменения захвата в положение контроллеров (переместить мышь вверх, MotionEvent)
  • вычислить новое положение курсора (new_x -= difference_x)
  • установить новое положение курсора (перемещать указатель down, XWarpPointer, предотвратите создание событий здесь)

Код ниже должен фиксировать событие движения каждый т ime мышь перемещается, но она генерирует событие только тогда, когда указатель перемещается из одного окна в другое ... Как захватить все события движения?

#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?

ответ

4

Когда ваша программа получает события мыши, он получает копию событий; копии также отправляются другим программам, которые прослушивают эти события (см. XSelectInput(3)). Вы не можете переопределить это, не используя XGrabPointer(3), чтобы получить эксклюзивное владение мышью, что предотвратит получение другими программами любых событий мыши. Короче говоря, вы не можете делать то, что вы пытаетесь сделать.

Обратите также внимание, что если клиент указал PointerMotion в своей маске нераспространения для одного из своих окон, вы не получите никаких событий перемещения курсора в своем окне (опять же, если вы не сделаете захват).

+0

Спасибо. В идеальном случае я хотел бы захватить события мыши «раньше», они обрабатываются входным уровнем X (но беспорядок с драйверами мыши был бы слишком низким, вероятно). Знаете ли вы, возможно ли это? –

+1

X11 обычно не обеспечивает такой уровень контроля; если вы не можете сделать это с помощью XInput API, вам действительно нужно будет сделать это на уровне драйвера или, по крайней мере, серверного плагина. X11 не очень гибкий в этом отношении. – geekosaur

2

Если вы хотите изменить поведение мыши при ее перемещении, я предлагаю вам играть со свойствами ввода вместо того, чтобы пытаться выполнить обработку в вашей программе.

  • xinput --list
  • xinput --list-props 'USB Optical Mouse'
  • xinput --set-prop 'USB Optical Mouse' 'Evdev Axis Inversion' 1 0
  • Там также координатные преобразования матрицы 'собственность, но по какой-то причине это не работает для меня прямо сейчас.

Вам не нужно вызвать программу xinput себя: вы можете использовать Xlib звонки (смотреть на xinput «s исходный код).

+0

Спасибо. Инвертирование осей было всего лишь примером, я хочу добавить что-то более причудливое :) –

Смежные вопросы