This repository has been archived by the owner. It is now read-only.
Permalink
...
Comparing changes
Open a pull request
16
contributors
Unified
Split
Showing
with
181 additions
and 105 deletions.
- +2 −0 .github/ISSUE_TEMPLATE.md
- +1 −6 CMakeLists.txt
- +19 −0 ChangeLog
- +2 −2 src/gui/res/lang/Languages.xml
- +26 −18 src/gui/res/mac/Info.plist
- +1 −1 src/gui/src/LicenseManager.cpp
- +2 −2 src/gui/src/main.cpp
- +24 −12 src/lib/platform/MSWindowsKeyState.cpp
- +1 −1 src/lib/platform/MSWindowsKeyState.h
- +17 −1 src/lib/platform/OSXScreen.mm
- +5 −24 src/lib/platform/XWindowsScreen.cpp
- +2 −2 src/lib/server/Config.cpp
- +44 −30 src/lib/server/Server.cpp
- +4 −2 src/lib/synergy/key_types.h
- +1 −1 src/micro/uSynergy.h
- +21 −0 src/test/integtests/platform/MSWindowsKeyStateTests.cpp
- +9 −3 src/test/unittests/synergy/ClipboardChunkTests.cpp
View
2
.github/ISSUE_TEMPLATE.md
| @@ -27,4 +27,6 @@ Client: Applesoft Windy OS 10 | |||
| * Is there a way to work around it? No/Yes, you can... | * Is there a way to work around it? No/Yes, you can... | ||
| * Does this bug prevent you from using Synergy entirely? Yes/No | * Does this bug prevent you from using Synergy entirely? Yes/No | ||
| +Please follow the link below to send us logs from both your server and client sides if it's appropriate. https://github.com/symless/synergy/wiki/Sending-logs | |||
| + | |||
| Put anything else you can think of here. | Put anything else you can think of here. | ||
View
7
CMakeLists.txt
| @@ -17,7 +17,7 @@ | |||
| # Version number for Synergy | # Version number for Synergy | ||
| set(VERSION_MAJOR 1) | set(VERSION_MAJOR 1) | ||
| set(VERSION_MINOR 8) | set(VERSION_MINOR 8) | ||
| -set(VERSION_REV 6) | +set(VERSION_REV 8) | ||
| set(VERSION_STAGE stable) | set(VERSION_STAGE stable) | ||
| set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}") | set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}") | ||
| @@ -74,11 +74,6 @@ endif() | |||
| # Depending on the platform, pass in the required defines. | # Depending on the platform, pass in the required defines. | ||
| if (UNIX) | if (UNIX) | ||
| - | |||
| - # warnings as errors: | |||
| - # we have a problem with people checking in code with warnings. | |||
| - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-unused-local-typedef") | |||
| - | |||
| if (NOT APPLE) | if (NOT APPLE) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") | ||
| endif() | endif() | ||
View
19
ChangeLog
| @@ -1,3 +1,22 @@ | |||
| +v1.8.8 | |||
| +========== | |||
| +Bug #5196 - Some keys on Korean and Japanese keyboards have the same keycode | |||
| +Bug #5578 - Pressing Hangul key results in alt+'a' | |||
| +Bug #5785 - Can't switch screens when cursor is in a corner | |||
| +Bug #3992 - macOS: Dragging is broken in Unity 3D | |||
| +Bug #5075 - macOS: Build fails on macOS 10.9 due to unknown compiler flag | |||
| +Bug #5809 - macOS: No version number is shown in the App Info dialog | |||
| +Bug #3197 - Linux: switchDoubleTap option is not working | |||
| +Bug #4477 - Linux: Mouse buttons higher than id 10 result in crash | |||
| +Bug #5832 - Linux: Screen size misdetected on multi-monitor display | |||
| +Enhancement #4504 - Improved Korean language description | |||
| +Enhancement #5525 - Added support for precise screen positioning in config file | |||
| +Enhancement #4290 - Windows: Removed annoying alt+print screen functionality | |||
| + | |||
| +v1.8.7-stable | |||
| +============= | |||
| +Bug #5784 - Edition changes when reopening GUI | |||
| + | |||
| v1.8.6-stable | v1.8.6-stable | ||
| ============= | ============= | ||
| Bug #5592 - Some keys don't work for macOS Sierra clients | Bug #5592 - Some keys don't work for macOS Sierra clients | ||
View
4
src/gui/res/lang/Languages.xml
| @@ -36,11 +36,11 @@ | |||
| <language ietfCode="ar" name="العربية" /> | <language ietfCode="ar" name="العربية" /> | ||
| <language ietfCode="pes-IR" name="فارسی" /> | <language ietfCode="pes-IR" name="فارسی" /> | ||
| <language ietfCode="ur" name="اردو" /> | <language ietfCode="ur" name="اردو" /> | ||
| - <language ietfCode="mr" name="मराठी" /> | + <language ietfCode="mr" name="मराठी" /> | ||
| <language ietfCode="si" name="Sඉන්හල" /> | <language ietfCode="si" name="Sඉන්හල" /> | ||
| <language ietfCode="th-TH" name="ภาษาไทย" /> | <language ietfCode="th-TH" name="ภาษาไทย" /> | ||
| <language ietfCode="zh-CN" name="中文 (简体)" /> | <language ietfCode="zh-CN" name="中文 (简体)" /> | ||
| <language ietfCode="zh-TW" name="中文 (繁體)" /> | <language ietfCode="zh-TW" name="中文 (繁體)" /> | ||
| <language ietfCode="ja-JP" name="日本語" /> | <language ietfCode="ja-JP" name="日本語" /> | ||
| - <language ietfCode="ko" name="한국의" /> | + <language ietfCode="ko" name="한국어" /> | ||
| </languages> | </languages> | ||
View
44
src/gui/res/mac/Info.plist
| @@ -1,20 +1,28 @@ | |||
| -<?xml version="1.0" encoding="UTF-8"?> | +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | <plist version="1.0"> | ||
| -<dict> | + <dict> | ||
| - <key>CFBundleInfoDictionaryVersion</key> | + <key>CFBundleDevelopmentRegion</key> | ||
| - <string>6.0</string> | + <string>English</string> | ||
| - <key>NSPrincipalClass</key> | + <key>CFBundleDisplayName</key> | ||
| - <string>NSApplication</string> | + <string>Synergy</string> | ||
| - <key>CFBundleIconFile</key> | + <key>CFBundleExecutable</key> | ||
| - <string>Synergy.icns</string> | + <string>Synergy</string> | ||
| - <key>CFBundlePackageType</key> | + <key>CFBundleIconFile</key> | ||
| - <string>APPL</string> | + <string>Synergy.icns</string> | ||
| - <key>CFBundleSignature</key> | + <key>CFBundleIdentifier</key> | ||
| - <string>????</string> | + <string>synergy</string> | ||
| - <key>CFBundleExecutable</key> | + <!-- TODO: Fix this in v2.0 //--> | ||
| - <string>Synergy</string> | + <key>CFBundleInfoDictionaryVersion</key> | ||
| - <key>CFBundleIdentifier</key> | + <string>6.0</string> | ||
| - <string>synergy</string> | + <key>CFBundleName</key> | ||
| -</dict> | + <string>Synergy</string> | ||
| + <key>CFBundlePackageType</key> | |||
| + <string>APPL</string> | |||
| + <key>CFBundleShortVersionString</key> | |||
| + <string>1.8.8</string> | |||
| + <key>CFBundleVersion</key> | |||
| + <string>1.8.8</string> | |||
| + <key>NSHumanReadableCopyright</key> | |||
| + <string>© 2012-2016, Symless Ltd</string> | |||
| + </dict> | |||
| </plist> | </plist> | ||
View
2
src/gui/src/LicenseManager.cpp
| @@ -44,7 +44,7 @@ LicenseManager::setSerialKey(SerialKey serialKey, bool acceptExpired) | |||
| using std::swap; | using std::swap; | ||
| swap (serialKey, m_serialKey); | swap (serialKey, m_serialKey); | ||
| m_AppConfig->setSerialKey(QString::fromStdString | m_AppConfig->setSerialKey(QString::fromStdString | ||
| - (serialKey.toString())); | + (m_serialKey.toString())); | ||
| emit serialKeyChanged(m_serialKey); | emit serialKeyChanged(m_serialKey); | ||
| if (serialKey.isTrial()) { | if (serialKey.isTrial()) { | ||
View
4
src/gui/src/main.cpp
| @@ -119,8 +119,8 @@ int waitForTray() | |||
| if (++trayAttempts > TRAY_RETRY_COUNT) | if (++trayAttempts > TRAY_RETRY_COUNT) | ||
| { | { | ||
| QMessageBox::critical(NULL, "Synergy", | QMessageBox::critical(NULL, "Synergy", | ||
| - QObject::tr("System tray is unavailable, quitting.")); | + QObject::tr("System tray is unavailable, don't close your window.")); | ||
| - return false; | + return true; | ||
| } | } | ||
| QThreadImpl::msleep(TRAY_RETRY_WAIT); | QThreadImpl::msleep(TRAY_RETRY_WAIT); | ||
View
36
src/lib/platform/MSWindowsKeyState.cpp
| @@ -61,11 +61,11 @@ const KeyID MSWindowsKeyState::s_virtualKey[] = | |||
| /* 0x012 */ { kKeyAlt_L }, // VK_MENU | /* 0x012 */ { kKeyAlt_L }, // VK_MENU | ||
| /* 0x013 */ { kKeyPause }, // VK_PAUSE | /* 0x013 */ { kKeyPause }, // VK_PAUSE | ||
| /* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL | /* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL | ||
| - /* 0x015 */ { kKeyHangulKana }, // VK_HANGUL, VK_KANA | + /* 0x015 */ { kKeyKana }, // VK_HANGUL, VK_KANA | ||
| /* 0x016 */ { kKeyNone }, // undefined | /* 0x016 */ { kKeyNone }, // undefined | ||
| /* 0x017 */ { kKeyNone }, // VK_JUNJA | /* 0x017 */ { kKeyNone }, // VK_JUNJA | ||
| /* 0x018 */ { kKeyNone }, // VK_FINAL | /* 0x018 */ { kKeyNone }, // VK_FINAL | ||
| - /* 0x019 */ { kKeyHanjaKanzi }, // VK_KANJI | + /* 0x019 */ { kKeyKanzi }, // VK_HANJA, VK_KANJI | ||
| /* 0x01a */ { kKeyNone }, // undefined | /* 0x01a */ { kKeyNone }, // undefined | ||
| /* 0x01b */ { kKeyEscape }, // VK_ESCAPE | /* 0x01b */ { kKeyEscape }, // VK_ESCAPE | ||
| /* 0x01c */ { kKeyHenkan }, // VK_CONVERT | /* 0x01c */ { kKeyHenkan }, // VK_CONVERT | ||
| @@ -318,11 +318,11 @@ const KeyID MSWindowsKeyState::s_virtualKey[] = | |||
| /* 0x112 */ { kKeyAlt_R }, // VK_MENU | /* 0x112 */ { kKeyAlt_R }, // VK_MENU | ||
| /* 0x113 */ { kKeyNone }, // VK_PAUSE | /* 0x113 */ { kKeyNone }, // VK_PAUSE | ||
| /* 0x114 */ { kKeyNone }, // VK_CAPITAL | /* 0x114 */ { kKeyNone }, // VK_CAPITAL | ||
| - /* 0x115 */ { kKeyNone }, // VK_KANA | + /* 0x115 */ { kKeyHangul }, // VK_HANGUL | ||
| - /* 0x116 */ { kKeyNone }, // VK_HANGUL | + /* 0x116 */ { kKeyNone }, // undefined | ||
| /* 0x117 */ { kKeyNone }, // VK_JUNJA | /* 0x117 */ { kKeyNone }, // VK_JUNJA | ||
| /* 0x118 */ { kKeyNone }, // VK_FINAL | /* 0x118 */ { kKeyNone }, // VK_FINAL | ||
| - /* 0x119 */ { kKeyNone }, // VK_KANJI | + /* 0x119 */ { kKeyHanja }, // VK_HANJA | ||
| /* 0x11a */ { kKeyNone }, // undefined | /* 0x11a */ { kKeyNone }, // undefined | ||
| /* 0x11b */ { kKeyNone }, // VK_ESCAPE | /* 0x11b */ { kKeyNone }, // VK_ESCAPE | ||
| /* 0x11c */ { kKeyNone }, // VK_CONVERT | /* 0x11c */ { kKeyNone }, // VK_CONVERT | ||
| @@ -728,6 +728,10 @@ MSWindowsKeyState::mapKeyFromEvent(WPARAM charAndVirtKey, | |||
| // that so we clear it. | // that so we clear it. | ||
| active &= ~s_controlAlt; | active &= ~s_controlAlt; | ||
| } | } | ||
| + if (id == kKeyHangul) { | |||
| + // If shift-space is used to change input mode, clear shift modifier. | |||
| + active &= ~KeyModifierShift; | |||
| + } | |||
| *maskOut = active; | *maskOut = active; | ||
| } | } | ||
| @@ -1071,13 +1075,8 @@ MSWindowsKeyState::getKeyMap(synergy::KeyMap& keyMap) | |||
| } | } | ||
| } | } | ||
| - // add alt+printscreen | |||
| - if (m_buttonToVK[0x54u] == 0) { | |||
| - m_buttonToVK[0x54u] = VK_SNAPSHOT; | |||
| - } | |||
| - | |||
| // set virtual key to button table | // set virtual key to button table | ||
| - if (GetKeyboardLayout(0) == m_groups[g]) { | + if (activeLayout == m_groups[g]) { | ||
| for (KeyButton i = 0; i < 512; ++i) { | for (KeyButton i = 0; i < 512; ++i) { | ||
| if (m_buttonToVK[i] != 0) { | if (m_buttonToVK[i] != 0) { | ||
| if (m_virtualKeyToButton[m_buttonToVK[i]] == 0) { | if (m_virtualKeyToButton[m_buttonToVK[i]] == 0) { | ||
| @@ -1339,8 +1338,20 @@ MSWindowsKeyState::setWindowGroup(SInt32 group) | |||
| } | } | ||
| KeyID | KeyID | ||
| -MSWindowsKeyState::getKeyID(UINT virtualKey, KeyButton button) | +MSWindowsKeyState::getKeyID(UINT virtualKey, KeyButton button) const | ||
| { | { | ||
| + // Some virtual keycodes have same values. | |||
| + // VK_HANGUL == VK_KANA, VK_HANJA == NK_KANJI | |||
| + // which are used to change the input mode of IME. | |||
| + // But they have different X11 keysym. So we should distinguish them. | |||
| + if ((LOWORD(m_keyLayout) & 0xffffu) == 0x0412u) { // 0x0412 : Korean Locale ID | |||
| + if (virtualKey == VK_HANGUL || virtualKey == VK_HANJA) { | |||
| + // If shift-space is used to change the input mode, | |||
| + // the extented bit is not set. So add it to get right key id. | |||
| + button |= 0x100u; | |||
| + } | |||
| + } | |||
| + | |||
| if ((button & 0x100u) != 0) { | if ((button & 0x100u) != 0) { | ||
| virtualKey += 0x100u; | virtualKey += 0x100u; | ||
| } | } | ||
| @@ -1392,3 +1403,4 @@ MSWindowsKeyState::addKeyEntry(synergy::KeyMap& keyMap, synergy::KeyMap::KeyItem | |||
| m_keyToVKMap[item.m_id] = static_cast<UINT>(item.m_client); | m_keyToVKMap[item.m_id] = static_cast<UINT>(item.m_client); | ||
| } | } | ||
| } | } | ||
| + | |||
View
2
src/lib/platform/MSWindowsKeyState.h
| @@ -122,7 +122,7 @@ class MSWindowsKeyState : public KeyState { | |||
| (button should include the extended key bit), or kKeyNone if there is | (button should include the extended key bit), or kKeyNone if there is | ||
| no such key. | no such key. | ||
| */ | */ | ||
| - static KeyID getKeyID(UINT virtualKey, KeyButton button); | + KeyID getKeyID(UINT virtualKey, KeyButton button) const; | ||
| //! Map button to virtual key | //! Map button to virtual key | ||
| /*! | /*! | ||
View
18
src/lib/platform/OSXScreen.mm
| @@ -496,7 +496,23 @@ | |||
| // Fix for sticky keys | // Fix for sticky keys | ||
| CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags(); | CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags(); | ||
| CGEventSetFlags(event, modifiers); | CGEventSetFlags(event, modifiers); | ||
| - | + | ||
| + // Set movement deltas to fix issues with certain 3D programs | |||
| + SInt64 deltaX = pos.x; | |||
| + deltaX -= m_xCursor; | |||
| + | |||
| + SInt64 deltaY = pos.y; | |||
| + deltaY -= m_yCursor; | |||
| + | |||
| + CGEventSetIntegerValueField(event, kCGMouseEventDeltaX, deltaX); | |||
| + CGEventSetIntegerValueField(event, kCGMouseEventDeltaY, deltaY); | |||
| + | |||
| + double deltaFX = deltaX; | |||
| + double deltaFY = deltaY; | |||
| + | |||
| + CGEventSetDoubleValueField(event, kCGMouseEventDeltaX, deltaFX); | |||
| + CGEventSetDoubleValueField(event, kCGMouseEventDeltaY, deltaFY); | |||
| + | |||
| CGEventPost(kCGHIDEventTap, event); | CGEventPost(kCGHIDEventTap, event); | ||
| CFRelease(event); | CFRelease(event); | ||
View
29
src/lib/platform/XWindowsScreen.cpp
| @@ -160,15 +160,12 @@ XWindowsScreen::XWindowsScreen( | |||
| // primary/secondary screen only initialization | // primary/secondary screen only initialization | ||
| if (m_isPrimary) { | if (m_isPrimary) { | ||
| - // start watching for events on other windows | +#ifdef HAVE_XI2 | ||
| - selectEvents(m_root); | |||
| m_xi2detected = detectXI2(); | m_xi2detected = detectXI2(); | ||
| - | |||
| if (m_xi2detected) { | if (m_xi2detected) { | ||
| -#ifdef HAVE_XI2 | |||
| selectXIRawMotion(); | selectXIRawMotion(); | ||
| -#endif | |||
| } else | } else | ||
| +#endif | |||
| { | { | ||
| // start watching for events on other windows | // start watching for events on other windows | ||
| selectEvents(m_root); | selectEvents(m_root); | ||
| @@ -745,7 +742,7 @@ XWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask) | |||
| LOG((CLOG_WARN "failed to register hotkey %s (id=%04x mask=%04x)", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask)); | LOG((CLOG_WARN "failed to register hotkey %s (id=%04x mask=%04x)", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask)); | ||
| return 0; | return 0; | ||
| } | } | ||
| - | + | ||
| LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask, id)); | LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask, id)); | ||
| return id; | return id; | ||
| } | } | ||
| @@ -827,7 +824,7 @@ void | |||
| XWindowsScreen::fakeMouseButton(ButtonID button, bool press) | XWindowsScreen::fakeMouseButton(ButtonID button, bool press) | ||
| { | { | ||
| const unsigned int xButton = mapButtonToX(button); | const unsigned int xButton = mapButtonToX(button); | ||
| - if (xButton != 0) { | + if (xButton > 0 && xButton < 11) { | ||
| XTestFakeButtonEvent(m_display, xButton, | XTestFakeButtonEvent(m_display, xButton, | ||
| press ? True : False, CurrentTime); | press ? True : False, CurrentTime); | ||
| XFlush(m_display); | XFlush(m_display); | ||
| @@ -977,22 +974,6 @@ XWindowsScreen::saveShape() | |||
| m_w = WidthOfScreen(DefaultScreenOfDisplay(m_display)); | m_w = WidthOfScreen(DefaultScreenOfDisplay(m_display)); | ||
| m_h = HeightOfScreen(DefaultScreenOfDisplay(m_display)); | m_h = HeightOfScreen(DefaultScreenOfDisplay(m_display)); | ||
| -#if HAVE_X11_EXTENSIONS_XRANDR_H | |||
| - if (m_xrandr){ | |||
| - int numSizes; | |||
| - XRRScreenSize* xrrs; | |||
| - Rotation rotation; | |||
| - xrrs = XRRSizes(m_display, DefaultScreen(m_display), &numSizes); | |||
| - XRRRotations(m_display, DefaultScreen(m_display), &rotation); | |||
| - if (xrrs != NULL) { | |||
| - if (rotation & (RR_Rotate_90|RR_Rotate_270) ){ | |||
| - m_w = xrrs->height; | |||
| - m_h = xrrs->width; | |||
| - } | |||
| - } | |||
| - } | |||
| -#endif | |||
| - | |||
| // get center of default screen | // get center of default screen | ||
| m_xCenter = m_x + (m_w >> 1); | m_xCenter = m_x + (m_w >> 1); | ||
| m_yCenter = m_y + (m_h >> 1); | m_yCenter = m_y + (m_h >> 1); | ||
| @@ -1300,7 +1281,7 @@ XWindowsScreen::handleSystemEvent(const Event& event, void*) | |||
| // handle the event ourself | // handle the event ourself | ||
| switch (xevent->type) { | switch (xevent->type) { | ||
| case CreateNotify: | case CreateNotify: | ||
| - if (m_isPrimary) { | + if (m_isPrimary && !m_xi2detected) { | ||
| // select events on new window | // select events on new window | ||
| selectEvents(xevent->xcreatewindow.window); | selectEvents(xevent->xcreatewindow.window); | ||
| } | } | ||
View
4
src/lib/server/Config.cpp
| @@ -2096,11 +2096,11 @@ ConfigReadContext::parseInterval(const ArgList& args) const | |||
| } | } | ||
| char* end; | char* end; | ||
| - long startValue = strtol(args[0].c_str(), &end, 10); | + double startValue = strtod(args[0].c_str(), &end); | ||
| if (end[0] != '\0') { | if (end[0] != '\0') { | ||
| throw XConfigRead(*this, "invalid interval \"%{1}\"", concatArgs(args)); | throw XConfigRead(*this, "invalid interval \"%{1}\"", concatArgs(args)); | ||
| } | } | ||
| - long endValue = strtol(args[1].c_str(), &end, 10); | + double endValue = strtod(args[1].c_str(), &end); | ||
| if (end[0] != '\0') { | if (end[0] != '\0') { | ||
| throw XConfigRead(*this, "invalid interval \"%{1}\"", concatArgs(args)); | throw XConfigRead(*this, "invalid interval \"%{1}\"", concatArgs(args)); | ||
| } | } | ||
Oops, something went wrong.