Skip to content

Dead keys #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 88 additions & 55 deletions Headers/KLL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,40 +139,57 @@ void CKLL::Fill32()
PVK_TO_WCHARS1 pVkToWch = pVkToWchTbl->pVkToWchars;
while (pVkToWch->VirtualKey)
{
VK_STRUCT *pVK = new VK_STRUCT();
pVK->VirtualKey = (int)pVkToWch->VirtualKey;
pVK->Attributes = pVkToWch->Attributes;

for (int i = 0; i < pVkToWchTbl->nModifications; ++i)
if (pVkToWch->VirtualKey != 0xFF)
{
if (pVkToWch->wch[i] == WCH_LGTR)
{
VK_STRUCT_KEY key;
key.Character = 0;
key.IsLig = true;
VK_STRUCT* pVK = new VK_STRUCT();
pVK->VirtualKey = (int)pVkToWch->VirtualKey;
pVK->Attributes = pVkToWch->Attributes;

PLIGATURE1 current = KbdTables->pLigature;
while (current)
for (int i = 0; i < pVkToWchTbl->nModifications; ++i)
{
if (pVkToWch->wch[i] == WCH_LGTR)
{
if (current->VirtualKey == pVK->VirtualKey)
VK_STRUCT_KEY key;
key.Character = 0;
key.IsLig = true;
key.IsDeadKey = false;

PLIGATURE1 current = KbdTables->pLigature;
while (current)
{
key.Ligs.insert(key.Ligs.end(), current->wch[i]);
if (current->VirtualKey == pVK->VirtualKey)
{
key.Ligs.insert(key.Ligs.end(), current->wch[i]);
}
current = (PLIGATURE1)(((PBYTE)current) + KbdTables64->cbLgEntry);
}
current = (PLIGATURE1)(((PBYTE)current) + KbdTables64->cbLgEntry);
}

pVK->Characters.insert(pVK->Characters.end(), key);
}
else
{
VK_STRUCT_KEY key;
key.Character = pVkToWch->wch[i];
key.IsLig = false;
pVK->Characters.insert(pVK->Characters.end(), key);
}
else if (pVkToWch->wch[i] == WCH_DEAD)
{
//Is DeadKey
//Fetch Next key for character
PVK_TO_WCHARS1 pVkToWchNext = (PVK_TO_WCHARS1)(((PBYTE)pVkToWch) + pVkToWchTbl->cbSize);
VK_STRUCT_KEY key;
key.Character = pVkToWchNext->wch[i];
key.IsLig = false;
key.IsDeadKey = true;

pVK->Characters.insert(pVK->Characters.end(), key);
}
else
{
VK_STRUCT_KEY key;
key.Character = pVkToWch->wch[i];
key.IsLig = false;
key.IsDeadKey = false;

pVK->Characters.insert(pVK->Characters.end(), key);
pVK->Characters.insert(pVK->Characters.end(), key);
}
}
m_vkarray.insert(m_vkarray.end(), pVK);
}
m_vkarray.insert(m_vkarray.end(), pVK);
}
++pVkToWchTbl;
}
Expand Down Expand Up @@ -263,46 +280,62 @@ void CKLL::Fill64()
PVK_TO_WCHARS641 pVkToWch = pVkToWchTbl->pVkToWchars;
while (pVkToWch->VirtualKey)
{
VK_STRUCT *pVK = new VK_STRUCT();
pVK->VirtualKey = (int)pVkToWch->VirtualKey;
pVK->Attributes = pVkToWch->Attributes;

for (int i = 0; i < pVkToWchTbl->nModifications; ++i)
if (pVkToWch->VirtualKey != 0xFF)
{
if (pVkToWch->wch[i] == WCH_LGTR)
{
VK_STRUCT_KEY key;
key.Character = 0;
key.IsLig = true;
VK_STRUCT *pVK = new VK_STRUCT();
pVK->VirtualKey = (int)pVkToWch->VirtualKey;
pVK->Attributes = pVkToWch->Attributes;

PLIGATURE641 current = KbdTables64->pLIGATURE64;
while (current)
for (int i = 0; i < pVkToWchTbl->nModifications; ++i)
{
if (pVkToWch->wch[i] == WCH_LGTR)
{
if (current->VirtualKey == pVK->VirtualKey && current->ModificationNumber == i)
VK_STRUCT_KEY key;
key.Character = 0;
key.IsLig = true;
key.IsDeadKey = false;

PLIGATURE641 current = KbdTables64->pLIGATURE64;
while (current)
{
key.Ligs.insert(key.Ligs.end(), current->wch[0]);
key.Ligs.insert(key.Ligs.end(), current->wch[1]);
break;
if (current->VirtualKey == pVK->VirtualKey && current->ModificationNumber == i)
{
key.Ligs.insert(key.Ligs.end(), current->wch[0]);
key.Ligs.insert(key.Ligs.end(), current->wch[1]);
break;
}
current = (PLIGATURE641)(((PBYTE)current) + KbdTables64->cbLgEntry);
}
current = (PLIGATURE641)(((PBYTE)current) + KbdTables64->cbLgEntry);
}

/*key.Ligs.insert(key.Ligs.end(), KbdTables64->pLIGATURE64->wch[0]);
key.Ligs.insert(key.Ligs.end(), KbdTables64->pLIGATURE64->wch[1]);*/
/*key.Ligs.insert(key.Ligs.end(), KbdTables64->pLIGATURE64->wch[0]);
key.Ligs.insert(key.Ligs.end(), KbdTables64->pLIGATURE64->wch[1]);*/

pVK->Characters.insert(pVK->Characters.end(), key);
}
else
{
VK_STRUCT_KEY key;
key.Character = pVkToWch->wch[i];
key.IsLig = false;
pVK->Characters.insert(pVK->Characters.end(), key);
}
else if (pVkToWch->wch[i] == WCH_DEAD)
{
//Is DeadKey
//Fetch Next key for character
PVK_TO_WCHARS641 pVkToWchNext = (PVK_TO_WCHARS641)(((PBYTE)pVkToWch) + pVkToWchTbl->cbSize);
VK_STRUCT_KEY key;
key.Character = pVkToWchNext->wch[i];
key.IsLig = false;
key.IsDeadKey = true;

pVK->Characters.insert(pVK->Characters.end(), key);
}
else
{
VK_STRUCT_KEY key;
key.Character = pVkToWch->wch[i];
key.IsLig = false;
key.IsDeadKey = false;

pVK->Characters.insert(pVK->Characters.end(), key);
pVK->Characters.insert(pVK->Characters.end(), key);
}
}
m_vkarray.insert(m_vkarray.end(), pVK);
}
m_vkarray.insert(m_vkarray.end(), pVK);

pVkToWch = (PVK_TO_WCHARS641)(((PBYTE)pVkToWch) + pVkToWchTbl->cbSize);
}
++pVkToWchTbl;
Expand Down
1 change: 1 addition & 0 deletions Headers/KLL.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class __declspec( dllexport ) CKLL
struct VK_STRUCT_KEY
{
bool IsLig;
bool IsDeadKey;
int Character;
std::vector<int> Ligs;
};
Expand Down
2 changes: 1 addition & 1 deletion WindowsKeyboardLayout/KeyboardLayoutHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ WPFKeyboardNative::KeyboardLayout^ WPFKeyboardNative::KeyboardLayoutHelper::GetL
{
ligs[z] = vk->Characters[y].Ligs.at(z);
}
characters[y] = gcnew VirtualKeyCharacter(vk->Characters[y].IsLig, vk->Characters[y].Character, ligs);
characters[y] = gcnew VirtualKeyCharacter(vk->Characters[y].IsLig, vk->Characters[y].IsDeadKey, vk->Characters[y].Character, ligs);
}

layout->VirtualKeys->Add(gcnew VirtualKey(vk->VirtualKey, vk->Attributes, characters));
Expand Down
8 changes: 7 additions & 1 deletion WindowsKeyboardLayout/VirtualKey.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#include "stdafx.h"
#include "VirtualKey.h"

WPFKeyboardNative::VirtualKeyCharacter::VirtualKeyCharacter(bool isLig, int character, array<int>^ ligs)
WPFKeyboardNative::VirtualKeyCharacter::VirtualKeyCharacter(bool isLig, bool isDeadKey, int character, array<int>^ ligs)
{
_isLig = isLig;
_isDeadKey = isDeadKey;
_character = character;
_ligs = ligs;
}
Expand All @@ -13,6 +14,11 @@ bool WPFKeyboardNative::VirtualKeyCharacter::IsLig::get()
return _isLig;
}

bool WPFKeyboardNative::VirtualKeyCharacter::IsDeadKey::get()
{
return _isDeadKey;
}

int WPFKeyboardNative::VirtualKeyCharacter::Character::get()
{
return _character;
Expand Down
4 changes: 3 additions & 1 deletion WindowsKeyboardLayout/VirtualKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ namespace WPFKeyboardNative
public ref class VirtualKeyCharacter
{
private:
bool _isDeadKey;
bool _isLig;
int _character;
array<int>^ _ligs;
public:
VirtualKeyCharacter(bool isLog, int character, array<int>^ ligs);
VirtualKeyCharacter(bool isLog, bool isDeadKey, int character, array<int>^ ligs);
property bool IsLig { bool get(); }
property bool IsDeadKey { bool get(); }
property int Character { int get(); }
property array<int>^ Ligs { array<int>^ get(); }
};
Expand Down