diff --git a/lib/client/CServerProxy.cpp b/lib/client/CServerProxy.cpp index 435cdc55..9b242e7d 100644 --- a/lib/client/CServerProxy.cpp +++ b/lib/client/CServerProxy.cpp @@ -445,6 +445,11 @@ CServerProxy::enter() m_seqNum = seqNum; } + // ignore num lock if so desired + if (m_ignoreNumLock) { + mask &= ~KeyModifierNumLock; + } + // forward getClient()->enter(x, y, seqNum, static_cast(mask), false); } @@ -520,6 +525,12 @@ CServerProxy::keyDown() mask2 != static_cast(mask)) LOG((CLOG_DEBUG1 "key down translated to id=%d, mask=0x%04x", id2, mask2)); + // ignore num lock if so desired + if (id2 == kKeyNumLock && m_ignoreNumLock) { + LOG((CLOG_DEBUG1 "ignoring num lock")); + return; + } + // forward getClient()->keyDown(id2, mask2, button); } @@ -544,6 +555,12 @@ CServerProxy::keyRepeat() mask2 != static_cast(mask)) LOG((CLOG_DEBUG1 "key repeat translated to id=%d, mask=0x%04x", id2, mask2)); + // ignore num lock if so desired + if (id2 == kKeyNumLock && m_ignoreNumLock) { + LOG((CLOG_DEBUG1 "ignoring num lock")); + return; + } + // forward getClient()->keyRepeat(id2, mask2, count, button); } @@ -567,6 +584,12 @@ CServerProxy::keyUp() mask2 != static_cast(mask)) LOG((CLOG_DEBUG1 "key up translated to id=%d, mask=0x%04x", id2, mask2)); + // ignore num lock if so desired + if (id2 == kKeyNumLock && m_ignoreNumLock) { + LOG((CLOG_DEBUG1 "ignoring num lock")); + return; + } + // forward getClient()->keyUp(id2, mask2, button); } @@ -684,6 +707,9 @@ CServerProxy::resetOptions() if (m_heartRate >= 0.0) { CProtocolUtil::writef(getOutputStream(), kMsgCNoop); } + + // don't ignore num lock + m_ignoreNumLock = false; } void @@ -726,6 +752,9 @@ CServerProxy::setOptions() CProtocolUtil::writef(getOutputStream(), kMsgCNoop); } } + else if (options[i] == kOptionIgnoreNumLock) { + m_ignoreNumLock = true; + } if (id != kKeyModifierIDNull) { m_modifierTranslationTable[id] = static_cast(options[i + 1]); diff --git a/lib/client/CServerProxy.h b/lib/client/CServerProxy.h index cbb58f1b..423cdf56 100644 --- a/lib/client/CServerProxy.h +++ b/lib/client/CServerProxy.h @@ -128,6 +128,7 @@ private: SInt32 m_xMouse, m_yMouse; bool m_ignoreMouse; + bool m_ignoreNumLock; KeyModifierID m_modifierTranslationTable[kKeyModifierIDLast]; double m_heartRate; diff --git a/lib/server/CConfig.cpp b/lib/server/CConfig.cpp index 89417b28..04a2dc72 100644 --- a/lib/server/CConfig.cpp +++ b/lib/server/CConfig.cpp @@ -646,6 +646,9 @@ CConfig::getOptionName(OptionID id) if (id == kOptionXTestXineramaUnaware) { return "xtestIsXineramaUnaware"; } + if (id == kOptionIgnoreNumLock) { + return "ignoreNumLock"; + } return NULL; } @@ -655,7 +658,8 @@ CConfig::getOptionValue(OptionID id, OptionValue value) if (id == kOptionHalfDuplexCapsLock || id == kOptionHalfDuplexNumLock || id == kOptionScreenSaverSync || - id == kOptionXTestXineramaUnaware) { + id == kOptionXTestXineramaUnaware || + id == kOptionIgnoreNumLock) { return (value != 0) ? "true" : "false"; } if (id == kOptionModifierMapForShift || @@ -891,6 +895,10 @@ CConfig::readSectionScreens(std::istream& s) addOption(screen, kOptionXTestXineramaUnaware, parseBoolean(value)); } + else if (name == "ignoreNumLock") { + addOption(screen, kOptionIgnoreNumLock, + parseBoolean(value)); + } else { // unknown argument throw XConfigRead("unknown argument"); diff --git a/lib/synergy/OptionTypes.h b/lib/synergy/OptionTypes.h index aaefe7fa..27e1f837 100644 --- a/lib/synergy/OptionTypes.h +++ b/lib/synergy/OptionTypes.h @@ -55,6 +55,7 @@ static const OptionID kOptionScreenSwitchDelay = OPTION_CODE("SSWT"); static const OptionID kOptionScreenSwitchTwoTap = OPTION_CODE("SSTT"); static const OptionID kOptionScreenSaverSync = OPTION_CODE("SSVR"); static const OptionID kOptionXTestXineramaUnaware = OPTION_CODE("XTXU"); +static const OptionID kOptionIgnoreNumLock = OPTION_CODE("IGNL"); //@} #undef OPTION_CODE