Skip to content

Commit

Permalink
deskflow#5785 Fix screen switch problem when cursor is in a corner
Browse files Browse the repository at this point in the history
  • Loading branch information
mhobbs-ibm authored and Andrew Nelless committed Jan 25, 2017
1 parent b5a8157 commit adf34eb
Showing 1 changed file with 44 additions and 30 deletions.
74 changes: 44 additions & 30 deletions src/lib/server/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1766,52 +1766,66 @@ 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;
}

// get jump destination
BaseClientProxy* newScreen = mapToNeighbor(m_active, dir, x, y);
// 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);

// should we switch or not?
if (isSwitchOkay(newScreen, dir, x, y, xc, yc)) {
if (m_args.m_enableDragDrop
&& m_screen->isDraggingStarted()
&& m_active != newScreen
&& m_waitDragInfoThread) {
if (m_sendDragInfoThread == NULL) {
m_sendDragInfoThread = new Thread(
new TMethodJob<Server>(
this,
&Server::sendDragInfoThread, newScreen));
}

// should we switch or not?
if (isSwitchOkay(newScreen, dir, x, y, xc, yc)) {
if (m_args.m_enableDragDrop
&& m_screen->isDraggingStarted()
&& m_active != newScreen
&& m_waitDragInfoThread) {
if (m_sendDragInfoThread == NULL) {
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;
Expand Down

0 comments on commit adf34eb

Please sign in to comment.