From e2af2d0d34bf9970d8c1df3c8781e0c24aaaefab Mon Sep 17 00:00:00 2001 From: Sabine Date: Mon, 19 Feb 2024 20:47:50 +0100 Subject: [PATCH] feat(linux): mcompile-dk looking at this->SC() vs. KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK --- linux/mcompile/keymap/README.md | 1 + linux/mcompile/keymap/deadkey.cpp | 2 +- linux/mcompile/keymap/deadkey.h | 2 +- linux/mcompile/keymap/keymap.cpp | 15 ++++++++---- linux/mcompile/keymap/keymap.h | 10 ++++++-- linux/mcompile/keymap/mc_import_rules.cpp | 15 +++++++----- linux/mcompile/keymap/mcompile.cpp | 28 ++++++++++------------- 7 files changed, 42 insertions(+), 31 deletions(-) diff --git a/linux/mcompile/keymap/README.md b/linux/mcompile/keymap/README.md index 9f2a624f67..92bd6f646e 100755 --- a/linux/mcompile/keymap/README.md +++ b/linux/mcompile/keymap/README.md @@ -14,6 +14,7 @@ _S2 TODO TODO keymap* or keymap** everywhere? _S2 TODO check call by reference/value _S2 TODO replace GDK _S2 TODO what is wrong with kp->dpBitmapOffset/BitmapSize ? +_S2 TODO all wprintf gone ? _S2 ... diff --git a/linux/mcompile/keymap/deadkey.cpp b/linux/mcompile/keymap/deadkey.cpp index 60f181e15d..f9a174cfec 100755 --- a/linux/mcompile/keymap/deadkey.cpp +++ b/linux/mcompile/keymap/deadkey.cpp @@ -112,7 +112,7 @@ KMX_DWORD KMX_changeKeynameToCapital(KMX_DWORD KVal, KMX_DWORD &shift, GdkKeymap return Cap; } -// _S2 DESIGN NEEDED is this the right place to get dk from? if not wher are they stored? +// _S2 DESIGN NEEDED is this the right place to get dk from? if not where are they stored? void create_DKTable(v_dw_2D & dk_ComposeTable) { //values taken from: https://help.ubuntu.com/community/GtkDeadKeyTable#Latin diff --git a/linux/mcompile/keymap/deadkey.h b/linux/mcompile/keymap/deadkey.h index b4c6de7aeb..9f6713a805 100755 --- a/linux/mcompile/keymap/deadkey.h +++ b/linux/mcompile/keymap/deadkey.h @@ -23,7 +23,7 @@ bool found_dk_inVector(KMX_WCHAR dk, std::vector &myVec); // finds all combination for a specific deadkey(dk) ^-> â,ê,î,ô,û,... bool find_dk_combinations_for_specific_dk(v_dw_2D * dk_ComposeTable, v_dw_2D & dk_SingleTable, KMX_DWORD dk); -// gets the shifted character of a key +// gets the shifted character of a key and writes shiftstate of KValto shift KMX_DWORD KMX_changeKeynameToCapital(KMX_DWORD KVal, KMX_DWORD &shift, GdkKeymap* keymap); // _S2 TODO probably not used diff --git a/linux/mcompile/keymap/keymap.cpp b/linux/mcompile/keymap/keymap.cpp index 4111e317cb..10947ac77f 100755 --- a/linux/mcompile/keymap/keymap.cpp +++ b/linux/mcompile/keymap/keymap.cpp @@ -546,7 +546,6 @@ KMX_DWORD KMX_get_KeyvalUnderlying_DK_From_KeyCodeUnderlying_GDK(GdkKeymap *keym g_free(keyvals); g_free(maps); - // _S2 AHA output for dk4-12 at the top after dk... from here if((All_Keyvals >= deadkey_min) && (All_Keyvals <= deadkey_max)) // deadkeys return 0xFFFF; else if((All_Keyvals > deadkey_max) || ((All_Keyvals < deadkey_min) && ( All_Keyvals > 0xFF))) // out of range @@ -568,6 +567,12 @@ KMX_DWORD KMX_get_CharUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, U return 0xFFFE; else // usable char return keyvals_dw; + +/*if( keyvals_dw == 0xFFFF) + *DeadKey = *dky; + + return keyvals_dw;*/ + } KMX_DWORD KMX_get_VKUS_From_KeyCodeUnderlying_GDK( GdkKeymap *keymap, KMX_DWORD keycode) { @@ -583,7 +588,7 @@ KMX_DWORD KMX_get_VKUS_From_KeyCodeUnderlying_GDK( GdkKeymap *keymap, KMX_DWORD return 0; } - +//_S2 TODO condense these 2 fun to one KMX_DWORD KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(GdkKeymap *keymap, v_dw_3D &All_Vector, KMX_DWORD KC_US, ShiftState ss, int caps) { KMX_DWORD Character; @@ -592,7 +597,7 @@ KMX_DWORD KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(GdkKeymap *keymap, v_dw_3 //Find underlying KC of character for( int i=0; i< (int)All_Vector[1].size()-1 ;i++) { - for( int j=1; j< (int)All_Vector[01][0].size();j++) { + for( int j=1; j< (int)All_Vector[1][0].size();j++) { if ( ( All_Vector[1][i][j] == Character ) ) { KC_US = All_Vector[1][i][j]; return All_Vector[1][i][0]; @@ -602,12 +607,12 @@ KMX_DWORD KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(GdkKeymap *keymap, v_dw_3 return KC_US; } -KMX_WCHAR KMX_get_CharUS_From_VKUnderlying_VEC(v_dw_3D & All_Vector, KMX_DWORD VK_underlying) { +KMX_WCHAR KMX_get_KValUnderlying_From_KValUS_VEC(v_dw_3D & All_Vector, KMX_DWORD VK_underlying) { KMX_DWORD VK_US; for( int i=0; i< (int)All_Vector[0].size()-1 ;i++) { for( int j=1; j< (int)All_Vector[0][0].size();j++) { if ( ( All_Vector[0][i][j] == VK_underlying ) ) { - VK_US = All_Vector[1][i][j];; + VK_US = All_Vector[1][i][j]; return VK_US; } } diff --git a/linux/mcompile/keymap/keymap.h b/linux/mcompile/keymap/keymap.h index 5567a05fdc..c1c99e7f3d 100755 --- a/linux/mcompile/keymap/keymap.h +++ b/linux/mcompile/keymap/keymap.h @@ -68,6 +68,7 @@ static KMX_DWORD returnIfCharInvalid = 0; static KMX_DWORD keycode_max = 94; static KMX_DWORD deadkey_min = 0xfe50; static KMX_DWORD deadkey_max = 0xfe93; +//static KMX_DWORD deadkey_max = 0xfe52; // _S2 TODO This has to go! my test: to only return 3 dk int map_VKShiftState_to_LinModifier(int VKShiftState); @@ -509,19 +510,24 @@ std::u16string convert_DeadkeyValues_To_U16str(int in); // use gdk_keymap_translate_keyboard_state to get keyval - base function to get keyvals int KMX_get_keyval_From_Keycode(GdkKeymap *keymap, guint keycode, ShiftState ss, int caps); +// uses KMX_get_keyval_From_Keycode and forbids use of certain keycodes KMX_DWORD KMX_get_KeyvalUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, guint keycode, int shift_state_pos); + +// _S2 uses KMX_get_keyval_From_Keycode and returns CATEGORY off keyval and forbids use of certain keycodes KMX_DWORD KMX_get_KeyvalUnderlying_DK_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, guint keycode, int shift_state_pos, PKMX_WCHAR &dky); +// _S2 fills Deadkey with dk and returns CATEGORY KMX_DWORD KMX_get_CharUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, UINT VKShiftState, UINT KC_underlying, PKMX_WCHAR DeadKey); // return the VirtualKey of the underlying Keyboard for a given Keyode using GDK KMX_DWORD KMX_get_VKUS_From_KeyCodeUnderlying_GDK( GdkKeymap *keymap, KMX_DWORD keycode); -// return the Keycode of the underlying Keyboard for given VK_US using GDK +// uses Vector to return the Keycode of the underlying Keyboard for given VK_US using GDK KMX_DWORD KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(GdkKeymap *keymap, v_dw_3D &All_Vector,KMX_DWORD KC_US, ShiftState ss, int caps); -KMX_WCHAR KMX_get_CharUS_From_VKUnderlying_VEC(v_dw_3D &All_Vector,KMX_DWORD VK_underlying); + // _S2 HÄÄ + KMX_WCHAR KMX_get_KValUnderlying_From_KValUS_VEC(v_dw_3D &All_Vector,KMX_DWORD VK_underlying); // return the Keycode of the underlying Keyboard for given VK_US UINT KMX_get_KeyCodeUnderlying_From_VKUS(KMX_DWORD VirtualKeyUS); diff --git a/linux/mcompile/keymap/mc_import_rules.cpp b/linux/mcompile/keymap/mc_import_rules.cpp index 0576c06e20..409c17336b 100755 --- a/linux/mcompile/keymap/mc_import_rules.cpp +++ b/linux/mcompile/keymap/mc_import_rules.cpp @@ -77,7 +77,6 @@ int KMX_ToUnicodeEx(guint keycode, const BYTE *lpKeyState, PKMX_WCHAR pwszBuff, return 0; std::wstring str = convert_DeadkeyValues_ToWstr(KMX_get_keyval_From_Keycode(keymap, keycode, ShiftState(shift_state_pos), caps)); - pwszBuff[0]= * (PKMX_WCHAR) u16string_from_wstring(str).c_str(); KMX_DWORD keyvals_dw= (KMX_DWORD) KMX_get_keyval_From_Keycode(keymap, keycode, ShiftState(shift_state_pos), caps); @@ -290,10 +289,13 @@ int i4 = this->KMX_IsXxxxGrCapsEqualToXxxxShift() ? 8 : 0;*/ (this->KMX_IsXxxxGrCapsEqualToXxxxShift() ? 8 : 0); - // _S2 DIFFERENCE TO MCOMPILE WINDOWS + // DIFFERENCE TO MCOMPILE WINDOWS // _S2 DESIGN NEEDED on how to replace capslock // capslock has different values for linux. Therefore key->ShiftFlags will be different for numbers, special characters + // Therefore CAPS/NCAPS will be added differently for Lin<->Win // for now set capslock=1 + // capslock=1 <-> capslock=0; + // [ CTRL NCAPS K_I] <-> [CTRL K_I] capslock=1; for (int ss = 0; ss <= MaxShiftState; ss++) { @@ -344,7 +346,9 @@ int i4 = this->KMX_IsXxxxGrCapsEqualToXxxxShift() ? 8 : 0;*/ // key->Key stores VK-US ( not underlying !!) // key->dpOutput stores character Underlying - KMX_DWORD SC_Underlying = KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(keymap, All_Vector, this->SC(), (ShiftState) ss, caps); + // _S2 ToDo which one ??? is different if a char is on different keys- then it may find the wrong key. + //KMX_DWORD SC_Underlying = KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(keymap, All_Vector, this->SC(), (ShiftState) ss, caps); + KMX_DWORD SC_Underlying = this->SC(); key->Key = KMX_get_VKUS_From_KeyCodeUnderlying_GDK( keymap, SC_Underlying); key->Line = 0; @@ -518,7 +522,6 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap, // _S2 TODO not finished; Ctrl, Shft +40 not tested for(int caps = 0; caps <= 1; caps++) { - // _S2 TODO Do we need this? //loader.KMX_ClearKeyboardBuffer(); loader.KMX_FillKeyState(lpKeyState, ss, (caps == 0)); @@ -545,6 +548,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap, // VK_A ~ VK_Z keys to produce the control characters, // when the conversion rule is not provided in keyboard // layout files + continue; } if( (ss == Ctrl || ss == ShftCtrl) ) { @@ -657,7 +661,6 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap, UINT j; LPKMX_KEY kkp; for(j = 0, kkp = gp->dpKeyArray; j < gp->cxKeyArray; j++, kkp++) { - // _S2 AHA! missing 26 lines from here: since capalock is not correct this loop will never be done if((kkp->ShiftFlags & (K_CTRLFLAG|K_ALTFLAG|LCTRLFLAG|LALTFLAG|RCTRLFLAG|RALTFLAG)) != 0) { gp2->cxKeyArray++; LPKMX_KEY kkp2 = new KMX_KEY[gp2->cxKeyArray]; @@ -682,7 +685,7 @@ bool KMX_ImportRules(LPKMX_KEYBOARD kp,v_dw_3D &All_Vector, GdkKeymap **keymap, // If we have deadkeys, then add a new group to translate the deadkeys per the deadkey tables // We only do this if not in deadkey conversion mode // - // DK_PART + if (alDead.size() > 0 && !bDeadkeyConversion) { // I4552 kp->cxGroupArray++; diff --git a/linux/mcompile/keymap/mcompile.cpp b/linux/mcompile/keymap/mcompile.cpp index 64c0876301..0839ddf1bc 100755 --- a/linux/mcompile/keymap/mcompile.cpp +++ b/linux/mcompile/keymap/mcompile.cpp @@ -222,6 +222,7 @@ void KMX_TranslateDeadkeyKey(LPKMX_KEY key, KMX_WCHAR deadkey, KMX_WORD vk, UINT shift &= ~LCTRLFLAG; if(key->ShiftFlags == 0) { + // _S2 TODO enable logError //LogError("Converted mnemonic rule on line %d, + '%c' TO dk(%d) + [%x K_%d]", key->Line, key->Key, deadkey, shift, vk); //wprintf(L"DK Converted mnemonic rule on line %d, + '%c' TO dk(%d) + [%x K_%d], %i(%c)\n", key->Line, key->Key, deadkey, shift, vk, ch, ch); key->ShiftFlags = ISVIRTUALKEY | shift; @@ -360,7 +361,7 @@ KMX_WCHAR KMX_GetUniqueDeadkeyID(LPKMX_KEYBOARD kbd, KMX_WCHAR deadkey) { return s_dkids[s_ndkids++].dst_deadkey = s_next_dkid = ++dkid; } -void KMX_ConvertDeadkey(LPKMX_KEYBOARD kbd, KMX_WORD vk, UINT shift, KMX_WCHAR deadkey, v_dw_3D &All_Vector, GdkKeymap* keymap,v_dw_2D dk_Table) { +void KMX_ConvertDeadkey(LPKMX_KEYBOARD kbd, KMX_WORD vk_US, UINT shift, KMX_WCHAR deadkey, v_dw_3D &All_Vector, GdkKeymap* keymap,v_dw_2D dk_Table) { KMX_WORD deadkeys[512], *pdk; // Lookup the deadkey table for the deadkey in the physical keyboard @@ -368,16 +369,15 @@ void KMX_ConvertDeadkey(LPKMX_KEYBOARD kbd, KMX_WORD vk, UINT shift, KMX_WCHAR d KMX_WCHAR dkid = KMX_GetUniqueDeadkeyID(kbd, deadkey); // Add the deadkey to the mapping table for use in the import rules phase - KMX_DeadkeyMapping KMX_deadkeyMapping = { deadkey, dkid, shift, vk}; // I4353 + KMX_DeadkeyMapping KMX_deadkeyMapping = { deadkey, dkid, shift, vk_US}; // I4353 KMX_FDeadkeys.push_back(KMX_deadkeyMapping); //dkid, vk, shift); // I4353 - KMX_AddDeadkeyRule(kbd, dkid, vk, shift); + KMX_AddDeadkeyRule(kbd, dkid, vk_US, shift); KMX_GetDeadkeys(dk_Table, deadkey, pdk = deadkeys, keymap); // returns array of [usvk, ch_out] pairs while(*pdk) { // Look up the ch - UINT vkUnderlying = KMX_get_CharUS_From_VKUnderlying_VEC(All_Vector, *pdk); - + UINT vkUnderlying = KMX_get_KValUnderlying_From_KValUS_VEC(All_Vector, *pdk); KMX_TranslateDeadkeyKeyboard(kbd, dkid, vkUnderlying, *(pdk+1), *(pdk+2)); pdk+=3; } @@ -439,11 +439,8 @@ KMX_BOOL KMX_DoConvert(LPKMX_KEYBOARD kbd, KMX_BOOL bDeadkeyConversion, gint arg // Loop through each possible key on the keyboard for (int i = 0;KMX_VKMap[i]; i++) { // I4651 - - // _S2 DIFFERENT TO MCOMPILE WINDOWS // win goes via VK, Lin goes via SC/Keycode - UINT scUnderlying = KMX_get_KeyCodeUnderlying_From_VKUS(KMX_VKMap[i]); KMX_WCHAR ch = KMX_get_CharUnderlying_From_KeyCodeUnderlying_GDK(keymap, VKShiftState[j], scUnderlying, &DeadKey); @@ -484,14 +481,13 @@ int KMX_GetDeadkeys(v_dw_2D & dk_Table, KMX_WORD DeadKey, KMX_WORD *OutputPairs, for ( int i=0; i< (int) dk_SingleTable.size();i++) { KMX_WORD vk = KMX_changeKeynameToCapital(dk_SingleTable[i][1], shift, keymap); if(vk != 0) { - *p++ = vk; - *p++ = shift; - *p++ = dk_SingleTable[i][2]; - } - // _S2 TODO - //else { - // LogError(L"Warning: complex deadkey not supported."); - // } + *p++ = vk; + *p++ = shift; + *p++ = dk_SingleTable[i][2]; + } + else { + KMX_LogError(L"Warning: complex deadkey not supported."); + } } *p = 0; return (p-OutputPairs);