From 9d650efecbc8969d9aac27340e98a063ca088a22 Mon Sep 17 00:00:00 2001 From: Daneel Date: Sun, 22 Feb 2026 21:19:01 +0100 Subject: [PATCH] feat: macOS Zoom cursor tracking prototype (SPC z w) --- config.el | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/config.el b/config.el index 501f0ea..c705f4c 100644 --- a/config.el +++ b/config.el @@ -937,7 +937,67 @@ Keeps the status bar and tab bar fully visible at any zoom level.") :desc "Readable (32pt)" "r" #'my/zoom-readable :desc "Toggle magnifier" "m" #'my/mag-toggle :desc "Mag zoom in" "M" #'my/mag-zoom-in - :desc "Mag zoom out" "N" #'my/mag-zoom-out)) + :desc "Mag zoom out" "N" #'my/mag-zoom-out + :desc "Cursor warp (macOS Zoom)" "w" #'my/cursor-warp-toggle)) + + +;;; ============================================================ +;;; ACCESSIBILITY — MACOS ZOOM CURSOR TRACKING (SPC z w) +;;; ============================================================ +;; Prototype pro macOS Zoom "Follow mouse cursor" mode. +;; +;; Princip: po každém klávesovém příkazu přesune myš na pozici textového +;; kurzoru. macOS Zoom v "Follow mouse" módu pak sleduje kurzor. +;; Myš je neviditelná při psaní (make-pointer-invisible) → žádné vizuální +;; rušení. Při pohybu myší se viewport nepohybuje (warp se přeskočí). +;; +;; SETUP (jednorázové nastavení macOS): +;; System Settings → Accessibility → Zoom → Zoom style: Full Screen +;; "When zoomed in, the screen image moves: Continuously with pointer" +;; Zoom level: dle potřeby (např. 4-16×) +;; Pak zapni SPC z w pro aktivaci cursor trackingu. +;; +;; SPC z w toggle cursor warp on/off +;; SPC z +/- font scaling (volitelné, pro jemné doladění) + +(defvar my/cursor-warp-enabled nil + "When non-nil, mouse is warped to text cursor on each keyboard command.") + +;; Hide mouse pointer while typing (standard Emacs feature). +(setq make-pointer-invisible t) + +(defun my/last-input-was-mouse-p () + "Return non-nil if last input event was a mouse or scroll event." + (and last-input-event + (or (mouse-event-p last-input-event) + (mouse-movement-p last-input-event) + (and (listp last-input-event) + (memq (car last-input-event) + '(wheel-up wheel-down wheel-left wheel-right + mouse-4 mouse-5 mouse-6 mouse-7)))))) + +(defun my/warp-mouse-to-cursor () + "Move mouse pointer to current text cursor position. +Skips if last input was a mouse event (let user pan freely with mouse)." + (when (and my/cursor-warp-enabled + (display-graphic-p) + (not (my/last-input-was-mouse-p)) + (not (window-minibuffer-p (selected-window)))) + (when-let* ((pos (window-absolute-pixel-position)) + (x (car pos)) + ;; Place mouse at vertical center of cursor line. + (y (+ (cdr pos) (/ (line-pixel-height) 2)))) + (set-mouse-pixel-position (selected-frame) x y)))) + +(add-hook 'post-command-hook #'my/warp-mouse-to-cursor) + +(defun my/cursor-warp-toggle () + "Toggle macOS Zoom cursor tracking on/off." + (interactive) + (setq my/cursor-warp-enabled (not my/cursor-warp-enabled)) + (if my/cursor-warp-enabled + (message "Cursor warp ON — macOS Zoom will follow text cursor") + (message "Cursor warp OFF"))) ;;; ============================================================