altgr for string input

This commit is contained in:
minjaesong
2021-11-09 20:58:30 +09:00
parent d5bf27aa93
commit dc0de876d5
6 changed files with 129 additions and 108 deletions

View File

@@ -1,19 +1,19 @@
{"n":"US Colemak","t":[[""],[undefined], {"n":"US Colemak","capslock":"back","t":[[""],[undefined],
[undefined], [undefined],
["<HOME>"], ["<HOME>"],
[undefined], [undefined],
["<CALL>"], ["<CALL>"],
["<ENDCALL>"], ["<ENDCALL>"],
["0",")"], ["0",")","","”"],
["1","!"], ["1","!","¡","¹"],
["2","@"], ["2","@","º","²"],
["3","#"], ["3","#","ª","³"],
["4","$"], ["4","$","¢","£"],
["5","%"], ["5","%","€","¥"],
["6","^"], ["6","^","ħ","Ħ"],
["7","&"], ["7","&","ð","Ð"],
["8","*"], ["8","*","þ","Þ"],
["9","("], ["9","(","","“"],
["*"], ["*"],
["#"], ["#"],
["<UP>"], ["<UP>"],
@@ -26,54 +26,54 @@
["<POWER>"], ["<POWER>"],
["<CAMERA>"], ["<CAMERA>"],
["<CLEAR>"], ["<CLEAR>"],
["a","A"], ["a","A","á","Á"],
["b","B"], ["b","B","\u0306","©"],
["c","C"], ["c","C","ç","Ç"],
["s","S"], ["s","S","ß","ẞ"],
["f","F"], ["f","F","ã","Ã"],
["t","T"], ["t","T","\u0301","\u030B"],
["d","D"], ["d","D","\u0308","°"],
["h","H"], ["h","H","\u030C","±"],
["u","U"], ["u","U","ú","Ú"],
["n","N"], ["n","N","ñ","Ñ"],
["e","E"], ["e","E","é","É"],
["i","I"], ["i","I","í","Í"],
["m","M"], ["m","M","\u0304","µ"],
["k","K"], ["k","K","\u030A","№"],
["y","Y"], ["y","Y","ü","Ü"],
[";",":"], [";",":","ö","Ö"],
["q","Q"], ["q","Q","ä","Ä"],
["p","P"], ["p","P","ø","Ø"],
["r","R"], ["r","R","\u0300","®"],
["g","G"], ["g","G","\u0328","¶"],
["l","L"], ["l","L","ł","Ł"],
["v","V"], ["v","V","œ","Œ"],
["w","W"], ["w","W","å","Å"],
["x","X"], ["x","X","\u0302","¤"],
["j","J"], ["j","J","đ","Đ"],
["z","Z"], ["z","Z","æ","Æ"],
[",","<"], [",","<","\u0327","·"],
[".",">"], [".",">","\u0307","…"],
["<ALT_L>"], ["<ALT_L>"],
["<ALT_R>"], ["<ALT_R>"],
["<SHIFT_L>"], ["<SHIFT_L>"],
["<SHIFT_R>"], ["<SHIFT_R>"],
["<TAB>"], ["<TAB>"],
[" "], [" "," ","\u00A0","\u00A0"],
["<SYM>"], ["<SYM>"],
["<EXPLORER>"], ["<EXPLORER>"],
["<ENVELOPE>"], ["<ENVELOPE>"],
["\n"], ["\n"],
["\x08"], ["\x08"],
["`","~"], ["`","~","\u0303","≈"],
["-","_"], ["-","_","","—"],
["=","+"], ["=","+","×","÷"],
["[","{"], ["[","{","«",""],
["]","}"], ["]","}","»",""],
["\\","|"], ["\\","|,"~","¦"],
["o","O"], ["o","O","ó","Ó"],
["'",'"'], ["'",'"',"õ","Õ"],
["/","?"], ["/","?","¿","§"],
["<AT>"], ["<AT>"],
["<NUM_LOCK>"], ["<NUM_LOCK>"],
["<HEADSETHOOK>"], ["<HEADSETHOOK>"],

View File

@@ -1,19 +1,19 @@
{"n":"US Colemak-DH","t":[[""],[undefined], {"n":"US Colemak-DH","capslock":"back","t":[[""],[undefined],
[undefined], [undefined],
["<HOME>"], ["<HOME>"],
[undefined], [undefined],
["<CALL>"], ["<CALL>"],
["<ENDCALL>"], ["<ENDCALL>"],
["0",")"], ["0",")","","”"],
["1","!"], ["1","!","¡","¹"],
["2","@"], ["2","@","º","²"],
["3","#"], ["3","#","ª","³"],
["4","$"], ["4","$","¢","£"],
["5","%"], ["5","%","€","¥"],
["6","^"], ["6","^","ħ","Ħ"],
["7","&"], ["7","&","ð","Ð"],
["8","*"], ["8","*","þ","Þ"],
["9","("], ["9","(","","“"],
["*"], ["*"],
["#"], ["#"],
["<UP>"], ["<UP>"],
@@ -26,54 +26,54 @@
["<POWER>"], ["<POWER>"],
["<CAMERA>"], ["<CAMERA>"],
["<CLEAR>"], ["<CLEAR>"],
["a","A"], ["a","A","á","Á"],
["v","V"], ["v","V","œ","Œ"],
["c","C"], ["c","C","ç","Ç"],
["s","S"], ["s","S","ß","ẞ"],
["f","F"], ["f","F","ã","Ã"],
["t","T"], ["t","T","\u0301","\u030B"],
["g","G"], ["g","G","\u0328","¶"],
["m","M"], ["m","M","\u0304","µ"],
["u","U"], ["u","U","ú","Ú"],
["n","N"], ["n","N","ñ","Ñ"],
["e","E"], ["e","E","é","É"],
["i","I"], ["i","I","í","Í"],
["h","H"], ["h","H","\u030C","±"],
["k","K"], ["k","K","\u030A","№"],
["y","Y"], ["y","Y","ü","Ü"],
[";",":"], [";",":","ö","Ö"],
["q","Q"], ["q","Q","ä","Ä"],
["p","P"], ["p","P","ø","Ø"],
["r","R"], ["r","R","\u0300","®"],
["b","B"], ["b","B","\u0306","©"],
["l","L"], ["l","L","ł","Ł"],
["d","D"], ["d","D","\u0308","°"],
["w","W"], ["w","W","å","Å"],
["x","X"], ["x","X","\u0302","¤"],
["j","J"], ["j","J","đ","Đ"],
["z","Z"], ["z","Z","æ","Æ"],
[",","<"], [",","<","\u0327","·"],
[".",">"], [".",">","\u0307","…"],
["<ALT_L>"], ["<ALT_L>"],
["<ALT_R>"], ["<ALT_R>"],
["<SHIFT_L>"], ["<SHIFT_L>"],
["<SHIFT_R>"], ["<SHIFT_R>"],
["<TAB>"], ["<TAB>"],
[" "], [" "," ","\u00A0","\u00A0"],
["<SYM>"], ["<SYM>"],
["<EXPLORER>"], ["<EXPLORER>"],
["<ENVELOPE>"], ["<ENVELOPE>"],
["\n"], ["\n"],
["\x08"], ["\x08"],
["`","~"], ["`","~","\u0303","≈"],
["-","_"], ["-","_","","—"],
["=","+"], ["=","+","×","÷"],
["[","{"], ["[","{","«",""],
["]","}"], ["]","}","»",""],
["\\","|"], ["\\","|,"~","¦"],
["o","O"], ["o","O","ó","Ó"],
["'",'"'], ["'",'"',"õ","Õ"],
["/","?"], ["/","?","¿","§"],
["<AT>"], ["<AT>"],
["<NUM_LOCK>"], ["<NUM_LOCK>"],
["<HEADSETHOOK>"], ["<HEADSETHOOK>"],

View File

@@ -1,4 +1,4 @@
{"n":"US Qwerty","t":[[""],[undefined], {"n":"US Qwerty","capslock":"caps","t":[[""],[undefined],
[undefined], [undefined],
["<HOME>"], ["<HOME>"],
[undefined], [undefined],

View File

@@ -8,9 +8,14 @@ typealias IMEOutput = String
data class TerrarumKeyLayout( data class TerrarumKeyLayout(
val name: String, val name: String,
val capsMode: TerrarumKeyCapsMode,
val symbols: Array<Array<String?>>? val symbols: Array<Array<String?>>?
) )
enum class TerrarumKeyCapsMode {
CAPS, SHIFT, BACK
}
data class TerrarumIME( data class TerrarumIME(
val name: String, val name: String,
val config: TerrarumIMEConf, val config: TerrarumIMEConf,
@@ -101,17 +106,25 @@ object IME {
return highLayers.keys.toList() return highLayers.keys.toList()
} }
private fun String.toCapsMode() = when (this.lowercase()) {
"caps" -> TerrarumKeyCapsMode.CAPS
"shift" -> TerrarumKeyCapsMode.SHIFT
"back" -> TerrarumKeyCapsMode.BACK
else -> throw IllegalArgumentException("Unknown capslock mode: $this")
}
private fun String.toViewCount() = when (this.lowercase()) { private fun String.toViewCount() = when (this.lowercase()) {
"none" -> TerrarumIMEViewCount.NONE "none" -> TerrarumIMEViewCount.NONE
"one" -> TerrarumIMEViewCount.ONE "one" -> TerrarumIMEViewCount.ONE
"many" -> TerrarumIMEViewCount.MANY "many" -> TerrarumIMEViewCount.MANY
else -> throw IllegalArgumentException(this) else -> throw IllegalArgumentException("Unknown candidates mode: $this")
} }
private fun parseKeylayoutFile(file: File): TerrarumKeyLayout { private fun parseKeylayoutFile(file: File): TerrarumKeyLayout {
val src = file.readText(Charsets.UTF_8) val src = file.readText(Charsets.UTF_8)
val jsval = context.eval("js", "'use strict';Object.freeze($src)") val jsval = context.eval("js", "'use strict';Object.freeze($src)")
val name = jsval.getMember("n").asString() val name = jsval.getMember("n").asString()
val capsmode = jsval.getMember("capslock").asString().toCapsMode()
val out = Array(256) { Array<String?>(4) { null } } val out = Array(256) { Array<String?>(4) { null } }
@@ -131,7 +144,7 @@ object IME {
// println("[IME] Test Keymap print for $name:"); for (keycode in 0 until 256) { print("$keycode:\t"); println(out[keycode].joinToString("\t")) } // println("[IME] Test Keymap print for $name:"); for (keycode in 0 until 256) { print("$keycode:\t"); println(out[keycode].joinToString("\t")) }
return TerrarumKeyLayout(name, out) return TerrarumKeyLayout(name, capsmode, out)
} }
private fun String.toCanditates(): List<String> = private fun String.toCanditates(): List<String> =

View File

@@ -57,14 +57,21 @@ object InputStrober {
repeatCount += 1 repeatCount += 1
val shiftin = keys.contains(Input.Keys.SHIFT_LEFT) || keys.contains(Input.Keys.SHIFT_RIGHT) val shiftin = keys.contains(Input.Keys.SHIFT_LEFT) || keys.contains(Input.Keys.SHIFT_RIGHT)
val altgrin = keys.contains(Input.Keys.ALT_RIGHT)
val keysym0 = keysToStr(keymap, keys) val keysym0 = keysToStr(keymap, keys)
val newKeysym0 = keysToStr(keymap, keyDiff) val newKeysym0 = keysToStr(keymap, keyDiff)
val keysym = if (keysym0 == null) null val keysym =
else if (shiftin && keysym0[1]?.isNotBlank() == true) keysym0[1] if (keysym0 == null) null
else keysym0[0] else if (shiftin && altgrin && keysym0[3]?.isNotBlank() == true) keysym0[3]
val newKeysym = if (newKeysym0 == null) null else if (altgrin && keysym0[2]?.isNotBlank() == true) keysym0[2]
else if (shiftin && newKeysym0[1]?.isNotBlank() == true) newKeysym0[1] else if (shiftin && keysym0[1]?.isNotBlank() == true) keysym0[1]
else newKeysym0[0] else keysym0[0]
val newKeysym =
if (newKeysym0 == null) null
else if (shiftin && altgrin && newKeysym0[3]?.isNotBlank() == true) newKeysym0[3]
else if (altgrin && newKeysym0[2]?.isNotBlank() == true) newKeysym0[2]
else if (shiftin && newKeysym0[1]?.isNotBlank() == true) newKeysym0[1]
else newKeysym0[0]
val headKeyCode = if (keyDiff.size < 1) keys[0] else keyDiff[0] val headKeyCode = if (keyDiff.size < 1) keys[0] else keyDiff[0]

View File

@@ -170,6 +170,7 @@ class UIItemTextLineInput(
fboUpdateLatch = true fboUpdateLatch = true
forceLitCursor() forceLitCursor()
val ime = getIME() val ime = getIME()
val lowLayer = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
if (keycodes.contains(App.getConfigInt("control_key_toggleime")) && repeatCount == 1) { if (keycodes.contains(App.getConfigInt("control_key_toggleime")) && repeatCount == 1) {
toggleIME() toggleIME()
@@ -182,7 +183,7 @@ class UIItemTextLineInput(
endComposing() endComposing()
copyToClipboard() copyToClipboard()
} }
else if (keycodes.contains(Input.Keys.BACKSPACE)) { else if (keycodes.contains(Input.Keys.BACKSPACE) || (keycodes.contains(Input.Keys.CAPS_LOCK) && lowLayer.capsMode == TerrarumKeyCapsMode.BACK)) {
if (ime != null && ime.composing()) { if (ime != null && ime.composing()) {
candidates = ime.backspace().map { CodepointSequence(it.toCodePoints()) } candidates = ime.backspace().map { CodepointSequence(it.toCodePoints()) }
} }