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