feat(linux): mcompile-dk looking at this->SC() vs. KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK

This commit is contained in:
Sabine 2024-02-19 20:47:50 +01:00
parent d0c7d348f3
commit e2af2d0d34
7 changed files with 42 additions and 31 deletions

View file

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

View file

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

View file

@ -23,7 +23,7 @@ bool found_dk_inVector(KMX_WCHAR dk, std::vector<DeadKey*> &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

View file

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

View file

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

View file

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

View file

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