fix(core): drive auto-lock idle from real input, not widget focus
The auto-lock idle clock was reset whenever any ImGui item was active, so a text field left focused (a half-filled send form, say) counted as continuous activity and kept the wallet unlocked indefinitely, well past the configured idle timeout. - The idle clock is now fed by real input events (key, text, mouse, touch, pen, gamepad button) as they are ingested on the main thread, plus a still-held mouse button so a drag or scrollbar grab that emits no new event still counts. A focused but untouched widget no longer does. - A new header-only IdleTracker owns the clock and never moves backwards, so an event stamped before the previous one cannot shorten the idle time. Behaviour change: a form left focused and idle past the timeout now auto-locks. The form's buffers are app state and survive the lock and unlock, so nothing typed is lost. Tests: a new IdleTracker case covers idle time growing with no events (enough to trip a 900s lock), activity resetting it, the clock never moving backwards, and a query before the last activity reading zero rather than a negative value. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+4
-1
@@ -1605,7 +1605,10 @@ int main(int argc, char* argv[])
|
||||
Uint64 lastFrameStartNs = 0; // software frame cap bookkeeping (SDL_GetTicksNS)
|
||||
int settleFrames = kSettleFrames;
|
||||
auto noteEvent = [&](const SDL_Event& e) {
|
||||
if (isInputEvent(e.type)) lastInputMs = SDL_GetTicks();
|
||||
if (isInputEvent(e.type)) {
|
||||
lastInputMs = SDL_GetTicks();
|
||||
app.noteUserInput(); // auto-lock idle clock (C21): real input only, never widget state
|
||||
}
|
||||
else if (isWindowStateEvent(e.type)) settleFrames = kSettleFrames;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user