Lines Matching refs:il
71 static void input_linux_toggle_grab(InputLinux *il) in input_linux_toggle_grab() argument
73 intptr_t request = !il->grab_active; in input_linux_toggle_grab()
77 rc = ioctl(il->fd, EVIOCGRAB, request); in input_linux_toggle_grab()
81 il->grab_active = !il->grab_active; in input_linux_toggle_grab()
83 if (!il->grab_all) { in input_linux_toggle_grab()
87 if (item == il || item->grab_all) { in input_linux_toggle_grab()
91 if (item->grab_active != il->grab_active) { in input_linux_toggle_grab()
97 static bool input_linux_check_toggle(InputLinux *il) in input_linux_check_toggle() argument
99 switch (il->grab_toggle) { in input_linux_check_toggle()
101 return il->keydown[KEY_LEFTCTRL] && in input_linux_check_toggle()
102 il->keydown[KEY_RIGHTCTRL]; in input_linux_check_toggle()
105 return il->keydown[KEY_LEFTALT] && in input_linux_check_toggle()
106 il->keydown[KEY_RIGHTALT]; in input_linux_check_toggle()
109 return il->keydown[KEY_LEFTSHIFT] && in input_linux_check_toggle()
110 il->keydown[KEY_RIGHTSHIFT]; in input_linux_check_toggle()
113 return il->keydown[KEY_LEFTMETA] && in input_linux_check_toggle()
114 il->keydown[KEY_RIGHTMETA]; in input_linux_check_toggle()
117 return il->keydown[KEY_SCROLLLOCK]; in input_linux_check_toggle()
120 return (il->keydown[KEY_LEFTCTRL] || in input_linux_check_toggle()
121 il->keydown[KEY_RIGHTCTRL]) && in input_linux_check_toggle()
122 il->keydown[KEY_SCROLLLOCK]; in input_linux_check_toggle()
131 static bool input_linux_should_skip(InputLinux *il, in input_linux_should_skip() argument
134 return (il->grab_toggle == GRAB_TOGGLE_KEYS_SCROLLLOCK || in input_linux_should_skip()
135 il->grab_toggle == GRAB_TOGGLE_KEYS_CTRL_SCROLLLOCK) && in input_linux_should_skip()
139 static void input_linux_handle_keyboard(InputLinux *il, in input_linux_handle_keyboard() argument
143 if (event->value > 2 || (event->value > 1 && !il->repeat)) { in input_linux_handle_keyboard()
159 if (!il->keydown[event->code] && event->value) { in input_linux_handle_keyboard()
160 il->keydown[event->code] = true; in input_linux_handle_keyboard()
161 il->keycount++; in input_linux_handle_keyboard()
163 if (il->keydown[event->code] && !event->value) { in input_linux_handle_keyboard()
164 il->keydown[event->code] = false; in input_linux_handle_keyboard()
165 il->keycount--; in input_linux_handle_keyboard()
169 if (il->grab_active && !input_linux_should_skip(il, event)) { in input_linux_handle_keyboard()
175 if (input_linux_check_toggle(il)) { in input_linux_handle_keyboard()
176 il->grab_request = true; in input_linux_handle_keyboard()
184 if (il->grab_request && !il->keycount) { in input_linux_handle_keyboard()
185 il->grab_request = false; in input_linux_handle_keyboard()
186 input_linux_toggle_grab(il); in input_linux_handle_keyboard()
199 static void input_linux_handle_mouse(InputLinux *il, struct input_event *event) in input_linux_handle_mouse() argument
201 if (!il->grab_active) { in input_linux_handle_mouse()
241 il->wheel = event->value; in input_linux_handle_mouse()
249 il->abs_x_min, il->abs_x_max); in input_linux_handle_mouse()
253 il->abs_y_min, il->abs_y_max); in input_linux_handle_mouse()
259 if (il->wheel != 0) { in input_linux_handle_mouse()
260 input_linux_event_mouse_button((il->wheel > 0) in input_linux_handle_mouse()
263 il->wheel = 0; in input_linux_handle_mouse()
271 InputLinux *il = opaque; in input_linux_event() local
274 uint8_t *p = (uint8_t *)&il->event; in input_linux_event()
277 read_size = sizeof(il->event) - il->read_offset; in input_linux_event()
278 rc = read(il->fd, &p[il->read_offset], read_size); in input_linux_event()
282 qemu_set_fd_handler(il->fd, NULL, NULL, NULL); in input_linux_event()
283 close(il->fd); in input_linux_event()
285 il->read_offset += rc; in input_linux_event()
289 il->read_offset = 0; in input_linux_event()
291 if (il->num_keys) { in input_linux_event()
292 input_linux_handle_keyboard(il, &il->event); in input_linux_event()
294 if ((il->has_rel_x || il->has_abs_x) && il->num_btns) { in input_linux_event()
295 input_linux_handle_mouse(il, &il->event); in input_linux_event()
302 InputLinux *il = INPUT_LINUX(uc); in input_linux_complete() local
309 if (!il->evdev) { in input_linux_complete()
314 il->fd = open(il->evdev, O_RDWR); in input_linux_complete()
315 if (il->fd < 0) { in input_linux_complete()
316 error_setg_file_open(errp, errno, il->evdev); in input_linux_complete()
319 if (!g_unix_set_fd_nonblocking(il->fd, true, NULL)) { in input_linux_complete()
324 rc = ioctl(il->fd, EVIOCGVERSION, &ver); in input_linux_complete()
326 error_setg(errp, "%s: is not an evdev device", il->evdev); in input_linux_complete()
330 rc = ioctl(il->fd, EVIOCGBIT(0, sizeof(evtmap)), &evtmap); in input_linux_complete()
337 rc = ioctl(il->fd, EVIOCGBIT(EV_REL, sizeof(relmap)), &relmap); in input_linux_complete()
342 il->has_rel_x = true; in input_linux_complete()
348 rc = ioctl(il->fd, EVIOCGBIT(EV_ABS, sizeof(absmap)), &absmap); in input_linux_complete()
353 il->has_abs_x = true; in input_linux_complete()
354 rc = ioctl(il->fd, EVIOCGABS(ABS_X), &absinfo); in input_linux_complete()
357 il->evdev); in input_linux_complete()
360 il->abs_x_min = absinfo.minimum; in input_linux_complete()
361 il->abs_x_max = absinfo.maximum; in input_linux_complete()
362 rc = ioctl(il->fd, EVIOCGABS(ABS_Y), &absinfo); in input_linux_complete()
365 il->evdev); in input_linux_complete()
368 il->abs_y_min = absinfo.minimum; in input_linux_complete()
369 il->abs_y_max = absinfo.maximum; in input_linux_complete()
375 rc = ioctl(il->fd, EVIOCGBIT(EV_KEY, sizeof(keymap)), keymap); in input_linux_complete()
379 rc = ioctl(il->fd, EVIOCGKEY(sizeof(keystate)), keystate); in input_linux_complete()
381 error_setg(errp, "%s: failed to get global key state", il->evdev); in input_linux_complete()
387 il->num_btns++; in input_linux_complete()
389 il->num_keys++; in input_linux_complete()
392 il->keydown[i] = true; in input_linux_complete()
393 il->keycount++; in input_linux_complete()
399 qemu_set_fd_handler(il->fd, input_linux_event, NULL, il); in input_linux_complete()
400 if (il->keycount) { in input_linux_complete()
402 il->grab_request = true; in input_linux_complete()
404 input_linux_toggle_grab(il); in input_linux_complete()
406 QTAILQ_INSERT_TAIL(&inputs, il, next); in input_linux_complete()
407 il->initialized = true; in input_linux_complete()
411 error_setg(errp, "%s: failed to read event bits", il->evdev); in input_linux_complete()
414 close(il->fd); in input_linux_complete()
419 InputLinux *il = INPUT_LINUX(obj); in input_linux_instance_finalize() local
421 if (il->initialized) { in input_linux_instance_finalize()
422 QTAILQ_REMOVE(&inputs, il, next); in input_linux_instance_finalize()
423 qemu_set_fd_handler(il->fd, NULL, NULL, NULL); in input_linux_instance_finalize()
424 close(il->fd); in input_linux_instance_finalize()
426 g_free(il->evdev); in input_linux_instance_finalize()
431 InputLinux *il = INPUT_LINUX(obj); in input_linux_get_evdev() local
433 return g_strdup(il->evdev); in input_linux_get_evdev()
439 InputLinux *il = INPUT_LINUX(obj); in input_linux_set_evdev() local
441 if (il->evdev) { in input_linux_set_evdev()
445 il->evdev = g_strdup(value); in input_linux_set_evdev()
450 InputLinux *il = INPUT_LINUX(obj); in input_linux_get_grab_all() local
452 return il->grab_all; in input_linux_get_grab_all()
458 InputLinux *il = INPUT_LINUX(obj); in input_linux_set_grab_all() local
460 il->grab_all = value; in input_linux_set_grab_all()
465 InputLinux *il = INPUT_LINUX(obj); in input_linux_get_repeat() local
467 return il->repeat; in input_linux_get_repeat()
473 InputLinux *il = INPUT_LINUX(obj); in input_linux_set_repeat() local
475 il->repeat = value; in input_linux_set_repeat()
480 InputLinux *il = INPUT_LINUX(obj); in input_linux_get_grab_toggle() local
482 return il->grab_toggle; in input_linux_get_grab_toggle()
488 InputLinux *il = INPUT_LINUX(obj); in input_linux_set_grab_toggle() local
490 il->grab_toggle = value; in input_linux_set_grab_toggle()