diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index a23e1754a..061af6c29 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -890,8 +890,8 @@ static void send_nsevent(NSEvent *e) { NSRect screen; NSPoint location; NSWindow *window; - int pointer_x, pointer_y, ev_button, ev_type; - float pressure, tilt_x, tilt_y; + int ev_button, ev_type; + float pointer_x, pointer_y, pressure, tilt_x, tilt_y; DeviceIntPtr pDev; /* convert location to be relative to top-left of primary display */ @@ -909,7 +909,8 @@ static void send_nsevent(NSEvent *e) { pointer_y = (screen.origin.y + screen.size.height) - location.y; } - pressure = 0; // for tablets + /* Setup our valuators. These will range from 0 to 1 */ + pressure = 0; tilt_x = 0; tilt_y = 0; diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c index d3422765b..25faa7fe0 100644 --- a/hw/xquartz/darwin.c +++ b/hw/xquartz/darwin.c @@ -341,6 +341,8 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) { GetMotionHistorySize(), 2); InitAbsoluteClassDeviceStruct(pPointer); pPointer->valuator->mode = Absolute; // Relative + InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); break; case DEVICE_ON: pPointer->public.on = TRUE; @@ -372,17 +374,12 @@ static int DarwinTabletProc(DeviceIntPtr pPointer, int what) { InitProximityClassDeviceStruct(pPointer); InitAbsoluteClassDeviceStruct(pPointer); -// InitValuatorAxisStruct(pPointer, 0, 0, 1440, 1, 0, 1); -// InitValuatorAxisStruct(pPointer, 1, 0, 900, 1, 0, 1); - InitValuatorAxisStruct(pPointer, 2, 0, 1023, 1, 0, 1); - InitValuatorAxisStruct(pPointer, 3, -64, 64, 1, 0, 1); - InitValuatorAxisStruct(pPointer, 4, -64, 64, 1, 0, 1); -// InitValuatorAxisStruct(pPointer, 2, 0, 240, 49999, 49999, 49999); -// InitValuatorAxisStruct(pPointer, 3, -64, 63, 128, 128, 128); -// InitValuatorAxisStruct(pPointer, 4, -64, 63, 128, 128, 128); -// InitValuatorAxisStruct(pPointer, 5, 0, 1023, 128, 128, 128); - -// pPointer->use = IsXExtensionDevice; + InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitValuatorAxisStruct(pPointer, 2, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitValuatorAxisStruct(pPointer, 3, -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitValuatorAxisStruct(pPointer, 4, -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); +// pPointer->use = IsXExtensionDevice; break; case DEVICE_ON: pPointer->public.on = TRUE; diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index d5d17edc3..c31dffd48 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -68,10 +68,6 @@ in this Software without prior written authorization from The Open Group. #define SCROLLWHEELLEFTFAKE 6 #define SCROLLWHEELRIGHTFAKE 7 -/* These values were chosen to match the output of xinput under Linux */ -#define SCALEFACTOR_TILT 64.0 -#define SCALEFACTOR_PRESSURE 1023.0 - #define _APPLEWM_SERVER_ #include "applewmExt.h" #include @@ -390,31 +386,31 @@ static void DarwinPokeEQ(void) { * display. */ static void DarwinPrepareValuators(int *valuators, ScreenPtr screen, - int pointer_x, int pointer_y, + float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y) { /* Fix offset between darwin and X screens */ pointer_x -= darwinMainScreenX + dixScreenOrigins[screen->myNum].x; pointer_y -= darwinMainScreenY + dixScreenOrigins[screen->myNum].y; /* Setup our array of values */ - valuators[0] = pointer_x; - valuators[1] = pointer_y; - valuators[2] = pressure * SCALEFACTOR_PRESSURE; - valuators[3] = tilt_x * SCALEFACTOR_TILT; - valuators[4] = tilt_y * SCALEFACTOR_TILT; + valuators[0] = pointer_x * XQUARTZ_VALUATOR_LIMIT / (float)screenInfo.screens[0]->width; + valuators[1] = pointer_y * XQUARTZ_VALUATOR_LIMIT / (float)screenInfo.screens[0]->height; + valuators[2] = pressure * XQUARTZ_VALUATOR_LIMIT; + valuators[3] = tilt_x * XQUARTZ_VALUATOR_LIMIT; + valuators[4] = tilt_y * XQUARTZ_VALUATOR_LIMIT; -// DEBUG_LOG("Valuators: {%d,%d,%d,%d,%d}\n", -// valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]); + DEBUG_LOG("Valuators: {%d,%d,%d,%d,%d}\n", + valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]); } -void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, int pointer_x, int pointer_y, +void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y) { static int darwinFakeMouseButtonDown = 0; int i, num_events; ScreenPtr screen; int valuators[5]; -// DEBUG_LOG("x=%d, y=%d, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y); + DEBUG_LOG("x=%f, y=%f, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y); if(!darwinEvents) { DEBUG_LOG("DarwinSendPointerEvents called before darwinEvents was initialized\n"); @@ -483,13 +479,13 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) { } darwinEvents_unlock(); } -void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) { +void DarwinSendProximityEvents(int ev_type, float pointer_x, float pointer_y) { int i, num_events; ScreenPtr screen; DeviceIntPtr dev = darwinTabletCurrent; int valuators[5]; - DEBUG_LOG("DarwinSendProximityEvents(%d, %d, %d)\n", ev_type, pointer_x, pointer_y); + DEBUG_LOG("DarwinSendProximityEvents(%d, %f, %f)\n", ev_type, pointer_x, pointer_y); if(!darwinEvents) { DEBUG_LOG("DarwinSendProximityEvents called before darwinEvents was initialized\n"); @@ -514,7 +510,7 @@ void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) { /* Send the appropriate number of button clicks to emulate scroll wheel */ void DarwinSendScrollEvents(float count_x, float count_y, - int pointer_x, int pointer_y, + float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y) { if(!darwinEvents) { DEBUG_LOG("DarwinSendScrollEvents called before darwinEvents was initialized\n"); diff --git a/hw/xquartz/darwinEvents.h b/hw/xquartz/darwinEvents.h index 003f5faa8..2f1d9ff6f 100644 --- a/hw/xquartz/darwinEvents.h +++ b/hw/xquartz/darwinEvents.h @@ -28,15 +28,18 @@ #ifndef _DARWIN_EVENTS_H #define _DARWIN_EVENTS_H +/* For extra precision of our cursor and other valuators */ +#define XQUARTZ_VALUATOR_LIMIT (1 << 16) + Bool DarwinEQInit(void); void DarwinEQEnqueue(const xEventPtr e); void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e); void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX); -void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, int pointer_x, int pointer_y, +void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y); -void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y); +void DarwinSendProximityEvents(int ev_type, float pointer_x, float pointer_y); void DarwinSendKeyboardEvents(int ev_type, int keycode); -void DarwinSendScrollEvents(float count_x, float count_y, int pointer_x, int pointer_y, +void DarwinSendScrollEvents(float count_x, float count_y, float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y); void DarwinUpdateModKeys(int flags); void DarwinListenOnOpenFD(int fd);