Evil: add evil_utf8_to_utf16() API ; use evil_utf16_to_utf8() in Ecore_Win32

Summary: use existing utf-16 to utf-8 conversion function in Ecore_Win32. Add API to convert utf-8 to utf-16 in Evil for copy'n paste on Windows

Test Plan: compilation

Reviewers: raster, zmike

Reviewed By: zmike

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D11406
This commit is contained in:
Vincent Torri 2020-02-25 09:23:48 -05:00 committed by Mike Blumenkrantz
parent 526b1e2c72
commit 0ff7469d91
3 changed files with 51 additions and 30 deletions

View File

@ -9,6 +9,7 @@
#undef WIN32_LEAN_AND_MEAN
#include <windowsx.h>
#include <evil_private.h> /* evil_utf16_to_utf8() */
#include <Eina.h>
#include <Ecore.h>
#include <Ecore_Input.h>
@ -42,32 +43,6 @@ 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)
{
@ -1202,13 +1177,13 @@ _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);
compose = evil_utf16_to_utf8(buf);
}
else if (res == 0)
{
INF("No translatable character found, skipping");
if (msg->window_param >= 0x30 && msg->window_param <= 0x39)
compose = _ecore_win32_utf16_to_utf8(buf);
compose = evil_utf16_to_utf8(buf);
/* otherwise, compose is NULL */
}
else if (res >= 2)
@ -1222,11 +1197,11 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
MapVirtualKey(msg->window_param, MAPVK_VK_TO_CHAR),
kbd_state, buf, 4, 0);
if (!((res != 1) && (res != -1)))
compose = _ecore_win32_utf16_to_utf8(buf);
compose = evil_utf16_to_utf8(buf);
/* otherwise, compose is NULL */
}
else /* res == 1 : 1 char written to buf */
compose = _ecore_win32_utf16_to_utf8(buf);
compose = evil_utf16_to_utf8(buf);
/*** key field ***/

View File

@ -107,6 +107,34 @@ evil_utf16_to_utf8(const wchar_t *text16)
return text8;
}
wchar_t *
evil_utf8_to_utf16(const char *text)
{
wchar_t *text16;
DWORD flag = MB_ERR_INVALID_CHARS;
int size16;
if (!text)
return NULL;
size16 = MultiByteToWideChar(CP_UTF8, flag, text, -1, NULL, 0);
if (size16 == 0)
{
_evil_last_error_display(__FUNCTION__);
return NULL;
}
text16 = malloc(size16 * sizeof(wchar_t));
if (text16)
if (!MultiByteToWideChar(CP_UTF8, flag, text, -1, text16, size16))
{
_evil_last_error_display(__FUNCTION__);
return NULL;
}
return text16;
}
const char *
evil_format_message(long err)
{

View File

@ -59,6 +59,24 @@ EAPI char *evil_wchar_to_char(const wchar_t *text);
*/
EAPI char *evil_utf16_to_utf8(const wchar_t *text);
/**
* @brief Convert a string from UTF-8 to UTF-16.
*
* @param text The string to convert in UTF-8.
* @return The converted string in UTF-16.
*
* Convert a string from UTF-8 to UTF-16 and return it. If the
* allocation or conversion fails, NULL is returned. On success, the
* returned value must be freed when it is not used anymore.
*
* Conformity: Non applicable.
*
* @since 1.24
*
* @ingroup Evil
*/
EAPI wchar_t *evil_utf8_to_utf16(const char *text);
EAPI const char *evil_format_message(long err);
EAPI const char *evil_last_error_get(void);