Revision 027c03f7 hw/hid.c
b/hw/hid.c | ||
---|---|---|
71 | 71 |
|
72 | 72 |
bool hid_has_events(HIDState *hs) |
73 | 73 |
{ |
74 |
return hs->n > 0; |
|
74 |
return hs->n > 0 || hs->idle_pending;
|
|
75 | 75 |
} |
76 | 76 |
|
77 |
void hid_set_next_idle(HIDState *hs, int64_t curtime)
|
|
77 |
static void hid_idle_timer(void *opaque)
|
|
78 | 78 |
{ |
79 |
hs->next_idle_clock = curtime + (get_ticks_per_sec() * hs->idle * 4) / 1000; |
|
79 |
HIDState *hs = opaque; |
|
80 |
|
|
81 |
hs->idle_pending = true; |
|
82 |
hs->event(hs); |
|
83 |
} |
|
84 |
|
|
85 |
static void hid_del_idle_timer(HIDState *hs) |
|
86 |
{ |
|
87 |
if (hs->idle_timer) { |
|
88 |
qemu_del_timer(hs->idle_timer); |
|
89 |
qemu_free_timer(hs->idle_timer); |
|
90 |
hs->idle_timer = NULL; |
|
91 |
} |
|
92 |
} |
|
93 |
|
|
94 |
void hid_set_next_idle(HIDState *hs) |
|
95 |
{ |
|
96 |
if (hs->idle) { |
|
97 |
uint64_t expire_time = qemu_get_clock_ns(vm_clock) + |
|
98 |
get_ticks_per_sec() * hs->idle * 4 / 1000; |
|
99 |
if (!hs->idle_timer) { |
|
100 |
hs->idle_timer = qemu_new_timer_ns(vm_clock, hid_idle_timer, hs); |
|
101 |
} |
|
102 |
qemu_mod_timer_ns(hs->idle_timer, expire_time); |
|
103 |
} else { |
|
104 |
hid_del_idle_timer(hs); |
|
105 |
} |
|
80 | 106 |
} |
81 | 107 |
|
82 | 108 |
static void hid_pointer_event_clear(HIDPointerEvent *e, int buttons) |
... | ... | |
232 | 258 |
int index; |
233 | 259 |
HIDPointerEvent *e; |
234 | 260 |
|
261 |
hs->idle_pending = false; |
|
262 |
|
|
235 | 263 |
hid_pointer_activate(hs); |
236 | 264 |
|
237 | 265 |
/* When the buffer is empty, return the last event. Relative |
... | ... | |
319 | 347 |
|
320 | 348 |
int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len) |
321 | 349 |
{ |
350 |
hs->idle_pending = false; |
|
351 |
|
|
322 | 352 |
if (len < 2) { |
323 | 353 |
return 0; |
324 | 354 |
} |
... | ... | |
377 | 407 |
hs->n = 0; |
378 | 408 |
hs->protocol = 1; |
379 | 409 |
hs->idle = 0; |
410 |
hs->idle_pending = false; |
|
411 |
hid_del_idle_timer(hs); |
|
380 | 412 |
} |
381 | 413 |
|
382 | 414 |
void hid_free(HIDState *hs) |
... | ... | |
390 | 422 |
qemu_remove_mouse_event_handler(hs->ptr.eh_entry); |
391 | 423 |
break; |
392 | 424 |
} |
425 |
hid_del_idle_timer(hs); |
|
393 | 426 |
} |
394 | 427 |
|
395 | 428 |
void hid_init(HIDState *hs, int kind, HIDEventFunc event) |
... | ... | |
412 | 445 |
{ |
413 | 446 |
HIDState *s = opaque; |
414 | 447 |
|
415 |
if (s->idle) { |
|
416 |
hid_set_next_idle(s, qemu_get_clock_ns(vm_clock)); |
|
417 |
} |
|
448 |
hid_set_next_idle(s); |
|
418 | 449 |
return 0; |
419 | 450 |
} |
420 | 451 |
|
Also available in: Unified diff