-
Notifications
You must be signed in to change notification settings - Fork 580
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
fix(tsf): ime status #1499
fix(tsf): ime status #1499
Conversation
顺便把易语言写的测试程序也发上来吧,如果有人想测试的话可以用。 |
又发现点兼容性问题,等我再多测试一下。 |
也给我个版本用用看? |
不懂了。 |
|
过时的只是 ime 输入法框架,微软不推荐再使用 ime 制作输入法。 已经改好了,我再多测试一下。 |
现在应该没问题了。 之前发现的问题是,如果处于键盘处于 close & native 状态,imtip 始终显示为英文状态,但其实是中文状态。 然后学微软拼音,在获得焦点时无脑打开键盘,但保留 ascii 状态,这样或许更加友好。 |
这个有原来的需求要ctrl+space切换ascii和开关输入法可配置,目前的代码可以实现兼容这个吗? |
有没有具体的软件来测试,测试兼容性还得看具体软件。 |
#1364 看这个pr的内容,通过注册表里的项目,可选是否让ctrl+space开关输入法,还是切换ascii的
|
#1343 (comment) 这里提到:
我也发现微软拼音会忽略 ctrl+space,按这个issue里的讨论,我觉得更好的方案是直接无视掉 KEYBOARD_OPENCLOSE 消息,只处理 INPUTMODE_CONVERSION,这样的效果好像就跟微软拼音一样了。 这个 pr 暂时先放着,我试试无视 KEYBOARD_OPENCLOSE 消息之后的兼容性如何。 |
不少用户会想要Ctrl+空格切换ascii 所以之前的pr改成这个状态,如果要维持之前的开关输入法的状态可以手动修改下设定 |
那个注册表设置跟微软拼音的行为并不一样,微软拼音是直接无视了 KEYBOARD_OPENCLOSE 消息,就不存在close这个状态,一直都是open。 |
这个组合键是可以用户配置的,暂无想法 |
调试出来了,是被系统吃掉的,具体来说是 weasel 收到了完整按键消息,librime 也能正确处理,但 weasel 把按键消息放行后,用户程序收不到按下消息,但能收到松开消息。 现在测试出来的情况是,最佳方案就是像微软拼音一样,无视掉 KEYBOARD_OPENCLOSE 消息,并且在获得焦点时强制 open。 大家觉得这样如何? |
最终就这样了,不再改了。。没想到一个小问题竟然引出一大堆其他问题。 修改内容如下:
|
找到一种简单可行的方式来向用户程序透传 ctrl+space,在 WeaselTSF::_ProcessKeyEvent 中添加: if (ke.keycode == ibus::space && (ke.mask & ibus::CONTROL_MASK) &&
!(ke.mask & ibus::RELEASE_MASK) && !*pfEaten) {
// TODO: 从注册表读取系统设置里的快捷键,如果是 ctrl+space 才模拟发送
HWND hwnd = _GetFocusedContextWindow();
PostMessage(hwnd, WM_KEYDOWN, VK_SPACE, 0);
} 这样修改后,行为就和微软拼音完全一致了。 |
@fxliang 你试试现在这样,我今天用了一天了,很完美,跟微软拼音一模一样了。 |
大概看了下,硬编了ctrl+space,如果用户改了其他快捷键可能失效了;还有,原来有用户就是要关闭输入法状态的需求如何处理?要再了解细一点再看怎么解,会比较好 |
|
能否先发个dll给我,每天被这个问题困扰…… |
呃,CI里就有安装包。 |
原来如此,action不熟,不好意思。 |
|
我们不是在讨论 |
引用上面 @popyoung 的回复:
|
可以暫時不關注在西文(ascii_mode)狀態下做轉換的需求。 希望 Control+space 不禁用輸入法的用家,想要的大概是 Control+space 與其他方式(如單擊 Shift)切換中西文等效吧。 那麼問題來了: |
我想提醒大家一点,之前的提交里我也说过: |
先別管 Control+space 能不能傳過去了。默認配置也沒綁定這個鍵。 微軟很可能有直接處理 Control+space 的方法,而不是在
|
目前的改动确认是会break #1364 所以目前我觉得未可合并 至于上面的判断是不是真不真,都可以插入一些OutputDebugString来验证 |
這就更迷惑了。測試 app 顯示的準嗎,和系統看到的一樣嗎? 如果這句無效果,那麼 我繼續追問, |
当然准的,至少在win11 24h2里就是这样。
所以就没有禁用输入法,只是改了输入法的 ascii 状态。
能,除非设置为 weasel/WeaselTSF/KeyEventSink.cpp Line 14 in d75b34b
|
謝謝。 如果實際行爲不變的話,PR 值得考慮啊。 輸入法框架記了一個有用的狀態,可以同步給 rime; |
这确实没有,之前也没有同步,所以有时候 ImTip 的状态显示才会异常,不过这跟 #1486 的原始问题无关,所以我没提。 真要修复也容易,在这里: weasel/WeaselTSF/LanguageBar.cpp Line 405 in d75b34b
根据传入的 status,调用一下 |
設置這些狀態如果系統沒有表現,最終只是讓輸入法自己遵守的話,無怪輸入法程序沒動力設置呢。 據說這些狀態CMD窗口會用到。 |
确认就这样了么?我可不想再返工了。。
要不要在这个 pr 里实现?当然我倾向于不要,这或许会牵扯到其他问题,先修好一个问题再说。 |
看了下,还是在 weasel/WeaselTSF/LanguageBar.cpp Line 405 in d75b34b
这里同步键盘开关状态最佳,一次解决两个问题。粗略测试了下,没毛病。 |
当我没说。。实测不行。。跟rime实时同步ascii状态还是先放着吧,先解决初始状态同步。 |
好的,是weasel-artifact-0.16.3.29.9c77c8d这个吧 |
对的。 |
简单试用了下,之前的问题都修正了。 |
试过基本可以了,就WeaselTSF/LanguageBar.cpp里修改那个if最好调整下可以让后面看起来清晰一点。 |
感觉这样写 if 更符合下面的逻辑,不然阅读代码时需要在脑内反转一下。 |
那就优化一下,@fxliang 现在这样写如何?为了阅读方便。 |
WeaselTSF/LanguageBar.cpp
Outdated
@@ -416,7 +416,8 @@ void WeaselTSF::_UpdateLanguageBar(weasel::Status stat) { | |||
else | |||
flags &= (~TF_CONVERSIONMODE_FULLSHAPE); | |||
_SetCompartmentDWORD(flags, GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION); | |||
|
|||
if (!_isToOpenClose && _IsKeyboardOpen() != (!stat.ascii_mode)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (!_isToOpenClose && (_IsKeyboardOpen() == stat.ascii_mode))
可能更清晰,另外可以考虑加一两行注释
fix #1486
现在能正确响应
ImmSetOpenStatus
和ImmSetConversionStatus
,也能正确支持 ImTip,但是依然发现以下问题:ImmSetConversionStatus
冲突,调用输入法的程序无法通过 api 切换为英文输入,想了想还是不跟了,影响太大。