| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(scroll): post phaseless continuous scroll events on macOS (#1157) Stamping kCGScrollWheelEventScrollPhase onto the synthetic frames declared a trackpad gesture to the system: AppKit/WebKit enabled rubber-band overscroll on plain wheel scrolling, and WebKit's gesture latching starved web apps that scroll from JS wheel handlers (reproduced on Fastmail's virtualized mailbox list in Safari, which stopped scrolling entirely). Phaseless continuous events carry the same distances with wheel semantics, matching what native continuous wheels and established smooth-scroll utilities emit. Zero-distance phaseless frames have nothing to say and are dropped at the boundary; the engine's balanced phase lifecycle remains the cross-platform runtime contract. The unsmoothed horizontal thumb-wheel gesture from #1689 is the one place a phase is the point: AppKit's swipe recognisers ignore a horizontal scroll without one. Those frames now go through a new post_phased_scroll, which keeps the previous phase-stamping behaviour, zero-distance Ended and Cancelled included. The output stream decides at Began whether it is a phased gesture and keeps that for every frame until it ends, so the application never sees a gesture change kind half-way. Event construction is split from posting so the phase fields are tested on the built events. | 15 天前 | |
perf(agent): block the button worker until a command or long-press deadline (#2094) * perf(agent): block the button worker until a command or long-press deadline The button lifecycle worker polled its queue every 10 ms to notice shutdown, waking the agent about 80 times per second while idle. Share the scroll worker's receive_command so it blocks until a command arrives or the earliest pending long-press threshold passes, and wake it explicitly on shutdown. Long presses now fire at their deadline instead of up to one poll late. * fix(agent): wake the button worker after a full-queue invalidation A producer that finds the lifecycle queue full bumps the generation, because the dropped command may have been a release. With the worker now blocking while idle, it could drain the queue and block before that bump, leaving a held shortcut down until the next command. Route the full-queue path through invalidate_all so the bump is followed by a wake. | 2 天前 |