aboutsummaryrefslogtreecommitdiffstats
path: root/input.c
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2011-05-10 10:55:21 +0200
committerDavid 'Digit' Turner <digit@android.com>2011-06-01 17:08:17 +0200
commit17410ee4539bb5216421bb9f9dc287b1f678b6cd (patch)
tree3651570420faac7bed11775c7f1f4d483424ac0e /input.c
parent5973c775c853e26f684de58ad28c267281aaffd6 (diff)
downloadexternal_qemu-17410ee4539bb5216421bb9f9dc287b1f678b6cd.zip
external_qemu-17410ee4539bb5216421bb9f9dc287b1f678b6cd.tar.gz
external_qemu-17410ee4539bb5216421bb9f9dc287b1f678b6cd.tar.bz2
qemu-char.h, console.h: upstream integration
Change-Id: Ibd11e84a4d48c1d6c4a168056869a7480bc89930
Diffstat (limited to 'input.c')
-rw-r--r--input.c62
1 files changed, 45 insertions, 17 deletions
diff --git a/input.c b/input.c
index ec05548..d20347f 100644
--- a/input.c
+++ b/input.c
@@ -28,24 +28,45 @@
#include "console.h"
#include "qjson.h"
-static QEMUPutKBDEvent *qemu_put_kbd_event;
-static void *qemu_put_kbd_event_opaque;
+#ifdef CONFIG_SKINNING
+QEMUPutMouseEntry *original_qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
+ void *opaque, int absolute,
+ const char *name);
+#undef qemu_add_mouse_event_handler
+#define qemu_add_mouse_event_handler original_qemu_add_mouse_event_handler
+#endif
+static QTAILQ_HEAD(, QEMUPutKBDEntry) kbd_handlers =
+ QTAILQ_HEAD_INITIALIZER(kbd_handlers);
static QTAILQ_HEAD(, QEMUPutLEDEntry) led_handlers = QTAILQ_HEAD_INITIALIZER(led_handlers);
static QTAILQ_HEAD(, QEMUPutMouseEntry) mouse_handlers =
QTAILQ_HEAD_INITIALIZER(mouse_handlers);
-static NotifierList mouse_mode_notifiers =
+static NotifierList mouse_mode_notifiers =
NOTIFIER_LIST_INITIALIZER(mouse_mode_notifiers);
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
{
- qemu_put_kbd_event_opaque = opaque;
- qemu_put_kbd_event = func;
+ QEMUPutKBDEntry *s;
+
+ if (func != NULL) {
+ s = qemu_mallocz(sizeof(QEMUPutKBDEntry));
+
+ s->put_kbd_event = func;
+ s->opaque = opaque;
+
+ QTAILQ_INSERT_TAIL(&kbd_handlers, s, next);
+ }
}
-void qemu_remove_kbd_event_handler(void)
+void qemu_remove_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
{
- qemu_put_kbd_event_opaque = NULL;
- qemu_put_kbd_event = NULL;
+ QEMUPutKBDEntry *cursor, *cursor_next;
+ if (func != NULL) {
+ QTAILQ_FOREACH_SAFE(cursor, &kbd_handlers, next, cursor_next) {
+ if (cursor->put_kbd_event == func && cursor->opaque == opaque) {
+ QTAILQ_REMOVE(&kbd_handlers, cursor, next);
+ }
+ }
+ }
}
static void check_mode_change(void)
@@ -129,8 +150,9 @@ void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry)
void kbd_put_keycode(int keycode)
{
- if (qemu_put_kbd_event) {
- qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
+ QEMUPutKBDEntry *cursor;
+ QTAILQ_FOREACH(cursor, &kbd_handlers, next) {
+ cursor->put_kbd_event(cursor->opaque, keycode);
}
}
@@ -148,7 +170,9 @@ void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
QEMUPutMouseEntry *entry;
QEMUPutMouseEvent *mouse_event;
void *mouse_event_opaque;
+#ifndef CONFIG_SKINNING
int width;
+#endif
if (QTAILQ_EMPTY(&mouse_handlers)) {
return;
@@ -160,16 +184,20 @@ void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
mouse_event_opaque = entry->qemu_put_mouse_event_opaque;
if (mouse_event) {
+#ifndef CONFIG_SKINNING
if (graphic_rotate) {
- if (entry->qemu_put_mouse_event_absolute)
+ if (entry->qemu_put_mouse_event_absolute) {
width = 0x7fff;
- else
+ } else {
width = graphic_width - 1;
- mouse_event(mouse_event_opaque,
- width - dy, dx, dz, buttons_state);
- } else
- mouse_event(mouse_event_opaque,
- dx, dy, dz, buttons_state);
+ }
+ mouse_event(mouse_event_opaque, width - dy, dx, dz, buttons_state);
+ } else {
+ mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
+ }
+#else
+ mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
+#endif
}
}