XQuartz: Use doubles for input valuators

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston 2012-03-17 00:04:27 -07:00
parent cd84c0949a
commit 5ff46d651a
2 changed files with 59 additions and 72 deletions

View File

@ -430,10 +430,12 @@ DarwinPokeEQ(void)
* display.
*/
static void
DarwinPrepareValuators(DeviceIntPtr pDev, int *valuators, ScreenPtr screen,
float pointer_x, float pointer_y,
float pressure, float tilt_x, float tilt_y)
DarwinPrepareValuators(DeviceIntPtr pDev, ValuatorMask *pmask, ScreenPtr screen,
double pointer_x, double pointer_y,
double pressure, double tilt_x, double tilt_y)
{
valuator_mask_zero(pmask);
/* Fix offset between darwin and X screens */
pointer_x -= darwinMainScreenX + screen->x;
pointer_y -= darwinMainScreenY + screen->y;
@ -445,26 +447,19 @@ DarwinPrepareValuators(DeviceIntPtr pDev, int *valuators, ScreenPtr screen,
pointer_y = 0.0;
if (pDev == darwinPointer) {
valuators[0] = pointer_x;
valuators[1] = pointer_y;
valuators[2] = 0;
valuators[3] = 0;
valuators[4] = 0;
valuator_mask_set_double(pmask, 0, pointer_x);
valuator_mask_set_double(pmask, 1, pointer_y);
} else {
valuator_mask_set_double(pmask, 0, XQUARTZ_VALUATOR_LIMIT * (pointer_x / (double)screenInfo.screens[0]->width));
valuator_mask_set_double(pmask, 1, XQUARTZ_VALUATOR_LIMIT * (pointer_y / (double)screenInfo.screens[0]->height));
valuator_mask_set_double(pmask, 2, XQUARTZ_VALUATOR_LIMIT * pressure);
valuator_mask_set_double(pmask, 3, XQUARTZ_VALUATOR_LIMIT * tilt_x);
valuator_mask_set_double(pmask, 4, XQUARTZ_VALUATOR_LIMIT * tilt_y);
}
else {
/* Setup our array of values */
valuators[0] =
XQUARTZ_VALUATOR_LIMIT * (pointer_x /
(float) screenInfo.screens[0]->width);
valuators[1] =
XQUARTZ_VALUATOR_LIMIT * (pointer_y /
(float) screenInfo.screens[0]->height);
valuators[2] = XQUARTZ_VALUATOR_LIMIT * pressure;
valuators[3] = XQUARTZ_VALUATOR_LIMIT * tilt_x;
valuators[4] = XQUARTZ_VALUATOR_LIMIT * tilt_y;
}
//DEBUG_LOG("Pointer (%f, %f), Valuators: {%d,%d,%d,%d,%d}\n", pointer_x, pointer_y,
// valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
//DEBUG_LOG("Pointer (%lf, %lf), Valuators: {%lf,%lf,%lf,%lf,%lf}\n", pointer_x, pointer_y,
// valuator_mask_get_double(pmask, 0), valuator_mask_get_double(pmask, 1),
// valuator_mask_get_double(pmask, 2), valuator_mask_get_double(pmask, 3),
// valuator_mask_get_double(pmask, 4));
}
void
@ -497,12 +492,12 @@ DarwinInputReleaseButtonsAndKeys(DeviceIntPtr pDev)
void
DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
float pointer_x, float pointer_y, float pressure,
float tilt_x, float tilt_y)
double pointer_x, double pointer_y, double pressure,
double tilt_x, double tilt_y)
{
static int darwinFakeMouseButtonDown = 0;
ScreenPtr screen;
int valuators[5];
ValuatorMask valuators;
//DEBUG_LOG("x=%f, y=%f, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y);
@ -559,14 +554,10 @@ DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
darwinFakeMouseButtonDown = 0;
}
DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y,
DarwinPrepareValuators(pDev, &valuators, screen, pointer_x, pointer_y,
pressure, tilt_x, tilt_y);
darwinEvents_lock(); {
ValuatorMask mask;
valuator_mask_set_range(&mask, 0, (pDev == darwinPointer) ? 2 : 5,
valuators);
QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &mask);
QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &valuators);
DarwinPokeEQ();
} darwinEvents_unlock();
}
@ -590,12 +581,12 @@ DarwinSendKeyboardEvents(int ev_type, int keycode)
}
void
DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x,
float pointer_y, float pressure, float tilt_x,
float tilt_y)
DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, double pointer_x,
double pointer_y, double pressure, double tilt_x,
double tilt_y)
{
ScreenPtr screen;
int valuators[5];
ValuatorMask valuators;
DEBUG_LOG("DarwinSendProximityEvents: %d l:%f,%f p:%f t:%f,%f\n", ev_type,
pointer_x, pointer_y, pressure, tilt_x, tilt_y);
@ -613,54 +604,50 @@ DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x,
return;
}
DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y,
DarwinPrepareValuators(pDev, &valuators, screen, pointer_x, pointer_y,
pressure, tilt_x, tilt_y);
darwinEvents_lock(); {
ValuatorMask mask;
valuator_mask_set_range(&mask, 0, 5, valuators);
QueueProximityEvents(pDev, ev_type, &mask);
QueueProximityEvents(pDev, ev_type, &valuators);
DarwinPokeEQ();
} darwinEvents_unlock();
}
/* Send the appropriate number of button clicks to emulate scroll wheel */
void
DarwinSendScrollEvents(float count_x, float count_y,
float pointer_x, float pointer_y,
float pressure, float tilt_x, float tilt_y)
DarwinSendScrollEvents(double scroll_x, double scroll_y, double pointer_x,
double pointer_y, double pressure, double tilt_x,
double tilt_y)
{
int sign_x, sign_y;
if (!darwinEvents) {
DEBUG_LOG
("DarwinSendScrollEvents called before darwinEvents was initialized\n");
DEBUG_LOG("DarwinSendScrollEvents called before darwinEvents was initialized\n");
return;
}
sign_x = count_x > 0.0f ? SCROLLWHEELLEFTFAKE : SCROLLWHEELRIGHTFAKE;
sign_y = count_y > 0.0f ? SCROLLWHEELUPFAKE : SCROLLWHEELDOWNFAKE;
count_x = fabs(count_x);
count_y = fabs(count_y);
sign_x = scroll_x > 0.0f ? SCROLLWHEELLEFTFAKE : SCROLLWHEELRIGHTFAKE;
sign_y = scroll_y > 0.0f ? SCROLLWHEELUPFAKE : SCROLLWHEELDOWNFAKE;
scroll_x = fabs(scroll_x);
scroll_y = fabs(scroll_y);
while ((count_x > 0.0f) || (count_y > 0.0f)) {
if (count_x > 0.0f) {
while ((scroll_x > 0.0f) || (scroll_y > 0.0f)) {
if (scroll_x > 0.0f) {
DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_x,
pointer_x, pointer_y, pressure, tilt_x,
tilt_y);
pointer_x, pointer_y, pressure,
tilt_x, tilt_y);
DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_x,
pointer_x, pointer_y, pressure, tilt_x,
tilt_y);
count_x = count_x - 1.0f;
pointer_x, pointer_y, pressure,
tilt_x, tilt_y);
scroll_x = scroll_x - 1.0f;
}
if (count_y > 0.0f) {
DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_y,
pointer_x, pointer_y, pressure, tilt_x,
tilt_y);
if (scroll_y > 0.0f) {
DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_y,
pointer_x, pointer_y, pressure,
tilt_x, tilt_y);
DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_y,
pointer_x, pointer_y, pressure, tilt_x,
tilt_y);
count_y = count_y - 1.0f;
pointer_x, pointer_y, pressure,
tilt_x, tilt_y);
scroll_y = scroll_y - 1.0f;
}
}
}

View File

@ -38,15 +38,15 @@ void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e);
void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
void DarwinInputReleaseButtonsAndKeys(DeviceIntPtr pDev);
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(DeviceIntPtr pDev, int ev_type, float pointer_x,
float pointer_y, float pressure, float tilt_x,
float tilt_y);
double pointer_x, double pointer_y, double pressure,
double tilt_x, double tilt_y);
void DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, double pointer_x,
double pointer_y, double pressure, double tilt_x,
double tilt_y);
void DarwinSendKeyboardEvents(int ev_type, int keycode);
void DarwinSendScrollEvents(float count_x, float count_y, float pointer_x,
float pointer_y, float pressure, float tilt_x,
float tilt_y);
void DarwinSendScrollEvents(double scroll_x, double scroll_y, double pointer_x,
double pointer_y, double pressure, double tilt_x,
double tilt_y);
void DarwinUpdateModKeys(int flags);
void DarwinListenOnOpenFD(int fd);