Extended character ime (#14559)

* Update Makefile

* Update win32_common.c

* Update input_driver.c

* Update gfx_thumbnail_path.c
This commit is contained in:
Kangmo-Ahn 2022-10-30 02:01:30 +09:00 committed by GitHub
parent edfc96feea
commit 3a744b7dae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 93 additions and 49 deletions

View File

@ -64,7 +64,7 @@ ifneq ($(findstring FPGA,$(OS)),)
endif
ifneq ($(findstring Win32,$(OS)),)
LDFLAGS += -static-libgcc -lwinmm
LDFLAGS += -static-libgcc -lwinmm -limm32
endif
include Makefile.common

View File

@ -1161,6 +1161,11 @@ static LRESULT CALLBACK wnd_proc_winraw_common_internal(HWND hwnd,
}
#endif
/* IME for CJK (-limm32) */
#ifdef _MSC_VER
#pragma comment(lib, "Imm32")
#endif
#ifdef HAVE_DINPUT
static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd,
UINT message, WPARAM wparam, LPARAM lparam)
@ -1172,6 +1177,32 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd,
switch (message)
{
case WM_IME_ENDCOMPOSITION:
input_keyboard_event(true, 1, 0x80000000, 0, RETRO_DEVICE_KEYBOARD);
break;
case WM_IME_COMPOSITION:
{
wchar_t wstr[4]={0,};
char utf8[8]={0,};
HIMC hIMC = ImmGetContext(hwnd);
unsigned gcs = lparam & (GCS_COMPSTR|GCS_RESULTSTR); /* GCS_COMPSTR:0x0008 GCS_RESULTSTR:0x0800 */
if( gcs )
{
int i;
int len1=ImmGetCompositionStringW(hIMC, gcs, wstr, 4); /* len:2 - usally (byte) */
for( i=0; i<len1/2; i++) /* len:4 - input ascii character while MBC composition */
{
int len2=WideCharToMultiByte( CP_UTF8, 0, wstr+i, -1, utf8, 8, NULL, NULL );
if (len2)
{
utf8[3] = (gcs) | (gcs>>4); /* COMPSTR:0x08000000, RESULTSTR:0x80000000 */
input_keyboard_event(true, 1, *((int*)utf8), 0, RETRO_DEVICE_KEYBOARD);
}
}
}
ImmReleaseContext(hwnd, hIMC);
return 0; /* block WM_CHAR */
} break;
case WM_KEYUP: /* Key released */
case WM_SYSKEYUP: /* Key released */
keydown = false;

View File

@ -663,6 +663,32 @@ bool gfx_thumbnail_update_path(
thumbnail_path[0] = '\0';
fill_pathname_join_special(thumbnail_path, tmp_buf,
path_data->content_img, PATH_MAX_LENGTH * sizeof(char));
/* Thumbnail fallback 1 - rom_name.png */
if ( !path_is_valid(thumbnail_path) ) // :\thumbnails\db_name\Named_Snaps\rom_name.png
{
char content_name[PATH_MAX_LENGTH];
char* cp = find_last_slash(path_data->content_path);
if( cp ) cp++; else cp = path_data->content_path;
strcpy(content_name,cp);
cp = strchr( content_name,'.');
if(cp) strcpy(cp,".png");
fill_pathname_join(thumbnail_path, dir_thumbnails, system_name, PATH_MAX_LENGTH);
fill_pathname_join(thumbnail_path, thumbnail_path, type, PATH_MAX_LENGTH);
fill_pathname_join(thumbnail_path, thumbnail_path, content_name, PATH_MAX_LENGTH);
}
/* Thumbnail fallback 2 - rom_path/rom_name.png */
if ( !path_is_valid(thumbnail_path) ) // :\roms\db_name\rom_name.png
{
char* cp;
char content_name[PATH_MAX_LENGTH];
strcpy(content_name,path_data->content_path);
cp = strstr(content_name, ".zip#");
if( cp ) cp[4]=0;
cp = strrchr( content_name,'.');
strcpy(cp,".png");
strcpy(thumbnail_path,content_name);
}
}
/* Final error check - is cached path empty? */

View File

@ -3225,64 +3225,51 @@ bool input_keyboard_line_event(
input_driver_state_t *input_st,
input_keyboard_line_t *state, uint32_t character)
{
char array[2];
bool ret = false;
const char *word = NULL;
char c = (character >= 128) ? '?' : character;
const char * word = (char*) &character;
static unsigned composition = 0;
/* Treat extended chars as ? as we cannot support
* printable characters for unicode stuff. */
if ( character & 0xFF000000 ) /* COMPSTR:0x08000000, RESULTSTR:0x80000000 END:0x01000000*/
{
int len = strlen((char*)&composition);
if( len>0 && state->ptr>=len && state->buffer )
{
memmove(state->buffer + state->ptr-len, state->buffer+state->ptr, len + 1);
state->ptr -=len;
state->size-=len;
}
if(character & 0xF0000000 ) composition = 0;
else composition = character &0xffffff; // GCS_COMPSTR
if(len && composition==0) word = state->buffer;
character &= 0xffffff;
}
if (c == '\r' || c == '\n')
if ( character==0x0000000D || character==0x0000000A ) /*(c == '\r' || c == '\n') */
{
state->cb(state->userdata, state->buffer);
array[0] = c;
array[1] = 0;
ret = true;
word = array;
}
else if (c == '\b' || c == '\x7f') /* 0x7f is ASCII for del */
} else
if ( character==0x00000008 || character==0x0000007f) /* c == '\b' || c == '\x7f') 0x7f is ASCII for del */
{
if (state->ptr)
{
unsigned i;
for (i = 0; i < input_st->osk_last_codepoint_len; i++)
{
memmove(state->buffer + state->ptr - 1,
state->buffer + state->ptr,
state->size - state->ptr + 1);
state->ptr--;
state->size--;
}
word = state->buffer;
unsigned i;
int len = input_st->osk_last_codepoint_len;
if( len>0 && state->ptr>=len && state->buffer )
{
memmove(state->buffer + state->ptr-len, state->buffer + state->ptr, (state->size - state->ptr) + 1);
state->ptr -=len;
state->size-=len;
}
word = state->buffer; //??
}
}
else if (ISPRINT(c))
{
/* Handle left/right here when suitable */
char *newbuf = (char*)
realloc(state->buffer, state->size + 2);
if (!newbuf)
return false;
memmove(newbuf + state->ptr + 1,
newbuf + state->ptr,
state->size - state->ptr + 1);
newbuf[state->ptr] = c;
state->ptr++;
state->size++;
newbuf[state->size] = '\0';
state->buffer = newbuf;
array[0] = c;
array[1] = 0;
word = array;
} else
if (character )
{
input_keyboard_line_append( state, (char*)&character, strlen((char*)&character));
} else
{
return false;
}
/* OSK - update last character */