Sending simulated mouse events using uinput
Linux/Linux Kernel :
2013. 2. 14. 15:29
반응형
출처 : http://www.mail-archive.com/linux-input@vger.kernel.org/msg00063.html
Sending simulated mouse events using uinput
Greetings oh Linux input wranglers, At Nuvation we are building a driver for multiple input devices, all of which need to appear as mouse events in userland. We've tried several approaches without any good results. Lately I've been looking at the uinput module, especially after finding an article in January 2007 Dashboard about how to do it:
www.einfochips.com/download/dash_jan_tip.pdf
I made a slightly modified version of the sample code from that article. I
enabled uinput, verified that it is in place, did chmod a+rw on it so I could
open it for writing, and compiled this:
===================================
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <sys/time.h>
#include <unistd.h>
// Test the uinput module
struct uinput_user_dev uinp;
struct input_event event;
int main(void) {
int ufile, retcode, i;
ufile = open("/dev/input/uinput", O_WRONLY | O_NDELAY );
printf("open /dev/input/uinput returned %d.\n", ufile);
if (ufile == 0) {
printf("Could not open uinput.\n");
return -1;
}
memset(&uinp, 0, sizeof(uinp));
strncpy(uinp.name, "simulated mouse", 20);
uinp.id.version = 4;
uinp.id.bustype = BUS_USB;
ioctl(ufile, UI_SET_EVBIT, EV_KEY);
ioctl(ufile, UI_SET_EVBIT, EV_REL);
ioctl(ufile, UI_SET_RELBIT, REL_X);
ioctl(ufile, UI_SET_RELBIT, REL_Y);
for (i=0; i<256; i++) {
ioctl(ufile, UI_SET_KEYBIT, i);
}
ioctl(ufile, UI_SET_KEYBIT, BTN_MOUSE);
// create input device in input subsystem
retcode = write(ufile, &uinp, sizeof(uinp));
printf("First write returned %d.\n", retcode);
retcode = (ioctl(ufile, UI_DEV_CREATE));
printf("ioctl UI_DEV_CREATE returned %d.\n", retcode);
if (retcode) {
printf("Error create uinput device %d.\n", retcode);
return -1;
}
// NOW DO STUFF !!!!
for (i=0; i<100; i++) {
struct timeval tv1;
// move pointer upleft by 5 pixels
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
event.code = REL_X;
event.value = -5;
write(ufile, &event, sizeof(event));
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
event.code = REL_Y;
event.value = -5;
write(ufile, &event, sizeof(event));
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(ufile, &event, sizeof(event));
// wait just a moment
do { gettimeofday(&tv1, NULL); } while ((tv1.tv_usec &
0x3FFF) != 0);
do { gettimeofday(&tv1, NULL); } while ((tv1.tv_usec &
0x3FFF) == 0);
}
// destroy the device
ioctl(ufile, UI_DEV_DESTROY);
close(ufile);
}
==============
As I understand it, this ought to cause the mouse to move slowly upleft for a
few seconds - but nothing happens! It is not clear to me what is wrong.
The output on the command line is thus:
[EMAIL PROTECTED] uinputtest]$ gcc uinputtest.c
[EMAIL PROTECTED] uinputtest]$ ./a.out
open /dev/input/uinput returned 3.
First write returned 1116.
ioctl UI_DEV_CREATE returned 0.
[EMAIL PROTECTED] uinputtest]$
I am running Fedora on a VM (using VMWare Player) on a Windows XP machine.
Here is /etc/X11/xorg.conf:
# Xorg configuration created by system-config-display
Section "ServerLayout"
Identifier "single head configuration"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "VMMouse" "CorePointer"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
EndSection
Section "InputDevice"
Identifier "VMMouse"
Driver "vmmouse"
Option "Device" "/dev/input/mice"
Option "Emulate3Buttons" "yes"
EndSection
Section "Monitor"
Identifier "Monitor0"
ModelName "LCD Panel 1680x1050"
HorizSync 31.5 - 90.0
VertRefresh 59.9 - 60.1
Option "dpms"
EndSection
Section "Device"
Identifier "Videocard0"
Driver "vmware"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection
Can anyone offer some advice? Are we forgetting something terribly obvious?
Is the fact of running under a VM somehow messing us up?
Thanks, people. I'm new to Linux - it's great to find out what a large group
of humans are actively supporting it.
Looking forward to any replies,
Nick Turner
Design Engineer
Nuvation, inc.
San Jose, CA
408-228-5580 x258
-
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html반응형
'Linux > Linux Kernel' 카테고리의 다른 글
| 다양한 spin_lock 함수들의 차이? (0) | 2013.02.26 |
|---|---|
| tty uart 를 input device driver로 연결 (0) | 2013.02.14 |
| error bad value (armv5t) for -march= switch (0) | 2013.02.13 |

