[Windows] Fix Caps Lock header support

This commit is contained in:
Marc Durdin 2019-01-08 20:41:29 +11:00
parent 988a0917cb
commit 5b60359aa2
29 changed files with 760 additions and 32 deletions

View file

@ -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:

View file

@ -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;
}

View file

@ -30,9 +30,6 @@ class AIWin2000Unicode:public AppIntegration
{
private:
BYTE kbstate[256];
BOOL FUnicharOkay;
BOOL PostKeys();

View file

@ -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);

View file

@ -23,9 +23,6 @@
*/
#include "pch.h" // I4551
BYTE kbstate[256];
#define MAX_RSHIFT 24
#define MAX_KSHIFT 18

View file

@ -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
{

View file

@ -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;

View file

@ -0,0 +1,6 @@
caps_lock_shift_frees_caps Change History
====================
1.0 (2019-01-07)
----------------
* Created by

View file

@ -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.

View file

@ -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

View file

@ -0,0 +1,7 @@
{
"license": "mit",
"languages": [
],
"description": "caps_lock_shift_frees_caps generated from template"
}

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<KeymanDeveloperProject>
<Options>
<BuildPath>$PROJECTPATH\build</BuildPath>
<CompilerWarningsAsErrors>True</CompilerWarningsAsErrors>
<WarnDeprecatedCode>True</WarnDeprecatedCode>
</Options>
<Files>
<File>
<ID>id_fb55c4befba94fb9e7468d5126e5ed10</ID>
<Filename>caps_lock_shift_frees_caps.kmn</Filename>
<Filepath>source\caps_lock_shift_frees_caps.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
<Details>
<Name>caps_lock_shift_frees_caps</Name>
<Copyright>© 2019 SIL International</Copyright>
</Details>
</File>
<File>
<ID>id_bae62fccce40fcec206e0258206bd18c</ID>
<Filename>caps_lock_caps_always_off.kmn</Filename>
<Filepath>source\caps_lock_caps_always_off.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
<Details>
<Name>caps_lock_caps_on_only</Name>
<Copyright>© 2019 SIL International</Copyright>
</Details>
</File>
<File>
<ID>id_7fff108dc6e58551d8bd46f89477c870</ID>
<Filename>caps_lock_caps_on_only.kmn</Filename>
<Filepath>source\caps_lock_caps_on_only.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
<Details>
<Name>caps_lock_caps_always_off</Name>
<Copyright>© 2019 SIL International</Copyright>
</Details>
</File>
<File>
<ID>id_b84bf1d230e3916202970f55640a5eea</ID>
<Filename>caps_lock_headers.kps</Filename>
<Filepath>source\caps_lock_headers.kps</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kps</FileType>
<Details>
<Name>caps_lock_shift_frees_caps</Name>
<Copyright>©</Copyright>
<Version>1.0</Version>
</Details>
</File>
<File>
<ID>id_cd9d739b26ce5dd73af0540ad4365954</ID>
<Filename>caps_lock_shift_frees_caps.kmx</Filename>
<Filepath>source\..\build\caps_lock_shift_frees_caps.kmx</Filepath>
<FileVersion></FileVersion>
<FileType>.kmx</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_a5299cc81250ba8131c83b259bb365f8</ID>
<Filename>caps_lock_shift_frees_caps.kvk</Filename>
<Filepath>source\..\build\caps_lock_shift_frees_caps.kvk</Filepath>
<FileVersion></FileVersion>
<FileType>.kvk</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_356e5d149c1e539356d72698c1e401a6</ID>
<Filename>welcome.htm</Filename>
<Filepath>source\welcome.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_8da344c4cea6f467013357fe099006f5</ID>
<Filename>readme.htm</Filename>
<Filepath>source\readme.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_0e43bd214d366e11a424144a99978808</ID>
<Filename>caps_lock_caps_on_only.kvk</Filename>
<Filepath>source\..\build\caps_lock_caps_on_only.kvk</Filepath>
<FileVersion></FileVersion>
<FileType>.kvk</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_55c8833c53e3295cd9424a114280a63b</ID>
<Filename>caps_lock_caps_always_off.kmx</Filename>
<Filepath>source\..\build\caps_lock_caps_always_off.kmx</Filepath>
<FileVersion></FileVersion>
<FileType>.kmx</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_141ea53b18baa35cf62ededea4321523</ID>
<Filename>caps_lock_caps_always_off.kvk</Filename>
<Filepath>source\..\build\caps_lock_caps_always_off.kvk</Filepath>
<FileVersion></FileVersion>
<FileType>.kvk</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
<File>
<ID>id_7b23e6d989803a371ca8e77bc862d26f</ID>
<Filename>caps_lock_caps_on_only.kmx</Filename>
<Filepath>source\..\build\caps_lock_caps_on_only.kmx</Filepath>
<FileVersion></FileVersion>
<FileType>.kmx</FileType>
<ParentFileID>id_b84bf1d230e3916202970f55640a5eea</ParentFileID>
</File>
</Files>
</KeymanDeveloperProject>

View file

@ -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(&COPYRIGHT) '© 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'

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<visualkeyboard>
<header>
<version>10.0</version>
<kbdname>caps_lock_caps_always_off</kbdname>
<flags>
<displayunderlying/>
</flags>
</header>
<encoding name="unicode" fontname="Arial" fontsize="-12">
<layer shift="">
<key vkey="K_BKQUOTE">`</key>
<key vkey="K_1">1</key>
<key vkey="K_2">2</key>
<key vkey="K_3">3</key>
<key vkey="K_4">4</key>
<key vkey="K_5">5</key>
<key vkey="K_6">6</key>
<key vkey="K_7">7</key>
<key vkey="K_8">8</key>
<key vkey="K_9">9</key>
<key vkey="K_0">0</key>
<key vkey="K_HYPHEN">-</key>
<key vkey="K_EQUAL">=</key>
<key vkey="K_Q">q</key>
<key vkey="K_W">w</key>
<key vkey="K_E">e</key>
<key vkey="K_R">r</key>
<key vkey="K_T">t</key>
<key vkey="K_Y">y</key>
<key vkey="K_U">u</key>
<key vkey="K_I">i</key>
<key vkey="K_O">o</key>
<key vkey="K_P">p</key>
<key vkey="K_LBRKT">[</key>
<key vkey="K_RBRKT">]</key>
<key vkey="K_BKSLASH">\</key>
<key vkey="K_A">lower-a</key>
<key vkey="K_S">s</key>
<key vkey="K_D">d</key>
<key vkey="K_F">f</key>
<key vkey="K_G">g</key>
<key vkey="K_H">h</key>
<key vkey="K_J">j</key>
<key vkey="K_K">k</key>
<key vkey="K_L">l</key>
<key vkey="K_COLON">;</key>
<key vkey="K_QUOTE">'</key>
<key vkey="K_oE2">\</key>
<key vkey="K_Z">z</key>
<key vkey="K_X">x</key>
<key vkey="K_C">c</key>
<key vkey="K_V">v</key>
<key vkey="K_B">b</key>
<key vkey="K_N">n</key>
<key vkey="K_M">m</key>
<key vkey="K_COMMA">,</key>
<key vkey="K_PERIOD">.</key>
<key vkey="K_SLASH">/</key>
<key vkey="K_SPACE"></key>
</layer>
<layer shift="S">
<key vkey="K_BKQUOTE">~</key>
<key vkey="K_1">!</key>
<key vkey="K_2">@</key>
<key vkey="K_3">#</key>
<key vkey="K_4">$</key>
<key vkey="K_5">%</key>
<key vkey="K_6">^</key>
<key vkey="K_7">&amp;</key>
<key vkey="K_8">*</key>
<key vkey="K_9">(</key>
<key vkey="K_0">)</key>
<key vkey="K_HYPHEN">_</key>
<key vkey="K_EQUAL">+</key>
<key vkey="K_Q">Q</key>
<key vkey="K_W">W</key>
<key vkey="K_E">E</key>
<key vkey="K_R">R</key>
<key vkey="K_T">T</key>
<key vkey="K_Y">Y</key>
<key vkey="K_U">U</key>
<key vkey="K_I">I</key>
<key vkey="K_O">O</key>
<key vkey="K_P">P</key>
<key vkey="K_LBRKT">{</key>
<key vkey="K_RBRKT">}</key>
<key vkey="K_BKSLASH">|</key>
<key vkey="K_A">shift-a</key>
<key vkey="K_S">S</key>
<key vkey="K_D">D</key>
<key vkey="K_F">F</key>
<key vkey="K_G">G</key>
<key vkey="K_H">H</key>
<key vkey="K_J">J</key>
<key vkey="K_K">K</key>
<key vkey="K_L">L</key>
<key vkey="K_COLON">:</key>
<key vkey="K_QUOTE">"</key>
<key vkey="K_oE2">|</key>
<key vkey="K_Z">Z</key>
<key vkey="K_X">X</key>
<key vkey="K_C">C</key>
<key vkey="K_V">V</key>
<key vkey="K_B">B</key>
<key vkey="K_N">N</key>
<key vkey="K_M">M</key>
<key vkey="K_COMMA">&lt;</key>
<key vkey="K_PERIOD">&gt;</key>
<key vkey="K_SLASH">?</key>
<key vkey="K_SPACE"></key>
</layer>
<layer shift="C">
<key vkey="K_SPACE"></key>
</layer>
</encoding>
</visualkeyboard>

View file

@ -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(&COPYRIGHT) '© 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'

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<visualkeyboard>
<header>
<version>10.0</version>
<kbdname>caps_lock_caps_always_off</kbdname>
<flags>
<displayunderlying/>
</flags>
</header>
<encoding name="unicode" fontname="Arial" fontsize="-12">
<layer shift="">
<key vkey="K_BKQUOTE">`</key>
<key vkey="K_1">1</key>
<key vkey="K_2">2</key>
<key vkey="K_3">3</key>
<key vkey="K_4">4</key>
<key vkey="K_5">5</key>
<key vkey="K_6">6</key>
<key vkey="K_7">7</key>
<key vkey="K_8">8</key>
<key vkey="K_9">9</key>
<key vkey="K_0">0</key>
<key vkey="K_HYPHEN">-</key>
<key vkey="K_EQUAL">=</key>
<key vkey="K_Q">q</key>
<key vkey="K_W">w</key>
<key vkey="K_E">e</key>
<key vkey="K_R">r</key>
<key vkey="K_T">t</key>
<key vkey="K_Y">y</key>
<key vkey="K_U">u</key>
<key vkey="K_I">i</key>
<key vkey="K_O">o</key>
<key vkey="K_P">p</key>
<key vkey="K_LBRKT">[</key>
<key vkey="K_RBRKT">]</key>
<key vkey="K_BKSLASH">\</key>
<key vkey="K_A">lower-a</key>
<key vkey="K_S">s</key>
<key vkey="K_D">d</key>
<key vkey="K_F">f</key>
<key vkey="K_G">g</key>
<key vkey="K_H">h</key>
<key vkey="K_J">j</key>
<key vkey="K_K">k</key>
<key vkey="K_L">l</key>
<key vkey="K_COLON">;</key>
<key vkey="K_QUOTE">'</key>
<key vkey="K_oE2">\</key>
<key vkey="K_Z">z</key>
<key vkey="K_X">x</key>
<key vkey="K_C">c</key>
<key vkey="K_V">v</key>
<key vkey="K_B">b</key>
<key vkey="K_N">n</key>
<key vkey="K_M">m</key>
<key vkey="K_COMMA">,</key>
<key vkey="K_PERIOD">.</key>
<key vkey="K_SLASH">/</key>
<key vkey="K_SPACE"> </key>
</layer>
<layer shift="S">
<key vkey="K_BKQUOTE">~</key>
<key vkey="K_1">!</key>
<key vkey="K_2">@</key>
<key vkey="K_3">#</key>
<key vkey="K_4">$</key>
<key vkey="K_5">%</key>
<key vkey="K_6">^</key>
<key vkey="K_7">&amp;</key>
<key vkey="K_8">*</key>
<key vkey="K_9">(</key>
<key vkey="K_0">)</key>
<key vkey="K_HYPHEN">_</key>
<key vkey="K_EQUAL">+</key>
<key vkey="K_Q">Q</key>
<key vkey="K_W">W</key>
<key vkey="K_E">E</key>
<key vkey="K_R">R</key>
<key vkey="K_T">T</key>
<key vkey="K_Y">Y</key>
<key vkey="K_U">U</key>
<key vkey="K_I">I</key>
<key vkey="K_O">O</key>
<key vkey="K_P">P</key>
<key vkey="K_LBRKT">{</key>
<key vkey="K_RBRKT">}</key>
<key vkey="K_BKSLASH">|</key>
<key vkey="K_A">shift-a</key>
<key vkey="K_S">S</key>
<key vkey="K_D">D</key>
<key vkey="K_F">F</key>
<key vkey="K_G">G</key>
<key vkey="K_H">H</key>
<key vkey="K_J">J</key>
<key vkey="K_K">K</key>
<key vkey="K_L">L</key>
<key vkey="K_COLON">:</key>
<key vkey="K_QUOTE">"</key>
<key vkey="K_oE2">|</key>
<key vkey="K_Z">Z</key>
<key vkey="K_X">X</key>
<key vkey="K_C">C</key>
<key vkey="K_V">V</key>
<key vkey="K_B">B</key>
<key vkey="K_N">N</key>
<key vkey="K_M">M</key>
<key vkey="K_COMMA">&lt;</key>
<key vkey="K_PERIOD">&gt;</key>
<key vkey="K_SLASH">?</key>
<key vkey="K_SPACE"> </key>
</layer>
<layer shift="C">
<key vkey="K_SPACE"> </key>
</layer>
</encoding>
</visualkeyboard>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<Package>
<System>
<KeymanDeveloperVersion>11.0.1300.0</KeymanDeveloperVersion>
<FileVersion>7.0</FileVersion>
</System>
<Options>
<ExecuteProgram></ExecuteProgram>
<ReadMeFile>readme.htm</ReadMeFile>
<MSIFileName></MSIFileName>
<MSIOptions></MSIOptions>
<FollowKeyboardVersion/>
</Options>
<StartMenu>
<Folder></Folder>
<Items/>
</StartMenu>
<Info>
<Name URL="">caps_lock_shift_frees_caps</Name>
<Copyright URL="">©</Copyright>
<Author URL=""></Author>
<Version URL="">1.0</Version>
</Info>
<Files>
<File>
<Name>..\build\caps_lock_shift_frees_caps.kmx</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.kmx</FileType>
</File>
<File>
<Name>..\build\caps_lock_shift_frees_caps.kvk</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.kvk</FileType>
</File>
<File>
<Name>welcome.htm</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.htm</FileType>
</File>
<File>
<Name>readme.htm</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.htm</FileType>
</File>
<File>
<Name>..\build\caps_lock_caps_on_only.kvk</Name>
<Description>File caps_lock_caps_on_only.kvk</Description>
<CopyLocation>0</CopyLocation>
<FileType>.kvk</FileType>
</File>
<File>
<Name>..\build\caps_lock_caps_always_off.kmx</Name>
<Description>Keyboard caps_lock_caps_on_only</Description>
<CopyLocation>0</CopyLocation>
<FileType>.kmx</FileType>
</File>
<File>
<Name>..\build\caps_lock_caps_always_off.kvk</Name>
<Description>File caps_lock_caps_always_off.kvk</Description>
<CopyLocation>0</CopyLocation>
<FileType>.kvk</FileType>
</File>
<File>
<Name>..\build\caps_lock_caps_on_only.kmx</Name>
<Description>Keyboard caps_lock_caps_always_off</Description>
<CopyLocation>0</CopyLocation>
<FileType>.kmx</FileType>
</File>
</Files>
<Keyboards>
<Keyboard>
<Name>caps_lock_shift_frees_caps</Name>
<ID>caps_lock_shift_frees_caps</ID>
<Version>1.0</Version>
<Languages/>
</Keyboard>
<Keyboard>
<Name>caps_lock_caps_on_only</Name>
<ID>caps_lock_caps_always_off</ID>
<Version>1.0</Version>
<Languages/>
</Keyboard>
<Keyboard>
<Name>caps_lock_caps_always_off</Name>
<ID>caps_lock_caps_on_only</ID>
<Version>1.0</Version>
<Languages/>
</Keyboard>
</Keyboards>
<Strings/>
</Package>

View file

@ -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(&COPYRIGHT) '© 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'

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<visualkeyboard>
<header>
<version>10.0</version>
<kbdname>caps_lock_shift_frees_caps</kbdname>
<flags/>
</header>
<encoding name="unicode" fontname="Arial" fontsize="-12">
<layer shift="">
<key vkey="K_BKQUOTE">`</key>
<key vkey="K_1">1</key>
<key vkey="K_2">2</key>
<key vkey="K_3">3</key>
<key vkey="K_4">4</key>
<key vkey="K_5">5</key>
<key vkey="K_6">6</key>
<key vkey="K_7">7</key>
<key vkey="K_8">8</key>
<key vkey="K_9">9</key>
<key vkey="K_0">0</key>
<key vkey="K_HYPHEN">-</key>
<key vkey="K_EQUAL">=</key>
<key vkey="K_Q">q</key>
<key vkey="K_W">w</key>
<key vkey="K_E">e</key>
<key vkey="K_R">r</key>
<key vkey="K_T">t</key>
<key vkey="K_Y">y</key>
<key vkey="K_U">u</key>
<key vkey="K_I">i</key>
<key vkey="K_O">o</key>
<key vkey="K_P">p</key>
<key vkey="K_LBRKT">[</key>
<key vkey="K_RBRKT">]</key>
<key vkey="K_BKSLASH">\</key>
<key vkey="K_A">lower-a</key>
<key vkey="K_S">s</key>
<key vkey="K_D">d</key>
<key vkey="K_F">f</key>
<key vkey="K_G">g</key>
<key vkey="K_H">h</key>
<key vkey="K_J">j</key>
<key vkey="K_K">k</key>
<key vkey="K_L">l</key>
<key vkey="K_COLON">;</key>
<key vkey="K_QUOTE">'</key>
<key vkey="K_oE2">\</key>
<key vkey="K_Z">z</key>
<key vkey="K_X">x</key>
<key vkey="K_C">c</key>
<key vkey="K_V">v</key>
<key vkey="K_B">b</key>
<key vkey="K_N">n</key>
<key vkey="K_M">m</key>
<key vkey="K_COMMA">,</key>
<key vkey="K_PERIOD">.</key>
<key vkey="K_SLASH">/</key>
<key vkey="K_SPACE"> </key>
</layer>
<layer shift="S">
<key vkey="K_BKQUOTE">~</key>
<key vkey="K_1">!</key>
<key vkey="K_2">@</key>
<key vkey="K_3">#</key>
<key vkey="K_4">$</key>
<key vkey="K_5">%</key>
<key vkey="K_6">^</key>
<key vkey="K_7">&amp;</key>
<key vkey="K_8">*</key>
<key vkey="K_9">(</key>
<key vkey="K_0">)</key>
<key vkey="K_HYPHEN">_</key>
<key vkey="K_EQUAL">+</key>
<key vkey="K_Q">Q</key>
<key vkey="K_W">W</key>
<key vkey="K_E">E</key>
<key vkey="K_R">R</key>
<key vkey="K_T">T</key>
<key vkey="K_Y">Y</key>
<key vkey="K_U">U</key>
<key vkey="K_I">I</key>
<key vkey="K_O">O</key>
<key vkey="K_P">P</key>
<key vkey="K_LBRKT">{</key>
<key vkey="K_RBRKT">}</key>
<key vkey="K_BKSLASH">|</key>
<key vkey="K_A">shift-a</key>
<key vkey="K_S">S</key>
<key vkey="K_D">D</key>
<key vkey="K_F">F</key>
<key vkey="K_G">G</key>
<key vkey="K_H">H</key>
<key vkey="K_J">J</key>
<key vkey="K_K">K</key>
<key vkey="K_L">L</key>
<key vkey="K_COLON">:</key>
<key vkey="K_QUOTE">"</key>
<key vkey="K_oE2">|</key>
<key vkey="K_Z">Z</key>
<key vkey="K_X">X</key>
<key vkey="K_C">C</key>
<key vkey="K_V">V</key>
<key vkey="K_B">B</key>
<key vkey="K_N">N</key>
<key vkey="K_M">M</key>
<key vkey="K_COMMA">&lt;</key>
<key vkey="K_PERIOD">&gt;</key>
<key vkey="K_SLASH">?</key>
<key vkey="K_SPACE"> </key>
</layer>
<layer shift="C">
<key vkey="K_SPACE"> </key>
</layer>
</encoding>
</visualkeyboard>

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>caps_lock_shift_frees_caps</title>
<style type="text/css">
p { font: 10pt Tahoma; }
h1 { font: bold 16pt Tahoma; color: #4444cc; margin-bottom: 2px }
h2 { font: bold 12pt Tahoma; color: #4444cc; }
</style>
</head>
<body>
<h1>caps_lock_shift_frees_caps</h1>
<p>
caps_lock_shift_frees_caps 1.0 generated from template.
</p>
<p>©</p>
</body>
</html>

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Start Using caps_lock_shift_frees_caps</title>
<style type="text/css">
p { font: 10pt Tahoma; }
h1 { font: bold 16pt Tahoma; color: #4444cc; margin-bottom: 2px }
h2 { font: bold 12pt Tahoma; color: #4444cc; }
</style>
</head>
<body>
<h1>Start Using caps_lock_shift_frees_caps</h1>
<p>
caps_lock_shift_frees_caps 1.0 generated from template.
</p>
<h1>Keyboard Layout</h1>
<!-- Insert Keyboard Layout Images or HTML here -->
<p>©</p>
</body>
</html>