From 357e0ccc7e103270a31df8e77432cd76cac4a76f Mon Sep 17 00:00:00 2001 From: albertony <12441419+albertony@users.noreply.github.com> Date: Sun, 6 Dec 2020 16:27:41 +0100 Subject: [PATCH 1/3] Configurable drop directory --- src/lib/barrier/App.cpp | 3 +++ src/lib/barrier/App.h | 4 +++- src/lib/barrier/ArgParser.cpp | 3 +++ src/lib/barrier/ArgsBase.cpp | 1 + src/lib/barrier/ArgsBase.h | 1 + src/lib/barrier/ClientApp.cpp | 3 +++ src/lib/barrier/IPlatformScreen.h | 1 + src/lib/barrier/PlatformScreen.h | 1 + src/lib/barrier/Screen.cpp | 6 ++++++ src/lib/barrier/Screen.h | 2 ++ src/lib/barrier/ServerApp.cpp | 3 +++ src/lib/platform/MSWindowsScreen.cpp | 32 +++++++++++++++++----------- src/lib/platform/MSWindowsScreen.h | 3 ++- 13 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/lib/barrier/App.cpp b/src/lib/barrier/App.cpp index 01540966..583883fa 100644 --- a/src/lib/barrier/App.cpp +++ b/src/lib/barrier/App.cpp @@ -176,6 +176,9 @@ App::initApp(int argc, const char** argv) if (argsBase().m_enableDragDrop) { LOG((CLOG_INFO "drag and drop enabled")); + if (!argsBase().m_dropTarget.empty()) { + LOG((CLOG_INFO "drop target: %s", argsBase().m_dropTarget.c_str())); + } } // setup file logging after parsing args diff --git a/src/lib/barrier/App.h b/src/lib/barrier/App.h index 95492b5a..ed034b62 100644 --- a/src/lib/barrier/App.h +++ b/src/lib/barrier/App.h @@ -167,7 +167,9 @@ private: " --no-tray disable the system tray icon.\n" \ " --enable-drag-drop enable file drag & drop.\n" \ " --enable-crypto enable the crypto (ssl) plugin.\n" \ - " --profile-dir use named profile directory instead.\n" + " --profile-dir use named profile directory instead.\n" \ + " --drop-dir use named drop target directory instead.\n" + #define HELP_COMMON_INFO_2 \ " -h, --help display this help and exit.\n" \ " --version display version information and exit.\n" diff --git a/src/lib/barrier/ArgParser.cpp b/src/lib/barrier/ArgParser.cpp index ec3991c6..5bf08b6c 100644 --- a/src/lib/barrier/ArgParser.cpp +++ b/src/lib/barrier/ArgParser.cpp @@ -257,6 +257,9 @@ ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i) argsBase().m_enableDragDrop = true; } } + else if (isArg(i, argc, argv, NULL, "--drop-dir")) { + argsBase().m_dropTarget = argv[++i]; + } else if (isArg(i, argc, argv, NULL, "--enable-crypto")) { argsBase().m_enableCrypto = true; } diff --git a/src/lib/barrier/ArgsBase.cpp b/src/lib/barrier/ArgsBase.cpp index b487f9df..dd983c6f 100644 --- a/src/lib/barrier/ArgsBase.cpp +++ b/src/lib/barrier/ArgsBase.cpp @@ -39,6 +39,7 @@ m_display(NULL), m_disableTray(false), m_enableIpc(false), m_enableDragDrop(false), +m_dropTarget(""), m_shouldExit(false), m_barrierAddress(), m_enableCrypto(false), diff --git a/src/lib/barrier/ArgsBase.h b/src/lib/barrier/ArgsBase.h index 03896735..ad442dc9 100644 --- a/src/lib/barrier/ArgsBase.h +++ b/src/lib/barrier/ArgsBase.h @@ -38,6 +38,7 @@ public: bool m_disableTray; bool m_enableIpc; bool m_enableDragDrop; + String m_dropTarget; #if SYSAPI_WIN32 bool m_debugServiceWait; bool m_pauseOnExit; diff --git a/src/lib/barrier/ClientApp.cpp b/src/lib/barrier/ClientApp.cpp index 8d20eaba..85206eed 100644 --- a/src/lib/barrier/ClientApp.cpp +++ b/src/lib/barrier/ClientApp.cpp @@ -235,6 +235,9 @@ barrier::Screen* ClientApp::openClientScreen() { barrier::Screen* screen = createScreen(); + if (!argsBase().m_dropTarget.empty()) { + screen->setDropTarget(argsBase().m_dropTarget); + } screen->setEnableDragDrop(argsBase().m_enableDragDrop); m_events->adoptHandler(m_events->forIScreen().error(), screen->getEventTarget(), diff --git a/src/lib/barrier/IPlatformScreen.h b/src/lib/barrier/IPlatformScreen.h index e4aef0a7..995ff733 100644 --- a/src/lib/barrier/IPlatformScreen.h +++ b/src/lib/barrier/IPlatformScreen.h @@ -197,6 +197,7 @@ public: virtual void fakeDraggingFiles(DragFileList fileList) = 0; virtual const String& getDropTarget() const = 0; + virtual void setDropTarget(const String&) = 0; protected: //! Handle system event diff --git a/src/lib/barrier/PlatformScreen.h b/src/lib/barrier/PlatformScreen.h index 38bf8de4..19a3da10 100644 --- a/src/lib/barrier/PlatformScreen.h +++ b/src/lib/barrier/PlatformScreen.h @@ -101,6 +101,7 @@ public: virtual void fakeDraggingFiles(DragFileList fileList) { throw std::runtime_error("fakeDraggingFiles not implemented"); } virtual const String& getDropTarget() const { throw std::runtime_error("getDropTarget not implemented"); } + virtual void setDropTarget(const String&) { throw std::runtime_error("setDropTarget not implemented"); } protected: //! Update mouse buttons diff --git a/src/lib/barrier/Screen.cpp b/src/lib/barrier/Screen.cpp index bdb29cba..2a2c8776 100644 --- a/src/lib/barrier/Screen.cpp +++ b/src/lib/barrier/Screen.cpp @@ -466,6 +466,12 @@ Screen::getDropTarget() const return m_screen->getDropTarget(); } +void +Screen::setDropTarget(const String& target) +{ + return m_screen->setDropTarget(target); +} + void* Screen::getEventTarget() const { diff --git a/src/lib/barrier/Screen.h b/src/lib/barrier/Screen.h index 6aac0b2a..1c8e7dec 100644 --- a/src/lib/barrier/Screen.h +++ b/src/lib/barrier/Screen.h @@ -290,6 +290,8 @@ public: //! Get the drop target directory const String& getDropTarget() const; + //! Set the drop target directory + void setDropTarget(const String&); //@} diff --git a/src/lib/barrier/ServerApp.cpp b/src/lib/barrier/ServerApp.cpp index ed064f87..d7862bbd 100644 --- a/src/lib/barrier/ServerApp.cpp +++ b/src/lib/barrier/ServerApp.cpp @@ -502,6 +502,9 @@ barrier::Screen* ServerApp::openServerScreen() { barrier::Screen* screen = createScreen(); + if (!argsBase().m_dropTarget.empty()) { + screen->setDropTarget(argsBase().m_dropTarget); + } screen->setEnableDragDrop(argsBase().m_enableDragDrop); m_events->adoptHandler(m_events->forIScreen().error(), screen->getEventTarget(), diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp index ed430894..6bd2f24d 100644 --- a/src/lib/platform/MSWindowsScreen.cpp +++ b/src/lib/platform/MSWindowsScreen.cpp @@ -146,16 +146,6 @@ MSWindowsScreen::MSWindowsScreen( LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : "")); LOG((CLOG_DEBUG "window is 0x%08x", m_window)); - // SHGetFolderPath is deprecated in vista, but use it for xp support. - char desktopPath[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) { - m_desktopPath = std::string(desktopPath); - LOG((CLOG_DEBUG "using desktop for drop target: %s", m_desktopPath.c_str())); - } - else { - LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError())); - } - OleInitialize(0); m_dropWindow = createDropWindow(m_class, "DropWindow"); m_dropTarget = new MSWindowsDropTarget(); @@ -1921,9 +1911,27 @@ std::string& MSWindowsScreen::getDraggingFilename() return m_draggingFilename; } -const std::string& MSWindowsScreen::getDropTarget() const +const std::string& +MSWindowsScreen::getDropTarget() const { - return m_desktopPath; + if (m_dropTargetPath.empty()) { + // SHGetFolderPath is deprecated in vista, but use it for xp support. + char desktopPath[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) { + m_dropTargetPath = std::string(desktopPath); + LOG((CLOG_DEBUG "using desktop for drop target: %s", m_dropTargetPath.c_str())); + } + else { + LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError())); + } + } + return m_dropTargetPath; +} + +void +MSWindowsScreen::setDropTarget(const std::string& target) +{ + m_dropTargetPath = target; } bool diff --git a/src/lib/platform/MSWindowsScreen.h b/src/lib/platform/MSWindowsScreen.h index a883d7e6..ae53f1ad 100644 --- a/src/lib/platform/MSWindowsScreen.h +++ b/src/lib/platform/MSWindowsScreen.h @@ -120,6 +120,7 @@ public: virtual void fakeDraggingFiles(DragFileList fileList); virtual std::string& getDraggingFilename(); virtual const std::string& getDropTarget() const; + virtual void setDropTarget(const std::string&); protected: // IPlatformScreen overrides @@ -332,7 +333,7 @@ private: IEventQueue* m_events; - std::string m_desktopPath; + mutable std::string m_dropTargetPath; MSWindowsDropTarget* m_dropTarget; From b125cf3da7d1ec9d271af0b73a66602cc041d795 Mon Sep 17 00:00:00 2001 From: albertony <12441419+albertony@users.noreply.github.com> Date: Sun, 6 Dec 2020 17:25:24 +0100 Subject: [PATCH 2/3] Improve drag&drop stability on windows --- src/lib/platform/MSWindowsScreen.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp index 6bd2f24d..68379df9 100644 --- a/src/lib/platform/MSWindowsScreen.cpp +++ b/src/lib/platform/MSWindowsScreen.cpp @@ -1878,6 +1878,7 @@ std::string& MSWindowsScreen::getDraggingFilename() SWP_SHOWWINDOW); // TODO: fake these keys properly + ARCH->sleep(.05f); // A tiny sleep here makes the DragEnter event on m_dropWindow trigger much more consistently fakeKeyDown(kKeyEscape, 8192, 1); fakeKeyUp(1); fakeMouseButton(kButtonLeft, false); From 36d9efbc64512a575bb5a96c6633cf06b78e6fe6 Mon Sep 17 00:00:00 2001 From: albertony <12441419+albertony@users.noreply.github.com> Date: Thu, 10 Dec 2020 01:11:49 +0100 Subject: [PATCH 3/3] Increased loglevel of central drag drop related messages --- src/lib/barrier/DropHelper.cpp | 2 +- src/lib/platform/MSWindowsScreen.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/barrier/DropHelper.cpp b/src/lib/barrier/DropHelper.cpp index 3582ae42..e3e15939 100644 --- a/src/lib/barrier/DropHelper.cpp +++ b/src/lib/barrier/DropHelper.cpp @@ -43,7 +43,7 @@ DropHelper::writeToDir(const String& destination, DragFileList& fileList, String file.write(data.c_str(), data.size()); file.close(); - LOG((CLOG_DEBUG "%s is saved to %s", fileList.at(0).getFilename().c_str(), destination.c_str())); + LOG((CLOG_INFO "dropped file \"%s\" in \"%s\"", fileList.at(0).getFilename().c_str(), destination.c_str())); fileList.clear(); } diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp index 68379df9..fd494c98 100644 --- a/src/lib/platform/MSWindowsScreen.cpp +++ b/src/lib/platform/MSWindowsScreen.cpp @@ -1900,12 +1900,12 @@ std::string& MSWindowsScreen::getDraggingFilename() m_draggingFilename = filename; } else { - LOG((CLOG_DEBUG "drag file name is invalid: %s", filename.c_str())); + LOG((CLOG_ERR "drag file name is invalid: %s", filename.c_str())); } } if (m_draggingFilename.empty()) { - LOG((CLOG_DEBUG "failed to get drag file name from OLE")); + LOG((CLOG_ERR "failed to get drag file name from OLE")); } } @@ -1920,7 +1920,7 @@ MSWindowsScreen::getDropTarget() const char desktopPath[MAX_PATH]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) { m_dropTargetPath = std::string(desktopPath); - LOG((CLOG_DEBUG "using desktop for drop target: %s", m_dropTargetPath.c_str())); + LOG((CLOG_INFO "using desktop for drop target: %s", m_dropTargetPath.c_str())); } else { LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError()));