From 07e396262f08f5a6f8856bb506dc87429d4cfb6d Mon Sep 17 00:00:00 2001 From: vanbui0196 <140935471+vanbui0196@users.noreply.github.com> Date: Sun, 11 Oct 2026 10:00:13 +0700 Subject: [PATCH 1/2] Update the git ignore + icon --- .gitignore | 1 + .../win32/OpenKey/OpenKey/StatusGer.ico | Bin 0 -> 136070 bytes .../win32/OpenKey/OpenKey/StatusGer10.ico | Bin 0 -> 136070 bytes 3 files changed, 1 insertion(+) create mode 100644 Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer.ico create mode 100644 Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer10.ico diff --git a/.gitignore b/.gitignore index 7fd14bb2..e0b73c90 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /Sources/OpenKey/win32/OpenKey/OpenKey/x64/Debug /Sources/OpenKey/win32/OpenKey/OpenKey/x64/Release /Sources/OpenKey/win32/OpenKey/OpenKeyUpdate/x64/Release +*/Release/ \ No newline at end of file diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer.ico b/Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer.ico new file mode 100644 index 0000000000000000000000000000000000000000..97f0fec976cbbae032265a9e2bae599ebdc777e6 GIT binary patch literal 136070 zcmeHQJ*?!m5!M-j;lcr2xVUr=FkoDHfSZ)BOl4e|A_!a>NaHF9QeBl4DUvQt0GIC0 zWeUH$=OBg4bTQz@O@O3xnKZkb`N-uyE|-)@ihtVo5zv!XPa=ok42Q#+ku*(Drgx^7 zFDKdGOwVqgOuw6^>Gt;c`^7Z9l5@|WAAigKpMQEXJ$rWi{lPTtzm_|1j=$fZrVs!1 zWP1Aa`1{>y`uKlOruXGM>i^F>)AZ{fy*0h}-tqr$Ptz}d{MIDZO)q7Wi_~>EoNna@ z3lSg!M1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5!f06_xqntcZV0# z>%+_G_3m@o?oZp@?!VKU!y#$A+x_Es|ChQ>sTcL%A8xk>&DGKS)&6JGo82E3f9`hw zPU35-9E7gF+kGqTYuNxj_Xml_vQ$Cf{_t$N+kYl_|FsLRLo(o=ht7Dj`~9TlL8A05 z*$CVpo+>QwcHa-pb5{oJ-_Q?t`=4iH@EC8rKRlOl{`qEkZu8$9-|c=7S^l%k5lGQt z@gbmWH?i3aX4ksE+kHcwU)jXR{mi)c$)K{0#GkZf+W>x1&h=@r2Uiy0YesxyYen;3e4>eR&+Gm20>9Xn;tZqv z>$fOpSSKL9FnU28WQ+K2g=Vb_#`GB==CKtVw@l}V>jRaCk&$n)Wj^$xeKh`KowDV4 zZ7)9NwmTaCk$aWf7vAT$`R8yMiT|MGvBz@ecva(nBk_L=Ydt$BRON{xSM<0cKg0aL zS59H7jEus6po>c9S^;bL zG)B@5Bk+Hucy6oMDf}ClD?;+u>iiJ=N6zyA{(Z<{>w-9a&$*#D|J8FCoq3NnNADbK z*cUzg9=-XG9EF}^A9>Xy#X_KiTG|Ia`49W5C-2erh%xb&KCqtr@1Dygw)lwUvGBj8 zo^$mK=GxTtd@EUb4E#s_w#$>2zemoGeGL3>*+*BdU~`UKT4K{{{_pAg7|GuE$>Fv0 zANhywm~8bMHpi&*zLAA%=YQASE{VmAUap=0h?BM&?`}J=J4Y|q&i`KiZmjug6g-z? z;{GM}E&aef?7v>?{#tf_OMbcfZ0+yX{O@V|L9f;*@VBp(+1&dPW2;ff|9Dh; z=6aOQ=P|t|{|yq$`(800#Q19!@;@HgUOB#4bJQy2e>}3i{Jva8%TBTc`3gpeU=YRTp^mEty_ISLgee~x}eF}QM=W7eO|MfZ0w}qbXe5mOI?u+WSTJQFb&x$^PZE>J4wdxzk z1!C8}d4BF(%{4$@M7Py?ukSc%8<5{v?=3C8)&S5AJ>K!x8}HHD$GcbN^mNVt)yxAQ z4d;>R>GcdKWUJP5KqKQl8g0G&fJ(Pi%mvNC8SkTkPTbOW*>d`6-_z3%gm-?n_IulX zw~s-Gy&i^MRK9ZJTH5VMZfdCPcATY0M;NQl-TDXv1V3rCXoxRFK$L4e-#bA zo&_}aWv%DIV?lApzM(6254{0hf%oa$?LRxtA!B~e&xZ;0TWnuzT&Ld!*3TahJN8ri zel~~5cLqj{d+0f!?{`1+cRt#W8SuoO_fvVCbGj3N`zTRD9xc@J=DX?ttl|IoGH zHS=M8x;}Jn1RVfbY9#|B@E-jg$pewY4kGsJg{Z?*h=n8*Y5*dsSen}*td04&u;{5d5ni>-(noOcYH8}<<`!R66?0d zcg(T!o9raMd8InJMZa{6v+XmUF}#hvM%#m9uBBV>Z*3bRf9Ehw2EL~rNYsNP`gvn{ z?p~*Sse}5|){fB{_mAx7b9o#4TiXL)P!BBV0q`DJU27R3XQalMEm7yS^WMm`ink0B zPc6Z>5_RDFX4gFK4e!k!HUWJEI%aWAww~c{>>hDLjnKR5A^)A_zv^RAOb1}8+m#vN3ZX*N1-`EjdP(9w6fGi0OJZdzB+I7OZ7Zu zt2|V^i{$*7UXJm)+)k?3V4t!O0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)2LZgO{8qM?vOSq@pmhW}EI}{wRg{IfL@2d6Ni1>cA=_-<)mqW{nC;<-Nw)?+-fj6Nw(lp(j`VF?Ms>Q}>9zk1d${v)gen_tg_i zhkM8+PFu@3l6wqDl9 zJId$)tVLpd2_-RK9rH-=0nE{D{1B&jfvl~;o0K)yT>W$ZGi~SULeROUMET$_Z;HOr z{;D!EXJ}qO1`ezEl>Y5g-CYfCvx) zB0vO)01+SpSBn7N6Zl-VPh>m2ClDuChyW3&gMiK@lILp>3-WCeD^l^ILEdqtaxf+C zmXr6P^2Q|Ig*X=Cf-MW$ESa~aVzbhh+VN)8pM!O5>=@S}##kdyM#n4jpBqc*gSuA6 zPpQ(J_G1nVWOS`emB>?0#@@~0$>fEOk2jPVm+rIQ>9O`z&&iy%T>^tN`t@9t*RIMz z!8;Pp=CI?lY}x%vq#t<{iEU}!y4=pgy!Tx~8_V??eU&BmGXLb1co~hSKQ$j1b53rl zL4WETJ2zjdadb8g&TYGRJ0uQ&*itESzl446yJaqEh@(GM?_h48E3N5I&HG%M-&@n4 z+TI-Y_+M&$mvUp~ph)?_SWD3Rq~GAXv?u;Pxw?A!fzM%P{)+wI+#G3Rn5sWx>$Tgc zd0cw_s!6M_?o|5$Im@G!lJ;AuZ^{=_DF?fS{p{M!$_`b}ORvu@uf2Xr(GjX&;-gG0 zEJMy%)QPV?7;&rQceKB^+$ zh7RtD01+SpM1Tko0U|&IhyW2F0z`laTp0p*P5|2r*-p<1d~ju*WOwQzpnXtyzo+C2 z27GF#*p$Q?;UmL6H4A)MXh*f1>HAjqivOv!Uktv-HFO!j-Pyhnowfb!Yy6|NX*=O5 zGMwr=UlXf4wVNWRLSt;vKKqnB*NC{z60HgJrR0}k+&~U&{;08z@ArysiN-R8zNNmJ z|3~CefYzw~M$#8MCQ@Udi!{d4hdIIEGqX?Cv8CvXp)DsrrUZRD7P34RAp@Zj)juC! zBKRAx^TP4#s`MdtQJ=w{53?-fKvog4K)7W5G{7i@K~| zFwT3F68f(;-BI!rVHeb*Gd5RaP6yVa4fU3`UzB}?@hkdG^ zg0`r{wYtoBd*UK2eEYVIwC*>hyW2F0z`la5CI}U1c*Q;0?3iMk?mHtQ=ZKG@`GjD z2xy;S;F%-w8)AK1x~MkAH<{#zkacs4Uob@TYCqBnpF&cM-tiw?_&3DolH!L<@snP( z6`%$Di;)lTEw;|&>qL&0N+>VOZcF=TM8*)8G@Ih}LX2pkec)ra<2zpRJI>az(Eif9 z7<_G?`fqT+J|F|QcCO5gabWH%!M1!fEVMscSHN#Mdyh-QO#ATh&DG_@9(c^%bMe2K z_Ls+!6SL$n>lPxp|WB0fi;5VM%SGI=JpA`Ia+cxw7H^_WYwmq~dnuXt~n4303d(?-q z4SHPts?N#(7%K~*$MZyh2oQl`5P+ZXsciVv&dE>M_UjnKV4(;xcB|R1oj=u@M%E2W zHU#X)(E28Xke+WB{2h*M06JpYQFFU7(be{^0sVXr3#6>@MpM;SM|0E}9PgeV#C$p8A2Uhp#R!F>4?n{-OJ9+HoAZ z?wq!G`kU7;V_Nm$D676>pWPqwDf_N<`xNs#xMrGJ`=M=@|Dm>U-8qjQ#*MEJ7uN$X z=)-_72knN&fNB@G%ecojtN&z7hYDy)Sxfo)yR^nx)5aV&cApfs@N;>_bLgC_N9_7S z$7n~r#|~{d@^0s?hwkTjB0vN-jR4jONFTu7tP{R|XVYD}Bpy2br01aPWHUak%d5j@ zFb_uAH!?>p%_FL=1pRL2NFQ}-zVOwh=Hz3%1jn9heD(Qa1-`jU+1O5<-uj$tFh`rB z>NxVmXCIjB%-+`~?lUE9Gi!UsTxa&)>nqlG(O!8PWC{S17TFtppk zwXVKWI!o4yDfQTO@|XxbVgz8{yeHd@Y{t%+-j*LN3iJf*4W+*@56gyQoWuX-iq^rF zE^+k~e#^Y!(+f(6_^$Vyv*%<(kLzz!^dHygiZ1lUs>|Gmy*sbsUQ^6k)2-k9AA8pa zVC#0fP5aos|I(It@HyG{*vIz$7uZ>Iv+kSiqtnOs{l0k{bC4-|?$ACHP3r@F<{Ixj xca$HSZX5$Iw?HOh{2{o;CqJkU=P$8*kVhrQ3-*DbOV7a%xS8|Z6M;bx_&;o6Xm|hs literal 0 HcmV?d00001 diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer10.ico b/Sources/OpenKey/win32/OpenKey/OpenKey/StatusGer10.ico new file mode 100644 index 0000000000000000000000000000000000000000..f36cdfb63ed9b87be1270c300696780657608259 GIT binary patch literal 136070 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 Date: Sun, 11 Oct 2026 10:01:52 +0700 Subject: [PATCH 2/2] adding support for german typing --- Sources/OpenKey/engine/Engine.cpp | 61 ++++++++++++++++++ Sources/OpenKey/engine/Engine.h | 7 ++ Sources/OpenKey/win32/OpenKey/OpenKey.sln | 4 +- .../win32/OpenKey/OpenKey/AppDelegate.cpp | 21 ++++-- .../win32/OpenKey/OpenKey/AppDelegate.h | 1 + .../OpenKey/OpenKey/MainControlDialog.cpp | 42 ++++++++---- .../win32/OpenKey/OpenKey/MainControlDialog.h | 2 +- .../OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp | 64 +++++++++++++++++-- .../OpenKey/win32/OpenKey/OpenKey/OpenKey.rc | 7 ++ .../win32/OpenKey/OpenKey/OpenKey.vcxproj | 14 ++-- .../OpenKey/OpenKey/OpenKey.vcxproj.filters | 6 ++ .../OpenKey/OpenKey/SystemTrayHelper.cpp | 37 ++++++++++- .../OpenKey/win32/OpenKey/OpenKey/resource.h | 11 +++- .../OpenKeyUpdate/OpenKeyUpdate.vcxproj | 10 +-- 14 files changed, 245 insertions(+), 42 deletions(-) diff --git a/Sources/OpenKey/engine/Engine.cpp b/Sources/OpenKey/engine/Engine.cpp index de90833b..d9214320 100644 --- a/Sources/OpenKey/engine/Engine.cpp +++ b/Sources/OpenKey/engine/Engine.cpp @@ -119,6 +119,25 @@ static bool _useSpellCheckingBefore; static bool _hasHandleQuickConsonant; static bool _willTempOffEngine = false; +/** + * German umlaut mode + * a + 1 -> ä; o + 1 -> ö; u + 1 -> ü; s + 1 -> ß + * Keeps the last typed letter (with caps state) of the current word. + * CAPS_MASK bit is used to remember whether the base letter was capitalized. + */ +static Uint32 _germanLastKey = 0; + +static Uint32 germanUmlautChar(const Uint32& lastKey) { + bool isCaps = (lastKey & CAPS_MASK) != 0; + switch (lastKey & CHAR_MASK) { + case KEY_A: return isCaps ? 0xC4 : 0xE4; //Ä : ä + case KEY_O: return isCaps ? 0xD6 : 0xF6; //Ö : ö + case KEY_U: return isCaps ? 0xDC : 0xFC; //Ü : ü + case KEY_S: return isCaps ? 0x1E9E : 0xDF; //ẞ : ß + } + return 0; +} + //function prototype void findAndCalculateVowel(const bool& forGrammar=false); void insertMark(const Uint32& markMask, const bool& canModifyFlag=true); @@ -463,6 +482,7 @@ void startNewSession() { _hasHandledMacro = false; _hasHandleQuickConsonant = false; _longWordHelper.clear(); + _germanLastKey = 0; } void checkCorrectVowel(vector>& charset, int& i, int& k, const Uint16& markKey) { @@ -1311,6 +1331,47 @@ void vEnglishMode(const vKeyEventState& state, const Uint16& data, const bool& i } } +void vGermanMode(const vKeyEventState& state, const Uint16& data, const bool& isCaps, const bool& otherControlKey) { + hCode = vDoNothing; + hBPC = 0; + hNCC = 0; + hExt = 3; //normal key + + if (state == vKeyEventState::MouseDown || state == vKeyEventState::MouseUp || otherControlKey) { + _germanLastKey = 0; + hExt = 1; //word break + return; + } + + if (data == KEY_DELETE) { //backspace + _germanLastKey = 0; + hExt = 2; //delete key + return; + } + + if (data == KEY_1) { //umlaut trigger key + if (_germanLastKey != 0) { + Uint32 ch = germanUmlautChar(_germanLastKey); + if (ch != 0) { + hCode = vWillProcess; + hBPC = 1; //remove the base letter + hNCC = 1; + hData[0] = CHAR_CODE_MASK | ch; + _germanLastKey = 0; + return; + } + } + _germanLastKey = 0; //'1' can not be combined + return; + } + + if (data >= KEY_A && data <= KEY_Z) { //letter key + _germanLastKey = data | (isCaps ? CAPS_MASK : 0); + } else { + _germanLastKey = 0; //any other key breaks the combination + } +} + void vKeyHandleEvent(const vKeyEvent& event, const vKeyEventState& state, const Uint16& data, diff --git a/Sources/OpenKey/engine/Engine.h b/Sources/OpenKey/engine/Engine.h index f288f8c5..a9471e0e 100644 --- a/Sources/OpenKey/engine/Engine.h +++ b/Sources/OpenKey/engine/Engine.h @@ -44,6 +44,7 @@ /* * 0: English * 1: Vietnamese + * 2: German (umlaut: a+1=ä, o+1=ö, u+1=ü, s+1=ß) */ extern int vLanguage; @@ -221,6 +222,12 @@ void startNewSession(); */ void vEnglishMode(const vKeyEventState& state, const Uint16& data, const bool& isCaps, const bool& otherControlKey); +/** + * German umlaut typing mode (a+1=ä, o+1=ö, u+1=ü, s+1=ß) + * Call this for every key/mouse event while vLanguage == 2 + */ +void vGermanMode(const vKeyEventState& state, const Uint16& data, const bool& isCaps, const bool& otherControlKey); + /** * temporarily turn off spell checking */ diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey.sln b/Sources/OpenKey/win32/OpenKey/OpenKey.sln index 5002e5a0..7692a697 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey.sln +++ b/Sources/OpenKey/win32/OpenKey/OpenKey.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29324.140 +# Visual Studio Version 18 +VisualStudioVersion = 18.10.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenKey", "OpenKey\OpenKey.vcxproj", "{21E71F9D-859A-4B8B-84F4-F5003E933BB3}" EndProject diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.cpp b/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.cpp index 140d6e4a..86719887 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.cpp +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.cpp @@ -205,14 +205,27 @@ void AppDelegate::onDefaultConfig() { } void AppDelegate::onToggleVietnamese() { - APP_SET_DATA(vLanguage, vLanguage ? 0 : 1); + APP_SET_DATA(vLanguage, vLanguage == 0 ? 1 : (vLanguage == 1 ? 2 : 0)); if (mainDialog) { mainDialog->fillData(); } - + + if (vUseSmartSwitchKey) { + string& exe = OpenKeyHelper::getLastAppExecuteName(); + setAppInputMethodStatus(exe, vLanguage | (vCodeTable << 2)); + saveSmartSwitchKeyData(); + } +} + +void AppDelegate::onSetLanguage(const int& language) { + APP_SET_DATA(vLanguage, language == 1 ? 1 : (language == 2 ? 2 : 0)); + if (mainDialog) { + mainDialog->fillData(); + } + if (vUseSmartSwitchKey) { string& exe = OpenKeyHelper::getLastAppExecuteName(); - setAppInputMethodStatus(exe, vLanguage | (vCodeTable << 1)); + setAppInputMethodStatus(exe, vLanguage | (vCodeTable << 2)); saveSmartSwitchKeyData(); } } @@ -281,7 +294,7 @@ void AppDelegate::onTableCode(const int & code) { mainDialog->fillData(); } if (vRememberCode) { - setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1)); + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); saveSmartSwitchKeyData(); } } diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.h b/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.h index dd5ffdaa..1852f133 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.h +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/AppDelegate.h @@ -47,6 +47,7 @@ class AppDelegate { void onInputType(const int& type); void onTableCode(const int& code); + void onSetLanguage(const int& language); //0: English; 1: Vietnamese; 2: German void onControlPanel(); void onOpenKeyAbout(); diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.cpp b/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.cpp index eab2e7c2..74b2cfc4 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.cpp +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.cpp @@ -112,6 +112,9 @@ void MainControlDialog::initDialog() { checkEnglish = GetDlgItem(hDlg, IDC_RADIO_METHOD_ENGLISH); createToolTip(checkEnglish, IDS_STRING_ENG); + checkGerman = GetDlgItem(hDlg, IDC_RADIO_METHOD_GERMAN); + createToolTip(checkGerman, IDS_STRING_GER); + /*--------end common---------*/ checkModernOrthorgraphy = GetDlgItem(hTabPage1, IDC_CHECK_MODERN_ORTHORGRAPHY); @@ -334,8 +337,9 @@ void MainControlDialog::fillData() { setSwitchKeyText(textSwitchKey, (vSwitchKeyStatus >> 24) & 0xFF); SendMessage(checkBeep, BM_SETCHECK, HAS_BEEP(vSwitchKeyStatus) ? 1 : 0, 0); - SendMessage(checkVietnamese, BM_SETCHECK, vLanguage, 0); - SendMessage(checkEnglish, BM_SETCHECK, !vLanguage, 0); + SendMessage(checkVietnamese, BM_SETCHECK, vLanguage == 1, 0); + SendMessage(checkEnglish, BM_SETCHECK, vLanguage == 0, 0); + SendMessage(checkGerman, BM_SETCHECK, vLanguage == 2, 0); SendMessage(checkModernOrthorgraphy, BM_SETCHECK, vUseModernOrthography ? 1 : 0, 0); SendMessage(checkFixRecommendBrowser, BM_SETCHECK, vFixRecommendBrowser ? 1 : 0, 0); @@ -392,7 +396,7 @@ void MainControlDialog::onComboBoxSelected(const HWND& hCombobox, const int& com else if (hCombobox == comboBoxTableCode) { APP_SET_DATA(vCodeTable, (int)SendMessage(hCombobox, CB_GETCURSEL, 0, 0)); if (vRememberCode) { - setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1)); + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); saveSmartSwitchKeyData(); } } @@ -433,18 +437,32 @@ void MainControlDialog::onCheckboxClicked(const HWND& hWnd) { } else if (hWnd == checkVietnamese) { val = (int)SendMessage(checkVietnamese, BM_GETCHECK, 0, 0); - APP_SET_DATA(vLanguage, val ? 1 : 0); - if (vUseSmartSwitchKey) { - setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1)); - saveSmartSwitchKeyData(); + if (val) { + APP_SET_DATA(vLanguage, 1); + if (vUseSmartSwitchKey) { + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); + saveSmartSwitchKeyData(); + } } } else if (hWnd == checkEnglish) { - val = (int)SendMessage(checkVietnamese, BM_GETCHECK, 0, 0); - APP_SET_DATA(vLanguage, val ? 1 : 0); - if (vUseSmartSwitchKey) { - setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1)); - saveSmartSwitchKeyData(); + val = (int)SendMessage(checkEnglish, BM_GETCHECK, 0, 0); + if (val) { + APP_SET_DATA(vLanguage, 0); + if (vUseSmartSwitchKey) { + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); + saveSmartSwitchKeyData(); + } + } + } + else if (hWnd == checkGerman) { + val = (int)SendMessage(checkGerman, BM_GETCHECK, 0, 0); + if (val) { + APP_SET_DATA(vLanguage, 2); + if (vUseSmartSwitchKey) { + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); + saveSmartSwitchKeyData(); + } } } else if (hWnd == checkModernOrthorgraphy) { diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.h b/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.h index 435d638f..4726051e 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.h +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/MainControlDialog.h @@ -20,7 +20,7 @@ class MainControlDialog : public BaseDialog { HWND comboBoxInputType; HWND comboBoxTableCode; HWND checkCtrl, checkAlt, checkWin, checkShift, textSwitchKey, checkBeep; - HWND checkVietnamese, checkEnglish; + HWND checkVietnamese, checkEnglish, checkGerman; HWND checkModernOrthorgraphy, checkFixRecommendBrowser, checkShowOnStartup, checkRunWithWindows, checkSpelling, checkRestoreIfWrongSpelling, checkUseClipboard, checkModernIcon, checkAllowZWJF, checkTempOffSpelling, checkQuickStartConsonant, checkQuickEndConsonant; diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp index faa179cc..ff7ff710 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp @@ -401,13 +401,15 @@ bool checkHotKey(int hotKeyData, bool checkKeyCode = true) { void switchLanguage() { if (vLanguage == 0) vLanguage = 1; + else if (vLanguage == 1) + vLanguage = 2; //German else vLanguage = 0; if (HAS_BEEP(vSwitchKeyStatus)) MessageBeep(MB_OK); AppDelegate::getInstance()->onInputMethodChangedFromHotKey(); if (vUseSmartSwitchKey) { - setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1)); + setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 2)); saveSmartSwitchKeyData(); } startNewSession(); @@ -454,6 +456,32 @@ static void handleMacro() { SendKeyCode(_keycode | (_flag & MASK_SHIFT ? CAPS_MASK : 0)); } +static void handleGermanKey() { + //fix autocomplete + if (vFixRecommendBrowser) { + SendEmptyCharacter(); + pData->backspaceCount++; + } + + //send backspace to remove the base letter + if (pData->backspaceCount > 0 && pData->backspaceCount < MAX_BUFF) { + for (_i = 0; _i < pData->backspaceCount; _i++) { + SendBackspace(); + } + } + + //send the umlaut character + if (!vSendKeyStepByStep) { + SendNewCharString(); + } else { + if (pData->newCharCount > 0 && pData->newCharCount <= MAX_BUFF) { + for (int i = pData->newCharCount - 1; i >= 0; i--) { + SendKeyCode(pData->charData[i]); + } + } + } +} + static bool SetModifierMask(const Uint16& vkCode) { // For caps lock case, toggling the flag isn't enough. We need to check the actual state, which should be done before each key press. // Example: the caps lock state can be changed without the key being pressed, or the key toggle is made with admin privilege, making the app not able to detect the change. @@ -577,6 +605,22 @@ LRESULT CALLBACK keyboardHookProcess(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } + //if is in german mode + if (vLanguage == 2) { + if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { + vGermanMode(vKeyEventState::KeyDown, + _keycode, + (_flag & MASK_SHIFT) || (_flag & MASK_CAPITAL), + OTHER_CONTROL_KEY); + + if (pData->code == vWillProcess) { //umlaut character + handleGermanKey(); + return -1; //consume event + } + } + return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); + } + //handle keyboard if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { //send event signal to Engine @@ -662,7 +706,11 @@ LRESULT CALLBACK mouseHookProcess(int nCode, WPARAM wParam, LPARAM lParam) { case WM_XBUTTONUP: case WM_NCXBUTTONUP: //send event signal to Engine - vKeyHandleEvent(vKeyEvent::Mouse, vKeyEventState::MouseDown, 0); + if (vLanguage == 2) { + vGermanMode(vKeyEventState::MouseDown, 0, false, false); + } else { + vKeyHandleEvent(vKeyEvent::Mouse, vKeyEventState::MouseDown, 0); + } if (IS_DOUBLE_CODE(vCodeTable)) { //VNI _syncKey.clear(); } @@ -677,18 +725,22 @@ VOID CALLBACK winEventProcCallback(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, H string& exe = OpenKeyHelper::getFrontMostAppExecuteName(); if (exe.compare("explorer.exe") == 0) //dont apply with windows explorer return; - _languageTemp = getAppInputMethodStatus(exe, vLanguage | (vCodeTable << 1)); + _languageTemp = getAppInputMethodStatus(exe, vLanguage | (vCodeTable << 2)); vTempOffEngine(false); - if (vUseSmartSwitchKey && (_languageTemp & 0x01) != vLanguage) { + if (_languageTemp != -1 && (_languageTemp & 0x03) == 3 && _languageTemp <= 9) { + //legacy data (old bit layout: 1-bit language + code table shifted 1) + _languageTemp = (_languageTemp & 0x01) | ((_languageTemp >> 1) << 2); + } + if (vUseSmartSwitchKey && (_languageTemp & 0x03) != vLanguage) { if (_languageTemp != -1) { - vLanguage = _languageTemp; + vLanguage = _languageTemp & 0x03; AppDelegate::getInstance()->onInputMethodChangedFromHotKey(); } else { saveSmartSwitchKeyData(); } } startNewSession(); - if (vRememberCode && (_languageTemp >> 1) != vCodeTable) { //for remember table code feature + if (vRememberCode && (_languageTemp >> 2) != vCodeTable) { //for remember table code feature if (_languageTemp != -1) { AppDelegate::getInstance()->onTableCode(_languageTemp >> 1); } else { diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.rc b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.rc index 25cab5ac..d24639c2 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.rc +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.rc @@ -42,6 +42,10 @@ IDI_ICON_STATUS_VIET_10 ICON "StatusViet10.ico" IDI_ICON_STATUS_ENG_10 ICON "StatusEng10.ico" +IDI_ICON_STATUS_GER ICON "StatusGer.ico" + +IDI_ICON_STATUS_GER_10 ICON "StatusGer10.ico" + IDI_ICON_OK_BUTTON ICON "OKButton.ico" IDI_ICON_EXIT_BUTTON ICON "ExitButton.ico" @@ -129,6 +133,7 @@ BEGIN LTEXT "Chế độ gõ:",IDC_STATIC,14,60,36,8 CONTROL "Tiếng Việt",IDC_RADIO_METHOD_VIETNAMESE,"Button",BS_AUTORADIOBUTTON,64,59,47,10 CONTROL "Tiếng Anh",IDC_RADIO_METHOD_ENGLISH,"Button",BS_AUTORADIOBUTTON,158,59,48,10 + CONTROL "Tiếng Đức",IDC_RADIO_METHOD_GERMAN,"Button",BS_AUTORADIOBUTTON,226,59,48,10 DEFPUSHBUTTON "Đóng",IDBUTTON_OK,200,234,71,20 PUSHBUTTON "Tắt OpenKey",IDBUTTON_EXIT,26,234,71,20 CONTROL "",IDC_TAB_CONTROL,"SysTabControl32",TCS_FIXEDWIDTH,7,89,283,140 @@ -448,6 +453,7 @@ BEGIN IDS_APP_TITLE "OpenKey" IDS_TRAY_TITLE "Bấm vào đây để bật gõ Tiếng Việt" IDS_TRAY_TITLE_2 "Bấm vào đây để tắt gõ Tiếng Việt" + IDS_TRAY_TITLE_3 "Đang gõ Tiếng Đức (ä ö ü ß)" IDS_STRING_CONVERT_COMPLETED "Chuyển mã thành công!\nKết quả đã được lưu trong Clipboard!" IDS_MAIN_DIALOG_TITLE "OpenKey %s - Bộ gõ Tiếng Việt" @@ -508,6 +514,7 @@ BEGIN IDS_STRING_BEEP "Kêu tiếng bíp mỗi khi chuyển chế độ gõ, không áp dụng với Loại trừ ứng dụng thông minh" IDS_STRING_VIET "Bật chế độ gõ Tiếng Việt" IDS_STRING_ENG "Bật chế độ gõ Tiếng Anh" + IDS_STRING_GER "Bật chế độ gõ Tiếng Đức: a+1=ä, o+1=ö, u+1=ü, s+1=ß" IDS_STRING_CODE "Chọn bảng mã cần gõ" IDS_STRING_INPUT "Chọn kiểu gõ quen thuộc của bạn" IDS_STRING_MACRO "Bật tính năng gõ tắt" diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj index 69b1e312..d5d637ce 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj @@ -1,5 +1,5 @@ - + Debug @@ -19,7 +19,7 @@ - 15.0 + 18.0 {21E71F9D-859A-4B8B-84F4-F5003E933BB3} Win32Proj OpenKey @@ -29,26 +29,26 @@ Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode @@ -210,6 +210,8 @@ + + diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj.filters b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj.filters index d23a8126..4dcbf909 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj.filters +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.vcxproj.filters @@ -153,6 +153,12 @@ Resource Files + + Resource Files + + + Resource Files + Resource Files diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/SystemTrayHelper.cpp b/Sources/OpenKey/win32/OpenKey/OpenKey/SystemTrayHelper.cpp index 55d786e9..e818d7fb 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/SystemTrayHelper.cpp +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/SystemTrayHelper.cpp @@ -22,6 +22,10 @@ redistribute your new version, it MUST be open source. #define POPUP_SMART_SWITCH 902 #define POPUP_USE_MACRO 903 +#define POPUP_LANG_VIET 904 +#define POPUP_LANG_ENG 905 +#define POPUP_LANG_GER 906 + #define POPUP_TELEX 910 #define POPUP_VNI 911 #define POPUP_SIMPLE_TELEX 912 @@ -49,11 +53,15 @@ redistribute your new version, it MUST be open source. static HMENU popupMenu; //static HMENU menuInputType; static HMENU otherCode; +static HMENU languageMenu; static NOTIFYICONDATA nid; map menuData = { {POPUP_VIET_ON_OFF, _T("Bật Tiếng Việt")}, + {POPUP_LANG_VIET, _T("Tiếng Việt")}, + {POPUP_LANG_ENG, _T("Tiếng Anh")}, + {POPUP_LANG_GER, _T("Tiếng Đức (ä ö ü ß)")}, {POPUP_SPELLING, _T("Bật kiểm tra chính tả")}, {POPUP_SMART_SWITCH, _T("Bật loại trừ ứng dụng thông minh")}, {POPUP_USE_MACRO, _T("Bật gõ tắt")}, @@ -80,7 +88,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_CREATE: taskbarCreated = RegisterWindowMessage(_T("TaskbarCreated")); break; - case WM_USER+2019: + case WM_USER+2019: AppDelegate::getInstance()->onControlPanel(); break; case WM_TRAYMESSAGE: { @@ -107,6 +115,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case POPUP_VIET_ON_OFF: AppDelegate::getInstance()->onToggleVietnamese(); break; + case POPUP_LANG_VIET: + AppDelegate::getInstance()->onSetLanguage(1); + break; + case POPUP_LANG_ENG: + AppDelegate::getInstance()->onSetLanguage(0); + break; + case POPUP_LANG_GER: + AppDelegate::getInstance()->onSetLanguage(2); + break; case POPUP_SPELLING: AppDelegate::getInstance()->onToggleCheckSpelling(); break; @@ -202,6 +219,13 @@ HWND SystemTrayHelper::createFakeWindow(const HINSTANCE & hIns) { void SystemTrayHelper::createPopupMenu() { popupMenu = CreatePopupMenu(); AppendMenu(popupMenu, MF_CHECKED, POPUP_VIET_ON_OFF, menuData[POPUP_VIET_ON_OFF]); + + languageMenu = CreatePopupMenu(); + AppendMenu(languageMenu, MF_CHECKED, POPUP_LANG_VIET, menuData[POPUP_LANG_VIET]); + AppendMenu(languageMenu, MF_CHECKED, POPUP_LANG_ENG, menuData[POPUP_LANG_ENG]); + AppendMenu(languageMenu, MF_CHECKED, POPUP_LANG_GER, menuData[POPUP_LANG_GER]); + AppendMenu(popupMenu, MF_POPUP, (UINT_PTR)languageMenu, _T("Ngôn ngữ")); + AppendMenu(popupMenu, MF_SEPARATOR, 0, 0); AppendMenu(popupMenu, MF_CHECKED, POPUP_SPELLING, menuData[POPUP_SPELLING]); AppendMenu(popupMenu, MF_CHECKED, POPUP_SMART_SWITCH, menuData[POPUP_SMART_SWITCH]); @@ -241,10 +265,14 @@ void SystemTrayHelper::createPopupMenu() { static void loadTrayIcon() { int icon = 0; - if (vLanguage) { + if (vLanguage == 1) { icon = vUseGrayIcon ? IDI_ICON_STATUS_VIET_10 : IDI_ICON_STATUS_VIET; LoadString(GetModuleHandle(0), IDS_TRAY_TITLE_2, nid.szTip, 128); } + else if (vLanguage == 2) { + icon = vUseGrayIcon ? IDI_ICON_STATUS_GER_10 : IDI_ICON_STATUS_GER; + LoadString(GetModuleHandle(0), IDS_TRAY_TITLE_3, nid.szTip, 128); + } else { icon = vUseGrayIcon ? IDI_ICON_STATUS_ENG_10 : IDI_ICON_STATUS_ENG; LoadString(GetModuleHandle(0), IDS_TRAY_TITLE, nid.szTip, 128); @@ -256,7 +284,10 @@ void SystemTrayHelper::updateData() { loadTrayIcon(); Shell_NotifyIcon(NIM_MODIFY, &nid); - MODIFY_MENU(popupMenu, POPUP_VIET_ON_OFF, vLanguage); + MODIFY_MENU(popupMenu, POPUP_VIET_ON_OFF, vLanguage == 1); + MODIFY_MENU(languageMenu, POPUP_LANG_VIET, vLanguage == 1); + MODIFY_MENU(languageMenu, POPUP_LANG_ENG, vLanguage == 0); + MODIFY_MENU(languageMenu, POPUP_LANG_GER, vLanguage == 2); MODIFY_MENU(popupMenu, POPUP_SPELLING, vCheckSpelling); MODIFY_MENU(popupMenu, POPUP_SMART_SWITCH, vUseSmartSwitchKey); MODIFY_MENU(popupMenu, POPUP_USE_MACRO, vUseMacro); diff --git a/Sources/OpenKey/win32/OpenKey/OpenKey/resource.h b/Sources/OpenKey/win32/OpenKey/OpenKey/resource.h index dc1f5b3e..b890be70 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKey/resource.h +++ b/Sources/OpenKey/win32/OpenKey/OpenKey/resource.h @@ -182,16 +182,21 @@ #define IDS_STRING_START_CONSONANT 1066 #define IDS_STRING_END_CONSONANT 1067 #define IDC_CHECK_OTHER_LANGUAGES 1068 +#define IDC_RADIO_METHOD_GERMAN 1069 +#define IDS_STRING_GER 1070 +#define IDS_TRAY_TITLE_3 1071 +#define IDI_ICON_STATUS_GER 153 +#define IDI_ICON_STATUS_GER_10 154 #define IDC_STATIC -1 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 149 +#define _APS_NEXT_RESOURCE_VALUE 157 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1052 +#define _APS_NEXT_CONTROL_VALUE 1072 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif diff --git a/Sources/OpenKey/win32/OpenKey/OpenKeyUpdate/OpenKeyUpdate.vcxproj b/Sources/OpenKey/win32/OpenKey/OpenKeyUpdate/OpenKeyUpdate.vcxproj index 4b97af97..4c9fd942 100644 --- a/Sources/OpenKey/win32/OpenKey/OpenKeyUpdate/OpenKeyUpdate.vcxproj +++ b/Sources/OpenKey/win32/OpenKey/OpenKeyUpdate/OpenKeyUpdate.vcxproj @@ -19,7 +19,7 @@ - 16.0 + 18.0 {A63EF692-7EAE-4EDA-8D2B-3686E1A15A19} Win32Proj OpenKeyUpdate @@ -29,26 +29,26 @@ Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode