From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58405) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsVk2-0001Ak-Po for qemu-devel@nongnu.org; Mon, 16 Dec 2013 05:49:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VsVjt-0000rM-DD for qemu-devel@nongnu.org; Mon, 16 Dec 2013 05:49:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:18016) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsVjt-0000qO-66 for qemu-devel@nongnu.org; Mon, 16 Dec 2013 05:49:29 -0500 From: Gerd Hoffmann Date: Mon, 16 Dec 2013 11:48:45 +0100 Message-Id: <1387190958-19470-10-git-send-email-kraxel@redhat.com> In-Reply-To: <1387190958-19470-1-git-send-email-kraxel@redhat.com> References: <1387190958-19470-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 09/42] input: add core bits of the new input layer List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Anthony Liguori Register and unregister handlers. Event dispatcher code. Signed-off-by: Gerd Hoffmann --- include/ui/input.h | 32 +++++++++++++++++++++ ui/Makefile.objs | 2 +- ui/input.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 include/ui/input.h create mode 100644 ui/input.c diff --git a/include/ui/input.h b/include/ui/input.h new file mode 100644 index 0000000..3cf3641 --- /dev/null +++ b/include/ui/input.h @@ -0,0 +1,32 @@ +#ifndef INPUT_H +#define INPUT_H + +#include "qapi-types.h" + +#define INPUT_EVENT_MASK_KEY (1<dev = dev; + s->handler = handler; + s->id = id++; + QTAILQ_INSERT_TAIL(&handlers, s, node); + return s; +} + +void qemu_input_handler_activate(QemuInputHandlerState *s) +{ + QTAILQ_REMOVE(&handlers, s, node); + QTAILQ_INSERT_HEAD(&handlers, s, node); +} + +void qemu_input_handler_unregister(QemuInputHandlerState *s) +{ + QTAILQ_REMOVE(&handlers, s, node); + g_free(s); +} + +static QemuInputHandlerState* +qemu_input_find_handler(uint32_t mask) +{ + QemuInputHandlerState *s; + + QTAILQ_FOREACH(s, &handlers, node) { + if (mask & s->handler->mask) { + return s; + } + } + return NULL; +} + +void qemu_input_event_send(QemuConsole *src, InputEvent *evt) +{ + QemuInputHandlerState *s; + + if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { + return; + } + + s = qemu_input_find_handler(1 << evt->kind); + s->handler->event(s->dev, src, evt); + s->events++; +} + +void qemu_input_event_sync(void) +{ + QemuInputHandlerState *s; + + if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { + return; + } + + QTAILQ_FOREACH(s, &handlers, node) { + if (!s->events) { + continue; + } + if (s->handler->sync) { + s->handler->sync(s->dev); + } + s->events = 0; + } +} -- 1.8.3.1