Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Osk for all redo #14956

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
151 changes: 151 additions & 0 deletions assets/keyboard.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
{
"data":
[
{ "name": "symbols_grid1", "mark": "SY", "comp": "",
"grid": [ "1","2", "3","4", "5", "6","7","8","9","0", "-","⇦",
"!","\"","#","$", "%", "&","'","*","(",")", "+", "⏎",
"+",",", "-","~", "/", ":",";","=","<",">", "`","⇩",
"?","@", "[","\\","]", "^","_","|","{","}", " ", "⊕" ]
},
{ "name": "us_grid1", "mark": "en",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "_","⇦",
"q","w","e","r","t", "y","u","i","o","p", "=","⏎",
"a","s","d","f","g", "h","j","k","l","@", "'","⇧",
"z","x","c","v","b", "n","m"," ",",",".", "/", "⊕" ]
},
{ "name": "us_grid2", "mark": "EN",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "_","⇦",
"Q","W","E","R","T", "Y","U","I","O","P", "+","⏎",
"A","S","D","F","G", "H","J","K","L",":", "\"","⇩",
"Z","X","C","V","B", "N","M"," ","<",">", "?", "⊕" ]
},
{ "name": "jp_grid1", "mark": "jp",
"grid": [ "あ","い","う","え","お", "な","に","ぬ","ね","の", "ん", "⇦",
"か","き","く","け","こ", "は","ひ","ふ","へ","ほ", "っ","⏎",
"さ","し","す","せ","そ", "ま","み","む","め","も", "わ","⇧",
"た","ち","つ","て","と", "ら","り","る","れ","ろ", "を","⊕" ]
},
{ "name": "jp_grid2", "mark": "jp",
"grid": [ "ぁ","ぃ","ぅ","ぇ","ぉ", "ぱ","ぴ","ぷ","ぺ","ぽ", "ん","⇦",
"が","ぎ","ぐ","げ","ご", "ば","び","ぶ","べ","ぼ", "っ","⏎",
"ざ","じ","ず","ぜ","ぞ", "や","ゆ","よ","「","」", "わ","⇩",
"だ","ぢ","づ","で","ど", "ゃ","ゅ","ょ", " ","、", "を","⊕" ]
},
{ "name": "jp_grid3", "mark": "JP",
"grid": [ "ア","イ","ウ","エ","オ", "ナ","ニ","ヌ","ネ","ノ", "ン","⇦",
"カ","キ","ク","ケ","コ", "ハ","ヒ","フ","ヘ","ホ", "ッ","⏎",
"サ","シ","ス","セ","ソ", "マ","ミ","ム","メ","モ", "ワ","⇧",
"タ","チ","ツ","テ","ト", "ラ","リ","ル","レ","ロ", "ヲ","⊕" ]
},
{ "name": "jp_grid4", "mark": "JP",
"grid": [ "ァ","ィ","ゥ","ェ","ォ", "パ","ピ","プ","ペ","ポ", "ン","⏎",
"ガ","ギ","グ","ゲ","ゴ", "バ","ビ","ブ","ベ","ボ", "ッ","⇦",
"ザ","ジ","ズ","ゼ","ゾ", "ヤ","ユ","ヨ","『","』", "ワ","⇩",
"ダ","ヂ","ヅ","デ","ド", "ャ","ュ","ョ"," " ,"。", "ヲ","⊕" ]
},
{ "name": "kr_grid1", "mark": "kr",
"comp": [ "ㄱㄱㄲ ㄷㄷㄸ ㅂㅂㅃ ㅅㅅㅆ ㅈㅈㅉ",
"ㅗㅏㅘ ㅗㅐㅙ ㅗㅣㅚ ㅜㅓㅝ ㅜㅔㅞ ㅜㅣㅟ ㅡㅣㅢ",
"ㄱㄱㄲ ㄱㅅㄳ ㄴㅈㄵ ㄴㅎㄶ ㄹㄱㄺ ㄹㅁㄻ ㄹㅂㄼ ㄹㅅㄽ ㄹㅌㄾ ㄹㅍㄿ ㄹㅎㅀ ㅂㅅㅄ ㅅㅅㅆ",
"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㆍㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ"],
"grid": [ "1" ,"2","3","4","5", "6", "7", "8", "9", "0", "-","⇦",
"ㅂ","ㅈ","ㄷ","ㄱ","ㅅ", "ㅛ","ㅕ","ㅑ","ㅐ","ㅔ", "=","⏎",
"ㅁ","ㄴ","ㅇ","ㄹ","ㅎ", "ㅗ","ㅓ","ㅏ","ㅣ","ㅒ", "ㅖ","⇧",
"ㅋ","ㅌ","ㅊ","ㅍ","ㅠ", "ㅜ","ㅡ"," ", ",",".", "/","⊕" ]
},
{ "name": "kr_grid2", "mark": "KR",
"comp": [ "ㄱㄱㄲ ㄷㄷㄸ ㅂㅂㅃ ㅅㅅㅆ ㅈㅈㅉ",
"ㅗㅏㅘ ㅗㅐㅙ ㅗㅣㅚ ㅜㅓㅝ ㅜㅔㅞ ㅜㅣㅟ ㅡㅣㅢ",
"ㄱㄱㄲ ㄱㅅㄳ ㄴㅈㄵ ㄴㅎㄶ ㄹㄱㄺ ㄹㅁㄻ ㄹㅂㄼ ㄹㅅㄽ ㄹㅌㄾ ㄹㅍㄿ ㄹㅎㅀ ㅂㅅㅄ ㅅㅅㅆ",
"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㆍㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ"],
"grid": [ "1" ,"2","3","4","5", "6","7","8","9","0", "_","⇦",
"ㅂ","ㅈ","ㄷ","ㄱ","ㅅ", "ㅛ","ㅕ","ㅑ","ㅐ","ㅔ", "+","⏎",
"ㅁ","ㄴ","ㅇ","ㄹ","ㅎ", "ㅗ","ㅓ","ㅏ","ㅣ","ㅒ", "ㅖ","⇩",
"ㅋ","ㅌ","ㅊ","ㅍ","ㅠ", "ㅜ","ㅡ"," ", "<",">", "?","⊕" ]
},
{ "name": "ge_grid1", "mark": "ge", "comp": "´aá ´eé ´ií ´oó ´uú `aà `eè `iì `oò `uù ",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "´","⇦",
"q","w","e","r","t", "y","u","i","o","ü", "β","⏎",
"a","s","d","f","g", "h","j","k","l","ö", "ä","⇧",
"z","x","c","v","b", "n","Ù"," ","'",",", ".","⊕" ]
},
{ "name": "ge_grid2", "mark": "GE", "comp": "´aá ´eé ´ií ´oó ´uú `aà `eè `iì `oò `uù ",
"grid":[ "1","2","3","4","5", "6","7","8","9","0", "`", "⇦",
"Q","W","E","R","T", "Z","U","I","P","Ü", "ß","⏎",
"A","S","D","F","G", "H","J","K","L","Ö", "Ä", "⇩",
"Y","X","C","V","B", "N","M"," ","'",",", ".", "⊕" ]
},
{ "name": "fr_grid1", "mark": "fr", "comp": "^aâ ^iî ^uû ^eê ^oô ¨eë ¨iï ",
"grid": [ "&","é","\"","'","(", "-","è","_","ç","à", "¨","⇦",
"a","z","e","r","t", "y","u","i","o","p", "^","⏎",
"q","s","d","f","g", "h","j","k","l","m", "ù","⇧",
"w","x","c","v","b", "n",","," ",";",":", "!","⊕" ]
},
{ "name": "fr_grid2", "mark": "FR", "comp": "^aâ ^iî ^uû ^eê ^oô ¨eë ¨iï ",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "£","⇦",
"A","Z","E","R","T", "Y","U","I","O","P", "$","⏎",
"Q","S","D","F","G", "H","J","K","L","M", "%","⇩",
"W","X","C","V","B", "N","?"," ",".","/", "§","⊕" ]
},
{ "name": "es_grid1", "mark": "es",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "_","⇦",
"q","w","e","r","t", "y","u","i","o","p", "=","⏎",
"a","s","d","f","g", "h","j","k","l","ñ", "'","⇧",
"z","x","c","v","b", "n","m"," ",",",".", "/","⊕" ]
},
{ "name": "es_grid2", "mark": "ES",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "_","⇦",
"Q","W","E","R","T", "Y","U","I","O","P", "+","⏎",
"A","S","D","F","G", "H","J","K","L","Ñ", "'","⇩",
"Z","X","C","V","B", "N","M"," ","<",">", "Ç","⊕" ]
},
{ "name": "pt_grid1", "mark": "pt",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "`","⇦",
"q","w","e","r","t", "y","u","i","o","p", "'","⏎",
"a","s","d","f","g", "h","j","k","l","ç", "~","⇧",
"z","x","c","v","b", "n","m"," ",",",".", "^","⊕" ]
},
{ "name": "pt_grid2", "mark": "PT",
"grid": [ "1","2","3","4","5", "6","7","8","9","0", "`","⇦",
"Q","W","E","R","T", "Y","U","I","O","P", "'","⏎",
"A","S","D","F","G", "H","J","K","L","Ç", "~","⇩",
"Z","X","C","V","B", "N","M"," ","<",">", "^","⊕" ]
},


{ "country": "0" , "desc": "ENGLISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "1" , "desc": "JAPANESE" , "layout": ["jp_grid1","jp_grid2","jp_grid3", "jp_grid4", "us_grid1", "us_grid2", "symbols_grid1","symbols_grid1"] },
{ "country": "2" , "desc": "FRENCH" , "layout": ["fr_grid1","fr_grid2","us_grid1","us_grid2"] },
{ "country": "3" , "desc": "SPANISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "4" , "desc": "GERMAN" , "layout": ["ge_grid1","ge_grid2","us_grid1","us_grid2"] },
{ "country": "5" , "desc": "ITALIAN" , "layout": ["us_grid1","us_grid2"] },
{ "country": "6" , "desc": "DUTCH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "7" , "desc": "PO_BRAZIL" , "layout": ["us_grid1","us_grid2"] },
{ "country": "8" , "desc": "PORTUGAL" , "layout": ["us_grid1","us_grid2"] },
{ "country": "9" , "desc": "RUSSIAN" , "layout": ["us_grid1","us_grid2"] },
{ "country": "10", "desc": "KOREAN" , "layout": ["kr_grid1","kr_grid2","us_grid1", "us_grid2"] },
{ "country": "11", "desc": "CHINESE_TR", "layout": ["us_grid1","us_grid2"] },
{ "country": "12", "desc": "CHINESE_SI", "layout": ["us_grid1","us_grid2"] },
{ "country": "13", "desc": "ESPERANTO" , "layout": ["us_grid1","us_grid2"] },
{ "country": "14", "desc": "POLISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "15", "desc": "VIETNAMESE", "layout": ["us_grid1","us_grid2"] },
{ "country": "16", "desc": "ARABIC" , "layout": ["us_grid1","us_grid2"] },
{ "country": "17", "desc": "GREEK" , "layout": ["us_grid1","us_grid2"] },
{ "country": "18", "desc": "TURKISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "19", "desc": "SLOVAK" , "layout": ["us_grid1","us_grid2"] },
{ "country": "20", "desc": "PERSIAN" , "layout": ["us_grid1","us_grid2"] },
{ "country": "21", "desc": "HEBREW" , "layout": ["us_grid1","us_grid2"] },
{ "country": "22", "desc": "ASTURIAN" , "layout": ["us_grid1","us_grid2"] },
{ "country": "23", "desc": "FINNISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "24", "desc": "INDONESIAN", "layout": ["us_grid1","us_grid2"] },
{ "country": "25", "desc": "SWEDISH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "26", "desc": "UKRAINIAN" , "layout": ["us_grid1","us_grid2"] },
{ "country": "27", "desc": "CZECH" , "layout": ["us_grid1","us_grid2"] },
{ "country": "28", "desc": "VALENCIA" , "layout": ["us_grid1","us_grid2"] },
{ "country": "29", "desc": "CATALAN" , "layout": ["us_grid1","us_grid2"] },
]
}




97 changes: 76 additions & 21 deletions gfx/common/win32_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#include "../../tasks/task_content.h"
#include "../../tasks/tasks_internal.h"
#include "../../core_info.h"
#include "../../input/input_osk.h"

#if !defined(_XBOX)

Expand Down Expand Up @@ -920,6 +921,52 @@ static LRESULT CALLBACK wnd_proc_common(
/* Seems to be hard to synchronize
* WM_CHAR and WM_KEYDOWN properly.
*/

/* ctrl-v paste clip board */
if( wparam == RETROK_PASTE || (wparam>127 && wparam<256) )
{
int size = 0;
char* utf8 = NULL;
int codepage;
WORD lang = LOWORD(GetKeyboardLayout(0));
char data[8];
GetLocaleInfoA( MAKELCID(lang,SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, data, _countof(data) );
codepage = atoi(data);
if( wparam == RETROK_PASTE )
{
if( IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(hwnd) )
{
HGLOBAL hglb = GetClipboardData(CF_TEXT);
LPTSTR str = NULL;
char* cur = NULL;
int ulen = 0;
int i;
if( hglb ) str = GlobalLock(hglb);
if( str ) utf8 = codepage_to_utf8_string_alloc((const char*)str, (enum CodePage)codepage);
if( utf8 ) ulen = utf8len(utf8);
cur = utf8;
for( i=0; i<ulen; i++) input_keyboard_event(true, RETROK_UNKNOWN, utf8_get(&cur,0), 0, RETRO_DEVICE_KEYBOARD);
if( utf8 ) free(utf8);
if( hglb ) GlobalUnlock(hglb);
CloseClipboard();
}
return TRUE;
}
if( wparam>127 && wparam<256 )
{
uint32_t orig = wparam;
wparam = '?';
if( codepage )
{
char* cur = NULL;
utf8 = codepage_to_utf8_string_alloc((const char*)&orig, (enum CodePage)codepage);
if( utf8 ) cur = utf8;
input_keyboard_event(true, RETROK_UNKNOWN, utf8_get(&cur,0) , 0, RETRO_DEVICE_KEYBOARD);
free(utf8);
return TRUE;
}
}
}
input_keyboard_event(true, RETROK_UNKNOWN,
wparam, mod, RETRO_DEVICE_KEYBOARD);
}
Expand Down Expand Up @@ -1175,41 +1222,48 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd,
bool keydown = true;
bool quit = false;
win32_common_state_t *g_win32 = (win32_common_state_t*)&win32_st;

static int rsv_comp = 0;
switch (message)
{
case WM_IME_STARTCOMPOSITION:
rsv_comp =1;
break;
case WM_IME_ENDCOMPOSITION:
input_keyboard_event(true, 1, 0x80000000, 0, RETRO_DEVICE_KEYBOARD);
input_keyboard_event(true, 1, OSK_COMPOSITION, 0, RETRO_DEVICE_KEYBOARD);
rsv_comp = 0;
break;
case WM_IME_COMPOSITION:
{
HIMC hIMC = ImmGetContext(hwnd);
unsigned gcs = lparam & (GCS_COMPSTR|GCS_RESULTSTR);
if (gcs)
wchar_t* wstr = NULL;
char* utf8 = NULL;
while( gcs )
{
int i;
wchar_t wstr[4]={0,};
int len1 = ImmGetCompositionStringW(hIMC, gcs, wstr, 4);
wstr[2] = wstr[1];
wstr[1] = 0;
if ((len1 <= 0) || (len1 > 4))
break;
for (i = 0; i < len1; i = i + 2)
int len = ImmGetCompositionStringW(hIMC, gcs, NULL, 0);
if( !len ) break;
wstr = (wchar_t*) malloc(len+2);
if( !wstr ) break;
len = ImmGetCompositionStringW(hIMC, gcs, wstr, len) / 2;
if( !len ) break;
wstr[len] = L'\0';
utf8 = utf16_to_utf8_string_alloc(wstr);
if ( utf8 )
{
size_t len2;
char *utf8 = utf16_to_utf8_string_alloc(wstr+i);
if (!utf8)
continue;
len2 = strlen(utf8) + 1;
if (len2 >= 1 && len2 <= 3)
int i;
char* nxt = utf8;
input_keyboard_event(true, 1, OSK_COMPOSITION, 0, RETRO_DEVICE_KEYBOARD);
for (i=0; i<len; i++)
{
if (len2 >= 2)
utf8[3] = (gcs) | (gcs >> 4);
input_keyboard_event(true, 1, *((int*)utf8), 0, RETRO_DEVICE_KEYBOARD);
uint32_t ch = utf8_get(&nxt,0);
if( !(gcs&GCS_RESULTSTR) ) ch = ch | OSK_COMPOSITION;
input_keyboard_event(true, 1, ch , 0, RETRO_DEVICE_KEYBOARD);
}
free(utf8);
}
break;
}
if( utf8) free(utf8);
if (wstr) free(wstr);
ImmReleaseContext(hwnd, hIMC);
return 0;
}
Expand All @@ -1220,6 +1274,7 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd,
/* fall-through */
case WM_KEYDOWN: /* Key pressed */
case WM_SYSKEYDOWN: /* Key pressed */
if( keydown && rsv_comp ) return 0;
quit = true;
{
uint16_t mod = 0;
Expand Down
Loading