The client is not aware of where the screen is placed so it will give us screen relative coordinates. Convert to and from these and absolute coordinates before interacting with the input layer.tags/v1.7.90
@@ -92,6 +92,16 @@ void vncGetScreenFormat(int scrIdx, int *depth, int *bpp, | |||
*blueMask = vis->blueMask; | |||
} | |||
int vncGetScreenX(int scrIdx) | |||
{ | |||
return screenInfo.screens[scrIdx]->x; | |||
} | |||
int vncGetScreenY(int scrIdx) | |||
{ | |||
return screenInfo.screens[scrIdx]->y; | |||
} | |||
int vncGetScreenWidth(int scrIdx) | |||
{ | |||
return screenInfo.screens[scrIdx]->width; |
@@ -33,6 +33,8 @@ void vncGetScreenFormat(int scrIdx, int *depth, int *bpp, | |||
int *trueColour, int *bigEndian, | |||
int *redMask, int *greenMask, int *blueMask); | |||
int vncGetScreenX(int scrIdx); | |||
int vncGetScreenY(int scrIdx); | |||
int vncGetScreenWidth(int scrIdx); | |||
int vncGetScreenHeight(int scrIdx); | |||
@@ -514,6 +514,8 @@ void XserverDesktop::readWakeupHandler(fd_set* fds, int nfds) | |||
// We are responsible for propagating mouse movement between clients | |||
int cursorX, cursorY; | |||
vncGetPointerPos(&cursorX, &cursorY); | |||
cursorX -= vncGetScreenX(screenIndex); | |||
cursorY -= vncGetScreenY(screenIndex); | |||
if (oldCursorPos.x != cursorX || oldCursorPos.y != cursorY) { | |||
oldCursorPos.x = cursorX; | |||
oldCursorPos.y = cursorY; | |||
@@ -648,7 +650,8 @@ void XserverDesktop::approveConnection(uint32_t opaqueId, bool accept, | |||
void XserverDesktop::pointerEvent(const Point& pos, int buttonMask) | |||
{ | |||
vncPointerMove(pos.x, pos.y); | |||
vncPointerMove(pos.x + vncGetScreenX(screenIndex), | |||
pos.y + vncGetScreenY(screenIndex)); | |||
vncPointerButtonAction(buttonMask); | |||
} | |||