From 775d6611b28c8a57988ee5c1ad37cf3a031ecdc1 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Wed, 2 Mar 2016 13:30:21 +0100 Subject: [PATCH] Duplicate key sequences detection added --- ZRColaCompile/dbsource.cpp | 2 +- ZRColaCompile/main.cpp | 15 +++++++++++- lib/libZRColaUI/include/zrcolaui/keyboard.h | 25 ++++++++++++++++++++ lib/libZRColaUI/src/keyboard.cpp | 15 ++++++++++++ lib/libZRColaUI/src/stdafx.h | 2 ++ output/data/ZRCola.zrcdb | Bin 107942 -> 107922 bytes 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/ZRColaCompile/dbsource.cpp b/ZRColaCompile/dbsource.cpp index a850611..f7cbf71 100644 --- a/ZRColaCompile/dbsource.cpp +++ b/ZRColaCompile/dbsource.cpp @@ -262,7 +262,7 @@ bool ZRCola::DBSource::SelectKeySequences(ATL::CComPtr &rs) const wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false); // Open it. - if (FAILED(rs->Open(ATL::CComVariant(L"SELECT [Znak], [tipka] FROM [wrd_KeyCodes]"), ATL::CComVariant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) { + if (FAILED(rs->Open(ATL::CComVariant(L"SELECT DISTINCT [Znak], [tipka] FROM [wrd_KeyCodes]"), 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(); return false; diff --git a/ZRColaCompile/main.cpp b/ZRColaCompile/main.cpp index 068f68c..5cce0ee 100644 --- a/ZRColaCompile/main.cpp +++ b/ZRColaCompile/main.cpp @@ -464,6 +464,19 @@ int _tmain(int argc, _TCHAR *argv[]) qsort_s(db.idxChr.data(), count, sizeof(unsigned __int32), CompareKeySequenceChar, db.data.data()); qsort_s(db.idxKey.data(), count, sizeof(unsigned __int32), CompareKeySequenceKey , db.data.data()); + // Check key sequences. + for (std::vector::size_type i = 1, n = db.idxKey.size(); i < n; i++) { + const ZRCola::keyseq_db::keyseq + &ks1 = (const ZRCola::keyseq_db::keyseq&)db.data[db.idxKey[i - 1]], + &ks2 = (const ZRCola::keyseq_db::keyseq&)db.data[db.idxKey[i ]]; + + if (CompareSequence(ks1.seq, ks1.seq_len, ks2.seq, ks2.seq_len) == 0) { + std::wstring seq_str; + ZRCola::keyseq_db::GetSequenceAsText(ks1.seq, ks1.seq_len, seq_str); + _ftprintf(stderr, wxT("%s: warning ZCC0007: Duplicate key sequence (%ls => %04X or %04X). The keyboard behaviour will be unpredictable.\n"), (LPCTSTR)filenameIn.c_str(), seq_str.c_str(), ks1.chr, ks2.chr); + } + } + // Write translations to file. dst << ZRCola::keyseq_rec(db); } else { @@ -479,7 +492,7 @@ int _tmain(int argc, _TCHAR *argv[]) stdex::idrec::close(dst, dst_start); if (dst.fail()) { - _ftprintf(stderr, wxT("%s: error ZCC0007: Writing to output file failed.\n"), (LPCTSTR)filenameOut.c_str()); + _ftprintf(stderr, wxT("%s: error ZCC1000: Writing to output file failed.\n"), (LPCTSTR)filenameOut.c_str()); has_errors = true; } diff --git a/lib/libZRColaUI/include/zrcolaui/keyboard.h b/lib/libZRColaUI/include/zrcolaui/keyboard.h index 13a24f4..7e73891 100644 --- a/lib/libZRColaUI/include/zrcolaui/keyboard.h +++ b/lib/libZRColaUI/include/zrcolaui/keyboard.h @@ -63,6 +63,31 @@ namespace ZRCola { std::vector idxChr; ///< Character index std::vector idxKey; ///< Key index std::vector data; ///< Key sequences data + + public: + /// + /// Get text representation of a given key sequence + /// + /// \param[in] seq Key sequence + /// \param[in] seq_len Number of elements in \p seq + /// \param[out] str Text representation of a \p seq key sequence + /// + static void GetSequenceAsText(_In_count_(seq_len) const keyseq::key_t *seq, _In_ size_t seq_len, _Out_ std::wstring& str); + + /// + /// Get text representation of a given key sequence + /// + /// \param[in] seq Key sequence + /// \param[in] seq_len Number of elements in \p seq + /// + /// \returns Text representation of a \p seq key sequence + /// + static inline std::wstring GetSequenceAsText(_In_count_(seq_len) const keyseq::key_t *seq, _In_ size_t seq_len) + { + std::wstring str; + GetSequenceAsText(seq, seq_len, str); + return str; + } }; diff --git a/lib/libZRColaUI/src/keyboard.cpp b/lib/libZRColaUI/src/keyboard.cpp index ac111f1..b5b41cf 100644 --- a/lib/libZRColaUI/src/keyboard.cpp +++ b/lib/libZRColaUI/src/keyboard.cpp @@ -18,3 +18,18 @@ */ #include "stdafx.h" + + +void ZRCola::keyseq_db::GetSequenceAsText(_In_count_(seq_len) const ZRCola::keyseq_db::keyseq::key_t *seq, _In_ size_t seq_len, _Out_ std::wstring& str) +{ + assert(seq || !seq_len); + + str.clear(); + for (size_t i = 0; i < seq_len; i++) { + if (i) str += L", "; + if (seq[i].modifiers & keyseq::CTRL ) str += L"Ctrl+"; + if (seq[i].modifiers & keyseq::ALT ) str += L"Alt+"; + if (seq[i].modifiers & keyseq::SHIFT) str += L"Shift+"; + str += seq[i].key; + } +} diff --git a/lib/libZRColaUI/src/stdafx.h b/lib/libZRColaUI/src/stdafx.h index d4f84ec..171035c 100644 --- a/lib/libZRColaUI/src/stdafx.h +++ b/lib/libZRColaUI/src/stdafx.h @@ -21,3 +21,5 @@ #include "../../../include/zrcola.h" #include "../include/zrcolaui/keyboard.h" + +#include diff --git a/output/data/ZRCola.zrcdb b/output/data/ZRCola.zrcdb index 14c5484cf58c57fb8f48605b8c70643d9e359634..d39f33a98a52ffb14dce1168604c71c1e7519e5b 100644 GIT binary patch delta 9663 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 delta 9751 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 P$G_-69(Qwny_EYutL+u;