Skip to content

fix: 未定義のCtrl+キーの組み合わせをIMEで処理しないようにする#310

Merged
ensan-hcl merged 1 commit into
azooKey:mainfrom
mjun0812:fix/ctrl-shortcut-action
Apr 12, 2026
Merged

fix: 未定義のCtrl+キーの組み合わせをIMEで処理しないようにする#310
ensan-hcl merged 1 commit into
azooKey:mainfrom
mjun0812:fix/ctrl-shortcut-action

Conversation

@mjun0812
Copy link
Copy Markdown
Contributor

概要

azookey(日本語)を使用時に、Ctrl+`など、IMEで明示的に処理していないCtrl+キーの組み合わせが全角文字として入力されてしまう問題を修正しました。

背景

具体例として、VSCodeにはCtrl + ` (バッククォート) でターミナルの表示/非表示を切り替えできるショートカットがありますが、azooKey(日本語)を使用時に、ターミナルがトグルできずに`(バッククォート)が入力されてしまいます。(動画参照)
これは、macOS標準の日本語IME使用時には発生せず、他のアプリのショートカットでも問題となる可能性があります。

default.mov

原因

UserAction.getUserAction() において、Ctrl+キーの組み合わせのうち明示的に処理していないもの(Ctrl+H, Ctrl+Pなど以外)が、default ケースに到達し .input() として処理されていました。
これによりアプリにショートカットが渡らなくなっていました。

変更内容

  • UserAction.swiftの論理キー判定部分で、明示的に処理しているCtrl+キーの個別ケースの直後に、Controlを含む未定義の組み合わせを.unknown として返すケースを追加

Test plan

  • swift test --package-path Core が全テストパス
  • ./install.sh でビルド&インストール後、VSCodeでCtrl+`によるターミナルトグルが動作することを確認(下記動画参照)
  • 既存のCtrl+キーのショートカット(Ctrl+H, Ctrl+J等)が引き続き動作することを確認
2.mov

久しぶりにswiftを読み書きしたので、修正点等あれば遠慮なく指摘してください。よろしくお願いします。

Ctrl+`など、IMEで明示的に処理していないCtrl+キーの組み合わせが
全角文字として入力されてしまう問題を修正。
Copy link
Copy Markdown
Member

@ensan-hcl ensan-hcl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

たぶん問題ないのでマージするのですが、何か問題が起きたらrevertしちゃうかもです!

@ensan-hcl ensan-hcl merged commit eb3e4e5 into azooKey:main Apr 12, 2026
4 checks passed
@mjun0812 mjun0812 deleted the fix/ctrl-shortcut-action branch April 13, 2026 06:35
@mjun0812
Copy link
Copy Markdown
Contributor Author

@ensan-hcl

ctrl全部を.unknownにしているので,副作用あるかもなので大丈夫です!
対応ありがとうございます!

@ensan-hcl
Copy link
Copy Markdown
Member

ensan-hcl commented Apr 18, 2026

@mjun0812 こちら、例えばDiscordのアプリで Ctrl + Shift + O(など任意の文字)などを入力したときに入力がクリアされてしまう不具合を起こしてると思うのですが、どうにかする方法って検討いただけたりしますか?

@mjun0812
Copy link
Copy Markdown
Contributor Author

@ensan-hcl
ああ...やっぱり副作用出てしまいましたか...。
了解です。いくつか改善案思いついているので、取り掛かってみます。少々お時間ください!

@amatsus
Copy link
Copy Markdown
Contributor

amatsus commented May 8, 2026

logicalKey ブロックで control 修飾を含むキーを全て処理してしまうため、keyCode ブロックの control+delete などが機能しなくなっています。

Ctrl+Shift+任意の文字 が .unknown を返して、InputState 側で .fallthrough すると入力がクリアされるので、

  • Ctrl+任意の文字 → keyCode ブロックの default で .unknown を返してOSに委譲する
  • Ctrl+Shift+任意の文字InputState 側で consume する

という方向が良さそうでしょうか。

@mjun0812
Copy link
Copy Markdown
Contributor Author

mjun0812 commented May 8, 2026

少なくとも乱暴に crtl + Any Keysとするのではなく,ctrl + 1文字にするべきですね.
今日修正PR出します

@amatsus
Copy link
Copy Markdown
Contributor

amatsus commented May 8, 2026

Ctrl+数字 のショートカットもOS側に渡さないとですね

             // Numpadでそれぞれ「入力先頭にカーソルを移動」「入力末尾にカーソルを移動」「変換候補欄を1ページ戻る」「変換候補欄
を1ページ進む」「順方向削除」「入力全消し(より強いエスケープ)」に対応するが、サポート外の動作として明示的に無効化
             return .unknown
         case 18, 19, 20, 21, 23, 22, 26, 28, 25, 29:
-            if !eventCore.modifierFlags.contains(.shift) && !eventCore.modifierFlags.contains(.option) {
+            if eventCore.modifierFlags.isDisjoint(with: [.shift, .option, .control]) {
                 let number: UserAction.Number = [
                     18: .one,
                     19: .two,

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

Successfully merging this pull request may close these issues.

3 participants