Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Python | USB-мышь (http://forum.oszone.net/showthread.php?t=77481)

Well7 13-01-2007 00:14 535300

Python | USB-мышь
 
Всем привет, у меня возникла одна проблемка: необходимо запустить демон в линухах, который будет следить в фоне за поведением USB-мышки, а точнее за тем, какие кнопки на ней зажаты (левая или правая). Вот тут-то и проблема, а как за мышкой следить-то? Кто может помогите, меня интересует слежка именно за USB-мышкой. Пробовал hexdump устройства, но по какой-то странной причине он мне разные значения дает, может не так пробовал, вот код.
Код:

import os
f = os.popen ('/usr/bin/hexdump /dev/input/mice', 'rb', 1)
data  = f.read(512)
while(data):
        print data,
        data  =  f.read(512)

Может надо с popen2 поиграться? Кто знает, подскажите, заранее спасибо.

ivank 13-01-2007 02:54 535329

Well7
А X'ы запущены? Если да, то можно через Xlib за мышой следить, скорее всего.

добавлено чуть позже. Немного порылся в инете. Как таки получать все события от мыши написано здесь, в секции "Grabbing the Keyboard and Pointer". Биндинг Xlib для питона тоже существует.

Well7 15-01-2007 11:38 536224

ivank
Неа, иксы не запущены, только консоль. Может как-то через gpm можно?

ivank 18-01-2007 18:28 537999

Честно говоря мне с gpm разбираться лень (я с ним даже как простой пользователь не общался никогда).

Так что рекомендую поизучать /usr/src/linux/drivers/input/mousedev.c. В частности функцию mousedev_packet. Пакет данных на самом деле очень простой, кажется. Особенно если нас интересуют только нажатые клавиши. Единственная мелочь - протоколы бывают 3-х и 4-х байтовые (обычный PS2 - 3хбайтовый, у меня именно так). Информация о трёх первых нажатых кнопках содержится в трёх младших битах первого байта. Всё.

Добавлено чуть позже

Вот, написал относительно правдоподобный обработчик клика:
Код:

#!/usr/bin/python
f = file("/dev/input/mice")
l, r = 0, 0
while 1:
        buttons = ord(f.read(3)[0])
        nl, nr = buttons&1, buttons&2
        if l and not nl:
                print "left release"
        if r and not nr:
                print "right release"
        l, r = nl, nr

Добаволено ещё чуть позже
Пораскинул мозгами и понял, что /dev/input/mice по умолчанию всегда выдаёт в PS2 всё. И чтобы перевести её в расширенный режим надо что-то сделать. Вывод на сделан на основе того, что мышь у меня со скролом (т.е. привтворяется пятикнопочной), а PS2 несёт информацию только о 3-х кнопках. При этом иксы питаясь от того же /dev/input/mice на скролл реагируют -> каким-то образом переводят его в расширенный режим (т.е. один из двух 4-х юайтовых протоколов). Как это делается - ни малейшего представления.

Well7 20-01-2007 11:49 538889

ivank
Огромное спасибо, я даже и не подумал про mousedev.c. Рулез, Спасибо.


Время: 20:07.

Время: 20:07.
© OSzone.net 2001-