XQuartz: darwinPointer now sends both absolute and relative motion

This should hopefully help out wine clients that were continuing to
have issues after the earlier changes.

http://xquartz.macosforge.org/trac/ticket/548

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston 2012-04-19 16:38:06 -07:00
parent 662d41acdd
commit e34519e525
4 changed files with 56 additions and 52 deletions

View File

@ -215,7 +215,8 @@ message_kit_thread(SEL selector, NSObject *arg)
if (state) { if (state) {
if (bgMouseLocationUpdated) { if (bgMouseLocationUpdated) {
DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, DarwinSendPointerEvents(darwinPointer, MotionNotify, 0,
bgMouseLocation.x, bgMouseLocation.y); bgMouseLocation.x, bgMouseLocation.y,
0.0, 0.0);
bgMouseLocationUpdated = FALSE; bgMouseLocationUpdated = FALSE;
} }
DarwinSendDDXEvent(kXquartzActivate, 0); DarwinSendDDXEvent(kXquartzActivate, 0);
@ -1595,14 +1596,16 @@ handle_mouse:
if (bgMouseLocationUpdated) { if (bgMouseLocationUpdated) {
if (!(ev_type == MotionNotify && ev_button == 0)) { if (!(ev_type == MotionNotify && ev_button == 0)) {
DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, DarwinSendPointerEvents(darwinPointer, MotionNotify, 0,
location.x, location.y); location.x, location.y,
0.0, 0.0);
} }
bgMouseLocationUpdated = FALSE; bgMouseLocationUpdated = FALSE;
} }
if (pDev == darwinPointer) { if (pDev == darwinPointer) {
DarwinSendPointerEvents(pDev, ev_type, ev_button, DarwinSendPointerEvents(pDev, ev_type, ev_button,
location.x, location.y); location.x, location.y,
[e deltaX], [e deltaY]);
} else { } else {
DarwinSendTabletEvents(pDev, ev_type, ev_button, DarwinSendTabletEvents(pDev, ev_type, ev_button,
location.x, location.y, pressure, location.x, location.y, pressure,
@ -1667,7 +1670,8 @@ handle_mouse:
if (!XQuartzServerVisible && noTestExtensions) { if (!XQuartzServerVisible && noTestExtensions) {
bgMouseLocationUpdated = FALSE; bgMouseLocationUpdated = FALSE;
DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, DarwinSendPointerEvents(darwinPointer, MotionNotify, 0,
location.x, location.y); location.x, location.y,
0.0, 0.0);
} }
#endif #endif
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070

View File

@ -309,7 +309,7 @@ static int
DarwinMouseProc(DeviceIntPtr pPointer, int what) DarwinMouseProc(DeviceIntPtr pPointer, int what)
{ {
#define NBUTTONS 3 #define NBUTTONS 3
#define NAXES 4 #define NAXES 6
// 3 buttons: left, middle, right // 3 buttons: left, middle, right
CARD8 map[NBUTTONS + 1] = { 0, 1, 2, 3}; CARD8 map[NBUTTONS + 1] = { 0, 1, 2, 3};
Atom btn_labels[NBUTTONS] = { 0 }; Atom btn_labels[NBUTTONS] = { 0 };
@ -323,10 +323,12 @@ DarwinMouseProc(DeviceIntPtr pPointer, int what)
btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y); axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_WHEEL); axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HWHEEL); axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
axes_labels[4] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_WHEEL);
axes_labels[5] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HWHEEL);
// Set button map. // Set button map.
InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS, InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
@ -334,21 +336,27 @@ DarwinMouseProc(DeviceIntPtr pPointer, int what)
(PtrCtrlProcPtr)NoopDDA, (PtrCtrlProcPtr)NoopDDA,
GetMotionHistorySize(), NAXES, GetMotionHistorySize(), NAXES,
axes_labels); axes_labels);
InitValuatorAxisStruct(pPointer, 0, axes_labels[0], InitValuatorAxisStruct(pPointer, 0, axes_labels[0],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative); 0, 0, 0, Absolute);
InitValuatorAxisStruct(pPointer, 1, axes_labels[1], InitValuatorAxisStruct(pPointer, 1, axes_labels[1],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative); 0, 0, 0, Absolute);
InitValuatorAxisStruct(pPointer, 2, axes_labels[2], InitValuatorAxisStruct(pPointer, 2, axes_labels[2],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative); 1, 0, 1, Relative);
InitValuatorAxisStruct(pPointer, 3, axes_labels[3], InitValuatorAxisStruct(pPointer, 3, axes_labels[3],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative); 1, 0, 1, Relative);
InitValuatorAxisStruct(pPointer, 4, axes_labels[4],
NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative);
InitValuatorAxisStruct(pPointer, 5, axes_labels[5],
NO_AXIS_LIMITS, NO_AXIS_LIMITS,
1, 0, 1, Relative);
SetScrollValuator(pPointer, 2, SCROLL_TYPE_VERTICAL, -1.0, SCROLL_FLAG_PREFERRED); SetScrollValuator(pPointer, 4, SCROLL_TYPE_VERTICAL, -1.0, SCROLL_FLAG_PREFERRED);
SetScrollValuator(pPointer, 3, SCROLL_TYPE_HORIZONTAL, -1.0, SCROLL_FLAG_NONE); SetScrollValuator(pPointer, 5, SCROLL_TYPE_HORIZONTAL, -1.0, SCROLL_FLAG_NONE);
break; break;
case DEVICE_ON: case DEVICE_ON:
@ -399,23 +407,24 @@ DarwinTabletProc(DeviceIntPtr pPointer, int what)
axes_labels); axes_labels);
InitProximityClassDeviceStruct(pPointer); InitProximityClassDeviceStruct(pPointer);
InitValuatorAxisStruct(pPointer, 0, axes_labels[0], 0, InitValuatorAxisStruct(pPointer, 0, axes_labels[0],
XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, 0, XQUARTZ_VALUATOR_LIMIT,
Absolute); 1, 0, 1, Absolute);
InitValuatorAxisStruct(pPointer, 1, axes_labels[1], 0, InitValuatorAxisStruct(pPointer, 1, axes_labels[1],
XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, 0, XQUARTZ_VALUATOR_LIMIT,
Absolute); 1, 0, 1, Absolute);
InitValuatorAxisStruct(pPointer, 2, axes_labels[2], 0, InitValuatorAxisStruct(pPointer, 2, axes_labels[2],
XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, 0, XQUARTZ_VALUATOR_LIMIT,
Absolute); 1, 0, 1, Absolute);
InitValuatorAxisStruct(pPointer, 3, axes_labels[3], InitValuatorAxisStruct(pPointer, 3, axes_labels[3],
-XQUARTZ_VALUATOR_LIMIT, -XQUARTZ_VALUATOR_LIMIT,
XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, XQUARTZ_VALUATOR_LIMIT,
Absolute); 1, 0, 1, Absolute);
InitValuatorAxisStruct(pPointer, 4, axes_labels[4], InitValuatorAxisStruct(pPointer, 4, axes_labels[4],
-XQUARTZ_VALUATOR_LIMIT, -XQUARTZ_VALUATOR_LIMIT,
XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, XQUARTZ_VALUATOR_LIMIT,
Absolute); 1, 0, 1, Absolute);
// pPointer->use = IsXExtensionDevice; // pPointer->use = IsXExtensionDevice;
break; break;

View File

@ -74,12 +74,6 @@
#include <IOKit/hidsystem/IOLLEvent.h> #include <IOKit/hidsystem/IOLLEvent.h>
/* Fake button press/release for scroll wheel move. */
#define SCROLLWHEELUPFAKE 4
#define SCROLLWHEELDOWNFAKE 5
#define SCROLLWHEELLEFTFAKE 6
#define SCROLLWHEELRIGHTFAKE 7
#include <X11/extensions/applewmconst.h> #include <X11/extensions/applewmconst.h>
#include "applewmExt.h" #include "applewmExt.h"
@ -497,12 +491,6 @@ DarwinSendTabletEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
pointer_x -= darwinMainScreenX + screen->x; pointer_x -= darwinMainScreenX + screen->x;
pointer_y -= darwinMainScreenY + screen->y; pointer_y -= darwinMainScreenY + screen->y;
if (pointer_x < 0.0)
pointer_x = 0.0;
if (pointer_y < 0.0)
pointer_y = 0.0;
/* Adjust our pointer location to the [0,1] range */ /* Adjust our pointer location to the [0,1] range */
pointer_x = pointer_x / (double)screenInfo.width; pointer_x = pointer_x / (double)screenInfo.width;
pointer_y = pointer_y / (double)screenInfo.height; pointer_y = pointer_y / (double)screenInfo.height;
@ -528,7 +516,8 @@ DarwinSendTabletEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
void void
DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
double pointer_x, double pointer_y) double pointer_x, double pointer_y,
double pointer_dx, double pointer_dy)
{ {
static int darwinFakeMouseButtonDown = 0; static int darwinFakeMouseButtonDown = 0;
ScreenPtr screen; ScreenPtr screen;
@ -553,7 +542,7 @@ DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
/* We're currently "down" with another button, so release it first */ /* We're currently "down" with another button, so release it first */
DarwinSendPointerEvents(pDev, ButtonRelease, DarwinSendPointerEvents(pDev, ButtonRelease,
darwinFakeMouseButtonDown, darwinFakeMouseButtonDown,
pointer_x, pointer_y); pointer_x, pointer_y, 0.0, 0.0);
darwinFakeMouseButtonDown = 0; darwinFakeMouseButtonDown = 0;
} }
if (darwin_all_modifier_flags & darwinFakeMouse2Mask) { if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
@ -591,22 +580,23 @@ DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
pointer_x -= darwinMainScreenX + screen->x; pointer_x -= darwinMainScreenX + screen->x;
pointer_y -= darwinMainScreenY + screen->y; pointer_y -= darwinMainScreenY + screen->y;
if (pointer_x < 0.0)
pointer_x = 0.0;
if (pointer_y < 0.0)
pointer_y = 0.0;
valuator_mask_zero(&valuators); valuator_mask_zero(&valuators);
valuator_mask_set_double(&valuators, 0, pointer_x); valuator_mask_set_double(&valuators, 0, pointer_x);
valuator_mask_set_double(&valuators, 1, pointer_y); valuator_mask_set_double(&valuators, 1, pointer_y);
if (ev_type == MotionNotify) {
if (pointer_dx != 0.0)
valuator_mask_set_double(&valuators, 2, pointer_dx);
if (pointer_dy != 0.0)
valuator_mask_set_double(&valuators, 3, pointer_dy);
}
darwinEvents_lock(); darwinEvents_lock();
{ {
QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE,
&valuators); &valuators);
DarwinPokeEQ(); DarwinPokeEQ();
} darwinEvents_unlock(); } darwinEvents_unlock();
} }
void void
@ -647,8 +637,8 @@ DarwinSendScrollEvents(double scroll_x, double scroll_y) {
} }
valuator_mask_zero(&valuators); valuator_mask_zero(&valuators);
valuator_mask_set_double(&valuators, 2, scroll_y); valuator_mask_set_double(&valuators, 4, scroll_y);
valuator_mask_set_double(&valuators, 3, scroll_x); valuator_mask_set_double(&valuators, 5, scroll_x);
darwinEvents_lock(); darwinEvents_lock();
{ {

View File

@ -49,7 +49,8 @@ DarwinSendTabletEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
double tilt_x, double tilt_y); double tilt_x, double tilt_y);
void void
DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
double pointer_x, double pointer_y); double pointer_x, double pointer_y,
double pointer_dx, double pointer_dy);
void void
DarwinSendKeyboardEvents(int ev_type, int keycode); DarwinSendKeyboardEvents(int ev_type, int keycode);
void void