From 7e3e24232d7a8c6d11af57d75bcead5976959e98 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Wed, 25 May 2016 12:44:00 +0200 Subject: [PATCH] Key codes are translated to English U.S. keyboard correctly now --- ZRColaCompile/dbsource.cpp | 82 +++++++++++-------------------------- ZRColaCompile/dbsource.h | 27 ++++++------ output/data/ZRCola.zrcdb | Bin 1890516 -> 1890516 bytes 3 files changed, 39 insertions(+), 70 deletions(-) diff --git a/ZRColaCompile/dbsource.cpp b/ZRColaCompile/dbsource.cpp index 1032c4c..c77e2c3 100644 --- a/ZRColaCompile/dbsource.cpp +++ b/ZRColaCompile/dbsource.cpp @@ -325,54 +325,6 @@ bool ZRCola::DBSource::GetUnicodeString(const ATL::CComPtr& f, std::ws } -bool ZRCola::DBSource::GetKeyCode(const ATL::CComPtr& f, ZRCola::DBSource::keyseq::keycode& kc) const -{ - wxASSERT_MSG(f, wxT("field is empty")); - - ATL::CComVariant v; - wxVERIFY(SUCCEEDED(f->get_Value(&v))); - wxCHECK(SUCCEEDED(v.ChangeType(VT_BSTR)), false); - - // Convert to uppercase. - _wcsupr_l(V_BSTR(&v), m_locale); - - // Parse the field. - memset(&kc, 0, sizeof(kc)); - for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) { - // Parse key code. - if (i) { - // Check for "+" separator. - if (V_BSTR(&v)[i] != L'+') { - ATL::CComBSTR fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname))); - _ftprintf(stderr, wxT("%s: error ZCC0070: Syntax error in \"%.*ls\" field (\"%.*ls\"). Key codes must be \"Ctrl+Alt+\" formatted.\n"), m_filename.c_str(), fieldname.Length(), (BSTR)fieldname, n, V_BSTR(&v)); - } - i++; - if (i >= n || !V_BSTR(&v)[i]) { - ATL::CComBSTR fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname))); - _ftprintf(stderr, wxT("%s: error ZCC0071: Syntax error in \"%.*ls\" field (\"%.*ls\"). Trailing separator \"+\" found.\n"), m_filename.c_str(), fieldname.Length(), (BSTR)fieldname, n, V_BSTR(&v)); - } - } - - static const wchar_t str_shift[] = L"SHIFT", str_ctrl[] = L"CTRL", str_alt[] = L"ALT"; - if (i + _countof(str_shift) - 1 <= n && wmemcmp(V_BSTR(&v) + i, str_shift, _countof(str_shift) - 1) == 0) { - kc.shift = true; - i += _countof(str_shift) - 1; - } else if (i + _countof(str_ctrl) - 1 <= n && wmemcmp(V_BSTR(&v) + i, str_ctrl, _countof(str_ctrl) - 1) == 0) { - kc.ctrl = true; - i += _countof(str_ctrl) - 1; - } else if (i + _countof(str_alt) - 1 <= n && wmemcmp(V_BSTR(&v) + i, str_alt, _countof(str_alt) - 1) == 0) { - kc.alt = true; - i += _countof(str_alt) - 1; - } else { - kc.key = V_BSTR(&v)[i]; - i++; - } - } - - return true; -} - - bool ZRCola::DBSource::GetLanguage(const ATL::CComPtr& f, ZRCola::langid_t& lang) const { wxASSERT_MSG(f, wxT("field is empty")); @@ -508,9 +460,9 @@ bool ZRCola::DBSource::SelectKeySequences(ATL::CComPtr &rs) const // Open it. if (FAILED(rs->Open(ATL::CComVariant( - L"SELECT DISTINCT [VRS_KeyCodes].[Znak], [VRS_CharGroup].[Name] AS [CharGroup], [VRS_KeyCodes].[KeyCode], [VRS_KeyCodes].[Shift] " + L"SELECT DISTINCT [VRS_KeyCodes].[Znak], [VRS_CharGroup].[CharGroup], IIF([VRS_CharGroup].[Arg1] IS NOT NULL, [VRS_CharGroup].[Arg1], 0)+IIF([VRS_CharGroup].[Arg2] IS NOT NULL, [VRS_CharGroup].[Arg2], 0)+IIF([VRS_CharGroup].[Arg3] IS NOT NULL, [VRS_CharGroup].[Arg3], 0) AS [Modifiers], IIF([VRS_CharGroup].[Arg4] IS NOT NULL, [VRS_CharGroup].[Arg4], 0) AS [KeyCodePre], [VRS_KeyCodes].[KeyCode], [VRS_KeyCodes].[Shift] " L"FROM [VRS_KeyCodes] LEFT JOIN [VRS_CharGroup] ON [VRS_CharGroup].[CharGroup]=[VRS_KeyCodes].[CharGroup] " - L"ORDER BY [VRS_CharGroup].[Name], [VRS_KeyCodes].[KeyCode], [VRS_KeyCodes].[Shift], [VRS_KeyCodes].[Znak]"), ATL::CComVariant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) + L"ORDER BY [VRS_CharGroup].[CharGroup], [VRS_KeyCodes].[KeyCode], [VRS_KeyCodes].[Shift], [VRS_KeyCodes].[Znak]"), ATL::CComVariant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) { _ftprintf(stderr, wxT("%s: error ZCC0050: Error loading key sequences from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); LogErrors(); @@ -534,11 +486,18 @@ bool ZRCola::DBSource::GetKeySequence(const ATL::CComPtr& rs, ZRCo wxCHECK(GetUnicodeCharacter(f, ks.chr), false); } - keyseq::keycode kc1; + int modifiers; { ATL::CComPtr f; - wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"CharGroup"), &f))); - wxCHECK(GetKeyCode(f, kc1), false); + wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"Modifiers"), &f))); + wxCHECK(GetValue(f, modifiers), false); + } + + int keycode1; + { + ATL::CComPtr f; + wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"KeyCodePre"), &f))); + wxCHECK(GetValue(f, keycode1), false); } int keycode; @@ -556,15 +515,24 @@ bool ZRCola::DBSource::GetKeySequence(const ATL::CComPtr& rs, ZRCo } ks.seq.clear(); - if (kc1.key) { + if (keycode1) { // First key in the sequence is complete. + keyseq::keycode kc1 = { + keyseq::keycode::translate_slen(keycode1), + (modifiers & 0x100) != 0, + (modifiers & 0x200) != 0, + (modifiers & 0x400) != 0 }; ks.seq.push_back(kc1); - keyseq::keycode kc2 = { keycode, shift }; + + keyseq::keycode kc2 = { keyseq::keycode::translate_slen(keycode), shift }; ks.seq.push_back(kc2); } else { // First key in the sequence is only modifier(s). - kc1.key = keycode; - if (shift) kc1.shift = true; + keyseq::keycode kc1 = { + keyseq::keycode::translate_slen(keycode), + shift || (modifiers & 0x100) != 0, + (modifiers & 0x200) != 0, + (modifiers & 0x400) != 0 }; ks.seq.push_back(kc1); } diff --git a/ZRColaCompile/dbsource.h b/ZRColaCompile/dbsource.h index 28f2f47..8771837 100644 --- a/ZRColaCompile/dbsource.h +++ b/ZRColaCompile/dbsource.h @@ -60,6 +60,20 @@ namespace ZRCola { bool shift; ///< Shift modifier bool ctrl; ///< Ctrl modifier bool alt; ///< Alt modifier + + /// + /// Translates keycode from Slovenian to English keyboard + /// + inline static wchar_t translate_slen(_In_ wchar_t key) + { + switch (key) { + case L'Z': return L'Y'; + case L'Y': return L'Z'; + case 191: return 189; + case 189: return 191; + default : return key; + } + } }; public: @@ -310,19 +324,6 @@ namespace ZRCola { bool GetUnicodeString(const ATL::CComPtr& f, std::wstring& str) const; - /// - /// Gets encoded key from ZRCola.zrc database - /// - /// \param[in] f Data field - /// \param[out] kc Output key code - /// - /// \returns - /// - true when successful - /// - false otherwise - /// - bool GetKeyCode(const ATL::CComPtr& f, keyseq::keycode& kc) const; - - /// /// Gets language ID from ZRCola.zrc database /// diff --git a/output/data/ZRCola.zrcdb b/output/data/ZRCola.zrcdb index a5b464eed44bb2d31d10725e2ff3808d332003a1..8bd1567f0ece94416df5afd952d5f40a70d17aba 100644 GIT binary patch delta 5232 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 LziTS#58nR)3oZzv