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))); |