#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,52 +1766,66 @@ Server::onMouseMovePrimary(SInt32 x, SInt32 y)
} }
// see if we should change screens // 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) { if (x < ax + zoneSize) {
x -= zoneSize; xh -= zoneSize;
dir = kLeft; dirh = kLeft;
} }
else if (x >= ax + aw - zoneSize) { else if (x >= ax + aw - zoneSize) {
x += zoneSize; xh += zoneSize;
dir = kRight; dirh = kRight;
} }
else if (y < ay + zoneSize) { if (y < ay + zoneSize) {
y -= zoneSize; yv -= zoneSize;
dir = kTop; dirv = kTop;
} }
else if (y >= ay + ah - zoneSize) { else if (y >= ay + ah - zoneSize) {
y += zoneSize; yv += zoneSize;
dir = kBottom; dirv = kBottom;
} }
else { if (dirh == kNoDirection && dirv == kNoDirection) {
// still on local screen // still on local screen
noSwitch(x, y); noSwitch(x, y);
return false; return false;
} }
// get jump destination // check both horizontally and vertically
BaseClientProxy* newScreen = mapToNeighbor(m_active, dir, x, y); 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];
// should we switch or not? // get jump destination
if (isSwitchOkay(newScreen, dir, x, y, xc, yc)) { BaseClientProxy* newScreen = mapToNeighbor(m_active, dir, x, y);
if (m_args.m_enableDragDrop
&& m_screen->isDraggingStarted() // should we switch or not?
&& m_active != newScreen if (isSwitchOkay(newScreen, dir, x, y, xc, yc)) {
&& m_waitDragInfoThread) { if (m_args.m_enableDragDrop
if (m_sendDragInfoThread == NULL) { && m_screen->isDraggingStarted()
m_sendDragInfoThread = new Thread( && m_active != newScreen
new TMethodJob<Server>( && m_waitDragInfoThread) {
this, if (m_sendDragInfoThread == NULL) {
&Server::sendDragInfoThread, newScreen)); m_sendDragInfoThread = new Thread(
new TMethodJob<Server>(
this,
&Server::sendDragInfoThread, newScreen));
}
return false;
} }
return false; // switch screen
switchScreen(newScreen, x, y, false);
m_waitDragInfoThread = true;
return true;
} }
// switch screen
switchScreen(newScreen, x, y, false);
m_waitDragInfoThread = true;
return true;
} }
return false; return false;