diff options
author | Vincent Torri <vincent.torri@gmail.com> | 2019-11-28 11:06:24 +0000 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2019-11-28 11:06:24 +0000 |
commit | 9acab812ee02f5a2f30544d0eeacc521200e7ac1 (patch) | |
tree | 0e3a0ed1538eda9af066fbbcfc216f97f5b0f3b6 | |
parent | 92d2cc7ae362275f2a7512778e1f0fa994cdc946 (diff) | |
download | efl-9acab812ee02f5a2f30544d0eeacc521200e7ac1.tar.gz |
ecore_win32: fix compose event field
Summary:
compose event field was encoded in UTF-16 and not UTF-8. Also string
event field was not correctly defined and was generating eina error
messages
Test Plan: running a test
Reviewers: raster, cedric, zmike
Reviewed By: raster
Subscribers: #reviewers, #committers
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D10753
-rw-r--r-- | src/lib/ecore_win32/ecore_win32_event.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/src/lib/ecore_win32/ecore_win32_event.c b/src/lib/ecore_win32/ecore_win32_event.c index cf6b4492cc..293b16816b 100644 --- a/src/lib/ecore_win32/ecore_win32_event.c +++ b/src/lib/ecore_win32/ecore_win32_event.c @@ -42,6 +42,32 @@ static Ecore_Win32_Key_Mask _ecore_win32_key_mask = 0; static Eina_Bool _ecore_win32_ctrl_fake = EINA_FALSE; static Eina_Bool _ecore_win32_clipboard_has_data = EINA_FALSE; +static char * +_ecore_win32_utf16_to_utf8(const wchar_t *text) +{ + char *res; + int size; + + /* text is used as an array, hence never NULL */ + + size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL); + if (size == 0) + return NULL; + + res = (char *)malloc(size * sizeof(char)); + if (!res) + return NULL; + + size = WideCharToMultiByte(CP_UTF8, 0, text, -1, res, size, NULL, NULL); + if (size == 0) + { + free(res); + return NULL; + } + + return res; +} + static unsigned int _ecore_win32_modifiers_get(void) { @@ -1176,15 +1202,14 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, if (res == -1) { /* dead key, but managed like normal key */ + compose = _ecore_win32_utf16_to_utf8(buf); } else if (res == 0) { INF("No translatable character found, skipping"); if (msg->window_param >= 0x30 && msg->window_param <= 0x39) - { - buf[0] = msg->window_param; - } - else return NULL; + compose = _ecore_win32_utf16_to_utf8(buf); + /* otherwise, compose is NULL */ } else if (res >= 2) { @@ -1196,12 +1221,12 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, res = ToUnicode(msg->window_param, MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR), kbd_state, buf, 4, 0); - if ((res != 1) && (res != -1)) - return NULL; + if (!((res != 1) && (res != -1))) + compose = _ecore_win32_utf16_to_utf8(buf); + /* otherwise, compose is NULL */ } - - string[0] = (char)buf[0]; - compose = string; + else /* res == 1 : 1 char written to buf */ + compose = _ecore_win32_utf16_to_utf8(buf); /*** key field ***/ @@ -1232,7 +1257,6 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, { buf[0] = msg->window_param; } - else return NULL; } else if (res >= 2) { @@ -1303,7 +1327,7 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, { buf[0] = msg->window_param; } - else return NULL; + else buf[0] = 0;// return NULL; } else if (res >= 2) { @@ -1353,7 +1377,7 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key) + strlen(keyname) + 1 + strlen(key) + 1 + - (compose ? (strlen(compose) + 1) : 0)); + (compose ? strlen(compose) : 0) + 1); if (!e) return NULL; @@ -1366,7 +1390,12 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg, memcpy((char *)e->keyname, keyname, strlen(keyname)); memcpy((char *)e->key, key, strlen(key)); - if (compose) memcpy((char *)e->compose, compose, strlen(compose)); + if (compose) + { + memcpy((char *)e->compose, compose, strlen(compose)); + free(compose); + } + return e; } |