From: Anthony Liguori <anthony@codemonkey.ws>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/4] kbd leds: infrastructure
Date: Thu, 25 Feb 2010 08:15:08 -0600 [thread overview]
Message-ID: <4B8685EC.20000@codemonkey.ws> (raw)
In-Reply-To: <1267087161-15204-2-git-send-email-kraxel@redhat.com>
On 02/25/2010 02:39 AM, Gerd Hoffmann wrote:
> Adds infrastructure for keyboard led status tracking to qemu.
>
> Signed-off-by: Gerd Hoffmann<kraxel@redhat.com>
>
This is an obvious extension to the current API so I'm not necessarily
opposed to it.
But I wonder if it really makes sense to treat all of these things
differently since we end up duplicating a lot of code. Would it make
more sense to just introduce:
typedef struct QEMUInputHandler {
void (*put_kbd_event)(QEMUInputHandler *obj, int keycode);
void (*put_led_event)(QEMUInputHandler *obj, int ledstate);
void (*put_mouse_event)(QEMUInputHandler *obj, int dx, int dy, int
dz, int buttons_state);
QLIST_ENTRY(QEMUInputHandler) node;
} QEMUInputHandler;
void qemu_add_input_handler(QEMUInputHandler *handler);
void qemu_remove_input_handler(QEMUInputHandler *handler);
Regards,
Anthony Liguori
> ---
> console.h | 14 ++++++++++++++
> input.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 64 insertions(+), 0 deletions(-)
>
> diff --git a/console.h b/console.h
> index 916859d..0e969d1 100644
> --- a/console.h
> +++ b/console.h
> @@ -10,10 +10,15 @@
> #define MOUSE_EVENT_RBUTTON 0x02
> #define MOUSE_EVENT_MBUTTON 0x04
>
> +#define QEMU_SCROLL_LOCK_LED (1<< 0)
> +#define QEMU_NUM_LOCK_LED (1<< 1)
> +#define QEMU_CAPS_LOCK_LED (1<< 2)
> +
> /* in ms */
> #define GUI_REFRESH_INTERVAL 30
>
> typedef void QEMUPutKBDEvent(void *opaque, int keycode);
> +typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
> typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
>
> typedef struct QEMUPutMouseEntry {
> @@ -26,13 +31,22 @@ typedef struct QEMUPutMouseEntry {
> struct QEMUPutMouseEntry *next;
> } QEMUPutMouseEntry;
>
> +typedef struct QEMUPutLEDEntry {
> + QEMUPutLEDEvent *put_led;
> + void *opaque;
> + struct QEMUPutLEDEntry *next;
> +} QEMUPutLEDEntry;
> +
> void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
> QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
> void *opaque, int absolute,
> const char *name);
> void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
> +QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, void *opaque);
> +void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry);
>
> void kbd_put_keycode(int keycode);
> +void kbd_put_ledstate(int ledstate);
> void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
> int kbd_mouse_is_absolute(void);
>
> diff --git a/input.c b/input.c
> index 955b9ab..82bc85c 100644
> --- a/input.c
> +++ b/input.c
> @@ -31,6 +31,7 @@
>
> static QEMUPutKBDEvent *qemu_put_kbd_event;
> static void *qemu_put_kbd_event_opaque;
> +static QEMUPutLEDEntry *qemu_put_led_event_head;
> static QEMUPutMouseEntry *qemu_put_mouse_event_head;
> static QEMUPutMouseEntry *qemu_put_mouse_event_current;
>
> @@ -102,6 +103,44 @@ void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
> qemu_free(entry);
> }
>
> +QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func,
> + void *opaque)
> +{
> + QEMUPutLEDEntry *s;
> +
> + s = qemu_mallocz(sizeof(QEMUPutLEDEntry));
> +
> + s->put_led = func;
> + s->opaque = opaque;
> + s->next = qemu_put_led_event_head;
> + qemu_put_led_event_head = s;
> + return s;
> +}
> +
> +void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry)
> +{
> + QEMUPutLEDEntry *prev = NULL, *cursor;
> +
> + if (!qemu_put_led_event_head || entry == NULL)
> + return;
> +
> + cursor = qemu_put_led_event_head;
> + while (cursor != NULL&& cursor != entry) {
> + prev = cursor;
> + cursor = cursor->next;
> + }
> +
> + if (cursor == NULL) // does not exist or list empty
> + return;
> +
> + if (prev == NULL) { // entry is head
> + qemu_put_led_event_head = cursor->next;
> + } else {
> + prev->next = entry->next;
> + }
> + qemu_free(entry);
> +}
> +
> void kbd_put_keycode(int keycode)
> {
> if (qemu_put_kbd_event) {
> @@ -109,6 +148,17 @@ void kbd_put_keycode(int keycode)
> }
> }
>
> +void kbd_put_ledstate(int ledstate)
> +{
> + QEMUPutLEDEntry *cursor;
> +
> + cursor = qemu_put_led_event_head;
> + while (cursor != NULL) {
> + cursor->put_led(cursor->opaque, ledstate);
> + cursor = cursor->next;
> + }
> +}
> +
> void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
> {
> QEMUPutMouseEvent *mouse_event;
>
next prev parent reply other threads:[~2010-02-25 14:15 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-25 8:39 [Qemu-devel] [PATCH 0/4] keyboard led status tracking Gerd Hoffmann
2010-02-25 8:39 ` [Qemu-devel] [PATCH 1/4] kbd leds: infrastructure Gerd Hoffmann
2010-02-25 10:57 ` [Qemu-devel] " Juan Quintela
2010-02-25 14:15 ` Anthony Liguori [this message]
2010-02-25 14:36 ` [Qemu-devel] " Gerd Hoffmann
2010-02-25 15:07 ` Anthony Liguori
2010-02-25 16:51 ` Gerd Hoffmann
2010-02-25 17:05 ` Anthony Liguori
2010-02-25 8:39 ` [Qemu-devel] [PATCH 2/4] kbd leds: ps/2 kbd Gerd Hoffmann
2010-02-25 10:59 ` [Qemu-devel] " Juan Quintela
2010-02-25 8:39 ` [Qemu-devel] [PATCH 3/4] kbd leds: usb kbd Gerd Hoffmann
2010-02-25 8:39 ` [Qemu-devel] [PATCH 4/4] kbd keds: vnc Gerd Hoffmann
2010-02-25 11:03 ` [Qemu-devel] " Juan Quintela
2010-02-25 11:11 ` Paolo Bonzini
2010-02-26 16:05 ` Gerd Hoffmann
2010-02-28 1:38 ` [Qemu-devel] " Paul Brook
2010-03-01 8:12 ` Gerd Hoffmann
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=4B8685EC.20000@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=kraxel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.