From a645e9a29603bca413b7d22e83ce7e8e1141295d Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 21 Jun 2018 00:13:40 +0300 Subject: [PATCH 1/7] Improve precision of grabbed scroll events on OSX server This is barrier issue #63, synergy issue #5672. --- src/lib/platform/OSXScreen.h | 4 ++-- src/lib/platform/OSXScreen.mm | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/platform/OSXScreen.h b/src/lib/platform/OSXScreen.h index 27cb7dfc..6178529a 100644 --- a/src/lib/platform/OSXScreen.h +++ b/src/lib/platform/OSXScreen.h @@ -144,10 +144,10 @@ private: ButtonID mapMacButtonToBarrier(UInt16) const; // map mac scroll wheel value to a barrier scroll wheel value - SInt32 mapScrollWheelToBarrier(SInt32) const; + SInt32 mapScrollWheelToBarrier(float) const; // map barrier scroll wheel value to a mac scroll wheel value - SInt32 mapScrollWheelFromBarrier(SInt32) const; + SInt32 mapScrollWheelFromBarrier(float) const; // get the current scroll wheel speed double getScrollSpeed() const; diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm index 1d80521a..1e0268ef 100644 --- a/src/lib/platform/OSXScreen.mm +++ b/src/lib/platform/OSXScreen.mm @@ -1421,7 +1421,7 @@ OSXScreen::mapMacButtonToBarrier(UInt16 macButton) const } SInt32 -OSXScreen::mapScrollWheelToBarrier(SInt32 x) const +OSXScreen::mapScrollWheelToBarrier(float x) const { // return accelerated scrolling but not exponentially scaled as it is // on the mac. @@ -1430,7 +1430,7 @@ OSXScreen::mapScrollWheelToBarrier(SInt32 x) const } SInt32 -OSXScreen::mapScrollWheelFromBarrier(SInt32 x) const +OSXScreen::mapScrollWheelFromBarrier(float x) const { // use server's acceleration with a little boost since other platforms // take one wheel step as a larger step than the mac does. @@ -1948,9 +1948,9 @@ OSXScreen::handleCGInputEvent(CGEventTapProxy proxy, break; case kCGEventScrollWheel: screen->onMouseWheel(screen->mapScrollWheelToBarrier( - CGEventGetIntegerValueField(event, kCGScrollWheelEventDeltaAxis2)), + CGEventGetIntegerValueField(event, kCGScrollWheelEventFixedPtDeltaAxis2) / 65536.0f), screen->mapScrollWheelToBarrier( - CGEventGetIntegerValueField(event, kCGScrollWheelEventDeltaAxis1))); + CGEventGetIntegerValueField(event, kCGScrollWheelEventFixedPtDeltaAxis1) / 65536.0f)); break; case kCGEventKeyDown: case kCGEventKeyUp: From 76c39aaf4e0b5ad873c97905f6a936eb2134860c Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 21 Jun 2018 00:50:08 +0300 Subject: [PATCH 2/7] Accumulate scrolls less than supported scroll on XWindows This fixes barrier case #67 and synergy case #5670. --- src/lib/platform/XWindowsScreen.cpp | 30 +++++++++++++++++------------ src/lib/platform/XWindowsScreen.h | 11 +++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index 581c9111..28464120 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -99,6 +99,7 @@ XWindowsScreen::XWindowsScreen( IEventQueue* events) : m_isPrimary(isPrimary), m_mouseScrollDelta(mouseScrollDelta), + m_accumulatedScroll(0), m_display(NULL), m_root(None), m_window(None), @@ -865,9 +866,11 @@ XWindowsScreen::fakeMouseWheel(SInt32, SInt32 yDelta) const return; } - // choose button depending on rotation direction - const unsigned int xButton = mapButtonToX(static_cast( - (yDelta >= 0) ? -1 : -2)); + int numEvents = accumulateMouseScroll(yDelta); + + // choose button depending on rotation direction + const unsigned int xButton = mapButtonToX(static_cast( + (numEvents >= 0) ? -1 : -2)); if (xButton == 0) { // If we get here, then the XServer does not support the scroll // wheel buttons, so send PageUp/PageDown keystrokes instead. @@ -886,20 +889,14 @@ XWindowsScreen::fakeMouseWheel(SInt32, SInt32 yDelta) const return; } - // now use absolute value of delta - if (yDelta < 0) { - yDelta = -yDelta; - } - - if (yDelta < m_mouseScrollDelta) { - LOG((CLOG_WARN "Wheel scroll delta (%d) smaller than threshold (%d)", yDelta, m_mouseScrollDelta)); - } + numEvents = std::abs(numEvents); // send as many clicks as necessary - for (; yDelta >= m_mouseScrollDelta; yDelta -= m_mouseScrollDelta) { + for (; numEvents > 0; numEvents--) { XTestFakeButtonEvent(m_display, xButton, True, CurrentTime); XTestFakeButtonEvent(m_display, xButton, False, CurrentTime); } + XFlush(m_display); } @@ -1643,6 +1640,15 @@ XWindowsScreen::onMouseMove(const XMotionEvent& xmotion) } } +int +XWindowsScreen::accumulateMouseScroll(SInt32 yDelta) const +{ + m_accumulatedScroll += yDelta; + int numEvents = m_accumulatedScroll / m_mouseScrollDelta; + m_accumulatedScroll -= numEvents * m_mouseScrollDelta; + return numEvents; +} + Cursor XWindowsScreen::createBlankCursor() const { diff --git a/src/lib/platform/XWindowsScreen.h b/src/lib/platform/XWindowsScreen.h index 35f9368e..a2e3495b 100644 --- a/src/lib/platform/XWindowsScreen.h +++ b/src/lib/platform/XWindowsScreen.h @@ -136,6 +136,10 @@ private: void onMouseRelease(const XButtonEvent&); void onMouseMove(const XMotionEvent&); + // Returns the number of scroll events needed after the current delta has + // been taken into account + int accumulateMouseScroll(SInt32 yDelta) const; + bool detectXI2(); #ifdef HAVE_XI2 void selectXIRawMotion(); @@ -172,8 +176,15 @@ private: // true if screen is being used as a primary screen, false otherwise bool m_isPrimary; + + // The size of a smallest supported scroll event, in points int m_mouseScrollDelta; + // Accumulates scrolls of less than m_mouseScrollDelta across multiple + // scroll events. We dispatch a scroll event whenever the accumulated scroll + // becomes larger than m_mouseScrollDelta + mutable int m_accumulatedScroll; + Display* m_display; Window m_root; Window m_window; From b570e5759166913120b6420f538b7a8b9ecc0b58 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 21 Jun 2018 01:13:41 +0300 Subject: [PATCH 3/7] Add fake changelog so that debian package may be built --- debian/changelog | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 debian/changelog diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 00000000..b8334228 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +barrier (2.1-1) unstable; urgency=low + + * Initial release (Closes: #123456) + + -- Debauchee Open Source Group Sat, 01 Apr 2018 00:00:00 +0000 From e88bc97e630b55bc11c6627e4ae26ae564fdaae9 Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Sat, 30 Jun 2018 13:26:18 -0400 Subject: [PATCH 4/7] non-GUI build should not require bonjour headers --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c4ba6de..5a2a4eb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,7 +187,7 @@ if (UNIX) message (FATAL_ERROR "Missing header: " ${XKBlib}) endif() - if (NOT HAVE_DNSSD) + if (BARRIER_BUILD_GUI AND NOT HAVE_DNSSD) message (FATAL_ERROR "Missing header: dns_sd.h") endif() From a956cad0da23f544b874888c6c3540dc7f8f22cf Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Sat, 30 Jun 2018 13:44:34 -0400 Subject: [PATCH 5/7] add patch from Gentoo packager to fix cmake issue (reported on Arch, too). ref #49 --- src/gui/CMakeLists.txt | 2 +- src/gui/src/ActionDialog.cpp | 1 + src/gui/src/ScreenSetupView.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 9c902867..12fb5fda 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -22,7 +22,7 @@ add_executable (barrier WIN32 include_directories (./src) -qt5_use_modules (barrier Core Widgets Network) +target_link_libraries (barrier Qt5::Core Qt5::Widgets Qt5::Network) target_compile_definitions (barrier PRIVATE -DBARRIER_VERSION_STAGE="${BARRIER_VERSION_STAGE}") target_compile_definitions (barrier PRIVATE -DBARRIER_REVISION="${BARRIER_REVISION}") diff --git a/src/gui/src/ActionDialog.cpp b/src/gui/src/ActionDialog.cpp index e824ea3c..3565cfbc 100644 --- a/src/gui/src/ActionDialog.cpp +++ b/src/gui/src/ActionDialog.cpp @@ -25,6 +25,7 @@ #include #include +#include ActionDialog::ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), diff --git a/src/gui/src/ScreenSetupView.cpp b/src/gui/src/ScreenSetupView.cpp index e42ae17e..46e70990 100644 --- a/src/gui/src/ScreenSetupView.cpp +++ b/src/gui/src/ScreenSetupView.cpp @@ -22,6 +22,7 @@ #include #include +#include ScreenSetupView::ScreenSetupView(QWidget* parent) : QTableView(parent) From 1f3a91e74eb2f551a12573dc5fc4fe7cdca1685a Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Sat, 30 Jun 2018 16:32:05 -0400 Subject: [PATCH 6/7] fix email in debian changelog --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index b8334228..05477074 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,4 +2,4 @@ barrier (2.1-1) unstable; urgency=low * Initial release (Closes: #123456) - -- Debauchee Open Source Group Sat, 01 Apr 2018 00:00:00 +0000 + -- Debauchee Open Source Group Sat, 01 Apr 2018 00:00:00 +0000 From dc5dc25de7fd8b59d97bed14e9a45b0ed7b6453c Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Sat, 30 Jun 2018 17:33:19 -0400 Subject: [PATCH 7/7] screen settings dialog handles internationalized default name better (ref #71) --- src/gui/src/NewScreenWidget.cpp | 2 +- src/gui/src/ScreenSettingsDialog.cpp | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/gui/src/NewScreenWidget.cpp b/src/gui/src/NewScreenWidget.cpp index 18379c0b..0336249e 100644 --- a/src/gui/src/NewScreenWidget.cpp +++ b/src/gui/src/NewScreenWidget.cpp @@ -1,4 +1,4 @@ -/* +/* * barrier -- mouse and keyboard sharing utility * Copyright (C) 2012-2016 Symless Ltd. * Copyright (C) 2008 Volker Lanz (vl@fidra.de) diff --git a/src/gui/src/ScreenSettingsDialog.cpp b/src/gui/src/ScreenSettingsDialog.cpp index 1e95a9c5..4f294e24 100644 --- a/src/gui/src/ScreenSettingsDialog.cpp +++ b/src/gui/src/ScreenSettingsDialog.cpp @@ -23,6 +23,19 @@ #include #include +static const QRegExp ValidScreenName("[a-z0-9\\._-]{,255}", Qt::CaseInsensitive); + +static QString check_name_param(QString name) +{ + // after internationalization happens the default name "Unnamed" might + // be translated with spaces (or other chars). let's replace the spaces + // with dashes and just give up if that doesn't pass the regexp + name.replace(' ', '-'); + if (ValidScreenName.exactMatch(name)) + return name; + return ""; +} + ScreenSettingsDialog::ScreenSettingsDialog(QWidget* parent, Screen* pScreen) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), Ui::ScreenSettingsDialogBase(), @@ -30,13 +43,11 @@ ScreenSettingsDialog::ScreenSettingsDialog(QWidget* parent, Screen* pScreen) : { setupUi(this); - QRegExp validScreenName("[a-z0-9\\._-]{,255}", Qt::CaseInsensitive); - - m_pLineEditName->setText(m_pScreen->name()); - m_pLineEditName->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); + m_pLineEditName->setText(check_name_param(m_pScreen->name())); + m_pLineEditName->setValidator(new QRegExpValidator(ValidScreenName, m_pLineEditName)); m_pLineEditName->selectAll(); - m_pLineEditAlias->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); + m_pLineEditAlias->setValidator(new QRegExpValidator(ValidScreenName, m_pLineEditName)); for (int i = 0; i < m_pScreen->aliases().count(); i++) new QListWidgetItem(m_pScreen->aliases()[i], m_pListAliases);