From faff28de44bb635fe1103216996de46625ca0e99 Mon Sep 17 00:00:00 2001 From: crs Date: Sat, 12 Jul 2003 18:13:36 +0000 Subject: [PATCH] Added ignoreNumLock boolean per-screen option. When true, NumLock is ignored on that client (it has no effect on the server). This is useful for keyboards that don't have separate number pads and the user often uses the client's keyboard directly, when turning on NumLock interferes with normal typing. --- lib/client/CServerProxy.cpp | 29 +++++++++++++++++++++++++++++ lib/client/CServerProxy.h | 1 + lib/server/CConfig.cpp | 10 +++++++++- lib/synergy/OptionTypes.h | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/client/CServerProxy.cpp b/lib/client/CServerProxy.cpp index 435cdc5522..9b242e7d8b 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 cbb58f1b73..423cdf5679 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 89417b2827..04a2dc724c 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 aaefe7fa91..27e1f83711 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