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... | ||
| * 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. | ||
View
7
CMakeLists.txt
| @@ -17,7 +17,7 @@ | ||
| # Version number for Synergy | ||
| set(VERSION_MAJOR 1) | ||
| set(VERSION_MINOR 8) | ||
| -set(VERSION_REV 6) | ||
| +set(VERSION_REV 8) | ||
| set(VERSION_STAGE stable) | ||
| set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}") | ||
| @@ -74,11 +74,6 @@ endif() | ||
| # Depending on the platform, pass in the required defines. | ||
| 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) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") | ||
| 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 | ||
| ============= | ||
| 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="pes-IR" name="فارسی" /> | ||
| <language ietfCode="ur" name="اردو" /> | ||
| - <language ietfCode="mr" name="मराठी" /> | ||
| + <language ietfCode="mr" name="मराठी" /> | ||
| <language ietfCode="si" name="Sඉන්හල" /> | ||
| <language ietfCode="th-TH" name="ภาษาไทย" /> | ||
| <language ietfCode="zh-CN" name="中文 (简体)" /> | ||
| <language ietfCode="zh-TW" name="中文 (繁體)" /> | ||
| <language ietfCode="ja-JP" name="日本語" /> | ||
| - <language ietfCode="ko" name="한국의" /> | ||
| + <language ietfCode="ko" name="한국어" /> | ||
| </languages> | ||
View
44
src/gui/res/mac/Info.plist
| @@ -1,20 +1,28 @@ | ||
| -<?xml version="1.0" encoding="UTF-8"?> | ||
| -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| <plist version="1.0"> | ||
| -<dict> | ||
| - <key>CFBundleInfoDictionaryVersion</key> | ||
| - <string>6.0</string> | ||
| - <key>NSPrincipalClass</key> | ||
| - <string>NSApplication</string> | ||
| - <key>CFBundleIconFile</key> | ||
| - <string>Synergy.icns</string> | ||
| - <key>CFBundlePackageType</key> | ||
| - <string>APPL</string> | ||
| - <key>CFBundleSignature</key> | ||
| - <string>????</string> | ||
| - <key>CFBundleExecutable</key> | ||
| - <string>Synergy</string> | ||
| - <key>CFBundleIdentifier</key> | ||
| - <string>synergy</string> | ||
| -</dict> | ||
| + <dict> | ||
| + <key>CFBundleDevelopmentRegion</key> | ||
| + <string>English</string> | ||
| + <key>CFBundleDisplayName</key> | ||
| + <string>Synergy</string> | ||
| + <key>CFBundleExecutable</key> | ||
| + <string>Synergy</string> | ||
| + <key>CFBundleIconFile</key> | ||
| + <string>Synergy.icns</string> | ||
| + <key>CFBundleIdentifier</key> | ||
| + <string>synergy</string> | ||
| + <!-- TODO: Fix this in v2.0 //--> | ||
| + <key>CFBundleInfoDictionaryVersion</key> | ||
| + <string>6.0</string> | ||
| + <key>CFBundleName</key> | ||
| + <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> |
View
2
src/gui/src/LicenseManager.cpp
| @@ -44,7 +44,7 @@ LicenseManager::setSerialKey(SerialKey serialKey, bool acceptExpired) | ||
| using std::swap; | ||
| swap (serialKey, m_serialKey); | ||
| m_AppConfig->setSerialKey(QString::fromStdString | ||
| - (serialKey.toString())); | ||
| + (m_serialKey.toString())); | ||
| emit serialKeyChanged(m_serialKey); | ||
| if (serialKey.isTrial()) { | ||
View
4
src/gui/src/main.cpp
| @@ -119,8 +119,8 @@ int waitForTray() | ||
| if (++trayAttempts > TRAY_RETRY_COUNT) | ||
| { | ||
| QMessageBox::critical(NULL, "Synergy", | ||
| - QObject::tr("System tray is unavailable, quitting.")); | ||
| - return false; | ||
| + QObject::tr("System tray is unavailable, don't close your window.")); | ||
| + return true; | ||
| } | ||
| 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 | ||
| /* 0x013 */ { kKeyPause }, // VK_PAUSE | ||
| /* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL | ||
| - /* 0x015 */ { kKeyHangulKana }, // VK_HANGUL, VK_KANA | ||
| + /* 0x015 */ { kKeyKana }, // VK_HANGUL, VK_KANA | ||
| /* 0x016 */ { kKeyNone }, // undefined | ||
| /* 0x017 */ { kKeyNone }, // VK_JUNJA | ||
| /* 0x018 */ { kKeyNone }, // VK_FINAL | ||
| - /* 0x019 */ { kKeyHanjaKanzi }, // VK_KANJI | ||
| + /* 0x019 */ { kKeyKanzi }, // VK_HANJA, VK_KANJI | ||
| /* 0x01a */ { kKeyNone }, // undefined | ||
| /* 0x01b */ { kKeyEscape }, // VK_ESCAPE | ||
| /* 0x01c */ { kKeyHenkan }, // VK_CONVERT | ||
| @@ -318,11 +318,11 @@ const KeyID MSWindowsKeyState::s_virtualKey[] = | ||
| /* 0x112 */ { kKeyAlt_R }, // VK_MENU | ||
| /* 0x113 */ { kKeyNone }, // VK_PAUSE | ||
| /* 0x114 */ { kKeyNone }, // VK_CAPITAL | ||
| - /* 0x115 */ { kKeyNone }, // VK_KANA | ||
| - /* 0x116 */ { kKeyNone }, // VK_HANGUL | ||
| + /* 0x115 */ { kKeyHangul }, // VK_HANGUL | ||
| + /* 0x116 */ { kKeyNone }, // undefined | ||
| /* 0x117 */ { kKeyNone }, // VK_JUNJA | ||
| /* 0x118 */ { kKeyNone }, // VK_FINAL | ||
| - /* 0x119 */ { kKeyNone }, // VK_KANJI | ||
| + /* 0x119 */ { kKeyHanja }, // VK_HANJA | ||
| /* 0x11a */ { kKeyNone }, // undefined | ||
| /* 0x11b */ { kKeyNone }, // VK_ESCAPE | ||
| /* 0x11c */ { kKeyNone }, // VK_CONVERT | ||
| @@ -728,6 +728,10 @@ MSWindowsKeyState::mapKeyFromEvent(WPARAM charAndVirtKey, | ||
| // that so we clear it. | ||
| active &= ~s_controlAlt; | ||
| } | ||
| + if (id == kKeyHangul) { | ||
| + // If shift-space is used to change input mode, clear shift modifier. | ||
| + active &= ~KeyModifierShift; | ||
| + } | ||
| *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 | ||
| - if (GetKeyboardLayout(0) == m_groups[g]) { | ||
| + if (activeLayout == m_groups[g]) { | ||
| for (KeyButton i = 0; i < 512; ++i) { | ||
| if (m_buttonToVK[i] != 0) { | ||
| if (m_virtualKeyToButton[m_buttonToVK[i]] == 0) { | ||
| @@ -1339,8 +1338,20 @@ MSWindowsKeyState::setWindowGroup(SInt32 group) | ||
| } | ||
| 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) { | ||
| 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); | ||
| } | ||
| } | ||
| + | ||
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 | ||
| no such key. | ||
| */ | ||
| - static KeyID getKeyID(UINT virtualKey, KeyButton button); | ||
| + KeyID getKeyID(UINT virtualKey, KeyButton button) const; | ||
| //! Map button to virtual key | ||
| /*! | ||
View
18
src/lib/platform/OSXScreen.mm
| @@ -496,7 +496,23 @@ | ||
| // Fix for sticky keys | ||
| CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags(); | ||
| 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); | ||
| CFRelease(event); | ||
View
29
src/lib/platform/XWindowsScreen.cpp
| @@ -160,15 +160,12 @@ XWindowsScreen::XWindowsScreen( | ||
| // primary/secondary screen only initialization | ||
| if (m_isPrimary) { | ||
| - // start watching for events on other windows | ||
| - selectEvents(m_root); | ||
| +#ifdef HAVE_XI2 | ||
| m_xi2detected = detectXI2(); | ||
| - | ||
| if (m_xi2detected) { | ||
| -#ifdef HAVE_XI2 | ||
| selectXIRawMotion(); | ||
| -#endif | ||
| } else | ||
| +#endif | ||
| { | ||
| // start watching for events on other windows | ||
| 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)); | ||
| 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)); | ||
| return id; | ||
| } | ||
| @@ -827,7 +824,7 @@ void | ||
| XWindowsScreen::fakeMouseButton(ButtonID button, bool press) | ||
| { | ||
| const unsigned int xButton = mapButtonToX(button); | ||
| - if (xButton != 0) { | ||
| + if (xButton > 0 && xButton < 11) { | ||
| XTestFakeButtonEvent(m_display, xButton, | ||
| press ? True : False, CurrentTime); | ||
| XFlush(m_display); | ||
| @@ -977,22 +974,6 @@ XWindowsScreen::saveShape() | ||
| m_w = WidthOfScreen(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 | ||
| m_xCenter = m_x + (m_w >> 1); | ||
| m_yCenter = m_y + (m_h >> 1); | ||
| @@ -1300,7 +1281,7 @@ XWindowsScreen::handleSystemEvent(const Event& event, void*) | ||
| // handle the event ourself | ||
| switch (xevent->type) { | ||
| case CreateNotify: | ||
| - if (m_isPrimary) { | ||
| + if (m_isPrimary && !m_xi2detected) { | ||
| // select events on new window | ||
| selectEvents(xevent->xcreatewindow.window); | ||
| } | ||
View
4
src/lib/server/Config.cpp
| @@ -2096,11 +2096,11 @@ ConfigReadContext::parseInterval(const ArgList& args) const | ||
| } | ||
| char* end; | ||
| - long startValue = strtol(args[0].c_str(), &end, 10); | ||
| + double startValue = strtod(args[0].c_str(), &end); | ||
| if (end[0] != '\0') { | ||
| 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') { | ||
| throw XConfigRead(*this, "invalid interval \"%{1}\"", concatArgs(args)); | ||
| } | ||
Oops, something went wrong.