From 73b6fd3e96942d5102ea373a4b613915e445c59b Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 10 Nov 2021 11:22:26 +0900 Subject: [PATCH] all US layout is changed into Intl. equivalents with AltGr support; left Ctrl+Alt can substitute AltGr; added Russian keyboard layout --- assets/keylayout/Philosophy.md | 3 + assets/keylayout/cj5-sc.han | 2 + assets/keylayout/cj5-tc.han | 2 + ...{en_us_colemak.key => en_intl_colemak.key} | 4 +- ..._colemak_dh.key => en_intl_colemak_dh.key} | 4 +- .../{en_us_qwerty.key => en_intl_qwerty.key} | 84 ++--- assets/keylayout/ko_kr_2set_ksx5002.ime | 36 +-- assets/keylayout/ko_kr_3set_390.ime | 34 +-- assets/keylayout/ko_kr_3set_shin_p2.ime | 38 +-- assets/keylayout/ru_ru_jcuken.ime | 289 ++++++++++++++++++ .../terrarum/gamecontroller/InputStrober.kt | 21 +- .../terrarum/ui/UIItemTextLineInput.kt | 10 +- 12 files changed, 419 insertions(+), 108 deletions(-) create mode 100644 assets/keylayout/Philosophy.md rename assets/keylayout/{en_us_colemak.key => en_intl_colemak.key} (97%) rename assets/keylayout/{en_us_colemak_dh.key => en_intl_colemak_dh.key} (97%) rename assets/keylayout/{en_us_qwerty.key => en_intl_qwerty.key} (73%) create mode 100644 assets/keylayout/ru_ru_jcuken.ime diff --git a/assets/keylayout/Philosophy.md b/assets/keylayout/Philosophy.md new file mode 100644 index 000000000..eb4553cd1 --- /dev/null +++ b/assets/keylayout/Philosophy.md @@ -0,0 +1,3 @@ +1. All keyboard layout must be capable of typing both the target language's own currency sign and the in-game currency sign. + +2. Keyboard layout that cannot type English must be implemented using the IME. (JCUKEN is IME, but BÉPO is not) \ No newline at end of file diff --git a/assets/keylayout/cj5-sc.han b/assets/keylayout/cj5-sc.han index 10f10815d..d0cf065fb 100644 --- a/assets/keylayout/cj5-sc.han +++ b/assets/keylayout/cj5-sc.han @@ -19,6 +19,8 @@ os,们 ii,为 iu,说 +zxo,¤ + a,日 a,曰 aa,昌 diff --git a/assets/keylayout/cj5-tc.han b/assets/keylayout/cj5-tc.han index 87b1e90ed..693f21995 100644 --- a/assets/keylayout/cj5-tc.han +++ b/assets/keylayout/cj5-tc.han @@ -22,6 +22,8 @@ if,為 bf,為 yu,說 +zxo,¤ + a,日 a,曰 aa,昌 diff --git a/assets/keylayout/en_us_colemak.key b/assets/keylayout/en_intl_colemak.key similarity index 97% rename from assets/keylayout/en_us_colemak.key rename to assets/keylayout/en_intl_colemak.key index d3a3a6ba0..43e13163f 100644 --- a/assets/keylayout/en_us_colemak.key +++ b/assets/keylayout/en_intl_colemak.key @@ -1,4 +1,4 @@ -{"n":"US Colemak","capslock":"back","t":[[""],[undefined], +{"n":"Colemak","capslock":"back","t":[[""],[undefined], [undefined], [""], [undefined], @@ -92,7 +92,7 @@ [""], [""], [""], -["TCH_CHARSET>"], +[""], ["<:A:>"], ["<:B:>"], ["<:C:>"], diff --git a/assets/keylayout/en_us_colemak_dh.key b/assets/keylayout/en_intl_colemak_dh.key similarity index 97% rename from assets/keylayout/en_us_colemak_dh.key rename to assets/keylayout/en_intl_colemak_dh.key index 07524ae62..6ad56148a 100644 --- a/assets/keylayout/en_us_colemak_dh.key +++ b/assets/keylayout/en_intl_colemak_dh.key @@ -1,4 +1,4 @@ -{"n":"US Colemak-DH","capslock":"back","t":[[""],[undefined], +{"n":"Colemak-DH","capslock":"back","t":[[""],[undefined], [undefined], [""], [undefined], @@ -92,7 +92,7 @@ [""], [""], [""], -["TCH_CHARSET>"], +[""], ["<:A:>"], ["<:B:>"], ["<:C:>"], diff --git a/assets/keylayout/en_us_qwerty.key b/assets/keylayout/en_intl_qwerty.key similarity index 73% rename from assets/keylayout/en_us_qwerty.key rename to assets/keylayout/en_intl_qwerty.key index 99ec6a0a7..24c98086a 100644 --- a/assets/keylayout/en_us_qwerty.key +++ b/assets/keylayout/en_intl_qwerty.key @@ -1,19 +1,19 @@ -{"n":"US Qwerty","capslock":"caps","t":[[""],[undefined], +{"n":"US-Intl. Qwerty","capslock":"caps","t":[[""],[undefined], [undefined], [""], [undefined], [""], [""], -["0",")"], -["1","!"], -["2","@"], -["3","#"], -["4","$"], -["5","%"], -["6","^"], -["7","&"], -["8","*"], -["9","("], +["0",")","’","”"], +["1","!","¡","¹"], +["2","@","º","²"], +["3","#","ª","³"], +["4","$","¤","£"], +["5","%","€","€"], +["6","^","¼","\u0302"], +["7","&","½","½"], +["8","*","¾","¾"], +["9","(","‘","“"], ["*"], ["#"], [""], @@ -26,54 +26,54 @@ [""], [""], [""], -["a","A"], +["a","A","á","Á"], ["b","B"], -["c","C"], -["d","D"], -["e","E"], +["c","C","¢","©"], +["d","D","ð","Ð"], +["e","E","é","É"], ["f","F"], ["g","G"], ["h","H"], -["i","I"], +["i","I","í","Í"], ["j","J"], ["k","K"], -["l","L"], -["m","M"], -["n","N"], -["o","O"], -["p","P"], -["q","Q"], -["r","R"], -["s","S"], -["t","T"], -["u","U"], +["l","L","ø","Ø"], +["m","M","µ","µ"], +["n","N","ñ","Ñ"], +["o","O","ó","Ó"], +["p","P","ö","Ö"], +["q","Q","ä","Ä"], +["r","R","®","®"], +["s","S","ß","§"], +["t","T","þ","Þ"], +["u","U","ú","Ú"], ["v","V"], -["w","W"], -["x","X"], -["y","Y"], -["z","Z"], -[",","<"], +["w","W","å","Å"], +["x","X","¤","¤"], +["y","Y","ü","Ü"], +["z","Z","æ","Æ"], +[",","<","ç","Ç"], [".",">"], [""], [""], [""], [""], [""], -[" "], +[" "," ","\u00A0","\u00A0"], [""], [""], [""], ["\n"], ["\x08"], -["`","~"], -["-","_"], -["=","+"], -["[","{"], -["]","}"], -["\\","|"], -[";",":"], -["'",'"'], -["/","?"], +["`","~","\u0300","\u0303"], +["-","_","–","—"], +["=","+","×","÷"], +["[","{","«","‹"], +["]","}","»","›"], +["\\","|","¬","¦"], +[";",":","¶","°"], +["'",'"',"\u0301","\u0308"], +["/","?","¿","¿"], [""], [""], [""], @@ -92,7 +92,7 @@ [""], [""], [""], -["TCH_CHARSET>"], +[""], ["<:A:>"], ["<:B:>"], ["<:C:>"], diff --git a/assets/keylayout/ko_kr_2set_ksx5002.ime b/assets/keylayout/ko_kr_2set_ksx5002.ime index 99cd9ea3b..ad845955f 100644 --- a/assets/keylayout/ko_kr_2set_ksx5002.ime +++ b/assets/keylayout/ko_kr_2set_ksx5002.ime @@ -65,12 +65,12 @@ let states = {"keylayouts":[[""],[undefined], [undefined], ["\n"], ["\x08"], -["`","~"], +["¤","~"], ["-","_"], ["=","+"], ["[","{"], ["]","}"], -["\\","|"], +["\\","₩"], [";",":"], ["'",'"'], ["/","?"], @@ -261,20 +261,20 @@ let reset = () => { states.buf = [] } let inRange = (s,a,b) => (a <= s && s <= b) -let isHangul = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x3131, 0x318E) -let isConsonant = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x3131, 0x314E) -let isVowel = (s) => (s === undefined) ? false : (inRange(s.charCodeAt(0), 0x314F, 0x3163) || inRange(s.charCodeAt(0), 0x318D, 0x318E)) -let isVowelSuper = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x318D, 0x318E) -let isJongseongConsonant = (s) => (s === undefined) ? false : (inRange(s.charCodeAt(0), 0x3131, 0x314E) && !([0x3138, 0x3143, 0x3149].includes(s.charCodeAt(0)))) -let isJungseongDigraph1 = (s) => (s === undefined) ? false : ([0x3157, 0x315C].includes(s.charCodeAt(0))) -let isJungseongDigraphO = (s) => (s === undefined) ? false : ([0x314F, 0x3150, 0x3163].includes(s.charCodeAt(0))) -let isJungseongDigraphU = (s) => (s === undefined) ? false : ([0x3153, 0x3154, 0x3163].includes(s.charCodeAt(0))) -let isJungseongDigraphEU = (s) => (s === undefined) ? false : ([0x3163].includes(s.charCodeAt(0))) -let isJungseongDigraphAA = (s) => (s === undefined) ? false : ([0x3163].includes(s.charCodeAt(0))) -let isJongseongDigraphG = (s) => (s === undefined) ? false : ([0x3145].includes(s.charCodeAt(0))) -let isJongseongDigraphN = (s) => (s === undefined) ? false : ([0x3148, 0x314E].includes(s.charCodeAt(0))) -let isJongseongDigraphR = (s) => (s === undefined) ? false : ([0x3131, 0x3141, 0x3142, 0x3145, 0x314C, 0x314D, 0x314E].includes(s.charCodeAt(0))) -let isJongseongDigraphB = (s) => (s === undefined) ? false : ([0x3145].includes(s.charCodeAt(0))) +let isHangul = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x3131, 0x318E) +let isConsonant = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x3131, 0x314E) +let isVowel = (s) => s !== undefined && (inRange(s.charCodeAt(0), 0x314F, 0x3163) || inRange(s.charCodeAt(0), 0x318D, 0x318E)) +let isVowelSuper = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x318D, 0x318E) +let isJongseongConsonant = (s) => s !== undefined && (inRange(s.charCodeAt(0), 0x3131, 0x314E) && !([0x3138, 0x3143, 0x3149].includes(s.charCodeAt(0)))) +let isJungseongDigraph1 = (s) => s !== undefined && ([0x3157, 0x315C].includes(s.charCodeAt(0))) +let isJungseongDigraphO = (s) => s !== undefined && ([0x314F, 0x3150, 0x3163].includes(s.charCodeAt(0))) +let isJungseongDigraphU = (s) => s !== undefined && ([0x3153, 0x3154, 0x3163].includes(s.charCodeAt(0))) +let isJungseongDigraphEU = (s) => s !== undefined && ([0x3163].includes(s.charCodeAt(0))) +let isJungseongDigraphAA = (s) => s !== undefined && ([0x3163].includes(s.charCodeAt(0))) +let isJongseongDigraphG = (s) => s !== undefined && ([0x3145].includes(s.charCodeAt(0))) +let isJongseongDigraphN = (s) => s !== undefined && ([0x3148, 0x314E].includes(s.charCodeAt(0))) +let isJongseongDigraphR = (s) => s !== undefined && ([0x3131, 0x3141, 0x3142, 0x3145, 0x314C, 0x314D, 0x314E].includes(s.charCodeAt(0))) +let isJongseongDigraphB = (s) => s !== undefined && ([0x3145].includes(s.charCodeAt(0))) let jungseongDigraphsO = {"\u314F":"\u3158", "\u3150":"\u3159", "\u3163":"\u315A"} let jungseongDigraphsU = {"\u3153":"\u315D", "\u3154":"\u315E", "\u3163":"\u315F"} let jungseongDigraphsEU = {"\u3163":"\u3162"} @@ -283,8 +283,8 @@ let jongseongDigraphsG = {"\u3145":"\u3133"} let jongseongDigraphsN = {"\u3148":"\u3135", "\u314E":"\u3136"} let jongseongDigraphsR = {"\u3131":"\u313A", "\u3141":"\u313B", "\u3142":"\u313C", "\u3145":"\u313D", "\u314C":"\u313E", "\u314D":"\u313F", "\u314E":"\u3140"} let jongseongDigraphsB = {"\u3145":"\u3144"} -let isThisCharJongseongDigraph = (s) => (s === undefined) ? false : ([0x3133, 0x3135, 0x3136, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3144].includes(s.charCodeAt(0))) -let isThisCharJungseongDigraph = (s) => (s === undefined) ? false : ([0x3158, 0x3159, 0x315A, 0x315D, 0x315E, 0x315F, 0x3162, 0x318E].includes(s.charCodeAt(0))) +let isThisCharJongseongDigraph = (s) => s !== undefined && ([0x3133, 0x3135, 0x3136, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3144].includes(s.charCodeAt(0))) +let isThisCharJungseongDigraph = (s) => s !== undefined && ([0x3158, 0x3159, 0x315A, 0x315D, 0x315E, 0x315F, 0x3162, 0x318E].includes(s.charCodeAt(0))) let choseongTable = {"\u3131":0,"\u3132":1,"\u3134":2,"\u3137":3,"\u3138":4,"\u3139":5,"\u3141":6,"\u3142":7,"\u3143":8,"\u3145":9,"\u3146":10,"\u3147":11,"\u3148":12,"\u3149":13,"\u314A":14,"\u314B":15,"\u314C":16,"\u314D":17,"\u314E":18} let jongseongTable = {"\u3131":0,"\u3132":1,"\u3133":2,"\u3134":3,"\u3135":4,"\u3136":5,"\u3137":6,"\u3139":7,"\u313A":8,"\u313B":9,"\u313C":10,"\u313D":11,"\u313E":12,"\u313F":13,"\u3140":14,"\u3141":15,"\u3142":16,"\u3144":17,"\u3145":18,"\u3146":19,"\u3147":20,"\u3148":21,"\u314A":22,"\u314B":23,"\u314C":24,"\u314D":25,"\u314E":26} let detachJongseongDigraph = { diff --git a/assets/keylayout/ko_kr_3set_390.ime b/assets/keylayout/ko_kr_3set_390.ime index 6cc429e8f..38574cbe6 100644 --- a/assets/keylayout/ko_kr_3set_390.ime +++ b/assets/keylayout/ko_kr_3set_390.ime @@ -65,12 +65,12 @@ let states = {"keylayouts":[[""],[undefined], [undefined], ["\n"], ["\x08"], -["`","~"], +["¤","~"], ["-","_"], ["=","+"], ["[","{"], ["]","}"], -["\\","|"], +["\\","₩"], ["\u1107",":"], ["\u1110",'"'], ["\u1169","?"], @@ -261,21 +261,21 @@ let reset = () => { states.buf = [] } let inRange = (s,a,b) => (a <= s && s <= b) -let isHangul = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1100, 0x11C2) -let isChoseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1100, 0x1112) -let isJungseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1161, 0x1175) -let isJongseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x11A8, 0x11C2) -let isChoseongDigraph = (s) => (s === undefined) ? false : ([0x1100, 0x1103, 0x1107, 0x1109, 0x110C].includes(s.charCodeAt(0))) -let isThisCharChoseongDigraph = (s) => (s === undefined) ? false : ([0x1101, 0x1104, 0x1108, 0x110A, 0x110D].includes(s.charCodeAt(0))) -let isThisCharJungseongDigraph = (s) => (s === undefined) ? false : ([0x116A, 0x116B, 0x116C, 0x116F, 0x1170, 0x1171, 0x1174].includes(s.charCodeAt(0))) -let isThisCharJongseongDigraph = (s) => (s === undefined) ? false : ([0x11A9, 0x11AA, 0x11AC, 0x11AD, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B9].includes(s.charCodeAt(0))) // ㅆ is an exception! -let isJungseongDigraphO = (s) => (s === undefined) ? false : ([0x1161, 0x1162, 0x1175].includes(s.charCodeAt(0))) -let isJungseongDigraphU = (s) => (s === undefined) ? false : ([0x1165, 0x1166, 0x1175].includes(s.charCodeAt(0))) -let isJungseongDigraphEU = (s) => (s === undefined) ? false : ([0x1175].includes(s.charCodeAt(0))) -let isJongseongDigraphG = (s) => (s === undefined) ? false : ([0x11A8, 0x11BA].includes(s.charCodeAt(0))) -let isJongseongDigraphN = (s) => (s === undefined) ? false : ([0x11BD, 0x11C2].includes(s.charCodeAt(0))) -let isJongseongDigraphR = (s) => (s === undefined) ? false : ([0x11A8, 0x11B7, 0x11B8, 0x11BA, 0x11C0, 0x11C1, 0x11C2].includes(s.charCodeAt(0))) -let isJongseongDigraphB = (s) => (s === undefined) ? false : ([0x11BA].includes(s.charCodeAt(0))) +let isHangul = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1100, 0x11C2) +let isChoseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1100, 0x1112) +let isJungseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1161, 0x1175) +let isJongseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x11A8, 0x11C2) +let isChoseongDigraph = (s) => s !== undefined && ([0x1100, 0x1103, 0x1107, 0x1109, 0x110C].includes(s.charCodeAt(0))) +let isThisCharChoseongDigraph = (s) => s !== undefined && ([0x1101, 0x1104, 0x1108, 0x110A, 0x110D].includes(s.charCodeAt(0))) +let isThisCharJungseongDigraph = (s) => s !== undefined && ([0x116A, 0x116B, 0x116C, 0x116F, 0x1170, 0x1171, 0x1174].includes(s.charCodeAt(0))) +let isThisCharJongseongDigraph = (s) => s !== undefined && ([0x11A9, 0x11AA, 0x11AC, 0x11AD, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B9].includes(s.charCodeAt(0))) // ㅆ is an exception! +let isJungseongDigraphO = (s) => s !== undefined && ([0x1161, 0x1162, 0x1175].includes(s.charCodeAt(0))) +let isJungseongDigraphU = (s) => s !== undefined && ([0x1165, 0x1166, 0x1175].includes(s.charCodeAt(0))) +let isJungseongDigraphEU = (s) => s !== undefined && ([0x1175].includes(s.charCodeAt(0))) +let isJongseongDigraphG = (s) => s !== undefined && ([0x11A8, 0x11BA].includes(s.charCodeAt(0))) +let isJongseongDigraphN = (s) => s !== undefined && ([0x11BD, 0x11C2].includes(s.charCodeAt(0))) +let isJongseongDigraphR = (s) => s !== undefined && ([0x11A8, 0x11B7, 0x11B8, 0x11BA, 0x11C0, 0x11C1, 0x11C2].includes(s.charCodeAt(0))) +let isJongseongDigraphB = (s) => s !== undefined && ([0x11BA].includes(s.charCodeAt(0))) let choseongDigraphs = {"\u1100":"\u1101", "\u1103":"\u1104", "\u1107":"\u1108", "\u1109":"\u110A", "\u110C":"\u110D"} let jungseongDigraphsO = {"\u1161":"\u116A", "\u1162":"\u116B", "\u1175":"\u116C"} let jungseongDigraphsU = {"\u1165":"\u116F", "\u1166":"\u1170", "\u1175":"\u1171"} diff --git a/assets/keylayout/ko_kr_3set_shin_p2.ime b/assets/keylayout/ko_kr_3set_shin_p2.ime index a776156ca..39b9be47b 100644 --- a/assets/keylayout/ko_kr_3set_shin_p2.ime +++ b/assets/keylayout/ko_kr_3set_shin_p2.ime @@ -33,7 +33,7 @@ let states = {"keylayouts":[[""],[undefined], ["\u11B8","\u1162","\u1162"], ["\u11C1","\u1161","\u1161"], ["\u11AE","\u1173","\u1173"], -["\u1102","\u25A1"], +["\u1102","₩"], ["\u1106","\u1173","\u1173"], ["\u110B","'"], ["\u1100",'"'], @@ -46,7 +46,7 @@ let states = {"keylayouts":[[""],[undefined], ["\u11C0","\u1165","\u1165"], ["\u11AB","\u1168","\u1168"], ["\u11BF","\u1167","\u1167"], -["\u1103","\u25CB"], +["\u1103","¤"], ["\u11BD","\u1169","\u1169"], ["\u11AF","\u1163","\u1163"], ["\u11BB","\u116D","\u116D"], @@ -264,23 +264,23 @@ let reset = () => { states.hasDeadkey = false } let inRange = (s,a,b) => (a <= s && s <= b) -let isHangul = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1100, 0x11FF) -let isChoseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1100, 0x1112) -let isJungseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1161, 0x1175) -let isJongseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x11A8, 0x11C2) -let isJungseongSuper = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x119E, 0x11A2) -let isChoseongDigraph = (s) => (s === undefined) ? false : ([0x1100, 0x1103, 0x1107, 0x1109, 0x110C].includes(s.charCodeAt(0))) -let isThisCharChoseongDigraph = (s) => (s === undefined) ? false : ([0x1101, 0x1104, 0x1108, 0x110A, 0x110D].includes(s.charCodeAt(0))) -let isThisCharJungseongDigraph = (s) => (s === undefined) ? false : ([0x116A, 0x116B, 0x116C, 0x116F, 0x1170, 0x1171, 0x1174, 0x119F, 0x11A0, 0x11A1, 0x11A2].includes(s.charCodeAt(0))) -let isThisCharJongseongDigraph = (s) => (s === undefined) ? false : ([0x11A9, 0x11AA, 0x11AC, 0x11AD, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B9].includes(s.charCodeAt(0))) // ㅆ is an exception! -let isJungseongDigraphO = (s) => (s === undefined) ? false : ([0x1161, 0x1162, 0x1175].includes(s.charCodeAt(0))) -let isJungseongDigraphU = (s) => (s === undefined) ? false : ([0x1165, 0x1166, 0x1175].includes(s.charCodeAt(0))) -let isJungseongDigraphEU = (s) => (s === undefined) ? false : ([0x1175].includes(s.charCodeAt(0))) -let isJungseongDigraphAA = (s) => (s === undefined) ? false : ([0x1165, 0x116E, 0x1175, 0x119E].includes(s.charCodeAt(0))) -let isJongseongDigraphG = (s) => (s === undefined) ? false : ([0x11A8, 0x11BA].includes(s.charCodeAt(0))) -let isJongseongDigraphN = (s) => (s === undefined) ? false : ([0x11BD, 0x11C2].includes(s.charCodeAt(0))) -let isJongseongDigraphR = (s) => (s === undefined) ? false : ([0x11A8, 0x11B7, 0x11B8, 0x11BA, 0x11C0, 0x11C1, 0x11C2].includes(s.charCodeAt(0))) -let isJongseongDigraphB = (s) => (s === undefined) ? false : ([0x11BA].includes(s.charCodeAt(0))) +let isHangul = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1100, 0x11FF) +let isChoseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1100, 0x1112) +let isJungseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x1161, 0x1175) +let isJongseong = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x11A8, 0x11C2) +let isJungseongSuper = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x119E, 0x11A2) +let isChoseongDigraph = (s) => s !== undefined && ([0x1100, 0x1103, 0x1107, 0x1109, 0x110C].includes(s.charCodeAt(0))) +let isThisCharChoseongDigraph = (s) => s !== undefined && ([0x1101, 0x1104, 0x1108, 0x110A, 0x110D].includes(s.charCodeAt(0))) +let isThisCharJungseongDigraph = (s) => s !== undefined && ([0x116A, 0x116B, 0x116C, 0x116F, 0x1170, 0x1171, 0x1174, 0x119F, 0x11A0, 0x11A1, 0x11A2].includes(s.charCodeAt(0))) +let isThisCharJongseongDigraph = (s) => s !== undefined && ([0x11A9, 0x11AA, 0x11AC, 0x11AD, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B9].includes(s.charCodeAt(0))) // ㅆ is an exception! +let isJungseongDigraphO = (s) => s !== undefined && ([0x1161, 0x1162, 0x1175].includes(s.charCodeAt(0))) +let isJungseongDigraphU = (s) => s !== undefined && ([0x1165, 0x1166, 0x1175].includes(s.charCodeAt(0))) +let isJungseongDigraphEU = (s) => s !== undefined && ([0x1175].includes(s.charCodeAt(0))) +let isJungseongDigraphAA = (s) => s !== undefined && ([0x1165, 0x116E, 0x1175, 0x119E].includes(s.charCodeAt(0))) +let isJongseongDigraphG = (s) => s !== undefined && ([0x11A8, 0x11BA].includes(s.charCodeAt(0))) +let isJongseongDigraphN = (s) => s !== undefined && ([0x11BD, 0x11C2].includes(s.charCodeAt(0))) +let isJongseongDigraphR = (s) => s !== undefined && ([0x11A8, 0x11B7, 0x11B8, 0x11BA, 0x11C0, 0x11C1, 0x11C2].includes(s.charCodeAt(0))) +let isJongseongDigraphB = (s) => s !== undefined && ([0x11BA].includes(s.charCodeAt(0))) let choseongDigraphs = {"\u1100":"\u1101", "\u1103":"\u1104", "\u1107":"\u1108", "\u1109":"\u110A", "\u110C":"\u110D"} let jungseongDigraphsO = {"\u1161":"\u116A", "\u1162":"\u116B", "\u1175":"\u116C"} let jungseongDigraphsU = {"\u1165":"\u116F", "\u1166":"\u1170", "\u1175":"\u1171"} diff --git a/assets/keylayout/ru_ru_jcuken.ime b/assets/keylayout/ru_ru_jcuken.ime new file mode 100644 index 000000000..796fac53f --- /dev/null +++ b/assets/keylayout/ru_ru_jcuken.ime @@ -0,0 +1,289 @@ +let states = {"keylayouts":[[""],[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +["0",")"], +["1","!"], +["2",'"'], +["3","¤"], +["4",";"], +["5","%"], +["6",":"], +["7","?"], +["8","₽"], +["9","("], +["*"], +["#"], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +["ф","Ф"], +["и","И"], +["с","С"], +["в","В"], +["у","У"], +["а","А"], +["п","П"], +["р","Р"], +["ш","Ш"], +["о","О"], +["л","Л"], +["д","Д"], +["ь","Ь"], +["т","Т"], +["щ","Щ"], +["з","З"], +["й","Й"], +["к","К"], +["ы","Ы"], +["е","Е"], +["г","Г"], +["м","М"], +["ц","Ц"], +["ч","Ч"], +["н","Н"], +["я","Я"], +["б","Б"], +["ю","Ю"], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[" "], +[undefined], +[undefined], +[undefined], +["\n"], +["\x08"], +["ё","Ё"], +["-","_"], +["=","+"], +["х","Х"], +["ъ","Ъ"], +["\\","/"], +["ж","Ж"], +["э",'Э'], +[".",","], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +["0"], +["1"], +["2"], +["3"], +["4"], +["5"], +["6"], +["7"], +["8"], +["9"], +["/"], +["*"], +["-"], +["+"], +["."], +["."], +["\n"], +["="], +["("], +[")"], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined], +[undefined] +], +"code":0} // practically unused as long as there are no diacritics on the keyboard +let reset = () => { + states.code = 0 +} +let inRange = (s,a,b) => (a <= s && s <= b) +let isDiacritics = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x0300, 0x036F) +return Object.freeze({"n":"Русс. ЙЦУКЕН","v":"none","c":"CuriousTo\uA75Bvald", +// return: [displayed output, composed output] +"accept":(headkey,shiftin,altgrin)=>{ + let layer = 1*shiftin// + 2*altgrin + states.code = 1 + + let s = states.keylayouts[headkey][layer] + + if (isDiacritics(s)) { + return ['', ''] + } + else { + reset() + return ['', s] + } +}, +"backspace":()=>{ + reset() + return '' +}, +"end":()=>{ + reset() + return '' +}, +"reset":()=>{ reset() }, +"composing":()=>(states.code!=0) +}) \ No newline at end of file diff --git a/src/net/torvald/terrarum/gamecontroller/InputStrober.kt b/src/net/torvald/terrarum/gamecontroller/InputStrober.kt index 6cda59b4f..a95125474 100644 --- a/src/net/torvald/terrarum/gamecontroller/InputStrober.kt +++ b/src/net/torvald/terrarum/gamecontroller/InputStrober.kt @@ -56,8 +56,8 @@ object InputStrober { stroboTime = System.nanoTime() repeatCount += 1 - val shiftin = keys.contains(Input.Keys.SHIFT_LEFT) || keys.contains(Input.Keys.SHIFT_RIGHT) - val altgrin = keys.contains(Input.Keys.ALT_RIGHT) + val shiftin = keys.containsSome(Input.Keys.SHIFT_LEFT, Input.Keys.SHIFT_RIGHT) + val altgrin = keys.contains(Input.Keys.ALT_RIGHT) || keys.containsAll(Input.Keys.ALT_LEFT, Input.Keys.CONTROL_LEFT) val keysym0 = keysToStr(keymap, keys) val newKeysym0 = keysToStr(keymap, keyDiff) val keysym = @@ -143,4 +143,19 @@ data class TerrarumKeyboardEvent( val headkey: Int, // representative keycode val repeatCount: Int, val keycodes: IntArray -) \ No newline at end of file +) + + +fun IntArray.containsAll(vararg keys: Int): Boolean { + keys.forEach { + if (!this.contains(it)) return false + } + return true +} + +fun IntArray.containsSome(vararg keys: Int): Boolean { + keys.forEach { + if (this.contains(it)) return true + } + return false +} diff --git a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt index 4927d6ac5..333a26609 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt @@ -175,11 +175,11 @@ class UIItemTextLineInput( if (keycodes.contains(App.getConfigInt("control_key_toggleime")) && repeatCount == 1) { toggleIME() } - else if (keycodes.contains(Input.Keys.V) && (keycodes.contains(Input.Keys.CONTROL_LEFT) || keycodes.contains(Input.Keys.CONTROL_RIGHT))) { + else if (keycodes.contains(Input.Keys.V) && keycodes.containsSome(Input.Keys.CONTROL_LEFT, Input.Keys.CONTROL_RIGHT)) { endComposing() paste(Clipboard.fetch().substringBefore('\n').substringBefore('\t').toCodePoints()) } - else if (keycodes.contains(Input.Keys.C) && (keycodes.contains(Input.Keys.CONTROL_LEFT) || keycodes.contains(Input.Keys.CONTROL_RIGHT))) { + else if (keycodes.contains(Input.Keys.C) && (keycodes.containsSome(Input.Keys.CONTROL_LEFT, Input.Keys.CONTROL_RIGHT))) { endComposing() copyToClipboard() } @@ -234,8 +234,8 @@ class UIItemTextLineInput( // - literal "<" // - keysymbol that does not start with "<" (not always has length of 1 because UTF-16) else if (char != null && char.length > 0 && char[0].code >= 32 && (char == "<" || !char.startsWith("<"))) { - val shiftin = keycodes.contains(Input.Keys.SHIFT_LEFT) || keycodes.contains(Input.Keys.SHIFT_RIGHT) - val altgrin = keycodes.contains(Input.Keys.ALT_RIGHT) + val shiftin = keycodes.containsSome(Input.Keys.SHIFT_LEFT, Input.Keys.SHIFT_RIGHT) + val altgrin = keycodes.contains(Input.Keys.ALT_RIGHT) || keycodes.containsAll(Input.Keys.ALT_LEFT, Input.Keys.CONTROL_LEFT) val codepoints = if (ime != null) { val newStatus = ime.acceptChar(headkey, shiftin, altgrin, char) @@ -256,7 +256,7 @@ class UIItemTextLineInput( tryCursorBack() } } - else if (keycodes.contains(Input.Keys.ENTER) || keycodes.contains(Input.Keys.NUMPAD_ENTER)) { + else if (keycodes.containsSome(Input.Keys.ENTER, Input.Keys.NUMPAD_ENTER)) { endComposing() }