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

西文模式下無法用滑動來打大寫字母 #820

Closed
syimyuzya opened this issue Jul 28, 2022 · 11 comments
Closed

西文模式下無法用滑動來打大寫字母 #820

syimyuzya opened this issue Jul 28, 2022 · 11 comments

Comments

@syimyuzya
Copy link

syimyuzya commented Jul 28, 2022

Describe the bug

我的自定義軟鍵盤,字母鍵有類似這樣的配置:

...
- {label: '手', click: 'q', hint: 'Q', swipe_up: 'Q', long_click: '_'}
- {label: '田', click: 'w', hint: 'W', swipe_up: 'W', long_click: '-'}
- {label: '水', click: 'e', hint: 'E', swipe_up: 'E', long_click: '+'}
- {label: '口', click: 'r', hint: 'R', swipe_up: 'R', long_click: '='}
...
- {click: ';', swipe_up: ':', long_click: ':'}

但是在 3.2.7 版的西文模式下,swipe_up 的項只對符號和數字有效(比如「;」鍵向上滑是「:」或者預設鍵盤頂排鍵可以上滑打數字等,而利用↑的配置想上滑打大寫字母卻完全沒有反應)。

【而更奇怪的是,中文模式下卻能正常的用它(但這樣會先將大寫字母打進編輯欄中,再按 space 才能出字,很麻煩)

To Reproduce

  1. 在 trime.custom.yaml 中為某輸入法配置如上所述的鍵盤
  2. 重新部署
  3. 輸入法切為西文模式
  4. 試着用字母鍵上滑輸入大寫字母

Expected behavior

應當能打出大寫字母。

Actual behavior

完全沒有效果。

Smartphone (please complete the following information):

  • Device: Xiaomi Mix 4
  • OS: Android 12
  • Theme: Default
  • Version: 3.2.7
  • Build info:
    Build: null
    Date: 2022-07-07 10:11 UTC
    Commit: v3.2.6-90-g68de0c6, 2022-06-29 22:45:02 +0800
    Branch:
    Repository: https://github.com/osfans/trime
    
@tumuyan
Copy link
Contributor

tumuyan commented Jul 30, 2022

大写字母在实体键盘中是不存在的,只有小写字母键。shift+大写字母没有构成组合键,所以没有反应是正常的。
建议设置下滑为Shift+小写字母,或者直接使用Shift键并点击对应字母键。

@syimyuzya
Copy link
Author

syimyuzya commented Jul 30, 2022

大写字母在实体键盘中是不存在的,只有小写字母键。shift+大写字母没有构成组合键,所以没有反应是正常的。 建议设置下滑为Shift+小写字母,或者直接使用Shift键并点击对应字母键。

那麼,過去版本(v3.2.6 及更早)又是怎樣做到這一功能的呢?靠模擬一個 shift 鍵組合還是靠什麼呢?

另外即使大寫字母真的「實際鍵盤中不存在」,可是符號呢?比如圓括號 () 這類字符,在這個「實體鍵盤」中卻存在對應的鍵……是這樣麼?

@tumuyan
Copy link
Contributor

tumuyan commented Jul 30, 2022

另外即使大寫字母真的「實際鍵盤中不存在」,可是符號呢?比如圓括號 () 這類字符,在這個「實體鍵盤」中卻存在對應的鍵……是這樣麼?

在Android系统中,()等多个按键也是存在的,而不是需要通过shift模拟(虽然你可能觉得离谱)。当然,也并非每个符号键都存在

    /** Key code constant: Numeric keypad '(' key. */
    public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;
    /** Key code constant: Numeric keypad ')' key. */
    public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;

是不存在的,依靠输入法对/进行转换(其实就是中文模式下打字)

那麼,過去版本(v3.2.6 及更早)又是怎樣做到這一功能的呢?靠模擬一個 shift 鍵組合還是靠什麼呢?

代码变化过多,同文的按键处理流程又太过复杂,过往到底如何做到的难以追溯;皮肤中发送shift组合键是最为稳妥的做法。

@syimyuzya
Copy link
Author

/** Key code constant: Numeric keypad '(' key. */
public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;
/** Key code constant: Numeric keypad ')' key. */
public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;

原來是利用了部分鍵盤中存在的鍵!【不過注意到裡面的 NUMPAD 字眼,它的兼容性不會有問題吧🤔【雖然 2022 年的現在不太會有什麼程序會繞過系統鍵盤佈局直接處理 keycode (?)

皮肤中发送shift组合键是最为稳妥的做法。

這個在 trime.custom.yaml 中要怎樣寫呢?是可以直接寫 swipe_up: 'Shift+q' 嘛?還是說需要先在 preset_keys 裡加一筆比如 UpperCaseQ: {label: Q, send: Shift+q} 才能再在佈局裡寫 swipe_up: UpperCaseQ 這樣?

【PS 另外我看內置的 trime.yaml 裡預置了個叫 us_intl 的軟鍵盤,它裡面給好些鍵的 swipe_up 定的是 ASCII 以外的字符(比如帶附標字母、更多符號等),它現在還能正常用麼?

@tumuyan
Copy link
Contributor

tumuyan commented Jul 30, 2022

实际的情况非常复杂,上一个回复我给出的是Android的keycode,但是librime不能处理这些keycode,是另外一套keycode。
同文的皮肤做了两种keycode的转换,依照librime书写即可,不需要使用Android keycode的命名。同文对键盘中大部分英文符号都做了处理,所以直接写英文符号,会自动替换为librime中的keycode,librime没有处理,则转换为Android keycode。这些处理都是没有额外附加shift键的

@syimyuzya
Copy link
Author

syimyuzya commented Jul 31, 2022

实际的情况非常复杂,上一个回复我给出的是Android的keycode,但是librime不能处理这些keycode,是另外一套keycode。 同文的皮肤做了两种keycode的转换,依照librime书写即可,不需要使用Android keycode的命名。同文对键盘中大部分英文符号都做了处理,所以直接写英文符号,会自动替换为librime中的keycode,librime没有处理,则转换为Android keycode。这些处理都是没有额外附加shift键的

結果我試着把我的 Q 鍵上滑改成了 swipe_up: 'Shift+q',結果上滑時竟然打出了內容為「Shift+q」的文本😂(西文模式下直接上屏,中文模式下整個「Shift+q」文本被打進了編輯區)⊙﹏⊙

所以……為什麼可以指定(裡面含大寫字母的)字符序列,卻指定不了單獨的大寫字母呢(明明它也能視作「文本」)?

以及……正確的寫法到底應該是什麼呢?不是 'Shift+q' 的話?'Shift-q''S-q''<S-q>'?還是說……必須利用 preset_keys

@syimyuzya
Copy link
Author

以及……正確的寫法到底應該是什麼呢?不是 'Shift+q' 的話?'Shift-q''S-q''<S-q>'?還是說……必須利用 preset_keys

於是只好去讀了下 Event.java 的代碼並試驗了下預設 30 鍵裡那個括號鍵定義中的 {Left} 的行為,發現指定成 swipe_up: '{Shift+q}' 可以在西文模式下用。

但它又產生了新的問題:這樣配置只在西文模式下正常,中文模式上滑只能打出小寫字母,沒法把大寫字母打進編輯區……

所以有沒有中西文模式下都能正常工作的解決方式呢?

@syimyuzya
Copy link
Author

syimyuzya commented Jul 31, 2022

繼續看了看代碼,發現了這麼一處可能有問題的地方:

在 Event.java 中,單獨的大寫字母,會進入到這個分支來處理:

} else if ((code = getClickCode(s)) >= 0) {
parseLabel();

其中 getClickCode 中又會進入這個分支(因為看 Keycode.kt 可以看到它是識別大寫字母的):

} else if (Keycode.fromString(s) != Keycode.VoidSymbol) { // 字母數字
keyCode = Keycode.keyCodeOf(s);

於是大寫字母似乎就被作為 keycode 而非「文本」的樣子(從這裡開始不太確定)。

但之前咱們又提到,librime 似乎並不認可大寫字母作為一個(能打出字符的)「鍵」,所以可能是 librime 也沒處理,trime 這邊也沒能進一步處理,「兩邊都不管」所以就沒反應了……是這樣嘛?

【而與之相對的,多字符的文本(即使裡面含大寫字母)因為確實被當作「文本」,反而能正確處理

@tumuyan tumuyan mentioned this issue Jul 31, 2022
4 tasks
@tumuyan
Copy link
Contributor

tumuyan commented Aug 1, 2022

於是大寫字母似乎就被作為 keycode 而非「文本」的樣子(從這裡開始不太確定)。

基本对的,单个大写字母是librime可以处理的按键名,但是那是Android没有这样的按键。

但之前咱們又提到,librime 似乎並不認可大寫字母作為一個(能打出字符的)「鍵」,所以可能是 librime 也沒處理,trime 這邊也沒能進一步處理,「兩邊都不管」所以就沒反應了……是這樣嘛?

librime是否处理大写字母,是方案决定的
当方案没有接收时,Android本身是不可能接收非法按键的,结果就是点击没有效果。

【而與之相對的,多字符的文本(即使裡面含大寫字母)因為確實被當作「文本」,反而能正確處理

是这样的

理论上现在的pr已经修复这个问题,模拟了Shift+组合键。可以从ci下载测试

@syimyuzya
Copy link
Author

😂多謝~我看一看

@tumuyan
Copy link
Contributor

tumuyan commented Aug 8, 2022

已经修复

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants