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

express_editor未正确拦截Escape键 #956

Open
1 of 6 tasks
adamhj opened this issue Dec 2, 2024 · 2 comments
Open
1 of 6 tasks

express_editor未正确拦截Escape键 #956

adamhj opened this issue Dec 2, 2024 · 2 comments
Labels

Comments

@adamhj
Copy link

adamhj commented Dec 2, 2024

Describe the bug
默认情况下,在有输入内容的时候按下Esc按键,RIME会清除所有候选词和输入框中的内容;按理来说,这个时候RIME已经响应了Esc键,就不应该把Esc键消息发给所处的应用中,但是实际测试中发现,RIME在这种情况下仍然会把Esc键的消息发给所处的应用中,导致应用响应Esc键消息。
一个例子是B站(bilibili.com)视频,全屏模式下,在弹幕输入框中输入文字,如果输入某个词到一半想撤销按下Esc键后,会导致视频直接退出全屏模式(响应了Esc键)

To Reproduce
Steps to reproduce the bug:

  1. 打开www.bilibili.com
  2. 随便点开一个视频,点播放窗口右下角图标进入全屏模式
  3. 输入任意编码,如"ceshi"
  4. 按一下Esc按键,视频退出了全屏模式

Expected behavior
正常来说在输入法输入区有内容的时候,按Esc键不应该把Esc按键消息发给该页面导致退出全屏模式

Flavor(please complete the following information):
Select your flavor:

  • ibus-rime
  • fcitx-rime
  • fcitx5-rime
  • Squirrel
  • Trime
  • Weasel

Package:

  • OS: Windows 7
  • Version: Build 7601
  • 使用我自己编译的小狼毫版本,为了支持Win7基于0.14.3.0以后后续部分commit的合并;librime使用的是1.10.0

Additional context
通过插入一个processor lua脚本调试,发现这个问题在express_editor上,猜测fluid_editor可能也会有相同的问题;
我把lua脚本放在express_editor前的时候,能接收到Escape和Release+Escape事件,而放在express_editor后的时候,只会接收到Escape事件;所以我猜测可能是express_editor确实把Release+Escape事件拦截了,但是没有拦截掉Escape事件,导致部分响应Keydown事件的网页/App会在上述情况下触发Esc键的事件处理。

而且即使我在express_editor后加一个processor屏蔽掉这个Escape事件(lua函数返回1)也没有效果,是express_editor里直接扔给系统了么?

目前我的临时解决方法是写了一个lua脚本放在express_editor前来单独处理Esc事件,不让事件走到express_editor:https://github.com/adamhj/rime_escape_fix

@adamhj adamhj added the bug label Dec 2, 2024
@lotem
Copy link
Member

lotem commented Dec 3, 2024

輸入法不會發按鍵給系統。輸入法處理按鍵的工作方式是系統發給輸入法,輸入法可以截獲。
系統也可以不發給輸入法。如果 Esc 鍵直接由應用處理,輸入法也沒轍。

express_editor 不負責處理功能鍵。他只處理組成輸入碼的字符按鍵。可能爲了簡便把所有 Release 事件都攔截了。 攔截了 Escape 但是並沒有攔截 Release 事件,而是選擇輸入法不處理該事件。所以 Escape+Release 會給系統和應用繼續處理。估計 bilibili 響應的是 Escape 的 keyup 事件。

@lotem
Copy link
Member

lotem commented Dec 3, 2024

比較棘手的地方是 keydown、keyup 事件是先後處理的,librime 只在 keydown 的位置判斷,而 keyup 一概不處理。
結果是應用會收到喪偶的 keyup 事件。

反過來也不行,如果一概截獲 keyup 事件,輸入法不處理的那些 keydown 又會沒有對應的 keyup——這更嚴重一點,會讓應用錯判爲鍵一直處於按下狀態。

要妥善解決,得記錄相同鍵值的前一個 keydown 的處理結果,給 keyup 返回相同的值。

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

No branches or pull requests

2 participants