mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-05 08:25:32 +00:00
feat(linux): mcompile-loader.KMX_ProcessDeadKey
This commit is contained in:
parent
5769bf04f8
commit
33c63fb72a
4 changed files with 235 additions and 60 deletions
|
|
@ -369,7 +369,8 @@ bool IsKeymanUsedKeyVal(std::u16string Keyval) {
|
|||
if ((KV >= 0x20 && KV <= 0x7F) || (KV >= 0x20 && KV <= 0x7F) || (KV >= 0xC4 && KV < 198) ||
|
||||
(KV >= 199 && KV < 208) || (KV >= 209 && KV < 216) || (KV >= 217 && KV < 229) ||
|
||||
(KV >= 231 && KV < 240) || (KV >= 241 && KV < 248) || (KV >= 249 && KV < 0xFF) ||
|
||||
(KV == 128) || (KV == 178) || (KV == 167) || (KV == 179) || (KV == 176)|| (KV == 181) )
|
||||
(KV == 128) || (KV == 178) || (KV == 167) || (KV == 179) || (KV == 176)|| (KV == 181)||
|
||||
(KV >= deadkey_min && KV < deadkey_max+1) )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
|
@ -407,9 +408,9 @@ std::u16string convert_DeadkeyValues_To_U16str(int in) {
|
|||
KMX_DWORD lname;
|
||||
|
||||
// it`s not a deadkey
|
||||
if (in <= (int) deadkey_min) { // no deadkey; no Unicode 97 => a
|
||||
if (!IsKeymanUsedKeyVal(std::u16string(1, in)))
|
||||
return u"\0";
|
||||
if (in < (int) deadkey_min) { // no deadkey; no Unicode 97 => a
|
||||
/*if (!IsKeymanUsedKeyVal(std::u16string(1, in)))
|
||||
return u"\0";*/
|
||||
return std::u16string(1, in);
|
||||
}
|
||||
else {
|
||||
|
|
@ -449,7 +450,7 @@ KMX_DWORD KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap
|
|||
if (!(keycode <= 94))
|
||||
return 0;
|
||||
|
||||
KMX_DWORD deadkey =(KMX_DWORD) keyvals[shift_state_pos];
|
||||
KMX_DWORD deadkey =(KMX_DWORD) keyvals[shift_state_pos]; //_S2 do I need this? no
|
||||
out = KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(keymap, keycode, (ShiftState) shift_state_pos, 0);
|
||||
|
||||
// _S2 g_free used everywhere?
|
||||
|
|
@ -478,6 +479,8 @@ KMX_DWORD KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap
|
|||
return 0;
|
||||
|
||||
KMX_DWORD deadkey = (KMX_DWORD) keyvals[shift_state_pos];
|
||||
//wprintf(L" keyvals[shift_state_pos]: %i %i %i %i----", keyvals[0],keyvals[1],keyvals[2],keyvals[3]);
|
||||
|
||||
dky = (PKMX_WCHAR) (convert_DeadkeyValues_To_U16str((int) deadkey)).c_str();
|
||||
out = KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(keymap, keycode, (ShiftState) shift_state_pos, 0);
|
||||
|
||||
|
|
@ -515,7 +518,6 @@ KMX_DWORD KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(Gdk
|
|||
else if (( ss == Shft ) && ( caps == 0 )) {
|
||||
GdkModifierType MOD_Shift = (GdkModifierType) ( GDK_SHIFT_MASK );
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_Shift , 0, keyvals, NULL, NULL, & consumed);
|
||||
std::wstring rV1= std::wstring(1, (int) *keyvals);
|
||||
}
|
||||
|
||||
//SHIFT+CAPS (shiftstate: 1)
|
||||
|
|
@ -524,15 +526,40 @@ KMX_DWORD KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(Gdk
|
|||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_ShiftCaps , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
// Ctrl (shiftstate: 2)
|
||||
else if (( ss == Ctrl ) && ( caps == 0 )){
|
||||
GdkModifierType MOD_Ctrl = (GdkModifierType) ( GDK_MOD5_MASK );
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_Ctrl , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
// Ctrl (shiftstate: 2)
|
||||
else if (( ss == Ctrl ) && ( caps == 1 )){
|
||||
GdkModifierType MOD_CtrlCaps = (GdkModifierType) (GDK_MOD5_MASK | GDK_LOCK_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_CtrlCaps , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
|
||||
// SHIFT+Ctrl (shiftstate: 3)
|
||||
else if (( ss == ShftCtrl ) && ( caps == 0 )){
|
||||
GdkModifierType MOD_Ctrl = (GdkModifierType) (GDK_SHIFT_MASK | GDK_MOD5_MASK );
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_Ctrl , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
// SHIFT+Ctrl (shiftstate: 3)
|
||||
else if (( ss == ShftCtrl ) && ( caps == 1 )){
|
||||
GdkModifierType MOD_CtrlCaps = (GdkModifierType) ( GDK_SHIFT_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_CtrlCaps , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
//ALT-GR (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 0 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
//ALT-GR +CAPS (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 1 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
|
|
@ -550,7 +577,7 @@ KMX_DWORD KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(Gdk
|
|||
else
|
||||
return 0;
|
||||
|
||||
if((*keyvals >= deadkey_min))
|
||||
if((*keyvals >= deadkey_min) && (*keyvals <= deadkey_max))
|
||||
return 0xFFFF;
|
||||
else
|
||||
return (KMX_DWORD) *keyvals;
|
||||
|
|
@ -608,13 +635,13 @@ std::wstring KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK(Gdk
|
|||
|
||||
//ALT-GR (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 0 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
//ALT-GR +CAPS (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 1 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
|
|
@ -689,13 +716,13 @@ std::u16string KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_1
|
|||
|
||||
//ALT-GR (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 0 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
//ALT-GR +CAPS (shiftstate: 6)
|
||||
else if (( ss == MenuCtrl ) && ( caps == 1 )){
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) ( (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK) );
|
||||
GdkModifierType MOD_AltGr = (GdkModifierType) (GDK_MOD2_MASK | GDK_MOD5_MASK | GDK_LOCK_MASK);
|
||||
gdk_keymap_translate_keyboard_state (keymap, keycode, MOD_AltGr , 0, keyvals, NULL, NULL, & consumed);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@
|
|||
#include "keymap.h"
|
||||
|
||||
|
||||
int KMX_ToUnicodeEx(guint ScanCode, const BYTE *lpKeyState, PWCHAR pwszBuff, int shift_state, int caps,GdkKeymap *keymap);
|
||||
|
||||
const int KMX_ShiftStateMap[] = {
|
||||
ISVIRTUALKEY,
|
||||
ISVIRTUALKEY | K_SHIFTFLAG,
|
||||
|
|
@ -99,6 +97,20 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
int KMX_ToUnicodeEx(guint ScanCode, const BYTE *lpKeyState, PKMX_WCHAR pwszBuff, int shift_state, int caps,GdkKeymap *keymap) {
|
||||
|
||||
KMX_DWORD kvl= KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(keymap, ScanCode, shift_state);
|
||||
//if((kvl >= deadkey_min) && (kvl <= deadkey_max))
|
||||
|
||||
|
||||
std::wstring character = KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK(keymap, ScanCode, ShiftState(shift_state), caps);
|
||||
std::u16string uuu16= u16string_from_wstring(character).c_str();
|
||||
pwszBuff[0]= * (PKMX_WCHAR) u16string_from_wstring(character).c_str();
|
||||
|
||||
if((kvl == 0xFFFF))
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int KMX_DeadKeyMap(int index, std::vector<DeadKey *> *deadkeys, int deadkeyBase, std::vector<KMX_DeadkeyMapping> *deadkeyMappings) { // I4327 // I4353
|
||||
for(size_t i = 0; i < deadkeyMappings->size(); i++) {
|
||||
|
|
@ -317,7 +329,7 @@ int i4 = this->KMX_IsXxxxGrCapsEqualToXxxxShift() ? 8 : 0;
|
|||
key->dpContext = new KMX_WCHAR[1];
|
||||
*key->dpContext = 0;
|
||||
key->ShiftFlags = this->KMX_GetShiftStateValue(capslock, caps, (ShiftState) ss);
|
||||
//key->Key = KMX_get_KVUS_From_KVUnderlying_VEC(All_Vector,this->VK());
|
||||
//key->Key = KMX_get_VKUS_From_VKUnderlying_VEC(All_Vector,this->VK());
|
||||
// key->Key = KMX_get_VKUnderlying_From_VKUS_GDK(keymap,this->VK());
|
||||
key->Line = 0;
|
||||
|
||||
|
|
@ -384,7 +396,7 @@ public:
|
|||
m_XxxxVk = value;
|
||||
}
|
||||
|
||||
ShiftState MaxShiftState() {
|
||||
ShiftState KMX_MaxShiftState() {
|
||||
return (Get_XxxxVk() == 0 ? ShftMenuCtrl : ShftXxxx);
|
||||
}
|
||||
|
||||
|
|
@ -411,19 +423,41 @@ public:
|
|||
DeadKey *KMX_ProcessDeadKey(
|
||||
UINT iKeyDead, // The index into the VirtualKey of the dead key
|
||||
ShiftState shiftStateDead, // The shiftstate that contains the dead key
|
||||
BYTE *lpKeyStateDead, // The key state for the dead key
|
||||
KMX_BYTE *lpKeyStateDead, // The key state for the dead key
|
||||
std::vector<KMX_VirtualKey*> rgKey, // Our array of dead keys
|
||||
bool fCapsLock, // Was the caps lock key pressed?
|
||||
KMX_HKL KMX_hkl) { // The keyboard layout
|
||||
KMX_HKL KMX_hkl, // The keyboard layout
|
||||
GdkKeymap *keymap) { // _S2 keymap, The keyboard layout
|
||||
|
||||
BYTE lpKeyState[256];
|
||||
|
||||
KMX_BYTE lpKeyState[256];
|
||||
DeadKey *deadKey = new DeadKey(rgKey[iKeyDead]->KMX_GetShiftState(shiftStateDead, fCapsLock)[0]);
|
||||
|
||||
KMX_WCHAR sbBuffer1[16];
|
||||
KMX_WCHAR sbBuffer2[16];
|
||||
KMX_WCHAR sbBuffer3[16];
|
||||
KMX_WCHAR sbBuffer4[16];
|
||||
KMX_WCHAR sbBuffer5[16];
|
||||
int rc1 = KMX_ToUnicodeEx(49, lpKeyState, sbBuffer1, 0, 0, keymap) ;
|
||||
int rc4 = KMX_ToUnicodeEx(21, lpKeyState, sbBuffer4, 0, 0, keymap) ;
|
||||
int rc3 = KMX_ToUnicodeEx( 3, lpKeyState, sbBuffer3, 0, 0, keymap) ;
|
||||
/*int rc2 = KMX_ToUnicodeEx( 49, lpKeyState, sbBuffer2, 0, 0, keymap) ;
|
||||
int rc5 = KMX_ToUnicodeEx( 65, lpKeyState, sbBuffer5, 0, 0, keymap) ;*/
|
||||
|
||||
/*int rc1 = KMX_ToUnicodeEx(192, lpKeyState, sbBuffer1, 0, 0, keymap) ;
|
||||
int rc4 = KMX_ToUnicodeEx(220, lpKeyState, sbBuffer4, 0, 0, keymap) ;
|
||||
int rc3 = KMX_ToUnicodeEx( 3, lpKeyState, sbBuffer3, 0, 0, keymap) ;
|
||||
int rc2 = KMX_ToUnicodeEx( 49, lpKeyState, sbBuffer2, 0, 0, keymap) ;
|
||||
int rc5 = KMX_ToUnicodeEx( 65, lpKeyState, sbBuffer5, 0, 0, keymap) ;*/
|
||||
|
||||
|
||||
|
||||
|
||||
for (UINT iKey = 0; iKey < rgKey.size(); iKey++) {
|
||||
if (rgKey[iKey] != NULL) {
|
||||
WCHAR sbBuffer[16];
|
||||
KMX_WCHAR sbBuffer[16];
|
||||
|
||||
for (ShiftState ss = Base; ss <= MaxShiftState(); ss = (ShiftState)((int)ss+1)) {
|
||||
for (ShiftState ss = Base; ss <= KMX_MaxShiftState(); ss = (ShiftState)((int)ss+1)) {
|
||||
int rc = 0;
|
||||
if (ss == Menu || ss == ShftMenu) {
|
||||
// Alt and Shift+Alt don't work, so skip them
|
||||
|
|
@ -431,6 +465,10 @@ public:
|
|||
}
|
||||
|
||||
for (int caps = 0; caps <= 1; caps++) {
|
||||
|
||||
//------_S2 To find a deadkey in a possibly messed up key ------------------------
|
||||
// _S2 My fun does not loop to shorten keys :-((
|
||||
|
||||
// First the dead key
|
||||
while (rc >= 0) {
|
||||
// We know that this is a dead key coming up, otherwise
|
||||
|
|
@ -442,25 +480,44 @@ public:
|
|||
|
||||
// _S2 needs replacement
|
||||
// rc = ToUnicodeEx(rgKey[iKeyDead]->VK(), rgKey[iKeyDead]->SC(), lpKeyStateDead, sbBuffer, _countof(sbBuffer), 0, hkl);
|
||||
rc=-1; //_S2
|
||||
//rc = KMX_ToUnicodeEx(rgKey[iKeyDead]->VK(), rgKey[iKeyDead]->SC(), lpKeyStateDead, sbBuffer, _countof(sbBuffer), 0, hkl);
|
||||
|
||||
rc = KMX_ToUnicodeEx(rgKey[iKeyDead]->SC(), lpKeyState, sbBuffer, ss, caps, keymap);
|
||||
//wprintf(L"ikey: %i rc = %i\n",iKey,rc);
|
||||
rc=-1; //_S2
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Now fill the key state for the potential base character
|
||||
KMX_FillKeyState(lpKeyState, ss, (caps != 0));
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// _S2 needs replacement
|
||||
//rc = ToUnicodeEx(rgKey[iKey]->VK(), rgKey[iKey]->SC(), lpKeyState, sbBuffer, _countof(sbBuffer), 0, hkl);
|
||||
rc = KMX_ToUnicodeEx( rgKey[iKey]->SC(), lpKeyState, sbBuffer, ss, caps, keymap) ;
|
||||
|
||||
|
||||
//--------- ONE character found = combined char (e.g. â ) --------------------------
|
||||
// ***** E.G: ToUnicodeEx FOUND Â ***** //
|
||||
|
||||
if (rc == 1) {
|
||||
// That was indeed a base character for our dead key.
|
||||
/* Â */ // That was indeed a base character for our dead key.
|
||||
// And we now have a composite character. Let's run
|
||||
// through one more time to get the actual base
|
||||
|
||||
// character that made it all possible?
|
||||
WCHAR combchar = sbBuffer[0];
|
||||
|
||||
// _S2 needs replacement
|
||||
//rc = ToUnicodeEx(rgKey[iKey]->VK(), rgKey[iKey]->SC(), lpKeyState, sbBuffer, _countof(sbBuffer), 0, hkl);
|
||||
// _s2 store combined char
|
||||
// ***** E.G: combchar = Â ***** //
|
||||
KMX_WCHAR combchar = sbBuffer[0];
|
||||
|
||||
WCHAR basechar = sbBuffer[0];
|
||||
// _S2 again split to get base char ( e.g. a)
|
||||
// ***** E.G: ToUnicodeEx FOUND A ***** //
|
||||
/* A */ rc = KMX_ToUnicodeEx(rgKey[iKey]->SC(), lpKeyState, sbBuffer, ss, caps, keymap) ;
|
||||
|
||||
KMX_WCHAR basechar = sbBuffer[0];
|
||||
|
||||
if (deadKey->KMX_DeadCharacter() == combchar) {
|
||||
// Since the combined character is the same as the dead key,
|
||||
|
|
@ -490,9 +547,16 @@ public:
|
|||
if (!deadKey->KMX_ContainsBaseCharacter(basechar)) {
|
||||
deadKey->KMX_AddDeadKeyRow(basechar, combchar);
|
||||
}
|
||||
} else if (rc > 1) {
|
||||
}
|
||||
|
||||
//---------no valid key combi -> IGNORE ---------------------------------------------
|
||||
|
||||
else if (rc > 1) {
|
||||
// Not a valid dead key combination, sorry! We just ignore it.
|
||||
} else if (rc < 0) {
|
||||
}
|
||||
|
||||
//---------another dead key-> IGNORE -----------------------------------------------
|
||||
else if (rc < 0) {
|
||||
// It's another dead key, so we ignore it (other than to flush it from the state)
|
||||
//ClearKeyboardBuffer(VK_DECIMAL, rgKey[VK_DECIMAL]->SC(), KMX_hkl);
|
||||
KMX_ClearKeyboardBuffer();
|
||||
|
|
@ -527,17 +591,6 @@ int KMX_GetMaxDeadkeyIndex(KMX_WCHAR *p) {
|
|||
return n;
|
||||
}
|
||||
|
||||
int KMX_ToUnicodeEx(guint ScanCode, const BYTE *lpKeyState, PKMX_WCHAR pwszBuff, int shift_state, int caps,GdkKeymap *keymap) {
|
||||
|
||||
KMX_DWORD kvl= KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(keymap, ScanCode, shift_state);
|
||||
if((kvl >= deadkey_min) && (kvl <= deadkey_max))
|
||||
return -1;
|
||||
|
||||
std::wstring character = KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK(keymap, ScanCode, ShiftState(shift_state), caps);
|
||||
pwszBuff[0]= * (PKMX_WCHAR) u16string_from_wstring(character).c_str();
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap, std::vector<KMX_DeadkeyMapping> *FDeadkeys, KMX_BOOL bDeadkeyConversion) { // I4353 // I4552
|
||||
KMX_Loader loader;
|
||||
|
||||
|
|
@ -614,7 +667,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
if(rgKey[iKey] != NULL) {
|
||||
KMX_WCHAR sbBuffer[256]; // Scratchpad we use many places
|
||||
|
||||
for(ShiftState ss = Base; ss <= loader.MaxShiftState(); ss = (ShiftState)((int)ss + 1)) {
|
||||
for(ShiftState ss = Base; ss <= loader.KMX_MaxShiftState(); ss = (ShiftState)((int)ss + 1)) {
|
||||
if(ss == Menu || ss == ShftMenu) {
|
||||
// Alt and Shift+Alt don't work, so skip them
|
||||
continue;
|
||||
|
|
@ -632,7 +685,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
// _S2 is THIS correct ??? Do we need lpKeyState or is it just used in ToUnicodeEx??
|
||||
loader.KMX_ClearKeyboardBuffer();
|
||||
loader.KMX_FillKeyState(lpKeyState, ss, (caps == 0));
|
||||
int rc = KMX_ToUnicodeEx(SC_US, lpKeyState, sbBuffer, ss, caps, *keymap) ;
|
||||
int rc = KMX_ToUnicodeEx(SC_US, lpKeyState, sbBuffer, ss, caps, *keymap);
|
||||
|
||||
if(rc > 0) {
|
||||
if(*sbBuffer == 0) {
|
||||
|
|
@ -669,6 +722,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
sbBuffer[2] = 0;
|
||||
//rgKey[iKey]->SetShiftState(ss, sbBuffer, true, (caps == 0));
|
||||
rgKey[iKey]->KMX_SetShiftState(ss, sbBuffer, true, (caps ));
|
||||
wprintf(L"rc<0 for iKey nr. %i (%c) \n",iKey,iKey );
|
||||
|
||||
// It's a dead key; let's flush out whats stored in the keyboard state.
|
||||
loader.KMX_ClearKeyboardBuffer();
|
||||
|
|
@ -685,7 +739,13 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
}
|
||||
if(dk == NULL) {
|
||||
//_S2 TODO
|
||||
//alDead.push_back(loader.KMX_ProcessDeadKey(iKey, ss, lpKeyState, rgKey, caps == 0, hkl));
|
||||
alDead.push_back(loader.KMX_ProcessDeadKey(iKey, ss, lpKeyState, rgKey, caps == 0, hkl, *keymap));
|
||||
//alDead.push_back(loader.KMX_ProcessDeadKey(192, ss, lpKeyState, rgKey, caps == 0, hkl, *keymap));
|
||||
|
||||
//_S2 for each dk (^ ' ` push_back all combinations ^,â,ê,î,ô,û ',á,é,í,ó,ú `,à,è,ì,ò,ù into alDead->m_rgcombchar)
|
||||
//_S2 for each dk (^ ' ` push_back all base char : _,a,e,i,o,u into alDead->m_rgbasechar)
|
||||
// S2 do nothing for other keys
|
||||
int wertzui=9;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -749,7 +809,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
UINT nKeys = 0;
|
||||
for (UINT iKey = 0; iKey < rgKey.size(); iKey++) {
|
||||
if ((rgKey[iKey] != NULL) && rgKey[iKey]->KMX_IsKeymanUsedKey() && (!rgKey[iKey]->KMX_IsEmpty())) {
|
||||
nKeys+= rgKey[iKey]->KMX_GetKeyCount(loader.MaxShiftState());
|
||||
nKeys+= rgKey[iKey]->KMX_GetKeyCount(loader.KMX_MaxShiftState());
|
||||
//wprintf(L" iKey = %i, Delta: %i -> Sum %i\n", iKey, rgKey[iKey]->KMX_GetKeyCount(loader.MaxShiftState()), nKeys);
|
||||
}
|
||||
}
|
||||
|
|
@ -771,8 +831,8 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,
|
|||
//
|
||||
for (UINT iKey = 0; iKey < rgKey.size(); iKey++) {
|
||||
if ((rgKey[iKey] != NULL) && rgKey[iKey]->KMX_IsKeymanUsedKey() && (!rgKey[iKey]->KMX_IsEmpty())) {
|
||||
if(rgKey[iKey]->KMX_LayoutRow(loader.MaxShiftState(), &gp->dpKeyArray[nKeys], &alDead, nDeadkey, bDeadkeyConversion, All_Vector,*keymap)) { // I4552
|
||||
nKeys+=rgKey[iKey]->KMX_GetKeyCount(loader.MaxShiftState());
|
||||
if(rgKey[iKey]->KMX_LayoutRow(loader.KMX_MaxShiftState(), &gp->dpKeyArray[nKeys], &alDead, nDeadkey, bDeadkeyConversion, All_Vector,*keymap)) { // I4552
|
||||
nKeys+=rgKey[iKey]->KMX_GetKeyCount(loader.KMX_MaxShiftState());
|
||||
// wprintf(L" iKey = %i, Delta: %i -> Sum %i\n", iKey, rgKey[iKey]->KMX_GetKeyCount(loader.MaxShiftState()), nKeys);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,14 @@
|
|||
//------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------------------------
|
||||
|
||||
// _S2 can go later
|
||||
void test_keyboard_S2(LPKMX_KEYBOARD kmxfile);
|
||||
|
||||
void TestKey_S2(LPKMX_KEY key) ;
|
||||
void TestGroup_S2(LPKMX_GROUP group) ;
|
||||
void TestKeyboard_S2(LPKMX_KEYBOARD kbd) ;
|
||||
|
||||
|
||||
KMX_BOOL KMX_DoConvert(LPKMX_KEYBOARD kbd, KMX_BOOL bDeadkeyConversion, gint argc, gchar *argv[]);
|
||||
|
||||
bool KMX_ImportRules( LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap,std::vector<KMX_DeadkeyMapping> *KMX_FDeadkeys, KMX_BOOL bDeadkeyConversion); // I4353 // I4327
|
||||
|
|
@ -123,6 +131,9 @@ int run(int argc, std::vector<std::u16string> str_argv, char* argv_ch[] = NULL){
|
|||
return 3;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//test_keyboard_S2(kmxfile); -> THE SAME
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
// _S2 DoConvert for windows needs to be done later ( can it be copied from engine/mcompile ?)
|
||||
/*if(DoConvert(kmxfile, kbid, bDeadkeyConversion)) { // I4552F
|
||||
|
|
@ -131,14 +142,15 @@ int run(int argc, std::vector<std::u16string> str_argv, char* argv_ch[] = NULL){
|
|||
|
||||
#else // LINUX
|
||||
if(KMX_DoConvert( kmxfile, bDeadkeyConversion, argc, (gchar**) argv_ch)) { // I4552F
|
||||
KMX_SaveKeyboard(kmxfile, outfile);
|
||||
KMX_SaveKeyboard(kmxfile, outfile); //test_keyboard_S2(kmxfile); -> THE SAME without DoConvert
|
||||
}
|
||||
//test_keyboard_S2(kmxfile); // -> DIFFERENT
|
||||
#endif
|
||||
|
||||
//DeleteReallocatedPointers(kmxfile); :TODO // _S2 not my ToDo :-)
|
||||
delete kmxfile;
|
||||
|
||||
//wprintf(L"\nmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm end\n");
|
||||
wprintf(L"\nmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm end\n");
|
||||
wprintf(L"\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -228,6 +240,9 @@ void KMX_ReportUnconvertedKeyboardRules(LPKMX_KEYBOARD kbd) {
|
|||
|
||||
void KMX_TranslateDeadkeyKey(LPKMX_KEY key, KMX_WCHAR deadkey, KMX_WORD vk, UINT shift, KMX_WORD ch) {
|
||||
if((key->ShiftFlags == 0 || key->ShiftFlags & VIRTUALCHARKEY) && key->Key == ch) {
|
||||
//vk==192 && ch==94 && key->Key==94 && Line == 1572
|
||||
//vk==192 && ch==94 && key->Key==94 && Line == 1567
|
||||
//vk==192 && ch==94 && key->Key==94 && Line == 1568
|
||||
|
||||
// The weird LCTRL+RALT is Windows' way of mapping the AltGr key.
|
||||
// We store that as just RALT, and use the option "Simulate RAlt with Ctrl+Alt"
|
||||
|
|
@ -243,9 +258,10 @@ void KMX_TranslateDeadkeyKey(LPKMX_KEY key, KMX_WCHAR deadkey, KMX_WORD vk, UINT
|
|||
key->ShiftFlags &= ~VIRTUALCHARKEY;
|
||||
}
|
||||
|
||||
int len = u16len(key->dpContext);
|
||||
int len = u16len(key->dpContext);
|
||||
|
||||
//PWSTR
|
||||
// _S2 breakpoint key->Key==94
|
||||
PKMX_WCHAR context = new KMX_WCHAR[len + 4];
|
||||
memcpy(context, key->dpContext, len * sizeof(KMX_WCHAR));
|
||||
context[len] = UC_SENTINEL;
|
||||
|
|
@ -253,16 +269,18 @@ void KMX_TranslateDeadkeyKey(LPKMX_KEY key, KMX_WCHAR deadkey, KMX_WORD vk, UINT
|
|||
context[len+2] = deadkey;
|
||||
context[len+3] = 0;
|
||||
key->dpContext = context;
|
||||
key->Key = vk;
|
||||
key->Key = vk; // _S2 fill with vk_US?
|
||||
}
|
||||
}
|
||||
|
||||
void KMX_TranslateDeadkeyGroup(LPKMX_GROUP group,KMX_WCHAR deadkey, KMX_WORD vk, UINT shift, KMX_WORD ch) {
|
||||
for(unsigned int i = 0; i < group->cxKeyArray; i++) {
|
||||
//wprintf(L" i= %i \n",i);
|
||||
KMX_TranslateDeadkeyKey(&group->dpKeyArray[i], deadkey, vk, shift, ch);
|
||||
}
|
||||
}
|
||||
|
||||
// is 223 0 175
|
||||
// should 45 0 175 --> need other VK !!
|
||||
void KMX_TranslateDeadkeyKeyboard(LPKMX_KEYBOARD kbd, KMX_WCHAR deadkey, KMX_WORD vk, UINT shift, KMX_WORD ch) {
|
||||
for(unsigned int i = 0; i < kbd->cxGroupArray; i++) {
|
||||
if(kbd->dpGroupArray[i].fUsingKeys) {
|
||||
|
|
@ -271,16 +289,18 @@ void KMX_TranslateDeadkeyKeyboard(LPKMX_KEYBOARD kbd, KMX_WCHAR deadkey, KMX_WOR
|
|||
}
|
||||
}
|
||||
|
||||
// _S2 this does not work OK
|
||||
void KMX_AddDeadkeyRule(LPKMX_KEYBOARD kbd, KMX_WCHAR deadkey, KMX_WORD vk, UINT shift) {
|
||||
// The weird LCTRL+RALT is Windows' way of mapping the AltGr key.
|
||||
// We store that as just RALT, and use the option "Simulate RAlt with Ctrl+Alt"
|
||||
// to provide an alternate..
|
||||
if((shift & (LCTRLFLAG|RALTFLAG)) == (LCTRLFLAG|RALTFLAG)) // I4549
|
||||
|
||||
shift &= ~LCTRLFLAG;
|
||||
// _s2 idee spanish keyboard has dk on altgr !!
|
||||
|
||||
// If the first group is not a matching-keys group, then we need to add into
|
||||
// each subgroup, otherwise just the match group
|
||||
int zaehler=0;
|
||||
for(unsigned int i = 0; i < kbd->cxGroupArray; i++) {
|
||||
if(kbd->dpGroupArray[i].fUsingKeys) {
|
||||
LPKMX_KEY keys = new KMX_KEY[kbd->dpGroupArray[i].cxKeyArray + 1];
|
||||
|
|
@ -298,6 +318,9 @@ void KMX_AddDeadkeyRule(LPKMX_KEYBOARD kbd, KMX_WCHAR deadkey, KMX_WORD vk, UINT
|
|||
kbd->dpGroupArray[i].dpKeyArray = keys;
|
||||
kbd->dpGroupArray[i].cxKeyArray++;
|
||||
//LogError("Add deadkey rule: + [%d K_%d] > dk(%d)", shift, vk, deadkey);
|
||||
zaehler++;
|
||||
//wprintf(L"Add deadkey rule: + [%d K_%d] > dk(%d) %i\n", shift, vk, deadkey,zaehler);
|
||||
//test_keyboard_S2(kbd);
|
||||
if(i == kbd->StartGroup[1]) break; // If this is the initial group, that's all we need to do.
|
||||
}
|
||||
}
|
||||
|
|
@ -391,8 +414,21 @@ void KMX_ConvertDeadkey(LPKMX_KEYBOARD kbd, KMX_WORD vk, UINT shift, KMX_WCHAR d
|
|||
|
||||
while(*pdk) {
|
||||
// Look up the ch
|
||||
|
||||
// go via SC
|
||||
UINT vkUnderlying = KMX_get_KVUS_From_KVUnderlying_VEC(All_Vector, *pdk);
|
||||
// hier ist das problem: ich muss über sc hehen; nicht über VK_underlying, dens nicht gibt!!
|
||||
//-S2 this is wrong!!
|
||||
//UINT vkUnderlying = KMX_get_VKUS_From_VKUnderlying_VEC(All_Vector, *pdk);
|
||||
UINT vkUnderlying = vk;
|
||||
|
||||
//if(vkUnderlying != *pdk)
|
||||
//wprintf(L" vkUnderlying_X %i *pdk %i \n", vkUnderlying, *pdk);
|
||||
|
||||
//UINT vkUnderlying = VKUnderlyingLayoutToVKUS(*pdk);
|
||||
// UINT scUnderlyingtest = KMX_get_SCUnderlying_From_VKUS(KMX_VKMap[i]);
|
||||
|
||||
// _s (pdk+1) = UINT shift, *(pdk+2)=WORD ch
|
||||
//wprintf(L" *(pdk+1): %i (%c) *(pdk+2) : \n", *(pdk+1), *(pdk+1) );
|
||||
KMX_TranslateDeadkeyKeyboard(kbd, dkid, vkUnderlying, *(pdk+1), *(pdk+2));
|
||||
pdk+=3;
|
||||
}
|
||||
|
|
@ -457,22 +493,24 @@ KMX_BOOL KMX_DoConvert(LPKMX_KEYBOARD kbd, KMX_BOOL bDeadkeyConversion, gint arg
|
|||
KMX_WCHAR ch = KMX_get_CharUnderlying_From_SCUnderlying_GDK(keymap, VKShiftState[j], scUnderlying, &DeadKey);
|
||||
|
||||
//LogError("--- VK_%d -> VK_%d [%c] dk=%d", VKMap[i], vkUnderlying, ch == 0 ? 32 : ch, DeadKey);
|
||||
//wprintf(L"--- VK_%d -> SC_%d [%c] dk=%d ( ss %i) \n", KMX_VKMap[i], KMX_get_KeyCodeUnderlying_From_VKUS(KMX_VKMap[i]), ch == 0 ? 32 : ch, DeadKey,VKShiftState[j]);
|
||||
|
||||
if(bDeadkeyConversion) { // I4552
|
||||
if(ch == 0xFFFF) {
|
||||
ch = DeadKey;
|
||||
}
|
||||
}
|
||||
|
||||
wprintf(L" scunderlying: SS: %i Nr: %i VKMap[i] %i ch:%i (%c) \n", VKShiftState[j],i, KMX_VKMap[i],ch,ch );
|
||||
// _S2 GOOD TIL HERE
|
||||
wprintf(L" scunderlying: SS: %i Nr: %i VKMap[i] %i ch:%i (%c)\n", VKShiftState[j],i, KMX_VKMap[i],ch,ch );
|
||||
switch(ch) {
|
||||
case 0x0000: break;
|
||||
case 0xFFFF: KMX_ConvertDeadkey(kbd, KMX_VKMap[i], VKShiftState[j], DeadKey, All_Vector, keymap); break;
|
||||
case 0xFFFF: KMX_ConvertDeadkey(kbd, KMX_VKMap[i], VKShiftState[j], DeadKey, All_Vector, keymap); break; //test_keyboard_S2(kbd); //-> mit Convert DK FALSCH; Ohne ConvertDK the same
|
||||
default: KMX_TranslateKeyboard(kbd, KMX_VKMap[i], VKShiftState[j], ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//test_keyboard_S2(kbd); //-> HIER SCHON FALSCH
|
||||
KMX_ReportUnconvertedKeyboardRules(kbd);
|
||||
|
||||
if(!KMX_ImportRules(kbd, All_Vector, &keymap, &KMX_FDeadkeys, bDeadkeyConversion)) { // I4353 // I4552
|
||||
|
|
@ -498,7 +536,7 @@ UINT KMX_get_SCUnderlying_From_VKUS(KMX_DWORD VirtualKeyUS) {
|
|||
return SC_OTHER;
|
||||
}
|
||||
|
||||
KMX_WCHAR KMX_get_KVUS_From_KVUnderlying_VEC(v_dw_3D All_Vector, KMX_DWORD VK_OTHER) {
|
||||
KMX_WCHAR KMX_get_VKUS_From_VKUnderlying_VEC(v_dw_3D All_Vector, KMX_DWORD VK_OTHER) {
|
||||
|
||||
KMX_DWORD VK_US;
|
||||
for( int i=0; i< (int)All_Vector[0].size()-1 ;i++) {
|
||||
|
|
@ -548,7 +586,7 @@ KMX_WCHAR KMX_get_CharUnderlying_From_SCUnderlying_GDK(GdkKeymap *keymap, KMX_U
|
|||
int VKShiftState_lin = map_VKShiftState_to_Lin(VKShiftState);
|
||||
KMX_DWORD KeyvalOther = KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(keymap,SC_OTHER, VKShiftState_lin, dky);
|
||||
|
||||
if (KeyvalOther >= deadkey_min) {
|
||||
if ((KeyvalOther >= deadkey_min) && (KeyvalOther >= deadkey_max)){
|
||||
*DeadKey = *dky;
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
|
@ -597,6 +635,55 @@ int KMX_GetDeadkeys(v_dw_2D & dk_Table, KMX_WORD DeadKey, KMX_WORD *OutputPairs,
|
|||
return (p-OutputPairs);
|
||||
}
|
||||
|
||||
|
||||
// _S2 can go later
|
||||
void test_keyboard_S2(LPKMX_KEYBOARD kmxfile){
|
||||
|
||||
TestKeyboard_S2(kmxfile);
|
||||
}
|
||||
|
||||
void TestKey_S2(LPKMX_KEY key) {
|
||||
//wprintf(L"key->dpOutput %i %i %i %i \n ",*key->dpOutput,*(key->dpOutput+1),*(key->dpOutput+2),*(key->dpOutput+3),*(key->dpOutput+4) );
|
||||
|
||||
wprintf(L" %i ",*key->dpOutput);
|
||||
for (int i=1; i<8;i++) {
|
||||
if( *(key->dpOutput+i) != 0)
|
||||
wprintf(L" %i\t", *(key->dpOutput+i) );
|
||||
else
|
||||
break;
|
||||
}
|
||||
wprintf(L" _\n");
|
||||
|
||||
|
||||
/*//wprintf(L" stopped at len for %i %i (%c) %c \n", key->Key, vk, vk, ch);
|
||||
PWSTR context = new WCHAR[len + 4];
|
||||
memcpy(context, key->dpContext, len * sizeof(WCHAR));
|
||||
context[len] = UC_SENTINEL;
|
||||
context[len+1] = CODE_DEADKEY;
|
||||
context[len+2] = deadkey;
|
||||
context[len+3] = 0;
|
||||
key->dpContext = context;
|
||||
key->Key = vk;
|
||||
}*/
|
||||
}
|
||||
|
||||
void TestGroup_S2(LPKMX_GROUP group) {
|
||||
for(unsigned int i = 0; i < group->cxKeyArray; i++) {
|
||||
wprintf(L" dpKeyArray[i] %i ",i );
|
||||
TestKey_S2(&group->dpKeyArray[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void TestKeyboard_S2(LPKMX_KEYBOARD kbd) {
|
||||
for(unsigned int i = 0; i < kbd->cxGroupArray; i++) {
|
||||
if(kbd->dpGroupArray[i].fUsingKeys) {
|
||||
wprintf(L"kbd->dpGroupArray[i] %i \n",i);
|
||||
TestGroup_S2(&kbd->dpGroupArray[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---- old copy code from here ----------------------------------------------------------
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -44,10 +44,11 @@ UINT KMX_get_SCUnderlying_From_VKUS(KMX_DWORD VirtualKeyUS);
|
|||
|
||||
KMX_WCHAR KMX_get_CharUnderlying_From_SCUnderlying_GDK(GdkKeymap *keymap, KMX_UINT VKShiftState, UINT SC_OTHER, PKMX_WCHAR DeadKey);
|
||||
|
||||
KMX_WCHAR KMX_get_KVUS_From_KVUnderlying_VEC(v_dw_3D All_Vector,KMX_DWORD SC_US);
|
||||
KMX_WCHAR KMX_get_VKUS_From_VKUnderlying_VEC(v_dw_3D All_Vector,KMX_DWORD SC_US);
|
||||
|
||||
int KMX_GetDeadkeys(v_dw_2D & dk_Table, KMX_WORD DeadKey, KMX_WORD *OutputPairs, GdkKeymap* keymap);
|
||||
|
||||
|
||||
//--------------------old
|
||||
/*
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue