mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-25 00:57:42 +00:00
feat(linux): mcompile-dk looking at this->SC() vs. KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK
This commit is contained in:
parent
d0c7d348f3
commit
e2af2d0d34
7 changed files with 42 additions and 31 deletions
|
|
@ -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 ...
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue