Revision 117b3ae6 hw/usb-hid.c

b/hw/usb-hid.c
64 64
    int kind;
65 65
    int protocol;
66 66
    int idle;
67
    int changed;
67 68
} USBHIDState;
68 69

  
69 70
/* mostly the same values as the Bochs USB Mouse device */
......
382 383
static void usb_mouse_event(void *opaque,
383 384
                            int dx1, int dy1, int dz1, int buttons_state)
384 385
{
385
    USBMouseState *s = opaque;
386
    USBHIDState *hs = opaque;
387
    USBMouseState *s = &hs->ptr;
386 388

  
387 389
    s->dx += dx1;
388 390
    s->dy += dy1;
389 391
    s->dz += dz1;
390 392
    s->buttons_state = buttons_state;
393
    hs->changed = 1;
391 394
}
392 395

  
393 396
static void usb_tablet_event(void *opaque,
394 397
			     int x, int y, int dz, int buttons_state)
395 398
{
396
    USBMouseState *s = opaque;
399
    USBHIDState *hs = opaque;
400
    USBMouseState *s = &hs->ptr;
397 401

  
398 402
    s->x = x;
399 403
    s->y = y;
400 404
    s->dz += dz;
401 405
    s->buttons_state = buttons_state;
406
    hs->changed = 1;
402 407
}
403 408

  
404 409
static void usb_keyboard_event(void *opaque, int keycode)
405 410
{
406
    USBKeyboardState *s = opaque;
411
    USBHIDState *hs = opaque;
412
    USBKeyboardState *s = &hs->kbd;
407 413
    uint8_t hid_code, key;
408 414
    int i;
409 415

  
......
411 417
    hid_code = usb_hid_usage_keys[key | ((s->modifiers >> 1) & (1 << 7))];
412 418
    s->modifiers &= ~(1 << 8);
413 419

  
420
    hs->changed = 1;
421

  
414 422
    switch (hid_code) {
415 423
    case 0x00:
416 424
        return;
......
456 464
        return val;
457 465
}
458 466

  
459
static int usb_mouse_poll(USBMouseState *s, uint8_t *buf, int len)
467
static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len)
460 468
{
461 469
    int dx, dy, dz, b, l;
470
    USBMouseState *s = &hs->ptr;
462 471

  
463 472
    if (!s->mouse_grabbed) {
464
	s->eh_entry = qemu_add_mouse_event_handler(usb_mouse_event, s,
473
	s->eh_entry = qemu_add_mouse_event_handler(usb_mouse_event, hs,
465 474
                                                  0, "QEMU USB Mouse");
466 475
	s->mouse_grabbed = 1;
467 476
    }
......
493 502
    return l;
494 503
}
495 504

  
496
static int usb_tablet_poll(USBMouseState *s, uint8_t *buf, int len)
505
static int usb_tablet_poll(USBHIDState *hs, uint8_t *buf, int len)
497 506
{
498 507
    int dz, b, l;
508
    USBMouseState *s = &hs->ptr;
499 509

  
500 510
    if (!s->mouse_grabbed) {
501
	s->eh_entry = qemu_add_mouse_event_handler(usb_tablet_event, s,
511
	s->eh_entry = qemu_add_mouse_event_handler(usb_tablet_event, hs,
502 512
                                                  1, "QEMU USB Tablet");
503 513
	s->mouse_grabbed = 1;
504 514
    }
......
711 721
        break;
712 722
    case GET_REPORT:
713 723
	if (s->kind == USB_MOUSE)
714
            ret = usb_mouse_poll(&s->ptr, data, length);
724
            ret = usb_mouse_poll(s, data, length);
715 725
	else if (s->kind == USB_TABLET)
716
            ret = usb_tablet_poll(&s->ptr, data, length);
726
            ret = usb_tablet_poll(s, data, length);
717 727
        else if (s->kind == USB_KEYBOARD)
718 728
            ret = usb_keyboard_poll(&s->kbd, data, length);
719 729
        break;
......
759 769
    switch(p->pid) {
760 770
    case USB_TOKEN_IN:
761 771
        if (p->devep == 1) {
772
            /* TODO: Implement finite idle delays.  */
773
            if (!(s->changed || s->idle))
774
                return USB_RET_NAK;
775
            s->changed = 0;
762 776
            if (s->kind == USB_MOUSE)
763
                ret = usb_mouse_poll(&s->ptr, p->data, p->len);
777
                ret = usb_mouse_poll(s, p->data, p->len);
764 778
            else if (s->kind == USB_TABLET)
765
                ret = usb_tablet_poll(&s->ptr, p->data, p->len);
779
                ret = usb_tablet_poll(s, p->data, p->len);
766 780
            else if (s->kind == USB_KEYBOARD)
767 781
                ret = usb_keyboard_poll(&s->kbd, p->data, p->len);
768 782
        } else {
......
803 817
    s->dev.handle_data = usb_hid_handle_data;
804 818
    s->dev.handle_destroy = usb_hid_handle_destroy;
805 819
    s->kind = USB_TABLET;
820
    /* Force poll routine to be run and grab input the first time.  */
821
    s->changed = 1;
806 822

  
807 823
    pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
808 824

  
......
824 840
    s->dev.handle_data = usb_hid_handle_data;
825 841
    s->dev.handle_destroy = usb_hid_handle_destroy;
826 842
    s->kind = USB_MOUSE;
843
    /* Force poll routine to be run and grab input the first time.  */
844
    s->changed = 1;
827 845

  
828 846
    pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
829 847

  

Also available in: Unified diff