Merge pull request #6278 from symless/v1.9-macsleep

@mrsixw
#5964 Can't click on client after sleep
This commit is contained in:
Steve Williams 2018-03-29 10:23:13 +01:00 committed by GitHub
commit b46714957f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 73 additions and 14 deletions

3
.gitignore vendored
View File

@ -19,3 +19,6 @@ src/gui/gui.pro.user*
src/gui/.qmake.stash src/gui/.qmake.stash
src/gui/.rnd src/gui/.rnd
src/setup/win32/synergy.suo src/setup/win32/synergy.suo
/.idea
/cmake-build-debug
/CMakeLists.txt.user

View File

@ -109,8 +109,8 @@ protected:
virtual IKeyState* getKeyState() const; virtual IKeyState* getKeyState() const;
private: private:
void updateScreenShape(); bool updateScreenShape();
void updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags); bool updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags);
void postMouseEvent(CGPoint&) const; void postMouseEvent(CGPoint&) const;
// convenience function to send events // convenience function to send events

View File

@ -39,6 +39,7 @@
#include "base/IEventQueue.h" #include "base/IEventQueue.h"
#include "base/TMethodEventJob.h" #include "base/TMethodEventJob.h"
#include "base/TMethodJob.h" #include "base/TMethodJob.h"
#include "synergy/DisplayInvalidException.h"
#include <math.h> #include <math.h>
#include <mach-o/dyld.h> #include <mach-o/dyld.h>
@ -105,9 +106,12 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
m_getDropTargetThread(NULL), m_getDropTargetThread(NULL),
m_impl(NULL) m_impl(NULL)
{ {
m_displayID = CGMainDisplayID();
if (!updateScreenShape(m_displayID, 0)) {
throw DisplayInvalidException ("failed to initialize screen shape");
}
try { try {
m_displayID = CGMainDisplayID();
updateScreenShape(m_displayID, 0);
m_screensaver = new OSXScreenSaver(m_events, getEventTarget()); m_screensaver = new OSXScreenSaver(m_events, getEventTarget());
m_keyState = new OSXKeyState(m_events); m_keyState = new OSXKeyState(m_events);
@ -1212,9 +1216,10 @@ OSXScreen::displayReconfigurationCallback(CGDirectDisplayID displayID, CGDisplay
LOG((CLOG_DEBUG1 "event: display was reconfigured: %x %x %x", flags, mask, flags & mask)); LOG((CLOG_DEBUG1 "event: display was reconfigured: %x %x %x", flags, mask, flags & mask));
if (flags & mask) { /* Something actually did change */ if (flags & mask) { /* Something actually did change */
LOG((CLOG_DEBUG1 "event: screen changed shape; refreshing dimensions")); LOG((CLOG_DEBUG1 "event: screen changed shape; refreshing dimensions"));
screen->updateScreenShape(displayID, flags); if (!screen->updateScreenShape(displayID, flags)) {
LOG((CLOG_ERR "failed to update screen shape during display reconfiguration"));
}
} }
} }
@ -1518,35 +1523,34 @@ OSXScreen::getKeyState() const
return m_keyState; return m_keyState;
} }
void bool OSXScreen::updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags flags)
OSXScreen::updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags flags)
{ {
updateScreenShape(); return updateScreenShape();
} }
void bool
OSXScreen::updateScreenShape() OSXScreen::updateScreenShape()
{ {
// get info for each display // get info for each display
CGDisplayCount displayCount = 0; CGDisplayCount displayCount = 0;
if (CGGetActiveDisplayList(0, NULL, &displayCount) != CGDisplayNoErr) { if (CGGetActiveDisplayList(0, NULL, &displayCount) != CGDisplayNoErr) {
return; return false;
} }
if (displayCount == 0) { if (displayCount == 0) {
return; return false;
} }
CGDirectDisplayID* displays = new CGDirectDisplayID[displayCount]; CGDirectDisplayID* displays = new CGDirectDisplayID[displayCount];
if (displays == NULL) { if (displays == NULL) {
return; return false;
} }
if (CGGetActiveDisplayList(displayCount, if (CGGetActiveDisplayList(displayCount,
displays, &displayCount) != CGDisplayNoErr) { displays, &displayCount) != CGDisplayNoErr) {
delete[] displays; delete[] displays;
return; return false;
} }
// get smallest rect enclosing all display rects // get smallest rect enclosing all display rects
@ -1575,6 +1579,8 @@ OSXScreen::updateScreenShape()
LOG((CLOG_DEBUG "screen shape: center=%d,%d size=%dx%d on %u %s", LOG((CLOG_DEBUG "screen shape: center=%d,%d size=%dx%d on %u %s",
m_x, m_y, m_w, m_h, displayCount, m_x, m_y, m_w, m_h, displayCount,
(displayCount == 1) ? "display" : "displays")); (displayCount == 1) ? "display" : "displays"));
return true;
} }
#pragma mark - #pragma mark -

View File

@ -32,6 +32,7 @@
#include "ipc/IpcMessage.h" #include "ipc/IpcMessage.h"
#include "ipc/Ipc.h" #include "ipc/Ipc.h"
#include "base/EventQueue.h" #include "base/EventQueue.h"
#include "DisplayInvalidException.h"
#if SYSAPI_WIN32 #if SYSAPI_WIN32
#include "arch/win32/ArchMiscWindows.h" #include "arch/win32/ArchMiscWindows.h"
@ -50,6 +51,7 @@
#include "platform/OSXDragSimulator.h" #include "platform/OSXDragSimulator.h"
#endif #endif
App* App::s_instance = nullptr; App* App::s_instance = nullptr;
// //
@ -125,6 +127,15 @@ App::run(int argc, char** argv)
// using the exit(int) function! // using the exit(int) function!
result = e.getCode(); result = e.getCode();
} }
catch (DisplayInvalidException& die) {
LOG((CLOG_CRIT "A display invalid exception error occurred: %s\n", die.what()));
// display invalid exceptions can occur when going to sleep. When this process exits, the
// UI will restart us instantly. We don't really want that behevior, so we quies for a bit
ARCH->sleep(10);
}
catch (std::runtime_error& re) {
LOG((CLOG_CRIT "A runtime error occurred: %s\n", re.what()));
}
catch (std::exception& e) { catch (std::exception& e) {
LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); LOG((CLOG_CRIT "An error occurred: %s\n", e.what()));
} }

View File

@ -0,0 +1,39 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2018 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SYNERGY_DISPLAYINVALIDEXCEPTION_H
#define SYNERGY_DISPLAYINVALIDEXCEPTION_H
#include <stdexcept>
#include <string>
class DisplayInvalidException : public std::runtime_error {
public:
DisplayInvalidException(const char* msg):
std::runtime_error(msg)
{
}
DisplayInvalidException(std::string msg):
std::runtime_error(msg)
{
}
};
#endif //SYNERGY_DISPLAYINVALIDEXCEPTION_H