From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50056) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WJO6e-0003Di-OY for qemu-devel@nongnu.org; Fri, 28 Feb 2014 09:08:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WJO6Y-00048d-Jr for qemu-devel@nongnu.org; Fri, 28 Feb 2014 09:08:04 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59089) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WJO6Y-00048N-Cc for qemu-devel@nongnu.org; Fri, 28 Feb 2014 09:07:58 -0500 From: Gerd Hoffmann Date: Fri, 28 Feb 2014 15:06:17 +0100 Message-Id: <1393596409-28934-7-git-send-email-kraxel@redhat.com> In-Reply-To: <1393596409-28934-1-git-send-email-kraxel@redhat.com> References: <1393596409-28934-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PULL 06/38] 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