Skip to content

Fix CGEvent text injection: clear modifier flags#115

Closed
krystophny wants to merge 5 commits intopeteonrails:mainfrom
krystophny:upstream-pr-cgevent-modifiers
Closed

Fix CGEvent text injection: clear modifier flags#115
krystophny wants to merge 5 commits intopeteonrails:mainfrom
krystophny:upstream-pr-cgevent-modifiers

Conversation

@krystophny
Copy link
Collaborator

Summary

Explicitly set CGEventFlagNull when shift is not needed, preventing Caps Lock or stuck modifiers from causing random capitalization.

Problem

Transcribed text would sometimes have random CAPS in the middle of sentences.

Solution

Clear all modifier flags for keystrokes that don't need shift.

Dependencies

Depends on #113 (macOS support)

This switches the device hotplug detection in the evdev listener from
using inotify directly to using the notify crate, which abstracts
filesystem watching across platforms.

Benefits:
- Cleaner dependency (notify is already used for status --follow)
- The notify crate is better maintained and more widely used
- Prepares codebase for future cross-platform support

The notify crate uses inotify internally on Linux, so behavior is
unchanged on the primary platform.
@krystophny krystophny force-pushed the upstream-pr-cgevent-modifiers branch from aa334c3 to e6880f1 Compare January 22, 2026 19:16
This adds full support for running voxtype on macOS:

**Hotkey capture:**
- CGEventTap-based global hotkey detection (requires Accessibility permissions)
- FN/Globe key support via SecondaryFn flag detection
- Platform-specific default: FN on macOS, SCROLLLOCK on Linux

**Text output:**
- CGEvent-based text injection for typing transcribed text
- Clipboard support via pbcopy/pbpaste

**Build configuration:**
- Conditional compilation for platform-specific code
- evdev moved to Linux-only dependency
- core-graphics and core-foundation added for macOS

**Other changes:**
- cfg guards for Linux-specific code (evdev, inotify, .init_array)
- Cross-platform test using printf instead of echo -n
- Documentation updates for macOS options
The audio_ctx optimization formula could produce values not aligned
to 8, causing GGML assertion failure (nb01 % 8 == 0) on Metal backend.

For example, a 4-second audio clip would produce audio_ctx=266,
which is not divisible by 8, causing a crash.

Fix: Round up audio_ctx to the next multiple of 8 using the formula
(raw_ctx + 7) / 8 * 8

This ensures compatibility with Metal backend alignment requirements
while preserving the optimization benefits for short audio clips.
When typing characters that don't need shift, explicitly set
CGEventFlagNull to clear all modifiers. This prevents Caps Lock
or stuck modifier keys from causing random capitalization in
the transcribed output.
@krystophny krystophny force-pushed the upstream-pr-cgevent-modifiers branch from e6880f1 to 9a0f6ac Compare January 22, 2026 19:24
@peteonrails peteonrails mentioned this pull request Jan 27, 2026
5 tasks
@peteonrails
Copy link
Owner

Superseded by #129 which includes this CGEvent modifier fix. Thank you for identifying and fixing this issue!

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.

2 participants