// Cthulhu screen reader. // Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . package review import ( "context" "errors" "time" ) // WarmDocument captures and syncs the currently focused document in the // background so the first navigation key does not pay for a cold capture. // Best-effort: a full queue or a focus outside web content is ignored by // the worker, and no result is delivered. func (worker *Worker) WarmDocument() { select { case worker.requests <- request{documentEpoch: worker.documentEpoch.Load(), documentLoadEpoch: worker.documentLoadEpoch.Load(), warmDocument: true, queuedAt: time.Now()}: default: } } func (worker *Worker) MoveDocumentCaret(command DocumentCaretCommand) error { if !command.valid() { return ErrInvalidDirection } select { case worker.requests <- request{documentEpoch: worker.documentEpoch.Load(), documentLoadEpoch: worker.documentLoadEpoch.Load(), caretCommand: command, queuedAt: time.Now()}: return nil default: return ErrRequestQueueFull } } func (worker *Worker) ActivateDocumentCaret() error { select { case worker.requests <- request{documentEpoch: worker.documentEpoch.Load(), documentLoadEpoch: worker.documentLoadEpoch.Load(), activate: true, queuedAt: time.Now()}: return nil default: return ErrRequestQueueFull } } func (worker *Worker) ReadAll(ctx context.Context) error { if ctx == nil { return errors.New("read all: nil context") } select { case worker.requests <- request{documentEpoch: worker.documentEpoch.Load(), documentLoadEpoch: worker.documentLoadEpoch.Load(), readAll: ctx, queuedAt: time.Now()}: return nil default: return ErrRequestQueueFull } } func (worker *Worker) JumpToDocumentFragment(fragment string) error { if fragment == "" { return ErrInvalidDirection } select { case worker.requests <- request{documentEpoch: worker.documentEpoch.Load(), documentLoadEpoch: worker.documentLoadEpoch.Load(), fragment: fragment, queuedAt: time.Now()}: return nil default: return ErrRequestQueueFull } }