From patchwork Fri Mar 26 16:06:34 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Riku Voipio X-Patchwork-Id: 48672 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 77AC5B7CE7 for ; Sat, 27 Mar 2010 04:10:56 +1100 (EST) Received: from localhost ([127.0.0.1]:52135 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NvCcC-0002Tg-0w for incoming@patchwork.ozlabs.org; Fri, 26 Mar 2010 12:42:32 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NvC5B-0003xK-Uf for qemu-devel@nongnu.org; Fri, 26 Mar 2010 12:08:26 -0400 Received: from [140.186.70.92] (port=41650 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NvC4Q-0003e7-8x for qemu-devel@nongnu.org; Fri, 26 Mar 2010 12:08:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1NvC4A-0006ty-UV for qemu-devel@nongnu.org; Fri, 26 Mar 2010 12:07:31 -0400 Received: from afflict.kos.to ([92.243.29.197]:33628) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NvC4A-0006tL-O9 for qemu-devel@nongnu.org; Fri, 26 Mar 2010 12:07:22 -0400 Received: by afflict.kos.to (Postfix, from userid 1000) id BA9FE265A4; Fri, 26 Mar 2010 16:07:21 +0000 (UTC) From: Riku Voipio To: qemu-devel@nongnu.org Date: Fri, 26 Mar 2010 16:06:34 +0000 Message-Id: <97ae98621ef1858ee0ba8343b846bab23be32690.1269617186.git.riku.voipio@nokia.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: References: In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: Riku Voipio , =?UTF-8?q?Juha=20Riihim=C3=A4ki?= Subject: [Qemu-devel] [PATCH 14/48] multikeyboard support merge X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Juha Riihimäki On some systems (such as n900), multiple physical devices can create keyboard events (gpio, lis302dl, twl4030, ..). Add hooks to make it possible to recieve keyboard input from multiple devices. merge our version with upstream multikb support Signed-Off-By: Riku Voipio Signed-Off-By: Juha Riihimäki --- console.h | 8 ++++---- input.c | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/console.h b/console.h index b1362ff..a894edf 100644 --- a/console.h +++ b/console.h @@ -39,12 +39,13 @@ typedef struct QEMUPutMouseEntry { /* used internally by qemu for handling mice */ QTAILQ_ENTRY(QEMUPutMouseEntry) node; } QEMUPutMouseEntry; + typedef struct QEMUPutKBDEntry { - QEMUPutKBDEvent *qemu_put_kbd_event; - void *qemu_put_kbd_event_opaque; + QEMUPutKBDEvent *put_kbd_event; + void *opaque; /* used internally by qemu for handling keyboards */ - struct QEMUPutKBDEntry *next; + QTAILQ_ENTRY(QEMUPutKBDEntry) next; } QEMUPutKBDEntry; typedef struct QEMUPutLEDEntry { @@ -54,7 +55,6 @@ typedef struct QEMUPutLEDEntry { } QEMUPutLEDEntry; void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque); -void qemu_remove_kbd_event_handler(QEMUPutKBDEvent *entry); QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque, int absolute, const char *name); diff --git a/input.c b/input.c index 8f0941e..2e860c6 100644 --- a/input.c +++ b/input.c @@ -28,8 +28,8 @@ #include "console.h" #include "qjson.h" -static QEMUPutKBDEvent *qemu_put_kbd_event; -static void *qemu_put_kbd_event_opaque; +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); @@ -38,8 +38,16 @@ static NotifierList 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); + } } static void check_mode_change(void) @@ -123,8 +131,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); } }