diff --git a/src/lib/platform/CMSWindowsScreen.cpp b/src/lib/platform/CMSWindowsScreen.cpp index d30674ac..ffde8738 100644 --- a/src/lib/platform/CMSWindowsScreen.cpp +++ b/src/lib/platform/CMSWindowsScreen.cpp @@ -361,7 +361,7 @@ CMSWindowsScreen::leave() m_isOnScreen = false; forceShowCursor(); - if (m_draggingStarted) { + if (getDraggingStarted()) { CString& draggingDir = getDraggingFileDir(); LOG((CLOG_DEBUG "get dragging file dir: %s", draggingDir.c_str())); size_t size = draggingDir.size(); @@ -1322,14 +1322,14 @@ CMSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam) if (button >= kButtonLeft && button <= kButtonExtra0 + 1) { if (pressed) { m_buttons[button] = true; - if (CApp::instance().argsBase().m_enableDragDrop && button == kButtonLeft) { + if (button == kButtonLeft) { m_draggingFileDir.clear(); LOG((CLOG_DEBUG2 "dragging file directory is cleared")); } } else { m_buttons[button] = false; - if (CApp::instance().argsBase().m_enableDragDrop && m_draggingStarted && button == kButtonLeft) { + if (m_draggingStarted && button == kButtonLeft) { m_draggingStarted = false; } } diff --git a/src/lib/platform/COSXScreen.cpp b/src/lib/platform/COSXScreen.cpp index fbe789ed..9662aad1 100644 --- a/src/lib/platform/COSXScreen.cpp +++ b/src/lib/platform/COSXScreen.cpp @@ -317,6 +317,7 @@ COSXScreen::isAnyMouseButtonDown(UInt32& buttonID) const { if (m_buttonState.test(0)) { buttonID = kButtonLeft; + return true; } return (GetCurrentButtonState() != 0); @@ -900,7 +901,7 @@ COSXScreen::leave() { hideCursor(); - if (m_draggingStarted) { + if (getDraggingStarted()) { CFStringRef dragInfo = getDraggedFileURL(); char* dragInfoCStr = CFStringRefToUTF8String(dragInfo); LOG((CLOG_DEBUG "drag info: %s", dragInfoCStr)); diff --git a/src/lib/synergy/CClientApp.cpp b/src/lib/synergy/CClientApp.cpp index c3063476..8be9abf4 100644 --- a/src/lib/synergy/CClientApp.cpp +++ b/src/lib/synergy/CClientApp.cpp @@ -302,6 +302,7 @@ CScreen* CClientApp::openClientScreen() { CScreen* screen = createScreen(); + screen->setEnableDragDrop(argsBase().m_enableDragDrop); m_events->adoptHandler(m_events->forIScreen().error(), screen->getEventTarget(), new TMethodEventJob( diff --git a/src/lib/synergy/CPlatformScreen.cpp b/src/lib/synergy/CPlatformScreen.cpp index 36f4801b..0ca207ee 100644 --- a/src/lib/synergy/CPlatformScreen.cpp +++ b/src/lib/synergy/CPlatformScreen.cpp @@ -17,6 +17,8 @@ */ #include "CPlatformScreen.h" +#include "CApp.h" +#include "CArgsBase.h" CPlatformScreen::CPlatformScreen(IEventQueue* events) : IPlatformScreen(events), @@ -110,3 +112,12 @@ CPlatformScreen::pollPressedKeys(KeyButtonSet& pressedKeys) const { getKeyState()->pollPressedKeys(pressedKeys); } + +bool +CPlatformScreen::getDraggingStarted() +{ + if (CApp::instance().argsBase().m_enableDragDrop) { + return m_draggingStarted; + } + return false; +} diff --git a/src/lib/synergy/CPlatformScreen.h b/src/lib/synergy/CPlatformScreen.h index 989eb50c..27fb9b09 100644 --- a/src/lib/synergy/CPlatformScreen.h +++ b/src/lib/synergy/CPlatformScreen.h @@ -78,7 +78,7 @@ public: virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; virtual void setDraggingStarted(bool started) { m_draggingStarted = started; } - virtual bool getDraggingStarted() { return m_draggingStarted; } + virtual bool getDraggingStarted(); virtual bool getFakeDraggingStarted() { return m_fakeDraggingStarted; } virtual CString& getDraggingFileDir() { return m_draggingFileDir; } diff --git a/src/lib/synergy/CScreen.cpp b/src/lib/synergy/CScreen.cpp index dd72dec7..dc15541e 100644 --- a/src/lib/synergy/CScreen.cpp +++ b/src/lib/synergy/CScreen.cpp @@ -36,7 +36,8 @@ CScreen::CScreen(IPlatformScreen* platformScreen, IEventQueue* events) : m_entered(m_isPrimary), m_screenSaverSync(true), m_fakeInput(false), - m_mock(false) + m_mock(false), + m_enableDragDrop(false) { assert(m_screen != NULL); @@ -368,12 +369,18 @@ CScreen::isLockedToScreen() const // check for pressed mouse buttons // HACK: commented out as it breaks new drag drop feature UInt32 buttonID = 0; + if (m_screen->isAnyMouseButtonDown(buttonID)) { if (buttonID != kButtonLeft) { LOG((CLOG_DEBUG "locked by mouse buttonID: %d", buttonID)); } - return (buttonID == kButtonLeft) ? false : true; + if (m_enableDragDrop) { + return (buttonID == kButtonLeft) ? false : true; + } + else { + return true; + } } // not locked @@ -433,6 +440,12 @@ CScreen::startDraggingFiles(CString str) m_screen->fakeDraggingFiles(str); } +void +CScreen::setEnableDragDrop(bool enabled) +{ + m_enableDragDrop = enabled; +} + CString& CScreen::getDraggingFileDir() const { diff --git a/src/lib/synergy/CScreen.h b/src/lib/synergy/CScreen.h index de8f44fe..76b99986 100644 --- a/src/lib/synergy/CScreen.h +++ b/src/lib/synergy/CScreen.h @@ -225,6 +225,7 @@ public: //! Fake a files dragging operation void startDraggingFiles(CString str); + void setEnableDragDrop(bool enabled); //@} //! @name accessors //@{ @@ -335,6 +336,7 @@ private: IEventQueue* m_events; bool m_mock; + bool m_enableDragDrop; }; #endif diff --git a/src/lib/synergy/CServerApp.cpp b/src/lib/synergy/CServerApp.cpp index 5730f9d9..938ac49c 100644 --- a/src/lib/synergy/CServerApp.cpp +++ b/src/lib/synergy/CServerApp.cpp @@ -547,6 +547,7 @@ bool CServerApp::initServer() CScreen* CServerApp::openServerScreen() { CScreen* screen = createScreen(); + screen->setEnableDragDrop(argsBase().m_enableDragDrop); m_events->adoptHandler(m_events->forIScreen().error(), screen->getEventTarget(), new TMethodEventJob(