From 46168b3b404164c1f2e7876031e70fb77192fe75 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Wed, 3 Sep 2008 09:11:25 -0700 Subject: [PATCH] XQuartz: Updated Tablet code to include ranges for valuators and added cursor and erasor (cherry picked from commit 6bca78760951cb5cb57ea66b7631a2dc230dc27a) (cherry picked from commit fafcafd6de39cf6b5967793f03b30b49db36fec5) --- hw/xquartz/X11Application.m | 36 +++++++++++++++++++++++++ hw/xquartz/darwin.c | 54 ++++++++++++++++++++++++++++--------- hw/xquartz/darwin.h | 5 +++- hw/xquartz/darwinEvents.c | 8 +++--- 4 files changed, 85 insertions(+), 18 deletions(-) diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index a1c09efb1..3bc489974 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -923,12 +923,48 @@ static void send_nsevent(NSEvent *e) { tilt_x = [e tilt].x; tilt_y = [e tilt].y; } + + if([e subtype] != NSTabletProximityEventSubtype) { + switch([e pointingDeviceType]) { + case NSEraserPointingDevice: + darwinTabletCurrent=darwinTabletEraser; + break; + case NSPenPointingDevice: + darwinTabletCurrent=darwinTabletStylus; + break; + case NSCursorPointingDevice: + case NSUnknownPointingDevice: + default: + darwinTabletCurrent=darwinTabletCursor; + break; + } + + DarwinSendProximityEvents([e isEnteringProximity]?ProximityIn:ProximityOut, + pointer_x, pointer_y); + } DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y, pressure, tilt_x, tilt_y); + break; case NSTabletProximity: + if([e subtype] != NSTabletProximityEventSubtype) { + switch([e pointingDeviceType]) { + case NSEraserPointingDevice: + darwinTabletCurrent=darwinTabletEraser; + break; + case NSPenPointingDevice: + darwinTabletCurrent=darwinTabletStylus; + break; + case NSCursorPointingDevice: + case NSUnknownPointingDevice: + default: + darwinTabletCurrent=darwinTabletCursor; + break; + } + } + DarwinSendProximityEvents([e isEnteringProximity]?ProximityIn:ProximityOut, pointer_x, pointer_y); break; diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c index fb0a806d6..19fe3238b 100644 --- a/hw/xquartz/darwin.c +++ b/hw/xquartz/darwin.c @@ -120,9 +120,12 @@ int darwinAppKitModMask = 0; // Any of these bits int windowItemModMask = NX_COMMANDMASK; // devices -DeviceIntPtr darwinPointer = NULL; -DeviceIntPtr darwinTablet = NULL; DeviceIntPtr darwinKeyboard = NULL; +DeviceIntPtr darwinPointer = NULL; +DeviceIntPtr darwinTabletCurrent = NULL; +DeviceIntPtr darwinTabletStylus = NULL; +DeviceIntPtr darwinTabletCursor = NULL; +DeviceIntPtr darwinTabletEraser = NULL; // Common pixmap formats static PixmapFormatRec formats[] = { @@ -354,7 +357,8 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) { GetMotionHistory, (PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), 2); - pPointer->name = strdup("Quartz Pointing Device"); + InitAbsoluteClassDeviceStruct(pPointer); + pPointer->valuator->mode = Absolute; // Relative break; case DEVICE_ON: pPointer->public.on = TRUE; @@ -381,10 +385,22 @@ static int DarwinTabletProc(DeviceIntPtr pPointer, int what) { InitPointerDeviceStruct((DevicePtr)pPointer, map, 3, GetMotionHistory, (PtrCtrlProcPtr)NoopDDA, - GetMotionHistorySize(), 7); + GetMotionHistorySize(), 5); + pPointer->valuator->mode = Absolute; // Relative InitProximityClassDeviceStruct(pPointer); -// InitAbsoluteClassDeviceStruct(pPointer); - pPointer->name = strdup("pen"); + 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; break; case DEVICE_ON: pPointer->public.on = TRUE; @@ -408,7 +424,6 @@ static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff ) switch ( onoff ) { case DEVICE_INIT: DarwinKeyboardInit( pDev ); - pDev->name = strdup("Quartz Keyboard"); break; case DEVICE_ON: pDev->public.on = TRUE; @@ -530,15 +545,28 @@ int DarwinParseModifierList(const char *constmodifiers, int separatelr) */ void InitInput( int argc, char **argv ) { - darwinPointer = AddInputDevice(DarwinMouseProc, TRUE); - RegisterPointerDevice( darwinPointer ); - - darwinTablet = AddInputDevice(DarwinTabletProc, TRUE); - RegisterPointerDevice( darwinTablet ); - darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE); RegisterKeyboardDevice( darwinKeyboard ); + darwinKeyboard->name = strdup("Quartz Keyboard"); + darwinPointer = AddInputDevice(DarwinMouseProc, TRUE); + RegisterPointerDevice( darwinPointer ); + darwinPointer->name = strdup("Quartz Pointing Device"); + + darwinTabletStylus = AddInputDevice(DarwinTabletProc, TRUE); + RegisterPointerDevice( darwinTabletStylus ); + darwinTabletStylus->name = strdup("stylus"); + + darwinTabletCursor = AddInputDevice(DarwinTabletProc, TRUE); + RegisterPointerDevice( darwinTabletCursor ); + darwinTabletCursor->name = strdup("cursor"); + + darwinTabletEraser = AddInputDevice(DarwinTabletProc, TRUE); + RegisterPointerDevice( darwinTabletEraser ); + darwinTabletEraser->name = strdup("eraser"); + + darwinTabletCurrent = darwinTabletStylus; + DarwinEQInit(); QuartzInitInput(argc, argv); diff --git a/hw/xquartz/darwin.h b/hw/xquartz/darwin.h index fd1c6d52b..3fac20330 100644 --- a/hw/xquartz/darwin.h +++ b/hw/xquartz/darwin.h @@ -71,7 +71,10 @@ extern io_connect_t darwinParamConnect; extern int darwinEventReadFD; extern int darwinEventWriteFD; extern DeviceIntPtr darwinPointer; -extern DeviceIntPtr darwinTablet; +extern DeviceIntPtr darwinTabletCurrent; +extern DeviceIntPtr darwinTabletCursor; +extern DeviceIntPtr darwinTabletStylus; +extern DeviceIntPtr darwinTabletEraser; extern DeviceIntPtr darwinKeyboard; // User preferences diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index 9cb553302..135e41920 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -70,7 +70,7 @@ in this Software without prior written authorization from The Open Group. /* These values were chosen to match the output of xinput under Linux */ #define SCALEFACTOR_TILT 64.0 -#define SCALEFACTOR_PRESSURE 1000.0 +#define SCALEFACTOR_PRESSURE 1023.0 #define _APPLEWM_SERVER_ #include "applewmExt.h" @@ -416,7 +416,7 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin if (pressure == 0 && tilt_x == 0 && tilt_y == 0) dev = darwinPointer; else - dev = darwinTablet; + dev = darwinTabletCurrent; screen = miPointerGetScreen(dev); if(!screen) { @@ -459,7 +459,7 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y); darwinEvents_lock(); { num_events = GetPointerEvents(darwinEvents, dev, ev_type, ev_button, - POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators); + POINTER_ABSOLUTE, 0, dev==darwinTabletCurrent?5:2, valuators); for(i=0; i