Skip to content

Add a menu bar item to toggle Caps Lock directly#25

Open
otiai10 wants to merge 3 commits into
fuji-mak:mainfrom
otiai10:feat/toggle-caps-lock-menu-item
Open

Add a menu bar item to toggle Caps Lock directly#25
otiai10 wants to merge 3 commits into
fuji-mak:mainfrom
otiai10:feat/toggle-caps-lock-menu-item

Conversation

@otiai10

@otiai10 otiai10 commented Jul 14, 2026

Copy link
Copy Markdown

背景

物理 Caps Lock キーを Ctrl 等にリマップしているユーザーは、Capsomnia が読み取る実際の Caps Lock 状態を切り替える手段がなかった。メニューバーには表示・言語などの設定項目はあるが、状態そのものを書き換える項目は無かった。

目的

Caps Lock キーをリマップしているユーザーも、メニューバーから直接 Caps Lock 状態を切り替えられるようにし、Capsomnia 既存のスリープ抑止フローをそのまま使えるようにする。

方針

物理キー入力を模倣する代わりに、IOKit の HIDSystem 経由で実際の Caps Lock modifier-lock 状態(LED含む)を書き換える。これにより、既存の 250ms ポーリング(applyCurrentCapsLockState)が新しい状態を物理キー押下と同じものとして検知し、apply() 以降の既存ロジックを一切変更せずに済む。

設計

変更 内容 AC
Sources/Capsomnia/SystemServices.swift CapsLockController を追加。純粋関数 toggledState(current:) と、IOKit HIDSystem 経由で実際の状態を書き換える set(_:) AC-1, AC-4
Sources/Capsomnia/CapsomniaApp.swift メニュー先頭に「Toggle Caps Lock」項目を追加し、クリックで toggleCapsLock() を実行 AC-4
Sources/Capsomnia/AppConstants.swift 日英ローカライズ文字列を追加 AC-3
README.md / README.ja.md / CHANGELOG.md 新機能のドキュメント化 AC-3

受入条件

  • [LOGIC] swift test --filter CapsLockControllerTeststoggledState の true/false 反転が pass する
  • [BUILD] swift build -c release が成功する
  • [BUILD] grep -q "Toggle Caps Lock" README.mdgrep -q "Caps Lockを切り替え" README.ja.md が成功する
  • [MANUAL] 実機のメニューバーで「Toggle Caps Lock」をクリックすると、実際の Caps Lock LED状態が切り替わり、Capsomniaのポーリングが新状態を検知してスリープ抑止設定が追従すること(物理キー入力なしで)

評価観点

  • IOKit HIDSystem の呼び出し(IOServiceOpen / IOServiceClose / IOObjectRelease)にリークが無いか
  • メニュー項目の配置(先頭)が既存のUXと整合しているか
  • Codex によるレビュー(IOKit正しさ・リーク・スレッド安全性・既存パターンとの一貫性)で指摘なしを確認済み

otiai10 added 3 commits July 14, 2026 16:59
Lets Capsomnia flip the actual system Caps Lock modifier-lock state
(LED included) instead of only reading it, so a future trigger other
than the physical key can drive the same polling-based sleep logic.
Keyboards that remap the physical Caps Lock key (e.g. to Control) had
no way to flip Capsomnia's trigger. The new menu item flips the real
state via CapsLockController, and the existing 250ms poll picks it up
exactly like a physical key press.
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.

1 participant