From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] move kbd/mouse handling to input.c
Date: Wed, 13 Jan 2010 17:27:49 -0600 [thread overview]
Message-ID: <4B4E56F5.7010409@codemonkey.ws> (raw)
In-Reply-To: <1263387934-14394-1-git-send-email-pbonzini@redhat.com>
On 01/13/2010 07:05 AM, Paolo Bonzini wrote:
> Move 200 lines out of vl.c already into common code that only needs to
> be compiled once.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
>
Applied. Thanks.
Regards,
Anthony Liguori
> ---
> Makefile.objs | 2 +-
> input.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> vl.c | 214 +--------------------------------------------------
> 3 files changed, 241 insertions(+), 213 deletions(-)
> create mode 100644 input.c
>
> diff --git a/Makefile.objs b/Makefile.objs
> index e8a44d7..5802d39 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -47,7 +47,7 @@ common-obj-y += $(qobject-obj-y)
> common-obj-y += readline.o console.o
>
> common-obj-y += tcg-runtime.o host-utils.o
> -common-obj-y += irq.o ioport.o
> +common-obj-y += irq.o ioport.o input.o
> common-obj-$(CONFIG_PTIMER) += ptimer.o
> common-obj-$(CONFIG_MAX7310) += max7310.o
> common-obj-$(CONFIG_WM8750) += wm8750.o
> diff --git a/input.c b/input.c
> new file mode 100644
> index 0000000..955b9ab
> --- /dev/null
> +++ b/input.c
> @@ -0,0 +1,238 @@
> +/*
> + * QEMU System Emulator
> + *
> + * Copyright (c) 2003-2008 Fabrice Bellard
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include "sysemu.h"
> +#include "net.h"
> +#include "monitor.h"
> +#include "console.h"
> +#include "qjson.h"
> +
> +
> +static QEMUPutKBDEvent *qemu_put_kbd_event;
> +static void *qemu_put_kbd_event_opaque;
> +static QEMUPutMouseEntry *qemu_put_mouse_event_head;
> +static QEMUPutMouseEntry *qemu_put_mouse_event_current;
> +
> +void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
> +{
> + qemu_put_kbd_event_opaque = opaque;
> + qemu_put_kbd_event = func;
> +}
> +
> +QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
> + void *opaque, int absolute,
> + const char *name)
> +{
> + QEMUPutMouseEntry *s, *cursor;
> +
> + s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
> +
> + s->qemu_put_mouse_event = func;
> + s->qemu_put_mouse_event_opaque = opaque;
> + s->qemu_put_mouse_event_absolute = absolute;
> + s->qemu_put_mouse_event_name = qemu_strdup(name);
> + s->next = NULL;
> +
> + if (!qemu_put_mouse_event_head) {
> + qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
> + return s;
> + }
> +
> + cursor = qemu_put_mouse_event_head;
> + while (cursor->next != NULL)
> + cursor = cursor->next;
> +
> + cursor->next = s;
> + qemu_put_mouse_event_current = s;
> +
> + return s;
> +}
> +
> +void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
> +{
> + QEMUPutMouseEntry *prev = NULL, *cursor;
> +
> + if (!qemu_put_mouse_event_head || entry == NULL)
> + return;
> +
> + cursor = qemu_put_mouse_event_head;
> + while (cursor != NULL&& cursor != entry) {
> + prev = cursor;
> + cursor = cursor->next;
> + }
> +
> + if (cursor == NULL) // does not exist or list empty
> + return;
> + else if (prev == NULL) { // entry is head
> + qemu_put_mouse_event_head = cursor->next;
> + if (qemu_put_mouse_event_current == entry)
> + qemu_put_mouse_event_current = cursor->next;
> + qemu_free(entry->qemu_put_mouse_event_name);
> + qemu_free(entry);
> + return;
> + }
> +
> + prev->next = entry->next;
> +
> + if (qemu_put_mouse_event_current == entry)
> + qemu_put_mouse_event_current = prev;
> +
> + qemu_free(entry->qemu_put_mouse_event_name);
> + qemu_free(entry);
> +}
> +
> +void kbd_put_keycode(int keycode)
> +{
> + if (qemu_put_kbd_event) {
> + qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
> + }
> +}
> +
> +void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
> +{
> + QEMUPutMouseEvent *mouse_event;
> + void *mouse_event_opaque;
> + int width;
> +
> + if (!qemu_put_mouse_event_current) {
> + return;
> + }
> +
> + mouse_event =
> + qemu_put_mouse_event_current->qemu_put_mouse_event;
> + mouse_event_opaque =
> + qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
> +
> + if (mouse_event) {
> + if (graphic_rotate) {
> + if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
> + width = 0x7fff;
> + 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);
> + }
> +}
> +
> +int kbd_mouse_is_absolute(void)
> +{
> + if (!qemu_put_mouse_event_current)
> + return 0;
> +
> + return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
> +}
> +
> +static void info_mice_iter(QObject *data, void *opaque)
> +{
> + QDict *mouse;
> + Monitor *mon = opaque;
> +
> + mouse = qobject_to_qdict(data);
> + monitor_printf(mon, "%c Mouse #%" PRId64 ": %s\n",
> + (qdict_get_bool(mouse, "current") ? '*' : ' '),
> + qdict_get_int(mouse, "index"), qdict_get_str(mouse, "name"));
> +}
> +
> +void do_info_mice_print(Monitor *mon, const QObject *data)
> +{
> + QList *mice_list;
> +
> + mice_list = qobject_to_qlist(data);
> + if (qlist_empty(mice_list)) {
> + monitor_printf(mon, "No mouse devices connected\n");
> + return;
> + }
> +
> + qlist_iter(mice_list, info_mice_iter, mon);
> +}
> +
> +/**
> + * do_info_mice(): Show VM mice information
> + *
> + * Each mouse is represented by a QDict, the returned QObject is a QList of
> + * all mice.
> + *
> + * The mouse QDict contains the following:
> + *
> + * - "name": mouse's name
> + * - "index": mouse's index
> + * - "current": true if this mouse is receiving events, false otherwise
> + *
> + * Example:
> + *
> + * [ { "name": "QEMU Microsoft Mouse", "index": 0, "current": false },
> + * { "name": "QEMU PS/2 Mouse", "index": 1, "current": true } ]
> + */
> +void do_info_mice(Monitor *mon, QObject **ret_data)
> +{
> + QEMUPutMouseEntry *cursor;
> + QList *mice_list;
> + int index = 0;
> +
> + mice_list = qlist_new();
> +
> + if (!qemu_put_mouse_event_head) {
> + goto out;
> + }
> +
> + cursor = qemu_put_mouse_event_head;
> + while (cursor != NULL) {
> + QObject *obj;
> + obj = qobject_from_jsonf("{ 'name': %s, 'index': %d, 'current': %i }",
> + cursor->qemu_put_mouse_event_name,
> + index, cursor == qemu_put_mouse_event_current);
> + qlist_append_obj(mice_list, obj);
> + index++;
> + cursor = cursor->next;
> + }
> +
> +out:
> + *ret_data = QOBJECT(mice_list);
> +}
> +
> +void do_mouse_set(Monitor *mon, const QDict *qdict)
> +{
> + QEMUPutMouseEntry *cursor;
> + int i = 0;
> + int index = qdict_get_int(qdict, "index");
> +
> + if (!qemu_put_mouse_event_head) {
> + monitor_printf(mon, "No mouse devices connected\n");
> + return;
> + }
> +
> + cursor = qemu_put_mouse_event_head;
> + while (cursor != NULL&& index != i) {
> + i++;
> + cursor = cursor->next;
> + }
> +
> + if (cursor != NULL)
> + qemu_put_mouse_event_current = cursor;
> + else
> + monitor_printf(mon, "Mouse at given index not found\n");
> +}
> diff --git a/vl.c b/vl.c
> index b048e89..df2a278 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -375,216 +375,9 @@ ram_addr_t qemu_balloon_status(void)
> return 0;
> }
>
> -/***********************************************************/
> -/* keyboard/mouse */
> -
> -static QEMUPutKBDEvent *qemu_put_kbd_event;
> -static void *qemu_put_kbd_event_opaque;
> -static QEMUPutMouseEntry *qemu_put_mouse_event_head;
> -static QEMUPutMouseEntry *qemu_put_mouse_event_current;
> -
> -void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
> -{
> - qemu_put_kbd_event_opaque = opaque;
> - qemu_put_kbd_event = func;
> -}
> -
> -QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
> - void *opaque, int absolute,
> - const char *name)
> -{
> - QEMUPutMouseEntry *s, *cursor;
> -
> - s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
> -
> - s->qemu_put_mouse_event = func;
> - s->qemu_put_mouse_event_opaque = opaque;
> - s->qemu_put_mouse_event_absolute = absolute;
> - s->qemu_put_mouse_event_name = qemu_strdup(name);
> - s->next = NULL;
> -
> - if (!qemu_put_mouse_event_head) {
> - qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
> - return s;
> - }
> -
> - cursor = qemu_put_mouse_event_head;
> - while (cursor->next != NULL)
> - cursor = cursor->next;
> -
> - cursor->next = s;
> - qemu_put_mouse_event_current = s;
> -
> - return s;
> -}
> -
> -void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
> -{
> - QEMUPutMouseEntry *prev = NULL, *cursor;
> -
> - if (!qemu_put_mouse_event_head || entry == NULL)
> - return;
> -
> - cursor = qemu_put_mouse_event_head;
> - while (cursor != NULL&& cursor != entry) {
> - prev = cursor;
> - cursor = cursor->next;
> - }
> -
> - if (cursor == NULL) // does not exist or list empty
> - return;
> - else if (prev == NULL) { // entry is head
> - qemu_put_mouse_event_head = cursor->next;
> - if (qemu_put_mouse_event_current == entry)
> - qemu_put_mouse_event_current = cursor->next;
> - qemu_free(entry->qemu_put_mouse_event_name);
> - qemu_free(entry);
> - return;
> - }
> -
> - prev->next = entry->next;
> -
> - if (qemu_put_mouse_event_current == entry)
> - qemu_put_mouse_event_current = prev;
> -
> - qemu_free(entry->qemu_put_mouse_event_name);
> - qemu_free(entry);
> -}
> -
> -void kbd_put_keycode(int keycode)
> -{
> - if (qemu_put_kbd_event) {
> - qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
> - }
> -}
> -
> -void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
> -{
> - QEMUPutMouseEvent *mouse_event;
> - void *mouse_event_opaque;
> - int width;
> -
> - if (!qemu_put_mouse_event_current) {
> - return;
> - }
> -
> - mouse_event =
> - qemu_put_mouse_event_current->qemu_put_mouse_event;
> - mouse_event_opaque =
> - qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
> -
> - if (mouse_event) {
> - if (graphic_rotate) {
> - if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
> - width = 0x7fff;
> - 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);
> - }
> -}
> -
> -int kbd_mouse_is_absolute(void)
> -{
> - if (!qemu_put_mouse_event_current)
> - return 0;
> -
> - return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
> -}
> -
> -static void info_mice_iter(QObject *data, void *opaque)
> -{
> - QDict *mouse;
> - Monitor *mon = opaque;
> -
> - mouse = qobject_to_qdict(data);
> - monitor_printf(mon, "%c Mouse #%" PRId64 ": %s\n",
> - (qdict_get_bool(mouse, "current") ? '*' : ' '),
> - qdict_get_int(mouse, "index"), qdict_get_str(mouse, "name"));
> -}
> -
> -void do_info_mice_print(Monitor *mon, const QObject *data)
> -{
> - QList *mice_list;
> -
> - mice_list = qobject_to_qlist(data);
> - if (qlist_empty(mice_list)) {
> - monitor_printf(mon, "No mouse devices connected\n");
> - return;
> - }
> -
> - qlist_iter(mice_list, info_mice_iter, mon);
> -}
> -
> -/**
> - * do_info_mice(): Show VM mice information
> - *
> - * Each mouse is represented by a QDict, the returned QObject is a QList of
> - * all mice.
> - *
> - * The mouse QDict contains the following:
> - *
> - * - "name": mouse's name
> - * - "index": mouse's index
> - * - "current": true if this mouse is receiving events, false otherwise
> - *
> - * Example:
> - *
> - * [ { "name": "QEMU Microsoft Mouse", "index": 0, "current": false },
> - * { "name": "QEMU PS/2 Mouse", "index": 1, "current": true } ]
> - */
> -void do_info_mice(Monitor *mon, QObject **ret_data)
> -{
> - QEMUPutMouseEntry *cursor;
> - QList *mice_list;
> - int index = 0;
> -
> - mice_list = qlist_new();
> -
> - if (!qemu_put_mouse_event_head) {
> - goto out;
> - }
> -
> - cursor = qemu_put_mouse_event_head;
> - while (cursor != NULL) {
> - QObject *obj;
> - obj = qobject_from_jsonf("{ 'name': %s, 'index': %d, 'current': %i }",
> - cursor->qemu_put_mouse_event_name,
> - index, cursor == qemu_put_mouse_event_current);
> - qlist_append_obj(mice_list, obj);
> - index++;
> - cursor = cursor->next;
> - }
> -
> -out:
> - *ret_data = QOBJECT(mice_list);
> -}
> -
> -void do_mouse_set(Monitor *mon, const QDict *qdict)
> -{
> - QEMUPutMouseEntry *cursor;
> - int i = 0;
> - int index = qdict_get_int(qdict, "index");
> -
> - if (!qemu_put_mouse_event_head) {
> - monitor_printf(mon, "No mouse devices connected\n");
> - return;
> - }
> -
> - cursor = qemu_put_mouse_event_head;
> - while (cursor != NULL&& index != i) {
> - i++;
> - cursor = cursor->next;
> - }
>
> - if (cursor != NULL)
> - qemu_put_mouse_event_current = cursor;
> - else
> - monitor_printf(mon, "Mouse at given index not found\n");
> -}
> +/***********************************************************/
> +/* real time host monotonic timer */
>
> /* compute with 96 bit intermediate result: (a*b)/c */
> uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
> @@ -610,9 +403,6 @@ uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
> return res.ll;
> }
>
> -/***********************************************************/
> -/* real time host monotonic timer */
> -
> static int64_t get_clock_realtime(void)
> {
> struct timeval tv;
>
prev parent reply other threads:[~2010-01-13 23:27 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-13 13:05 [Qemu-devel] [PATCH] move kbd/mouse handling to input.c Paolo Bonzini
2010-01-13 23:27 ` Anthony Liguori [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B4E56F5.7010409@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).