From 33c63fb72afa992a23d7e2ef356b00a0791e06b9 Mon Sep 17 00:00:00 2001 From: Sabine Date: Fri, 19 Jan 2024 19:29:50 +0100 Subject: [PATCH] feat(linux): mcompile-loader.KMX_ProcessDeadKey --- linux/mcompile/keymap/keymap.cpp | 53 ++++++--- linux/mcompile/keymap/mc_import_rules.cpp | 128 ++++++++++++++++------ linux/mcompile/keymap/mcompile.cpp | 111 +++++++++++++++++-- linux/mcompile/keymap/mcompile.h | 3 +- 4 files changed, 235 insertions(+), 60 deletions(-) diff --git a/linux/mcompile/keymap/keymap.cpp b/linux/mcompile/keymap/keymap.cpp index 380727eb8b..53f6ceac8b 100755 --- a/linux/mcompile/keymap/keymap.cpp +++ b/linux/mcompile/keymap/keymap.cpp @@ -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); } diff --git a/linux/mcompile/keymap/mc_import_rules.cpp b/linux/mcompile/keymap/mc_import_rules.cpp index c6faa51c42..2f20fc41ce 100755 --- a/linux/mcompile/keymap/mc_import_rules.cpp +++ b/linux/mcompile/keymap/mc_import_rules.cpp @@ -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 *deadkeys, int deadkeyBase, std::vector *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 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 *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); } } diff --git a/linux/mcompile/keymap/mcompile.cpp b/linux/mcompile/keymap/mcompile.cpp index ea43bf5f59..bd91bdc92c 100755 --- a/linux/mcompile/keymap/mcompile.cpp +++ b/linux/mcompile/keymap/mcompile.cpp @@ -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_FDeadkeys, KMX_BOOL bDeadkeyConversion); // I4353 // I4327 @@ -123,6 +131,9 @@ int run(int argc, std::vector 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 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 ---------------------------------------------------------- /* diff --git a/linux/mcompile/keymap/mcompile.h b/linux/mcompile/keymap/mcompile.h index bfdbbc5488..06f47a6d86 100755 --- a/linux/mcompile/keymap/mcompile.h +++ b/linux/mcompile/keymap/mcompile.h @@ -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 /*