All of lore.kernel.org
 help / color / mirror / Atom feed
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;
>    

  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.