XQuartz: Fix mouse input offsets earlier since GetPointerEvents does not like negative (x,y) values
(cherry picked from commit 8d9eab3a2ec5955cc2698fdcb1fa6ed12b2aadb7)
This commit is contained in:
parent
96fa7da3b8
commit
f4a68f3701
|
@ -839,7 +839,7 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
|
||||||
int pointer_x, pointer_y, ev_button, ev_type;
|
int pointer_x, pointer_y, ev_button, ev_type;
|
||||||
float pressure, tilt_x, tilt_y;
|
float pressure, tilt_x, tilt_y;
|
||||||
|
|
||||||
/* convert location to global top-left coordinates */
|
/* convert location to be relative to top-left of primary display */
|
||||||
location = [e locationInWindow];
|
location = [e locationInWindow];
|
||||||
window = [e window];
|
window = [e window];
|
||||||
screen = [[[NSScreen screens] objectAtIndex:0] frame];
|
screen = [[[NSScreen screens] objectAtIndex:0] frame];
|
||||||
|
|
|
@ -359,6 +359,28 @@ static void DarwinPokeEQ(void) {
|
||||||
write(darwinEventWriteFD, &nullbyte, 1);
|
write(darwinEventWriteFD, &nullbyte, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert from Appkit pointer input values to X input values:
|
||||||
|
* Note: pointer_x and pointer_y are relative to the upper-left of primary
|
||||||
|
* display.
|
||||||
|
*/
|
||||||
|
static void DarwinPrepareValuators(int *valuators, ScreenPtr screen,
|
||||||
|
int pointer_x, int 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;
|
||||||
|
|
||||||
|
DEBUG_LOG("Valuators: {%d,%d,%d,%d,%d}\n",
|
||||||
|
valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
|
||||||
|
}
|
||||||
|
|
||||||
void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y,
|
void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y,
|
||||||
float pressure, float tilt_x, float tilt_y) {
|
float pressure, float tilt_x, float tilt_y) {
|
||||||
static int darwinFakeMouseButtonDown = 0;
|
static int darwinFakeMouseButtonDown = 0;
|
||||||
|
@ -366,22 +388,26 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
|
||||||
int i, num_events;
|
int i, num_events;
|
||||||
DeviceIntPtr dev;
|
DeviceIntPtr dev;
|
||||||
ScreenPtr screen;
|
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=%d, y=%d, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y);
|
||||||
|
|
||||||
if(!darwinEvents) {
|
if(!darwinEvents) {
|
||||||
ErrorF("DarwinSendPointerEvents called before darwinEvents was initialized\n");
|
DEBUG_LOG("DarwinSendPointerEvents called before darwinEvents was initialized\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int valuators[5] = {pointer_x, pointer_y, pressure * SCALEFACTOR_PRESSURE,
|
if (pressure == 0 && tilt_x == 0 && tilt_y == 0)
|
||||||
tilt_x * SCALEFACTOR_TILT, tilt_y * SCALEFACTOR_TILT};
|
dev = darwinPointer;
|
||||||
|
else
|
||||||
|
dev = darwinTablet;
|
||||||
|
|
||||||
if (pressure == 0 && tilt_x == 0 && tilt_y == 0) dev = darwinPointer;
|
screen = miPointerGetScreen(dev);
|
||||||
else dev = darwinTablet;
|
if(!screen) {
|
||||||
|
DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG_LOG("Valuators: {%d,%d,%d,%d,%d}\n",
|
|
||||||
valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
|
|
||||||
if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
|
if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
|
||||||
// Mimic multi-button mouse with modifier-clicks
|
// Mimic multi-button mouse with modifier-clicks
|
||||||
// If both sets of modifiers are pressed,
|
// If both sets of modifiers are pressed,
|
||||||
|
@ -413,17 +439,11 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
|
||||||
darwinEvents_lock(); {
|
darwinEvents_lock(); {
|
||||||
num_events = GetPointerEvents(darwinEvents, dev, ev_type, ev_button,
|
num_events = GetPointerEvents(darwinEvents, dev, ev_type, ev_button,
|
||||||
POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
|
POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
|
||||||
screen = miPointerGetScreen(dev);
|
for(i=0; i<num_events; i++) mieqEnqueue (dev, &darwinEvents[i]);
|
||||||
for(i=0; i<num_events && screen; i++) {
|
|
||||||
darwinEvents[i].u.keyButtonPointer.rootX -= darwinMainScreenX +
|
|
||||||
dixScreenOrigins[screen->myNum].x;
|
|
||||||
darwinEvents[i].u.keyButtonPointer.rootY -= darwinMainScreenY +
|
|
||||||
dixScreenOrigins[screen->myNum].y;
|
|
||||||
mieqEnqueue (dev, &darwinEvents[i]);
|
|
||||||
}
|
|
||||||
DarwinPokeEQ();
|
DarwinPokeEQ();
|
||||||
|
|
||||||
} darwinEvents_unlock();
|
} darwinEvents_unlock();
|
||||||
|
@ -433,7 +453,7 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) {
|
||||||
int i, num_events;
|
int i, num_events;
|
||||||
|
|
||||||
if(!darwinEvents) {
|
if(!darwinEvents) {
|
||||||
ErrorF("DarwinSendKeyboardEvents called before darwinEvents was initialized\n");
|
DEBUG_LOG("DarwinSendKeyboardEvents called before darwinEvents was initialized\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,21 +479,28 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) {
|
||||||
|
|
||||||
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) {
|
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) {
|
||||||
int i, num_events;
|
int i, num_events;
|
||||||
|
ScreenPtr screen;
|
||||||
// tilt and pressure have no meaning for a Prox event
|
DeviceIntPtr dev = darwinTablet;
|
||||||
int valuators[5] = {pointer_x, pointer_y, 0, 0, 0};
|
int valuators[5];
|
||||||
|
|
||||||
DEBUG_LOG("DarwinSendProximityEvents(%d, %d, %d)\n", ev_type, pointer_x, pointer_y);
|
DEBUG_LOG("DarwinSendProximityEvents(%d, %d, %d)\n", ev_type, pointer_x, pointer_y);
|
||||||
|
|
||||||
if(!darwinEvents) {
|
if(!darwinEvents) {
|
||||||
ErrorF("DarwinSendProximityEvents called before darwinEvents was initialized\n");
|
DEBUG_LOG("DarwinSendProximityEvents called before darwinEvents was initialized\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
screen = miPointerGetScreen(dev);
|
||||||
|
if(!screen) {
|
||||||
|
DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, 0.0f, 0.0f, 0.0f);
|
||||||
darwinEvents_lock(); {
|
darwinEvents_lock(); {
|
||||||
num_events = GetProximityEvents(darwinEvents, darwinTablet, ev_type,
|
num_events = GetProximityEvents(darwinEvents, dev, ev_type,
|
||||||
0, 5, valuators);
|
0, 5, valuators);
|
||||||
for(i=0; i<num_events; i++) mieqEnqueue (darwinTablet,&darwinEvents[i]);
|
for(i=0; i<num_events; i++) mieqEnqueue (dev,&darwinEvents[i]);
|
||||||
DarwinPokeEQ();
|
DarwinPokeEQ();
|
||||||
} darwinEvents_unlock();
|
} darwinEvents_unlock();
|
||||||
}
|
}
|
||||||
|
@ -484,7 +511,7 @@ void DarwinSendScrollEvents(float count_x, float count_y,
|
||||||
int pointer_x, int pointer_y,
|
int pointer_x, int pointer_y,
|
||||||
float pressure, float tilt_x, float tilt_y) {
|
float pressure, float tilt_x, float tilt_y) {
|
||||||
if(!darwinEvents) {
|
if(!darwinEvents) {
|
||||||
ErrorF("DarwinSendScrollEvents called before darwinEvents was initialized\n");
|
DEBUG_LOG("DarwinSendScrollEvents called before darwinEvents was initialized\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue