On 01/13/2011 04:19 AM, Gerd Hoffmann wrote:
Hi,
Just throwing a quick writeup into the ring to kickstart the design
discussion ;)
cheers,
Gerd
#ifndef __QEMU_PVTABLET__
#define __QEMU_PVTABLET__ 1
/*
* qemu patavirtual tablet interface
*/
#include<inttypes.h>
/* our virtio-serial channel */
#define QEMU_PVTABLET_NAME "org.qemu.pvtablet.0"
enum qemu_pvtablet_buttons {
QEMU_PVTABLET_BTN_LEFT,
QEMU_PVTABLET_BTN_RIGHT,
QEMU_PVTABLET_BTN_MIDDLE,
/*
* we can handle up to 32 buttons although
* not every has a individual name;)
*/
};
/* send button down+up events */
typedef struct qemu_pvtablet_button {
uint32_t button;
uint32_t mask;
} qemu_pvtablet_button;
/* send pointer move events */
typedef struct qemu_pvtablet_position {
uint32_t pos_x; /* range: 0 -> 0xffff */
uint32_t pos_y; /* range: 0 -> 0xffff */
} qemu_pvtablet_position;
Let's add feature negotiation and not hardcode the resolution.
typedef enum qemu_pvtablet_features {
/* None yet */
};
/* host->guest, sent before any other events */
typedef struct qemu_pvtablet_init {
uint32_t res_x; /* x axis resolution */
uint32_t res_y; /* y axis resolution */
uint32_t features; /* qemu_pvtablet_features */
} qemu_pvtablet_init;
/* guest->host, sent after pvtablet_init. host will not send additional
messages until this is received */
typedef struct qemu_pvtablet_ack {
uint32_t features; /* qemu_pvtable_features */
};
enum qemu_pvtablet_type {
QEMU_PVTABLET_MSG_MOVE, /* qemu_pvtablet_position */
QEMU_PVTABLET_MSG_BTN_DOWN, /* qemu_pvtablet_button */
QEMU_PVTABLET_MSG_BTN_UP, /* qemu_pvtablet_button */
QEMU_PVTABLET_MSG_INIT, /* qemu_pvtable_init */
QEMU_PVTABLE_MSG_ACK, /* qemu_pvtable_ack */
Regards,
Anthony Liguori
};
typedef struct qemu_pvtablet_message {
uint32_t size; /* whole message size */
uint32_t type; /* qemu_pvtablet_type */
uint64_t tv_secs;
uint64_t tv_usecs;
union {
qemu_pvtablet_position position;
qemu_pvtablet_button button;
qemu_pvtablet_display display;
} m;
} qemu_pvtablet_message;
#endif /* __QEMU_PVTABLET__ */