Skip to content

fix(macos): Khắc phục lỗi đơ phím Apple Mail, Watchdog EventTap, SMAppService & hỗ trợ app lập trình - #333

Open
hungmtuci wants to merge 1 commit into
tuyenvm:masterfrom
hungmtuci:fix/macos-stability-and-modernization
Open

hungmtuci wants to merge 1 commit into
tuyenvm:masterfrom
hungmtuci:fix/macos-stability-and-modernization

Conversation

@hungmtuci

Copy link
Copy Markdown

📝 Tóm tắt / Summary

Bản PR này tập trung giải quyết triệt để các vấn đề liên quan đến độ ổn định, đơ phím và tương thích trên các phiên bản macOS hiện đại (macOS 13+ Ventura, Sonoma, Sequoia):


🛠️ Các thay đổi & bản vá chính / Key Changes & Fixes

  1. Khắc phục lỗi đơ gõ phím & mất ký tự trên Apple Mail & WebKit:

    • Nguyên nhân: Trước đây 2 biến eventBackSpaceDown và eventBackSpaceUp được tạo tĩnh 1 lần (CGEventCreateKeyboardEvent) và tái sử dụng liên tục qua CGEventTapPostEvent. Do đối tượng CGEventRef mang tính mutable, việc gửi nhiều lần làm sai lệch sequence number và timestamp nội bộ của WindowServer, dẫn đến tắc nghẽn hàng đợi sự kiện bàn phím sau một vài từ gõ trong Apple Mail.
    • Giải pháp: Thay thế bằng hàm PostBackspaceEvent() tự cấp phát mới và giải phóng tức thì bằng CFRelease() sau khi post sự kiện.
  2. Bổ sung Watchdog Timer (0.5s) bảo vệ EventTap:

    • macOS có cơ chế tự động vô hiệu hóa (kCGEventTapDisabledByTimeout) nếu callback xử lý chậm hoặc khi máy chuyển đổi trạng thái sleep/lock.
    • Thêm timer chạy nền mỗi 500ms để kiểm tra CGEventTapIsEnabled(eventTap) và tự động tái kích hoạt tap nếu bị tắt.
  3. Loại bỏ sự kiện kéo chuột (MouseDragged 120Hz):

    • Loại bỏ kCGEventLeftMouseDragged và kCGEventRightMouseDragged khỏi eventMask. Việc hook kéo chuột ở tần số quét cao (120Hz ProMotion) gây nghẽn luồng IPC của WindowServer mà không mang lại giá trị thực tế cho bộ gõ (chỉ cần giữ MouseDown để reset phiên gõ).
  4. Hiện đại hóa API khởi động cùng hệ thống (SMAppService):

    • Trên macOS 13+, Apple đã deprecate SMLoginItemSetEnabled. Đã nâng cấp sử dụng [SMAppService mainAppService] giúp OpenKey hiển thị minh bạch trong mục System Settings ➔ Login Items mà không phụ thuộc helper process riêng biệt.
    • Khắc phục gọi thừa: Loại bỏ dòng gọi setRunOnStartup trong hàm fillData, giúp thao tác chuyển đổi ngôn ngữ/bảng mã diễn ra 100% trong RAM mà không phát sinh system call thừa.
  5. Mở rộng Smart Switch Key cho các công cụ lập trình & terminal hiện đại:

    • Mặc định gõ tiếng Anh cho các công cụ phổ biến: VS Code, VS Code Insiders, Sublime Text, Xcode, Zed, Ghostty, Alacritty, WezTerm, Kitty, JetBrains IDEs...
  6. Tối ưu hóa biên dịch & Link-Time Optimization (LTO):

    • Bổ sung build_macos.sh và Makefile hỗ trợ biên dịch độc lập với Apple Clang native (-O3 -flto -Wl,-dead_strip), giúp nhị phân gọn gàng hơn và inlining tối ưu giữa Core Engine C++ và Objective-C.

🧪 Kiểm thử / Verification

  • Đã kiểm tra và chạy ổn định trên macOS Sequoia (Apple Silicon arm64).
  • Kiểm tra gõ phím liên tục trong Apple Mail, Safari, Chrome, Spotlight, VS Code, Terminal không còn hiện tượng giật đơ hay nuốt phím.
  • Cơ chế Login Item hoạt động chuẩn xác trong macOS System Settings.

…and modern dev app support

- Fix Apple Mail event queue congestion by replacing static backspace CGEventRef with dynamic allocation (PostBackspaceEvent)
- Add EventTap Watchdog Timer (0.5s) to automatically recover from system-disabled taps
- Remove high-frequency mouse dragged events (120Hz) to eliminate WindowServer IPC bottlenecks
- Modernize login item API using SMAppService.mainAppService on macOS 13+ (Ventura, Sonoma, Sequoia)
- Remove redundant setRunOnStartup call in fillData to ensure language switching is 100% in-memory
- Extend SmartSwitchKey default English mode for modern developer tools and terminals (VS Code, Cursor, Zed, Ghostty, Xcode, iTerm2, JetBrains, etc.)
- Add standalone native build system (build_macos.sh, Makefile) with Link-Time Optimization (-flto) and dead code stripping (-Wl,-dead_strip)
- Update README with attribution to original author Mai Vũ Tuyên (@tuyenvm) and detailed fork changelog
jetaudio added a commit to jetaudio/Omnikey that referenced this pull request Oct 7, 2026
Adapt upstream PRs tuyenvm#297 and tuyenvm#333 while preserving single-character VNI/CP1258 decoding. Add sanitizer-backed regression coverage.
jetaudio added a commit to jetaudio/Omnikey that referenced this pull request Oct 7, 2026
Adapt upstream PRs tuyenvm#324, tuyenvm#329, tuyenvm#332 and tuyenvm#333. Preserve saved shortcuts, bound Spotlight focus queries, avoid reusing backspace events, and send complete UTF-16 chunks. Cover event processing and tap lifecycle under sanitizers.
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