#5785 Fix screen switch problem when cursor is in a corner

This commit is contained in:
Mike Hobbs 2016-12-29 11:32:41 -06:00 committed by Andrew Nelless
parent b5a81579ed
commit adf34eba40
1 changed files with 44 additions and 30 deletions

View File

@ -1766,29 +1766,42 @@ Server::onMouseMovePrimary(SInt32 x, SInt32 y)
}
// see if we should change screens
EDirection dir;
// when the cursor is in a corner, there may be a screen either
// horizontally or vertically. check both directions.
EDirection dirh = kNoDirection, dirv = kNoDirection;
SInt32 xh = x, yv = y;
if (x < ax + zoneSize) {
x -= zoneSize;
dir = kLeft;
xh -= zoneSize;
dirh = kLeft;
}
else if (x >= ax + aw - zoneSize) {
x += zoneSize;
dir = kRight;
xh += zoneSize;
dirh = kRight;
}
else if (y < ay + zoneSize) {
y -= zoneSize;
dir = kTop;
if (y < ay + zoneSize) {
yv -= zoneSize;
dirv = kTop;
}
else if (y >= ay + ah - zoneSize) {
y += zoneSize;
dir = kBottom;
yv += zoneSize;
dirv = kBottom;
}
else {
if (dirh == kNoDirection && dirv == kNoDirection) {
// still on local screen
noSwitch(x, y);
return false;
}
// check both horizontally and vertically
EDirection dirs[] = {dirh, dirv};
SInt32 xs[] = {xh, x}, ys[] = {y, yv};
for (int i = 0; i < 2; ++i) {
EDirection dir = dirs[i];
if (dir == kNoDirection) {
continue;
}
x = xs[i], y = ys[i];
// get jump destination
BaseClientProxy* newScreen = mapToNeighbor(m_active, dir, x, y);
@ -1813,6 +1826,7 @@ Server::onMouseMovePrimary(SInt32 x, SInt32 y)
m_waitDragInfoThread = true;
return true;
}
}
return false;
}