* [Qemu-devel] [PATCH 1/5] Add function parameters for hwheel
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
@ 2010-05-04 16:56 ` Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 2/5] Add hwheel to monitor mouse_move Brad Jorsch
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-05-04 16:56 UTC (permalink / raw)
To: qemu-devel
Add a parameter for the hwheel delta to QEMUPutMouseEntry and
kbd_mouse_event, and adjust all users of those to match. At the moment,
all calls to kbd_mouse_event will pass 0 for the delta.
Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
---
cocoa.m | 6 +++---
console.h | 4 ++--
hw/adb.c | 3 ++-
hw/ads7846.c | 2 +-
hw/escc.c | 3 ++-
hw/msmouse.c | 2 +-
hw/ps2.c | 4 ++--
hw/syborg_pointer.c | 2 +-
hw/tsc2005.c | 2 +-
hw/tsc210x.c | 2 +-
hw/usb-hid.c | 5 +++--
hw/usb-wacom.c | 5 +++--
hw/vmmouse.c | 3 ++-
hw/xenfb.c | 2 +-
input.c | 6 +++---
monitor.c | 4 ++--
sdl.c | 10 ++++++----
vnc.c | 6 +++---
18 files changed, 39 insertions(+), 32 deletions(-)
diff --git a/cocoa.m b/cocoa.m
index 56c789a..c247833 100644
--- a/cocoa.m
+++ b/cocoa.m
@@ -47,9 +47,9 @@
#define cgrect(nsrect) (*(CGRect *)&(nsrect))
#define COCOA_MOUSE_EVENT \
if (isTabletEnabled) { \
- kbd_mouse_event((int)(p.x * 0x7FFF / (screen.width - 1)), (int)((screen.height - p.y) * 0x7FFF / (screen.height - 1)), 0, buttons); \
+ kbd_mouse_event((int)(p.x * 0x7FFF / (screen.width - 1)), (int)((screen.height - p.y) * 0x7FFF / (screen.height - 1)), 0, 0, buttons); \
} else if (isMouseGrabed) { \
- kbd_mouse_event((int)[event deltaX], (int)[event deltaY], 0, buttons); \
+ kbd_mouse_event((int)[event deltaX], (int)[event deltaY], 0, 0, buttons); \
} else { \
[NSApp sendEvent:event]; \
}
@@ -649,7 +649,7 @@ static int cocoa_keycode_to_qemu(int keycode)
break;
case NSScrollWheel:
if (isTabletEnabled || isMouseGrabed) {
- kbd_mouse_event(0, 0, -[event deltaY], 0);
+ kbd_mouse_event(0, 0, -[event deltaY], 0, 0);
} else {
[NSApp sendEvent:event];
}
diff --git a/console.h b/console.h
index 6def115..7ec693d 100644
--- a/console.h
+++ b/console.h
@@ -21,7 +21,7 @@
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 void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int dw, int buttons_state);
typedef struct QEMUPutMouseEntry {
QEMUPutMouseEvent *qemu_put_mouse_event;
@@ -53,7 +53,7 @@ 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);
+void kbd_mouse_event(int dx, int dy, int dz, int dw, int buttons_state);
/* Does the current mouse generate absolute events */
int kbd_mouse_is_absolute(void);
diff --git a/hw/adb.c b/hw/adb.c
index 4fb7a62..88be567 100644
--- a/hw/adb.c
+++ b/hw/adb.c
@@ -318,7 +318,8 @@ typedef struct MouseState {
} MouseState;
static void adb_mouse_event(void *opaque,
- int dx1, int dy1, int dz1, int buttons_state)
+ int dx1, int dy1, int dz1, int dw1,
+ int buttons_state)
{
ADBDevice *d = opaque;
MouseState *s = d->opaque;
diff --git a/hw/ads7846.c b/hw/ads7846.c
index 184b3dd..544db09 100644
--- a/hw/ads7846.c
+++ b/hw/ads7846.c
@@ -86,7 +86,7 @@ static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value)
}
static void ads7846_ts_event(void *opaque,
- int x, int y, int z, int buttons_state)
+ int x, int y, int z, int w, int buttons_state)
{
ADS7846State *s = opaque;
diff --git a/hw/escc.c b/hw/escc.c
index 6d2fd36..c7b420d 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -827,7 +827,8 @@ static void handle_kbd_command(ChannelState *s, int val)
}
static void sunmouse_event(void *opaque,
- int dx, int dy, int dz, int buttons_state)
+ int dx, int dy, int dz, int dw,
+ int buttons_state)
{
ChannelState *s = opaque;
int ch;
diff --git a/hw/msmouse.c b/hw/msmouse.c
index 05f893c..f1bfd0d 100644
--- a/hw/msmouse.c
+++ b/hw/msmouse.c
@@ -31,7 +31,7 @@
#define MSMOUSE_HI2(n) (((n) & 0xc0) >> 6)
static void msmouse_event(void *opaque,
- int dx, int dy, int dz, int buttons_state)
+ int dx, int dy, int dz, int dw, int buttons_state)
{
CharDriverState *chr = (CharDriverState *)opaque;
diff --git a/hw/ps2.c b/hw/ps2.c
index f0b206a..db5605d 100644
--- a/hw/ps2.c
+++ b/hw/ps2.c
@@ -330,7 +330,7 @@ static void ps2_mouse_send_packet(PS2MouseState *s)
}
static void ps2_mouse_event(void *opaque,
- int dx, int dy, int dz, int buttons_state)
+ int dx, int dy, int dz, int dw, int buttons_state)
{
PS2MouseState *s = opaque;
@@ -361,7 +361,7 @@ static void ps2_mouse_event(void *opaque,
void ps2_mouse_fake_event(void *opaque)
{
- ps2_mouse_event(opaque, 1, 0, 0, 0);
+ ps2_mouse_event(opaque, 1, 0, 0, 0, 0);
}
void ps2_write_mouse(void *opaque, int val)
diff --git a/hw/syborg_pointer.c b/hw/syborg_pointer.c
index 563d730..04aa55b 100644
--- a/hw/syborg_pointer.c
+++ b/hw/syborg_pointer.c
@@ -122,7 +122,7 @@ static CPUWriteMemoryFunc * const syborg_pointer_writefn[] = {
syborg_pointer_write
};
-static void syborg_pointer_event(void *opaque, int dx, int dy, int dz,
+static void syborg_pointer_event(void *opaque, int dx, int dy, int dz, int dw,
int buttons_state)
{
SyborgPointerState *s = (SyborgPointerState *)opaque;
diff --git a/hw/tsc2005.c b/hw/tsc2005.c
index b75cc86..6bf991d 100644
--- a/hw/tsc2005.c
+++ b/hw/tsc2005.c
@@ -412,7 +412,7 @@ static void tsc2005_timer_tick(void *opaque)
}
static void tsc2005_touchscreen_event(void *opaque,
- int x, int y, int z, int buttons_state)
+ int x, int y, int z, int dw, int buttons_state)
{
TSC2005State *s = opaque;
int p = s->pressure;
diff --git a/hw/tsc210x.c b/hw/tsc210x.c
index e851ca1..c97aaf2 100644
--- a/hw/tsc210x.c
+++ b/hw/tsc210x.c
@@ -968,7 +968,7 @@ static void tsc210x_timer_tick(void *opaque)
}
static void tsc210x_touchscreen_event(void *opaque,
- int x, int y, int z, int buttons_state)
+ int x, int y, int z, int w, int buttons_state)
{
TSC210xState *s = opaque;
int p = s->pressure;
diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index 476fcfd..deb4731 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -414,7 +414,8 @@ static void usb_hid_changed(USBHIDState *hs)
}
static void usb_mouse_event(void *opaque,
- int dx1, int dy1, int dz1, int buttons_state)
+ int dx1, int dy1, int dz1, int dw1,
+ int buttons_state)
{
USBHIDState *hs = opaque;
USBMouseState *s = &hs->ptr;
@@ -428,7 +429,7 @@ static void usb_mouse_event(void *opaque,
}
static void usb_tablet_event(void *opaque,
- int x, int y, int dz, int buttons_state)
+ int x, int y, int dz, int dw, int buttons_state)
{
USBHIDState *hs = opaque;
USBMouseState *s = &hs->ptr;
diff --git a/hw/usb-wacom.c b/hw/usb-wacom.c
index fe052eb..b14e58b 100644
--- a/hw/usb-wacom.c
+++ b/hw/usb-wacom.c
@@ -119,7 +119,8 @@ static const uint8_t qemu_wacom_config_descriptor[] = {
};
static void usb_mouse_event(void *opaque,
- int dx1, int dy1, int dz1, int buttons_state)
+ int dx1, int dy1, int dz1, int dw1,
+ int buttons_state)
{
USBWacomState *s = opaque;
@@ -131,7 +132,7 @@ static void usb_mouse_event(void *opaque,
}
static void usb_wacom_event(void *opaque,
- int x, int y, int dz, int buttons_state)
+ int x, int y, int dz, int dw, int buttons_state)
{
USBWacomState *s = opaque;
diff --git a/hw/vmmouse.c b/hw/vmmouse.c
index bb6e605..b619170 100644
--- a/hw/vmmouse.c
+++ b/hw/vmmouse.c
@@ -67,7 +67,8 @@ static uint32_t vmmouse_get_status(VMMouseState *s)
return (s->status << 16) | s->nb_queue;
}
-static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_state)
+static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int dw,
+ int buttons_state)
{
VMMouseState *s = opaque;
int buttons = 0;
diff --git a/hw/xenfb.c b/hw/xenfb.c
index 422cd53..0d83810 100644
--- a/hw/xenfb.c
+++ b/hw/xenfb.c
@@ -320,7 +320,7 @@ static void xenfb_key_event(void *opaque, int scancode)
* the button state.
*/
static void xenfb_mouse_event(void *opaque,
- int dx, int dy, int dz, int button_state)
+ int dx, int dy, int dz, int dz2, int button_state)
{
struct XenInput *xenfb = opaque;
int dw = ds_get_width(xenfb->c.ds);
diff --git a/input.c b/input.c
index 8f0941e..ea7c246 100644
--- a/input.c
+++ b/input.c
@@ -137,7 +137,7 @@ void kbd_put_ledstate(int ledstate)
}
}
-void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
+void kbd_mouse_event(int dx, int dy, int dz, int dw, int buttons_state)
{
QEMUPutMouseEntry *entry;
QEMUPutMouseEvent *mouse_event;
@@ -160,10 +160,10 @@ void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
else
width = graphic_width - 1;
mouse_event(mouse_event_opaque,
- width - dy, dx, dz, buttons_state);
+ width - dy, dx, dz, dw, buttons_state);
} else
mouse_event(mouse_event_opaque,
- dx, dy, dz, buttons_state);
+ dx, dy, dz, dw, buttons_state);
}
}
diff --git a/monitor.c b/monitor.c
index 46d0b47..520d48d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1841,14 +1841,14 @@ static void do_mouse_move(Monitor *mon, const QDict *qdict)
dz = 0;
if (dz_str)
dz = strtol(dz_str, NULL, 0);
- kbd_mouse_event(dx, dy, dz, mouse_button_state);
+ kbd_mouse_event(dx, dy, dz, 0, mouse_button_state);
}
static void do_mouse_button(Monitor *mon, const QDict *qdict)
{
int button_state = qdict_get_int(qdict, "button_state");
mouse_button_state = button_state;
- kbd_mouse_event(0, 0, 0, mouse_button_state);
+ kbd_mouse_event(0, 0, 0, 0, mouse_button_state);
}
static void do_ioport_read(Monitor *mon, const QDict *qdict)
diff --git a/sdl.c b/sdl.c
index 16a48e9..616a7eb 100644
--- a/sdl.c
+++ b/sdl.c
@@ -503,7 +503,8 @@ static void sdl_mouse_mode_change(Notifier *notify)
}
}
-static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state)
+static void sdl_send_mouse_event(int dx, int dy, int dz, int dw,
+ int x, int y, int state)
{
int buttons;
buttons = 0;
@@ -526,7 +527,7 @@ static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state
dy = y;
}
- kbd_mouse_event(dx, dy, dz, buttons);
+ kbd_mouse_event(dx, dy, dz, dw, buttons);
}
static void toggle_full_screen(DisplayState *ds)
@@ -684,7 +685,7 @@ static void sdl_refresh(DisplayState *ds)
case SDL_MOUSEMOTION:
if (gui_grab || kbd_mouse_is_absolute() ||
absolute_enabled) {
- sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
+ sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0, 0,
ev->motion.x, ev->motion.y, ev->motion.state);
}
break;
@@ -713,7 +714,8 @@ static void sdl_refresh(DisplayState *ds)
dz = 1;
}
#endif
- sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
+ sdl_send_mouse_event(0, 0, dz, 0, bev->x, bev->y,
+ buttonstate);
}
}
break;
diff --git a/vnc.c b/vnc.c
index 5241a6a..332c14a 100644
--- a/vnc.c
+++ b/vnc.c
@@ -1292,17 +1292,17 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
x * 0x7FFF / (ds_get_width(vs->ds) - 1) : 0x4000,
ds_get_height(vs->ds) > 1 ?
y * 0x7FFF / (ds_get_height(vs->ds) - 1) : 0x4000,
- dz, buttons);
+ dz, 0, buttons);
} else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
x -= 0x7FFF;
y -= 0x7FFF;
- kbd_mouse_event(x, y, dz, buttons);
+ kbd_mouse_event(x, y, dz, 0, buttons);
} else {
if (vs->last_x != -1)
kbd_mouse_event(x - vs->last_x,
y - vs->last_y,
- dz, buttons);
+ dz, 0, buttons);
vs->last_x = x;
vs->last_y = y;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 2/5] Add hwheel to monitor mouse_move
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 1/5] Add function parameters for hwheel Brad Jorsch
@ 2010-05-04 16:56 ` Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 3/5] Pass hwheel events from the front-ends Brad Jorsch
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-05-04 16:56 UTC (permalink / raw)
To: qemu-devel
Adds a parameter to the monitor's mouse_move command to specify the
hwheel delta.
Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
---
monitor.c | 8 ++++++--
qemu-monitor.hx | 4 ++--
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/monitor.c b/monitor.c
index 520d48d..baff2cf 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1832,16 +1832,20 @@ static int mouse_button_state;
static void do_mouse_move(Monitor *mon, const QDict *qdict)
{
- int dx, dy, dz;
+ int dx, dy, dz, dw;
const char *dx_str = qdict_get_str(qdict, "dx_str");
const char *dy_str = qdict_get_str(qdict, "dy_str");
const char *dz_str = qdict_get_try_str(qdict, "dz_str");
+ const char *dw_str = qdict_get_try_str(qdict, "dw_str");
dx = strtol(dx_str, NULL, 0);
dy = strtol(dy_str, NULL, 0);
dz = 0;
+ dw = 0;
if (dz_str)
dz = strtol(dz_str, NULL, 0);
- kbd_mouse_event(dx, dy, dz, 0, mouse_button_state);
+ if (dw_str)
+ dw = strtol(dw_str, NULL, 0);
+ kbd_mouse_event(dx, dy, dz, dw, mouse_button_state);
}
static void do_mouse_button(Monitor *mon, const QDict *qdict)
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index 5ea5748..00067ba 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -616,8 +616,8 @@ ETEXI
{
.name = "mouse_move",
- .args_type = "dx_str:s,dy_str:s,dz_str:s?",
- .params = "dx dy [dz]",
+ .args_type = "dx_str:s,dy_str:s,dz_str:s?,dw_str:s?",
+ .params = "dx dy [dz [dw]]",
.help = "send mouse move events",
.mhandler.cmd = do_mouse_move,
},
--
1.7.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 3/5] Pass hwheel events from the front-ends
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 1/5] Add function parameters for hwheel Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 2/5] Add hwheel to monitor mouse_move Brad Jorsch
@ 2010-05-04 16:56 ` Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 4/5] Add a horizontal wheel to the USB mouse and tablet Brad Jorsch
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-05-04 16:56 UTC (permalink / raw)
To: qemu-devel
SDL seems to report hwheel events as SDL_BUTTON_X1 and SDL_BUTTON_X2.
VNC I am guessing is similar, and online docs indicate that Cocoa
reports hwheel deltas in deltaX for NSScrollWheel.
Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
---
cocoa.m | 2 +-
sdl.c | 12 ++++++++++--
vnc.c | 11 ++++++++---
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/cocoa.m b/cocoa.m
index c247833..afc1b5f 100644
--- a/cocoa.m
+++ b/cocoa.m
@@ -649,7 +649,7 @@ static int cocoa_keycode_to_qemu(int keycode)
break;
case NSScrollWheel:
if (isTabletEnabled || isMouseGrabed) {
- kbd_mouse_event(0, 0, -[event deltaY], 0, 0);
+ kbd_mouse_event(0, 0, -[event deltaY], -[event deltaX], 0);
} else {
[NSApp sendEvent:event];
}
diff --git a/sdl.c b/sdl.c
index 616a7eb..f6fabf1 100644
--- a/sdl.c
+++ b/sdl.c
@@ -700,8 +700,9 @@ static void sdl_refresh(DisplayState *ds)
sdl_grab_start();
}
} else {
- int dz;
+ int dz, dw;
dz = 0;
+ dw = 0;
if (ev->type == SDL_MOUSEBUTTONDOWN) {
buttonstate |= SDL_BUTTON(bev->button);
} else {
@@ -714,7 +715,14 @@ static void sdl_refresh(DisplayState *ds)
dz = 1;
}
#endif
- sdl_send_mouse_event(0, 0, dz, 0, bev->x, bev->y,
+#ifdef SDL_BUTTON_X1
+ if (bev->button == SDL_BUTTON_X1 && ev->type == SDL_MOUSEBUTTONDOWN) {
+ dw = -1;
+ } else if (bev->button == SDL_BUTTON_X2 && ev->type == SDL_MOUSEBUTTONDOWN) {
+ dw = 1;
+ }
+#endif
+ sdl_send_mouse_event(0, 0, dz, dw, bev->x, bev->y,
buttonstate);
}
}
diff --git a/vnc.c b/vnc.c
index 332c14a..c193963 100644
--- a/vnc.c
+++ b/vnc.c
@@ -1275,6 +1275,7 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
{
int buttons = 0;
int dz = 0;
+ int dw = 0;
if (button_mask & 0x01)
buttons |= MOUSE_EVENT_LBUTTON;
@@ -1286,23 +1287,27 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
dz = -1;
if (button_mask & 0x10)
dz = 1;
+ if (button_mask & 0x20)
+ dw = -1;
+ if (button_mask & 0x40)
+ dw = 1;
if (vs->absolute) {
kbd_mouse_event(ds_get_width(vs->ds) > 1 ?
x * 0x7FFF / (ds_get_width(vs->ds) - 1) : 0x4000,
ds_get_height(vs->ds) > 1 ?
y * 0x7FFF / (ds_get_height(vs->ds) - 1) : 0x4000,
- dz, 0, buttons);
+ dz, dw, buttons);
} else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
x -= 0x7FFF;
y -= 0x7FFF;
- kbd_mouse_event(x, y, dz, 0, buttons);
+ kbd_mouse_event(x, y, dz, dw, buttons);
} else {
if (vs->last_x != -1)
kbd_mouse_event(x - vs->last_x,
y - vs->last_y,
- dz, 0, buttons);
+ dz, dw, buttons);
vs->last_x = x;
vs->last_y = y;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 4/5] Add a horizontal wheel to the USB mouse and tablet
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
` (2 preceding siblings ...)
2010-05-04 16:56 ` [Qemu-devel] [PATCH 3/5] Pass hwheel events from the front-ends Brad Jorsch
@ 2010-05-04 16:56 ` Brad Jorsch
2010-05-04 16:56 ` [Qemu-devel] [PATCH 5/5] Add a horizontal wheel to the exps/2 mouse Brad Jorsch
2010-06-02 13:30 ` [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Anthony Liguori
5 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-05-04 16:56 UTC (permalink / raw)
To: qemu-devel
Adjust the USB report descriptors to indicate that the mouse and tablet
have horizontal wheels, and then report the delta when polled.
Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
---
hw/usb-hid.c | 44 ++++++++++++++++++++++++++++++++++++--------
1 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index deb4731..15cc2a1 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -44,7 +44,7 @@
#define USB_KEYBOARD 3
typedef struct USBMouseState {
- int dx, dy, dz, buttons_state;
+ int dx, dy, dz, dw, buttons_state;
int x, y;
int mouse_grabbed;
QEMUPutMouseEntry *eh_entry;
@@ -137,14 +137,14 @@ static const uint8_t qemu_mouse_config_descriptor[] = {
0x00, /* u8 country_code */
0x01, /* u8 num_descriptors */
0x22, /* u8 type; Report */
- 52, 0, /* u16 len */
+ 67, 0, /* u16 len */
/* one endpoint (status change endpoint) */
0x07, /* u8 ep_bLength; */
0x05, /* u8 ep_bDescriptorType; Endpoint */
0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
0x03, /* u8 ep_bmAttributes; Interrupt */
- 0x04, 0x00, /* u16 ep_wMaxPacketSize; */
+ 0x05, 0x00, /* u16 ep_wMaxPacketSize; */
0x0a, /* u8 ep_bInterval; (255ms -- usb 2.0 spec) */
};
@@ -192,14 +192,14 @@ static const uint8_t qemu_tablet_config_descriptor[] = {
0x00, /* u8 country_code */
0x01, /* u8 num_descriptors */
0x22, /* u8 type; Report */
- 74, 0, /* u16 len */
+ 93, 0, /* u16 len */
/* one endpoint (status change endpoint) */
0x07, /* u8 ep_bLength; */
0x05, /* u8 ep_bDescriptorType; Endpoint */
0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
0x03, /* u8 ep_bmAttributes; Interrupt */
- 0x08, 0x00, /* u16 ep_wMaxPacketSize; */
+ 0x09, 0x00, /* u16 ep_wMaxPacketSize; */
0x0a, /* u8 ep_bInterval; (255ms -- usb 2.0 spec) */
};
@@ -284,6 +284,13 @@ static const uint8_t qemu_mouse_hid_report_descriptor[] = {
0x75, 0x08, /* Report Size (8) */
0x95, 0x03, /* Report Count (3) */
0x81, 0x06, /* Input (Data, Variable, Relative) */
+ 0x05, 0x0c, /* Usage Page (Consumer Devices) */
+ 0x0a, 0x38, 0x02, /* Usage (AC Pan) */
+ 0x15, 0x81, /* Logical Minimum (-0x7f) */
+ 0x25, 0x7f, /* Logical Maximum (0x7f) */
+ 0x75, 0x08, /* Report Size (8) */
+ 0x95, 0x01, /* Report Count (1) */
+ 0x81, 0x06, /* Input (Data, Variable, Relative) */
0xc0, /* End Collection */
0xc0, /* End Collection */
};
@@ -324,6 +331,15 @@ static const uint8_t qemu_tablet_hid_report_descriptor[] = {
0x75, 0x08, /* Report Size (8) */
0x95, 0x01, /* Report Count (1) */
0x81, 0x06, /* Input (Data, Variable, Relative) */
+ 0x05, 0x0c, /* Usage Page (Consumer Devices) */
+ 0x0a, 0x38, 0x02, /* Usage (AC Pan) */
+ 0x15, 0x81, /* Logical Minimum (-0x7f) */
+ 0x25, 0x7f, /* Logical Maximum (0x7f) */
+ 0x35, 0x00, /* Physical Minimum (same as logical) */
+ 0x45, 0x00, /* Physical Maximum (same as logical) */
+ 0x75, 0x08, /* Report Size (8) */
+ 0x95, 0x01, /* Report Count (1) */
+ 0x81, 0x06, /* Input (Data, Variable, Relative) */
0xc0, /* End Collection */
0xc0, /* End Collection */
};
@@ -423,6 +439,7 @@ static void usb_mouse_event(void *opaque,
s->dx += dx1;
s->dy += dy1;
s->dz += dz1;
+ s->dw += dw1;
s->buttons_state = buttons_state;
usb_hid_changed(hs);
@@ -437,6 +454,7 @@ static void usb_tablet_event(void *opaque,
s->x = x;
s->y = y;
s->dz += dz;
+ s->dw += dw;
s->buttons_state = buttons_state;
usb_hid_changed(hs);
@@ -508,7 +526,7 @@ static inline int int_clamp(int val, int vmin, int vmax)
static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len)
{
- int dx, dy, dz, b, l;
+ int dx, dy, dz, dw, b, l;
USBMouseState *s = &hs->ptr;
if (!s->mouse_grabbed) {
@@ -519,10 +537,12 @@ static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len)
dx = int_clamp(s->dx, -127, 127);
dy = int_clamp(s->dy, -127, 127);
dz = int_clamp(s->dz, -127, 127);
+ dw = int_clamp(s->dw, -127, 127);
s->dx -= dx;
s->dy -= dy;
s->dz -= dz;
+ s->dw -= dw;
/* Appears we have to invert the wheel direction */
dz = 0 - dz;
@@ -544,12 +564,15 @@ static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len)
buf[l ++] = dy;
if (len > l)
buf[l ++] = dz;
+ if (len > l)
+ buf[l ++] = dw;
+
return l;
}
static int usb_tablet_poll(USBHIDState *hs, uint8_t *buf, int len)
{
- int dz, b, l;
+ int dz, dw, b, l;
USBMouseState *s = &hs->ptr;
if (!s->mouse_grabbed) {
@@ -560,6 +583,9 @@ static int usb_tablet_poll(USBHIDState *hs, uint8_t *buf, int len)
dz = int_clamp(s->dz, -127, 127);
s->dz -= dz;
+ dw = int_clamp(s->dw, -127, 127);
+ s->dw -= dw;
+
/* Appears we have to invert the wheel direction */
dz = 0 - dz;
b = 0;
@@ -576,7 +602,8 @@ static int usb_tablet_poll(USBHIDState *hs, uint8_t *buf, int len)
buf[3] = s->y & 0xff;
buf[4] = s->y >> 8;
buf[5] = dz;
- l = 6;
+ buf[6] = dw;
+ l = 7;
return l;
}
@@ -624,6 +651,7 @@ static void usb_mouse_handle_reset(USBDevice *dev)
s->ptr.dx = 0;
s->ptr.dy = 0;
s->ptr.dz = 0;
+ s->ptr.dw = 0;
s->ptr.x = 0;
s->ptr.y = 0;
s->ptr.buttons_state = 0;
--
1.7.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 5/5] Add a horizontal wheel to the exps/2 mouse
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
` (3 preceding siblings ...)
2010-05-04 16:56 ` [Qemu-devel] [PATCH 4/5] Add a horizontal wheel to the USB mouse and tablet Brad Jorsch
@ 2010-05-04 16:56 ` Brad Jorsch
2010-06-02 13:30 ` [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Anthony Liguori
5 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-05-04 16:56 UTC (permalink / raw)
To: qemu-devel
Have the emulated mouse report horizontal wheel events when in exps/2
mode.
Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
---
hw/ps2.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/hw/ps2.c b/hw/ps2.c
index db5605d..09e4365 100644
--- a/hw/ps2.c
+++ b/hw/ps2.c
@@ -105,7 +105,9 @@ typedef struct {
int mouse_dx; /* current values, needed for 'poll' mode */
int mouse_dy;
int mouse_dz;
+ int mouse_dw;
uint8_t mouse_buttons;
+ uint8_t mouse_buttons_changed;
} PS2MouseState;
/* Table to convert from PC scancodes to raw scancodes. */
@@ -284,11 +286,12 @@ void ps2_keyboard_set_translation(void *opaque, int mode)
static void ps2_mouse_send_packet(PS2MouseState *s)
{
unsigned int b;
- int dx1, dy1, dz1;
+ int dx1, dy1, dz1, dw1;
dx1 = s->mouse_dx;
dy1 = s->mouse_dy;
dz1 = s->mouse_dz;
+ dw1 = s->mouse_dw;
/* XXX: increase range to 8 bits ? */
if (dx1 > 127)
dx1 = 127;
@@ -299,12 +302,17 @@ static void ps2_mouse_send_packet(PS2MouseState *s)
else if (dy1 < -127)
dy1 = -127;
b = 0x08 | ((dx1 < 0) << 4) | ((dy1 < 0) << 5) | (s->mouse_buttons & 0x07);
+ s->mouse_buttons_changed &= ~0x07;
ps2_queue(&s->common, b);
ps2_queue(&s->common, dx1 & 0xff);
ps2_queue(&s->common, dy1 & 0xff);
/* extra byte for IMPS/2 or IMEX */
switch(s->mouse_type) {
default:
+ /* Just ignore the wheels if not supported */
+ s->mouse_dz = 0;
+ s->mouse_dw = 0;
+ s->mouse_buttons_changed &= 0x07;
break;
case 3:
if (dz1 > 127)
@@ -312,13 +320,29 @@ static void ps2_mouse_send_packet(PS2MouseState *s)
else if (dz1 < -127)
dz1 = -127;
ps2_queue(&s->common, dz1 & 0xff);
+ s->mouse_dz -= dz1;
+ s->mouse_dw = 0;
+ s->mouse_buttons_changed &= 0x07;
break;
case 4:
- if (dz1 > 7)
- dz1 = 7;
- else if (dz1 < -7)
- dz1 = -7;
- b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1);
+ /* This matches what the Linux kernel expects for exps/2 in
+ * drivers/input/mouse/psmouse-base.c. */
+ if (dw1 != 0) {
+ if (dw1 > 31)
+ dw1 = 31;
+ else if (dw1 < -31)
+ dw1 = -31;
+ b = (dw1 & 0x3f) | 0x40;
+ s->mouse_dw -= dw1;
+ } else {
+ if (dz1 > 7)
+ dz1 = 7;
+ else if (dz1 < -7)
+ dz1 = -7;
+ b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1);
+ s->mouse_dz -= dz1;
+ s->mouse_buttons_changed &= 0x07;
+ }
ps2_queue(&s->common, b);
break;
}
@@ -326,7 +350,6 @@ static void ps2_mouse_send_packet(PS2MouseState *s)
/* update deltas */
s->mouse_dx -= dx1;
s->mouse_dy -= dy1;
- s->mouse_dz -= dz1;
}
static void ps2_mouse_event(void *opaque,
@@ -341,11 +364,13 @@ static void ps2_mouse_event(void *opaque,
s->mouse_dx += dx;
s->mouse_dy -= dy;
s->mouse_dz += dz;
+ s->mouse_dw -= dw;
+ s->mouse_buttons_changed |= s->mouse_buttons ^ buttons_state;
+ s->mouse_buttons = buttons_state;
/* XXX: SDL sometimes generates nul events: we delete them */
if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0 &&
- s->mouse_buttons == buttons_state)
+ s->mouse_dw == 0 && s->mouse_buttons_changed == 0)
return;
- s->mouse_buttons = buttons_state;
if (!(s->mouse_status & MOUSE_STATUS_REMOTE) &&
(s->common.queue.count < (PS2_QUEUE_SIZE - 16))) {
@@ -353,7 +378,8 @@ static void ps2_mouse_event(void *opaque,
/* if not remote, send event. Multiple events are sent if
too big deltas */
ps2_mouse_send_packet(s);
- if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0)
+ if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0 &&
+ s->mouse_dw == 0 && s->mouse_buttons_changed == 0)
break;
}
}
@@ -525,7 +551,9 @@ static void ps2_mouse_reset(void *opaque)
s->mouse_dx = 0;
s->mouse_dy = 0;
s->mouse_dz = 0;
+ s->mouse_dw = 0;
s->mouse_buttons = 0;
+ s->mouse_buttons_changed = 0;
}
static const VMStateDescription vmstate_ps2_common = {
@@ -569,9 +597,9 @@ static const VMStateDescription vmstate_ps2_keyboard = {
static const VMStateDescription vmstate_ps2_mouse = {
.name = "ps2mouse",
- .version_id = 2,
- .minimum_version_id = 2,
- .minimum_version_id_old = 2,
+ .version_id = 3,
+ .minimum_version_id = 3,
+ .minimum_version_id_old = 3,
.fields = (VMStateField []) {
VMSTATE_STRUCT(common, PS2MouseState, 0, vmstate_ps2_common, PS2State),
VMSTATE_UINT8(mouse_status, PS2MouseState),
@@ -583,7 +611,9 @@ static const VMStateDescription vmstate_ps2_mouse = {
VMSTATE_INT32(mouse_dx, PS2MouseState),
VMSTATE_INT32(mouse_dy, PS2MouseState),
VMSTATE_INT32(mouse_dz, PS2MouseState),
+ VMSTATE_INT32(mouse_dw, PS2MouseState),
VMSTATE_UINT8(mouse_buttons, PS2MouseState),
+ VMSTATE_UINT8(mouse_buttons_changed, PS2MouseState),
VMSTATE_END_OF_LIST()
}
};
--
1.7.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible
2010-05-04 16:56 [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Brad Jorsch
` (4 preceding siblings ...)
2010-05-04 16:56 ` [Qemu-devel] [PATCH 5/5] Add a horizontal wheel to the exps/2 mouse Brad Jorsch
@ 2010-06-02 13:30 ` Anthony Liguori
2010-06-02 16:14 ` Brad Jorsch
5 siblings, 1 reply; 8+ messages in thread
From: Anthony Liguori @ 2010-06-02 13:30 UTC (permalink / raw)
To: Brad Jorsch; +Cc: qemu-devel
On 05/04/2010 11:56 AM, Brad Jorsch wrote:
> The emulated mice should emulate a horizontal wheel when possible. This
> patch series does that for the USB mouse and tablet and the ExPS/2
> mouse. As far as I can tell the vmmouse protocol doesn't handle a
> horizontal wheel, and I have no idea if emulating a wheel might make
> sense for any of the other mouse types.
>
At this point, are we just talking about adding additional mouse buttons?
I think instead of adding an additional parameter for horizontal wheel,
we should look at making the API capable of accepting/generating
arbitrary button presses.
Really, we should just drop dz and treat vertical wheel as two button
presses within button_state. Likewise, horizontal wheel should just be
two additional bits within button_state.
Regards,
Anthony Liguori
> I've tested this using the SDL interface and an Ububtu 10.04 cd image;
> xev reports the correct events for all three devices, and a gedit window
> with sufficient text to create scrollbars scrolls correctly with both
> mice (didn't test the tablet). More testing would be good.
>
> See also Debian bug #579968.[1]
>
> [1] http://bugs.debian.org/579968
>
>
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible
2010-06-02 13:30 ` [Qemu-devel] [RFC] [PATCH 0/5] Add horizontal wheel support to mice, where possible Anthony Liguori
@ 2010-06-02 16:14 ` Brad Jorsch
0 siblings, 0 replies; 8+ messages in thread
From: Brad Jorsch @ 2010-06-02 16:14 UTC (permalink / raw)
To: qemu-devel
On Wed, Jun 02, 2010 at 08:30:11AM -0500, Anthony Liguori wrote:
>
> I think instead of adding an additional parameter for horizontal
> wheel, we should look at making the API capable of
> accepting/generating arbitrary button presses.
>
> Really, we should just drop dz and treat vertical wheel as two
> button presses within button_state. Likewise, horizontal wheel
> should just be two additional bits within button_state.
Wheel handling in cocoa.m and in monitor.c may supply a delta greater
than 1 for the mouse wheels. Those front-ends would have to translate
those deltas into a series of press+release events. Then the emulated
devices (at least the PS/2 and USB devices) would have to sum the
designated button presses for outputting again as wheel data.
If that's the way we want to go, I can rework the patch easily enough.
^ permalink raw reply [flat|nested] 8+ messages in thread