feat(linux): mcompile-loader.KMX_ProcessDeadKey

This commit is contained in:
Sabine 2024-01-19 19:29:50 +01:00
parent 5769bf04f8
commit 33c63fb72a
4 changed files with 235 additions and 60 deletions

View file

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

View file

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

View file

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

View file

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