diff options
Diffstat (limited to 'src/vdagentd-uinput.c')
-rw-r--r-- | src/vdagentd-uinput.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/vdagentd-uinput.c b/src/vdagentd-uinput.c index a415f9c..47e1b45 100644 --- a/src/vdagentd-uinput.c +++ b/src/vdagentd-uinput.c @@ -42,12 +42,13 @@ struct vdagentd_uinput { struct vdagentd_guest_xorg_resolution *screen_info; int screen_count; VDAgentMouseState last; + int fake; }; struct vdagentd_uinput *vdagentd_uinput_create(const char *devname, int width, int height, struct vdagentd_guest_xorg_resolution *screen_info, int screen_count, - int debug) + int debug, int fake) { struct vdagentd_uinput *uinput; @@ -58,6 +59,7 @@ struct vdagentd_uinput *vdagentd_uinput_create(const char *devname, uinput->devname = devname; uinput->fd = -1; /* Gets opened by vdagentd_uinput_update_size() */ uinput->debug = debug; + uinput->fake = fake; vdagentd_uinput_update_size(&uinput, width, height, screen_info, screen_count); @@ -119,13 +121,18 @@ void vdagentd_uinput_update_size(struct vdagentd_uinput **uinputp, return; #endif - uinput->fd = open(uinput->devname, O_RDWR); + uinput->fd = open(uinput->devname, uinput->fake ? O_WRONLY : O_RDWR); if (uinput->fd == -1) { syslog(LOG_ERR, "open %s: %m", uinput->devname); vdagentd_uinput_destroy(uinputp); return; } + if (uinput->fake) { + /* fake device doesn't understand any ioctls and only writes events */ + return; + } + rc = write(uinput->fd, &device, sizeof(device)); if (rc != sizeof(device)) { syslog(LOG_ERR, "write %s: %m", uinput->devname); |