From 5b60359aa2d80d08ed0aa1d28dd94cc6cc114aaf Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 8 Jan 2019 20:41:29 +1100 Subject: [PATCH] [Windows] Fix Caps Lock header support --- windows/src/engine/keyman32/appint/aiTIP.cpp | 20 ++- .../keyman32/appint/aiWin2000Unicode.cpp | 4 +- .../engine/keyman32/appint/aiWin2000Unicode.h | 3 - windows/src/engine/keyman32/capsstate.cpp | 17 +-- windows/src/engine/keyman32/keystate.cpp | 3 - windows/src/engine/kmtip/keys.cpp | 9 +- windows/src/engine/kmtip/kmkey.cpp | 7 +- .../manual-tests/caps_lock_headers/HISTORY.md | 6 + .../manual-tests/caps_lock_headers/LICENSE.md | 21 ++++ .../manual-tests/caps_lock_headers/README.md | 29 +++++ .../build/caps_lock_caps_always_off.kmx | Bin 0 -> 722 bytes .../build/caps_lock_caps_always_off.kvk | Bin 0 -> 1608 bytes .../build/caps_lock_caps_on_only.kmx | Bin 0 -> 734 bytes .../build/caps_lock_caps_on_only.kvk | Bin 0 -> 1614 bytes .../build/caps_lock_headers.kmp | Bin 0 -> 4904 bytes .../build/caps_lock_shift_frees_caps.kmp | Bin 0 -> 2787 bytes .../build/caps_lock_shift_frees_caps.kmx | Bin 0 -> 738 bytes .../build/caps_lock_shift_frees_caps.kvk | Bin 0 -> 1616 bytes .../caps_lock_headers.keyboard_info | 7 ++ .../caps_lock_headers/caps_lock_headers.kpj | 119 ++++++++++++++++++ .../source/caps_lock_caps_always_off.kmn | 18 +++ .../source/caps_lock_caps_always_off.kvks | 117 +++++++++++++++++ .../source/caps_lock_caps_on_only.kmn | 18 +++ .../source/caps_lock_caps_on_only.kvks | 117 +++++++++++++++++ .../source/caps_lock_headers.kps | 95 ++++++++++++++ .../source/caps_lock_shift_frees_caps.kmn | 17 +++ .../source/caps_lock_shift_frees_caps.kvks | 115 +++++++++++++++++ .../caps_lock_headers/source/readme.htm | 23 ++++ .../caps_lock_headers/source/welcome.htm | 27 ++++ 29 files changed, 760 insertions(+), 32 deletions(-) create mode 100644 windows/src/test/manual-tests/caps_lock_headers/HISTORY.md create mode 100644 windows/src/test/manual-tests/caps_lock_headers/LICENSE.md create mode 100644 windows/src/test/manual-tests/caps_lock_headers/README.md create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kmx create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kvk create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kmx create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kvk create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_headers.kmp create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_shift_frees_caps.kmp create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_shift_frees_caps.kmx create mode 100644 windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_shift_frees_caps.kvk create mode 100644 windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.keyboard_info create mode 100644 windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.kpj create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kmn create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kvks create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kmn create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kvks create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_headers.kps create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kmn create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kvks create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/readme.htm create mode 100644 windows/src/test/manual-tests/caps_lock_headers/source/welcome.htm diff --git a/windows/src/engine/keyman32/appint/aiTIP.cpp b/windows/src/engine/keyman32/appint/aiTIP.cpp index 7241ee9fdb..a3b6491ec3 100644 --- a/windows/src/engine/keyman32/appint/aiTIP.cpp +++ b/windows/src/engine/keyman32/appint/aiTIP.cpp @@ -100,14 +100,17 @@ void ProcessToggleChange(UINT key) { // I4793 switch(key) { case VK_CAPITAL: flag = CAPITALFLAG; break; case VK_NUMLOCK: flag = NUMLOCKFLAG; break; + default: return; } - if(*Globals::ShiftState() & flag) { - *Globals::ShiftState() &= ~flag; - } - else { + if (GetKeyState(key) & 1) { + SendDebugMessageFormat(0, sdmAIDefault, 0, "ProcessToggleChange: Setting %s", flag == CAPITALFLAG ? "CAPITALFLAG" : "NUMLOCKFLAG"); *Globals::ShiftState() |= flag; } + else { + SendDebugMessageFormat(0, sdmAIDefault, 0, "ProcessToggleChange: Clearing %s", flag == CAPITALFLAG ? "CAPITALFLAG" : "NUMLOCKFLAG"); + *Globals::ShiftState() &= ~flag; + } } extern "C" __declspec(dllexport) BOOL WINAPI TIPProcessKey(WPARAM wParam, LPARAM lParam, // I3589 // I3588 @@ -131,6 +134,11 @@ extern "C" __declspec(dllexport) BOOL WINAPI TIPProcessKey(WPARAM wParam, LPARAM } if(scan == SCAN_FLAG_KEYMAN_KEY_EVENT) { // I4370 + if (wParam == VK_CAPITAL && !isUp) { + // Must also record toggle state change when Keyman has generated + // a Caps Lock event + ProcessToggleChange((UINT)wParam); // I4793 + } SendDebugMessageFormat(0, sdmAIDefault, 0, "TIPProcessKey: Virtual Key was generated by Keyman [Scan=0xFF]"); return FALSE; } @@ -154,10 +162,10 @@ extern "C" __declspec(dllexport) BOOL WINAPI TIPProcessKey(WPARAM wParam, LPARAM switch(wParam) { case VK_CAPITAL: if(!isUp) ProcessToggleChange((UINT) wParam); // I4793 - KeyCapsLockPress(isUp); // I4548 + if(!Updateable) KeyCapsLockPress(isUp); // I4548 return FALSE; case VK_SHIFT: - KeyShiftPress(isUp); // I4548 + if (!Updateable) KeyShiftPress(isUp); // I4548 // Fall through case VK_MENU: case VK_CONTROL: diff --git a/windows/src/engine/keyman32/appint/aiWin2000Unicode.cpp b/windows/src/engine/keyman32/appint/aiWin2000Unicode.cpp index 52a3824d13..d91b3453d4 100644 --- a/windows/src/engine/keyman32/appint/aiWin2000Unicode.cpp +++ b/windows/src/engine/keyman32/appint/aiWin2000Unicode.cpp @@ -87,9 +87,7 @@ BOOL AIWin2000Unicode::IsWindowHandled(HWND ahwnd) BOOL AIWin2000Unicode::IsUnicode() { BOOL Result = IsWindowUnicode(hwnd); - - SendDebugMessageFormat(0, sdmAIDefault, 0, "IsWindowUnicode=%s WM_UNICHAR:%s", - Result ? "Yes" : "No", FUnicharOkay ? "Yes" : "No"); + SendDebugMessageFormat(0, sdmAIDefault, 0, "IsWindowUnicode=%s", Result ? "Yes" : "No"); return Result; } diff --git a/windows/src/engine/keyman32/appint/aiWin2000Unicode.h b/windows/src/engine/keyman32/appint/aiWin2000Unicode.h index 52c83d1501..3866137074 100644 --- a/windows/src/engine/keyman32/appint/aiWin2000Unicode.h +++ b/windows/src/engine/keyman32/appint/aiWin2000Unicode.h @@ -30,9 +30,6 @@ class AIWin2000Unicode:public AppIntegration { private: - BYTE kbstate[256]; - BOOL FUnicharOkay; - BOOL PostKeys(); diff --git a/windows/src/engine/keyman32/capsstate.cpp b/windows/src/engine/keyman32/capsstate.cpp index e4d6c75a1e..68461b446c 100644 --- a/windows/src/engine/keyman32/capsstate.cpp +++ b/windows/src/engine/keyman32/capsstate.cpp @@ -26,12 +26,6 @@ */ #include "pch.h" -static BYTE kbstate[256]; -extern BOOL FShouldIgnoreNextKey[256]; - -//extern "C" void FAR PASCAL keybd_event(void); - - void ResetCapsLock(void) { PKEYMAN64THREADDATA _td = ThreadGlobals(); @@ -63,7 +57,8 @@ void KeyCapsLockPress(BOOL FIsUp) // I3284 - void // I3529 if(_td->lpActiveKeyboard->Keyboard->dwFlags & KF_CAPSONONLY) { - if(FIsUp && !(GetKeyState(VK_CAPITAL) & 1)) // I267 - 24/11/2006 invert GetKeyState test + SendDebugMessageFormat(0, sdmAIDefault, 0, "KeyCapsLockPress: KF_CAPSONONLY: FIsUp=%d CapsState=%d", FIsUp, GetKeyState(VK_CAPITAL) & 1); + if(FIsUp && !(GetKeyState(VK_CAPITAL) & 1)) // I267 - 24/11/2006 invert GetKeyState test { keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, 0, 0); keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, KEYEVENTF_KEYUP, 0); @@ -71,7 +66,8 @@ void KeyCapsLockPress(BOOL FIsUp) // I3284 - void // I3529 } else if(_td->lpActiveKeyboard->Keyboard->dwFlags & KF_CAPSALWAYSOFF) { - if(!FIsUp && (GetKeyState(VK_CAPITAL) & 1)) + SendDebugMessageFormat(0, sdmAIDefault, 0, "KeyCapsLockPress: KF_CAPSALWAYSOFF: FIsUp=%d CapsState=%d", FIsUp, GetKeyState(VK_CAPITAL) & 1); + if(!FIsUp && (GetKeyState(VK_CAPITAL) & 1)) { // I267 - 24/11/2006 invert GetKeyState test keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, KEYEVENTF_KEYUP, 0); keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, 0, 0); @@ -86,11 +82,10 @@ void KeyShiftPress(BOOL FIsUp) // I3284 - void // I3529 if(!_td) return; if(!_td->lpActiveKeyboard) return; // pass through to window - if((GetKeyState(VK_CAPITAL) & 1) == 0) return; - if(_td->lpActiveKeyboard->Keyboard->dwFlags & KF_SHIFTFREESCAPS) { - if(!FIsUp) + SendDebugMessageFormat(0, sdmAIDefault, 0, "KeyShiftPress: KF_SHIFTFREESCAPS: FIsUp=%d CapsState=%d", FIsUp, GetKeyState(VK_CAPITAL) & 1); + if(!FIsUp && (GetKeyState(VK_CAPITAL) & 1)) { keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, 0, 0); keybd_event(VK_CAPITAL, SCAN_FLAG_KEYMAN_KEY_EVENT, KEYEVENTF_KEYUP, 0); diff --git a/windows/src/engine/keyman32/keystate.cpp b/windows/src/engine/keyman32/keystate.cpp index 1be9fe4658..eb66b2e70d 100644 --- a/windows/src/engine/keyman32/keystate.cpp +++ b/windows/src/engine/keyman32/keystate.cpp @@ -23,9 +23,6 @@ */ #include "pch.h" // I4551 -BYTE kbstate[256]; - - #define MAX_RSHIFT 24 #define MAX_KSHIFT 18 diff --git a/windows/src/engine/kmtip/keys.cpp b/windows/src/engine/kmtip/keys.cpp index de4732a14e..d66e4d65c8 100644 --- a/windows/src/engine/kmtip/keys.cpp +++ b/windows/src/engine/kmtip/keys.cpp @@ -174,7 +174,8 @@ STDAPI CKMTipTextService::OnTestKeyDown(ITfContext *pContext, WPARAM wParam, LPA { LogKey("CKMTipTextService::OnTestKeyDown", 0, wParam, lParam); // If the keystroke is a Keyman-generated key, ignore it - if((lParam & 0x00FF0000L) == 0xFF0000L) // I3566 + if((lParam & 0x00FF0000L) == 0xFF0000L && + wParam != VK_CAPITAL) // I3566 *pfEaten = FALSE; else *pfEaten = _KeymanProcessKeystroke(pContext, wParam, lParam, FALSE, FALSE); // I3588 @@ -208,7 +209,8 @@ STDAPI CKMTipTextService::OnKeyDown(ITfContext *pContext, WPARAM wParam, LPARAM STDAPI CKMTipTextService::OnTestKeyUp(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { LogKey("CKMTipTextService::OnTestKeyUp", 2, wParam, lParam); - if((lParam & 0x00FF0000L) == 0xFF0000L) // I3566 + if((lParam & 0x00FF0000L) == 0xFF0000L && + wParam != VK_CAPITAL) // I3566 *pfEaten = FALSE; else { @@ -230,7 +232,8 @@ STDAPI CKMTipTextService::OnTestKeyUp(ITfContext *pContext, WPARAM wParam, LPARA STDAPI CKMTipTextService::OnKeyUp(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { LogKey("CKMTipTextService::OnKeyUp", 3, wParam, lParam); - if((lParam & 0x00FF0000L) == 0xFF0000L) // I3566 // I3605 + if((lParam & 0x00FF0000L) == 0xFF0000L && + wParam != VK_CAPITAL) // I3566 // I3605 *pfEaten = FALSE; else { diff --git a/windows/src/engine/kmtip/kmkey.cpp b/windows/src/engine/kmtip/kmkey.cpp index 275d02faf8..40ace7a5b7 100644 --- a/windows/src/engine/kmtip/kmkey.cpp +++ b/windows/src/engine/kmtip/kmkey.cpp @@ -117,7 +117,8 @@ BOOL CKMTipTextService::_KeymanProcessKeystroke(ITfContext *pContext, WPARAM wPa Log(L"_KeymanProcessKeystroke (%x %x %s %s ex=%x)", wParam, lParam, fUpdate?L"update":L"", fPreserved?L"preserved":L"", GetMessageExtraInfo()); // I4378 // Don't process keystrokes generated by Keyman (scan code = 0xFF) - if ((lParam & 0xFF0000) == 0xFF0000) { + if ((lParam & 0xFF0000) == 0xFF0000 && + wParam != VK_CAPITAL) { return FALSE; // I4378 } @@ -200,8 +201,8 @@ STDAPI CKeymanEditSession::DoEditSession(TfEditCookie ec) else { if (!(*pTIPProcessKey)(_wParam, _lParam, ExtKeymanProcessOutput, ExtKeymanGetContext, _fUpdate, _fPreserved)) { - SendDebugMessage(L"DoEditSession: TIPProcessKey failed"); - _hr = E_FAIL; + SendDebugMessage(L"DoEditSession: TIPProcessKey did not handle the keystroke"); + _hr = E_FAIL; // TODO: use S_FALSE -> this tells _KeymanProcessKeystroke to pass keystroke on } } ExtEditSession = NULL; diff --git a/windows/src/test/manual-tests/caps_lock_headers/HISTORY.md b/windows/src/test/manual-tests/caps_lock_headers/HISTORY.md new file mode 100644 index 0000000000..f2b6acd03b --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/HISTORY.md @@ -0,0 +1,6 @@ +caps_lock_shift_frees_caps Change History +==================== + +1.0 (2019-01-07) +---------------- +* Created by diff --git a/windows/src/test/manual-tests/caps_lock_headers/LICENSE.md b/windows/src/test/manual-tests/caps_lock_headers/LICENSE.md new file mode 100644 index 0000000000..714cb32594 --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +© + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/windows/src/test/manual-tests/caps_lock_headers/README.md b/windows/src/test/manual-tests/caps_lock_headers/README.md new file mode 100644 index 0000000000..bc3b3b42ea --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/README.md @@ -0,0 +1,29 @@ +caps_lock_shift_frees_caps keyboard +============== + +© + +Version 1.0 + +Description +----------- + +caps_lock_shift_frees_caps generated from template + +Links +----- + +Supported Platforms +------------------- + * Windows + * macOS + * Linux + * Web + * iPhone + * iPad + * Android phone + * Android tablet + * Mobile devices + * Desktop devices + * Tablet devices + diff --git a/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kmx b/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kmx new file mode 100644 index 0000000000000000000000000000000000000000..793c77615f0337c684d9fd58480d5431de907519 GIT binary patch literal 722 zcmaKpyGjF55QhJV;0+{&x6(p_g@&wFT6swmViya$5Tar*X2Y&*@D;>I5Gxx�SvM zI*4zgg{^*b_ACi14$L{<{AXv*%%1AOeod27zyJI$EN2Tgg&S|-(<9Os1`2fc=3&;y zFYI%kmr0!WyaJDV-h{_Im*K2d1TT607A|as^@7DtN72;Db<0u@!l1Ff?gmAK1%xSBZ6&YINkQlsuF zH+2dPG^<;8)!XzU-Er$0xq&vInkw33uke-iAFHdluULne&T2Y1*+ z|KD4rs|2@d=6_GgkqX(fz@vB$-^QH*3Fnu1rsa2}E8^=RO=vg74?|j>gh%36Jnh_G c$tGN7HH&$(mX1*~#pdd{zmh3GGk@oN1Ccgco&W#< literal 0 HcmV?d00001 diff --git a/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kvk b/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_always_off.kvk new file mode 100644 index 0000000000000000000000000000000000000000..06fe5344c11f5a8cd059e3c5bcf0c94b44047c27 GIT binary patch literal 1608 zcmZwF$5vBe7=__48MwFurdCue^rl#7p@d!np^Dfdkw8Kb6fR5!y$^+f*Wf(vO_uA; zz<=#-fBSc`lVq)i=ht`J+YXFd)i^h{3_Bd2Hb(w}m< zToY0L|Je=Qk&O7E@j{1QVv|NwMP{=`Gi(uCV5`^)+r&25F1EuCu>*FBov=&nf{kJ$ zJQW|nui_IpCGNm^@c<5pui>;XYz4ZBW8haI)!x}j_Ar|1IxD9`bOYmG= zfxpCM*b_CEfAE2}TGXemb7@9*mSDg53Z}$2a8P^;hs1YqM0^j^;wBswosE}1_KU{j zip&d*+wiwowf{x&h^q_YN7yGiH!r;^qp@F+*{ksqj*DAxO#A@9iTB}|_z-><8{pMQ z{6pe0^b_dNuR(|Y96IzH(4pUi4*eE%=&R77*FlF~4;}g)=+N&%hrR|K`aS5-r=UZh zhYo!JI`nDi&}X4T&q9Yj2Oat_bm$Y%p-)1G{s}ttW9ZO7Lx)~clQ~tpTOE2L9Qq7* zI`n?%&{NQ%4?>4N1ReSabm(d5&_|&|e*_)+b?DHm_V3Uax$4jtphNG24m|@MdM|Y7 Yt<8 literal 0 HcmV?d00001 diff --git a/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kmx b/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kmx new file mode 100644 index 0000000000000000000000000000000000000000..3ec75e634b4905d458f9b1135ad5319573979fb3 GIT binary patch literal 734 zcma)(Jxc>Y5Qg6bLD43KUswr>SZK(_N-ICogxJNxPC`@+YA)P`oN4_LlAjP$T8fqU zA8f>*qCRuCXAZS+j@fzk-QC%l+uHF_UDMLat3MQ$vjLmIjd$^-y!45Iny>+TM>CsC zf?kO8j@LQ3;CKU`a=ZgiIK+gr;p$@#}DwL<7b#MWBY(-9p_1Mpg?D8sLOb& zWkqVi7f=nQuWQ!Y%qq-!_?3Khhyj|-1BIOM<2{}{6;;ALZ4r%1+-084Cf3unCiy$$ zIEgbibqS5N25Q8Pe!RoiIiGaT-DNU(+J@??>X2Ba2J0dqT0coumci~zDzWa`^y!l| zL?7Q|ef{V5A{F*<%W3|1$1JIwJ`rp$pTqa?*nnHs@9`MdY!;B`h5%b54R^Y%B j^EW)H-(Jl6++;KhdA}Bas{5^2cTxOr(mg*<{yy^sNkm+C literal 0 HcmV?d00001 diff --git a/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kvk b/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_caps_on_only.kvk new file mode 100644 index 0000000000000000000000000000000000000000..0e1ea70914f64849c99891141df891680d8f6ec9 GIT binary patch literal 1614 zcmZwF*HTka7>40LIdHfJj>Ljp=|xneg%WxRMJWLlBWN%|BPv`N*zQB&z-#b4eqS=o zn*&y6{>iiU+L@i%Z#t7s#ifX3eQZTG_M#Z;u^V}5N8i}XYPX~l2bB}~c%@J1&b}x_ zPW!vkzjC=;7g4@=cS|Rd5x+Dx^wmpj)@ZKEY|&_etzs)|6Wd_B*bY0y4%jJn!Y;83 zc8lGxNo<1O#e48Xd<0}WOiZ5VF^qcq6`x@5RuF4$Icn!zIH!v;kz;V&p zcI7yc0M z!=K^(HU! zfew8JI`l>8(1)NypM?&69y;`8=+GCSLm!0>eF{4CY3R_uK!<(^9r{=3(2Hs^r)u|W zLr;W5pW~!MAA}A)1s(b@bm$|{p^rg_o`w#696I!e(4k*}4!!329r_Aa9r_Y<=mXH9 eXP`sxhYo!bI`j$X&>umE{scPoURV=)GQfZH9A%9F literal 0 HcmV?d00001 diff --git a/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_headers.kmp b/windows/src/test/manual-tests/caps_lock_headers/build/caps_lock_headers.kmp new file mode 100644 index 0000000000000000000000000000000000000000..a74095c4280ad7a993ebbb7c9e1ebb879538de59 GIT binary patch literal 4904 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 aI`nbq(8r)d?}84!8#?souq5=d0RI7YZDsQS literal 0 HcmV?d00001 diff --git a/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.keyboard_info b/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.keyboard_info new file mode 100644 index 0000000000..75346d748f --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.keyboard_info @@ -0,0 +1,7 @@ +{ + "license": "mit", + "languages": [ + + ], + "description": "caps_lock_shift_frees_caps generated from template" +} diff --git a/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.kpj b/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.kpj new file mode 100644 index 0000000000..1bef06328b --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/caps_lock_headers.kpj @@ -0,0 +1,119 @@ + + + + $PROJECTPATH\build + True + True + + + + id_fb55c4befba94fb9e7468d5126e5ed10 + caps_lock_shift_frees_caps.kmn + source\caps_lock_shift_frees_caps.kmn + 1.0 + .kmn +
+ caps_lock_shift_frees_caps + © 2019 SIL International +
+
+ + id_bae62fccce40fcec206e0258206bd18c + caps_lock_caps_always_off.kmn + source\caps_lock_caps_always_off.kmn + 1.0 + .kmn +
+ caps_lock_caps_on_only + © 2019 SIL International +
+
+ + id_7fff108dc6e58551d8bd46f89477c870 + caps_lock_caps_on_only.kmn + source\caps_lock_caps_on_only.kmn + 1.0 + .kmn +
+ caps_lock_caps_always_off + © 2019 SIL International +
+
+ + id_b84bf1d230e3916202970f55640a5eea + caps_lock_headers.kps + source\caps_lock_headers.kps + 1.0 + .kps +
+ caps_lock_shift_frees_caps + © + 1.0 +
+
+ + id_cd9d739b26ce5dd73af0540ad4365954 + caps_lock_shift_frees_caps.kmx + source\..\build\caps_lock_shift_frees_caps.kmx + + .kmx + id_b84bf1d230e3916202970f55640a5eea + + + id_a5299cc81250ba8131c83b259bb365f8 + caps_lock_shift_frees_caps.kvk + source\..\build\caps_lock_shift_frees_caps.kvk + + .kvk + id_b84bf1d230e3916202970f55640a5eea + + + id_356e5d149c1e539356d72698c1e401a6 + welcome.htm + source\welcome.htm + + .htm + id_b84bf1d230e3916202970f55640a5eea + + + id_8da344c4cea6f467013357fe099006f5 + readme.htm + source\readme.htm + + .htm + id_b84bf1d230e3916202970f55640a5eea + + + id_0e43bd214d366e11a424144a99978808 + caps_lock_caps_on_only.kvk + source\..\build\caps_lock_caps_on_only.kvk + + .kvk + id_b84bf1d230e3916202970f55640a5eea + + + id_55c8833c53e3295cd9424a114280a63b + caps_lock_caps_always_off.kmx + source\..\build\caps_lock_caps_always_off.kmx + + .kmx + id_b84bf1d230e3916202970f55640a5eea + + + id_141ea53b18baa35cf62ededea4321523 + caps_lock_caps_always_off.kvk + source\..\build\caps_lock_caps_always_off.kvk + + .kvk + id_b84bf1d230e3916202970f55640a5eea + + + id_7b23e6d989803a371ca8e77bc862d26f + caps_lock_caps_on_only.kmx + source\..\build\caps_lock_caps_on_only.kmx + + .kmx + id_b84bf1d230e3916202970f55640a5eea + +
+
diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kmn b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kmn new file mode 100644 index 0000000000..278300b8e2 --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kmn @@ -0,0 +1,18 @@ +c caps_lock_caps_on_only generated from template at 2019-01-07 14:12:26 + +store(&VERSION) '10.0' +store(&NAME) 'caps_lock_caps_on_only' +store(©RIGHT) '© 2019 SIL International' +store(&KEYBOARDVERSION) '1.0' +store(&TARGETS) 'windows' +store(&VISUALKEYBOARD) 'caps_lock_caps_on_only.kvks' +store(&CAPSONONLY) '1' + +begin Unicode > use(main) + +group(main) using keys + ++ [NCAPS K_A] > 'lower-a' ++ [CAPS K_A] > 'capital-a' ++ [NCAPS SHIFT K_A] > 'shift-a' ++ [CAPS SHIFT K_A] > 'capital-shift-a' diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kvks b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kvks new file mode 100644 index 0000000000..981d5d664a --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_always_off.kvks @@ -0,0 +1,117 @@ + + +
+ 10.0 + caps_lock_caps_always_off + + + +
+ + + ` + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + - + = + q + w + e + r + t + y + u + i + o + p + [ + ] + \ + lower-a + s + d + f + g + h + j + k + l + ; + ' + \ + z + x + c + v + b + n + m + , + . + / + + + + ~ + ! + @ + # + $ + % + ^ + & + * + ( + ) + _ + + + Q + W + E + R + T + Y + U + I + O + P + { + } + | + shift-a + S + D + F + G + H + J + K + L + : + " + | + Z + X + C + V + B + N + M + < + > + ? + + + + + + +
diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kmn b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kmn new file mode 100644 index 0000000000..384300f06a --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kmn @@ -0,0 +1,18 @@ +c caps_lock_caps_always_off generated from template at 2019-01-07 14:12:26 + +store(&VERSION) '10.0' +store(&NAME) 'caps_lock_caps_always_off' +store(©RIGHT) '© 2019 SIL International' +store(&KEYBOARDVERSION) '1.0' +store(&TARGETS) 'windows' +store(&VISUALKEYBOARD) 'caps_lock_caps_always_off.kvks' +store(&CAPSALWAYSOFF) '1' + +begin Unicode > use(main) + +group(main) using keys + ++ [NCAPS K_A] > 'lower-a' ++ [CAPS K_A] > 'capital-a' ++ [NCAPS SHIFT K_A] > 'shift-a' ++ [CAPS SHIFT K_A] > 'capital-shift-a' diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kvks b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kvks new file mode 100644 index 0000000000..c5c54455cf --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_caps_on_only.kvks @@ -0,0 +1,117 @@ + + +
+ 10.0 + caps_lock_caps_always_off + + + +
+ + + ` + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + - + = + q + w + e + r + t + y + u + i + o + p + [ + ] + \ + lower-a + s + d + f + g + h + j + k + l + ; + ' + \ + z + x + c + v + b + n + m + , + . + / + + + + ~ + ! + @ + # + $ + % + ^ + & + * + ( + ) + _ + + + Q + W + E + R + T + Y + U + I + O + P + { + } + | + shift-a + S + D + F + G + H + J + K + L + : + " + | + Z + X + C + V + B + N + M + < + > + ? + + + + + + +
diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_headers.kps b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_headers.kps new file mode 100644 index 0000000000..4e74dfe003 --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_headers.kps @@ -0,0 +1,95 @@ + + + + 11.0.1300.0 + 7.0 + + + + readme.htm + + + + + + + + + + caps_lock_shift_frees_caps + © + + 1.0 + + + + ..\build\caps_lock_shift_frees_caps.kmx + + 0 + .kmx + + + ..\build\caps_lock_shift_frees_caps.kvk + + 0 + .kvk + + + welcome.htm + + 0 + .htm + + + readme.htm + + 0 + .htm + + + ..\build\caps_lock_caps_on_only.kvk + File caps_lock_caps_on_only.kvk + 0 + .kvk + + + ..\build\caps_lock_caps_always_off.kmx + Keyboard caps_lock_caps_on_only + 0 + .kmx + + + ..\build\caps_lock_caps_always_off.kvk + File caps_lock_caps_always_off.kvk + 0 + .kvk + + + ..\build\caps_lock_caps_on_only.kmx + Keyboard caps_lock_caps_always_off + 0 + .kmx + + + + + caps_lock_shift_frees_caps + caps_lock_shift_frees_caps + 1.0 + + + + caps_lock_caps_on_only + caps_lock_caps_always_off + 1.0 + + + + caps_lock_caps_always_off + caps_lock_caps_on_only + 1.0 + + + + + diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kmn b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kmn new file mode 100644 index 0000000000..515921b9bd --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kmn @@ -0,0 +1,17 @@ +c caps_lock_shift_frees_caps generated from template at 2019-01-07 14:12:26 +store(&VERSION) '10.0' +store(&NAME) 'caps_lock_shift_frees_caps' +store(©RIGHT) '© 2019 SIL International' +store(&KEYBOARDVERSION) '1.0' +store(&TARGETS) 'windows' +store(&VISUALKEYBOARD) 'caps_lock_shift_frees_caps.kvks' +store(&SHIFTFREESCAPS) '1' + +begin Unicode > use(main) + +group(main) using keys + ++ [NCAPS K_A] > 'lower-a' ++ [CAPS K_A] > 'capital-a' ++ [NCAPS SHIFT K_A] > 'shift-a' ++ [CAPS SHIFT K_A] > 'capital-shift-a' diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kvks b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kvks new file mode 100644 index 0000000000..db31de4b42 --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/caps_lock_shift_frees_caps.kvks @@ -0,0 +1,115 @@ + + +
+ 10.0 + caps_lock_shift_frees_caps + +
+ + + ` + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + - + = + q + w + e + r + t + y + u + i + o + p + [ + ] + \ + lower-a + s + d + f + g + h + j + k + l + ; + ' + \ + z + x + c + v + b + n + m + , + . + / + + + + ~ + ! + @ + # + $ + % + ^ + & + * + ( + ) + _ + + + Q + W + E + R + T + Y + U + I + O + P + { + } + | + shift-a + S + D + F + G + H + J + K + L + : + " + | + Z + X + C + V + B + N + M + < + > + ? + + + + + + +
diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/readme.htm b/windows/src/test/manual-tests/caps_lock_headers/source/readme.htm new file mode 100644 index 0000000000..3e2679017c --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/readme.htm @@ -0,0 +1,23 @@ + + + + + caps_lock_shift_frees_caps + + + + +

caps_lock_shift_frees_caps

+ +

+ caps_lock_shift_frees_caps 1.0 generated from template. +

+ +

©

+ + + diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/welcome.htm b/windows/src/test/manual-tests/caps_lock_headers/source/welcome.htm new file mode 100644 index 0000000000..5155c2ff91 --- /dev/null +++ b/windows/src/test/manual-tests/caps_lock_headers/source/welcome.htm @@ -0,0 +1,27 @@ + + + + + Start Using caps_lock_shift_frees_caps + + + + +

Start Using caps_lock_shift_frees_caps

+ +

+ caps_lock_shift_frees_caps 1.0 generated from template. +

+ +

Keyboard Layout

+ + + +

©

+ + + \ No newline at end of file