Commit 63066f4f13b024ac0a45486f06dafbbf944fe4c6
1 parent
caf9a12e
hid event handling
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@880 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
93 additions
and
11 deletions
hw/pckbd.c
| @@ -190,9 +190,9 @@ static void kbd_queue(KBDState *s, int b, int aux) | @@ -190,9 +190,9 @@ static void kbd_queue(KBDState *s, int b, int aux) | ||
| 190 | kbd_update_irq(s); | 190 | kbd_update_irq(s); |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | -void kbd_put_keycode(int keycode) | 193 | +static void pc_kbd_put_keycode(void *opaque, int keycode) |
| 194 | { | 194 | { |
| 195 | - KBDState *s = &kbd_state; | 195 | + KBDState *s = opaque; |
| 196 | kbd_queue(s, keycode, 0); | 196 | kbd_queue(s, keycode, 0); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| @@ -434,9 +434,10 @@ static void kbd_mouse_send_packet(KBDState *s) | @@ -434,9 +434,10 @@ static void kbd_mouse_send_packet(KBDState *s) | ||
| 434 | s->mouse_dz -= dz1; | 434 | s->mouse_dz -= dz1; |
| 435 | } | 435 | } |
| 436 | 436 | ||
| 437 | -void kbd_mouse_event(int dx, int dy, int dz, int buttons_state) | 437 | +static void pc_kbd_mouse_event(void *opaque, |
| 438 | + int dx, int dy, int dz, int buttons_state) | ||
| 438 | { | 439 | { |
| 439 | - KBDState *s = &kbd_state; | 440 | + KBDState *s = opaque; |
| 440 | 441 | ||
| 441 | /* check if deltas are recorded when disabled */ | 442 | /* check if deltas are recorded when disabled */ |
| 442 | if (!(s->mouse_status & MOUSE_STATUS_ENABLED)) | 443 | if (!(s->mouse_status & MOUSE_STATUS_ENABLED)) |
| @@ -652,4 +653,7 @@ void kbd_init(void) | @@ -652,4 +653,7 @@ void kbd_init(void) | ||
| 652 | register_ioport_write(0x60, 1, 1, kbd_write_data, s); | 653 | register_ioport_write(0x60, 1, 1, kbd_write_data, s); |
| 653 | register_ioport_read(0x64, 1, 1, kbd_read_status, s); | 654 | register_ioport_read(0x64, 1, 1, kbd_read_status, s); |
| 654 | register_ioport_write(0x64, 1, 1, kbd_write_command, s); | 655 | register_ioport_write(0x64, 1, 1, kbd_write_command, s); |
| 656 | + | ||
| 657 | + qemu_add_kbd_event_handler(pc_kbd_put_keycode, s); | ||
| 658 | + qemu_add_mouse_event_handler(pc_kbd_mouse_event, s); | ||
| 655 | } | 659 | } |
vl.c
| @@ -385,6 +385,41 @@ void hw_error(const char *fmt, ...) | @@ -385,6 +385,41 @@ void hw_error(const char *fmt, ...) | ||
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | /***********************************************************/ | 387 | /***********************************************************/ |
| 388 | +/* keyboard/mouse */ | ||
| 389 | + | ||
| 390 | +static QEMUPutKBDEvent *qemu_put_kbd_event; | ||
| 391 | +static void *qemu_put_kbd_event_opaque; | ||
| 392 | +static QEMUPutMouseEvent *qemu_put_mouse_event; | ||
| 393 | +static void *qemu_put_mouse_event_opaque; | ||
| 394 | + | ||
| 395 | +void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque) | ||
| 396 | +{ | ||
| 397 | + qemu_put_kbd_event_opaque = opaque; | ||
| 398 | + qemu_put_kbd_event = func; | ||
| 399 | +} | ||
| 400 | + | ||
| 401 | +void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque) | ||
| 402 | +{ | ||
| 403 | + qemu_put_mouse_event_opaque = opaque; | ||
| 404 | + qemu_put_mouse_event = func; | ||
| 405 | +} | ||
| 406 | + | ||
| 407 | +void kbd_put_keycode(int keycode) | ||
| 408 | +{ | ||
| 409 | + if (qemu_put_kbd_event) { | ||
| 410 | + qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode); | ||
| 411 | + } | ||
| 412 | +} | ||
| 413 | + | ||
| 414 | +void kbd_mouse_event(int dx, int dy, int dz, int buttons_state) | ||
| 415 | +{ | ||
| 416 | + if (qemu_put_mouse_event) { | ||
| 417 | + qemu_put_mouse_event(qemu_put_mouse_event_opaque, | ||
| 418 | + dx, dy, dz, buttons_state); | ||
| 419 | + } | ||
| 420 | +} | ||
| 421 | + | ||
| 422 | +/***********************************************************/ | ||
| 388 | /* timers */ | 423 | /* timers */ |
| 389 | 424 | ||
| 390 | #if defined(__powerpc__) | 425 | #if defined(__powerpc__) |
vl.h
| @@ -179,6 +179,21 @@ extern int rtc_utc; | @@ -179,6 +179,21 @@ extern int rtc_utc; | ||
| 179 | #define BIOS_SIZE 0 | 179 | #define BIOS_SIZE 0 |
| 180 | #endif | 180 | #endif |
| 181 | 181 | ||
| 182 | +/* keyboard/mouse support */ | ||
| 183 | + | ||
| 184 | +#define MOUSE_EVENT_LBUTTON 0x01 | ||
| 185 | +#define MOUSE_EVENT_RBUTTON 0x02 | ||
| 186 | +#define MOUSE_EVENT_MBUTTON 0x04 | ||
| 187 | + | ||
| 188 | +typedef void QEMUPutKBDEvent(void *opaque, int keycode); | ||
| 189 | +typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state); | ||
| 190 | + | ||
| 191 | +void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque); | ||
| 192 | +void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque); | ||
| 193 | + | ||
| 194 | +void kbd_put_keycode(int keycode); | ||
| 195 | +void kbd_mouse_event(int dx, int dy, int dz, int buttons_state); | ||
| 196 | + | ||
| 182 | /* async I/O support */ | 197 | /* async I/O support */ |
| 183 | 198 | ||
| 184 | typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size); | 199 | typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size); |
| @@ -530,13 +545,6 @@ void pci_ne2000_init(NetDriverState *nd); | @@ -530,13 +545,6 @@ void pci_ne2000_init(NetDriverState *nd); | ||
| 530 | 545 | ||
| 531 | /* pckbd.c */ | 546 | /* pckbd.c */ |
| 532 | 547 | ||
| 533 | -void kbd_put_keycode(int keycode); | ||
| 534 | - | ||
| 535 | -#define MOUSE_EVENT_LBUTTON 0x01 | ||
| 536 | -#define MOUSE_EVENT_RBUTTON 0x02 | ||
| 537 | -#define MOUSE_EVENT_MBUTTON 0x04 | ||
| 538 | -void kbd_mouse_event(int dx, int dy, int dz, int buttons_state); | ||
| 539 | - | ||
| 540 | void kbd_init(void); | 548 | void kbd_init(void); |
| 541 | 549 | ||
| 542 | /* mc146818rtc.c */ | 550 | /* mc146818rtc.c */ |
| @@ -627,6 +635,41 @@ int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, | @@ -627,6 +635,41 @@ int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, | ||
| 627 | uint32_t initrd_image, uint32_t initrd_size, | 635 | uint32_t initrd_image, uint32_t initrd_size, |
| 628 | uint32_t NVRAM_image); | 636 | uint32_t NVRAM_image); |
| 629 | 637 | ||
| 638 | +/* adb.c */ | ||
| 639 | + | ||
| 640 | +#define MAX_ADB_DEVICES 16 | ||
| 641 | + | ||
| 642 | +typedef struct ADBDevice ADBDevice; | ||
| 643 | + | ||
| 644 | +typedef void ADBDeviceReceivePacket(ADBDevice *d, const uint8_t *buf, int len); | ||
| 645 | + | ||
| 646 | +struct ADBDevice { | ||
| 647 | + struct ADBBusState *bus; | ||
| 648 | + int devaddr; | ||
| 649 | + int handler; | ||
| 650 | + ADBDeviceReceivePacket *receive_packet; | ||
| 651 | + void *opaque; | ||
| 652 | +}; | ||
| 653 | + | ||
| 654 | +typedef struct ADBBusState { | ||
| 655 | + ADBDevice devices[MAX_ADB_DEVICES]; | ||
| 656 | + int nb_devices; | ||
| 657 | +} ADBBusState; | ||
| 658 | + | ||
| 659 | +void adb_receive_packet(ADBBusState *s, const uint8_t *buf, int len); | ||
| 660 | +void adb_send_packet(ADBBusState *s, const uint8_t *buf, int len); | ||
| 661 | + | ||
| 662 | +ADBDevice *adb_register_device(ADBBusState *s, int devaddr, | ||
| 663 | + ADBDeviceReceivePacket *receive_packet, | ||
| 664 | + void *opaque); | ||
| 665 | +void adb_kbd_init(ADBBusState *bus); | ||
| 666 | +void adb_mouse_init(ADBBusState *bus); | ||
| 667 | + | ||
| 668 | +/* cuda.c */ | ||
| 669 | + | ||
| 670 | +extern ADBBusState adb_bus; | ||
| 671 | +int cuda_init(void); | ||
| 672 | + | ||
| 630 | /* monitor.c */ | 673 | /* monitor.c */ |
| 631 | void monitor_init(void); | 674 | void monitor_init(void); |
| 632 | void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2))); | 675 | void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2))); |