You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
v2026.8.6.v2
Undo/redo survive rotation: rotating the screen used to destroy the drawing screen and rebuild it from scratch, which wiped the undo/redo history and hid the undo/redo buttons (on phones the whole dock collapsed, making them vanish entirely). The drawing screen now handles rotation itself, so your undo history, tool state, zoom and the dock stay exactly where you left them.
Undo now works after page resizes too: any width change — rotating to landscape, unfolding a foldable, entering split-screen — used to clear the undo history because the stored ink coordinates were stale. The history is now rescaled along with the page ink instead, so you can still undo strokes you drew before the resize.
Undo/redo buttons always stay in sync: when delete, cut or paste was your very first action, the undo button wasn't refreshed and tapping it silently did nothing. Every action now updates the button state automatically, so Undo is always there when there's something to undo.
Strokes are always erasable again: a wobbly or held-down pen could emit near-zero-length path segments that made a stroke invisible to the stroke eraser and to lasso selection (the geometry hit-test silently failed). Those degenerate points are now filtered out as the stroke is drawn, so every stroke can be erased and selected.
Folders move to the Bin together with their contents: moving a folder to the Bin used to hide its notebooks and subfolders from the main list without actually binning them — they never appeared in the Bin, and permanently deleting the folder later made them all reappear. Binning a folder now carries its entire contents along, restoring brings back the whole subtree (and un-bins any binned parent folder so nothing gets stranded invisible), and Delete permanently deletes everything inside the folder instead of resurrecting it.
Deleting several pages at once is now atomic: multi-select delete used to rewrite the PDF once per page, interleaved with the in-memory page renumbering — if a rewrite failed partway, the file was missing some pages while the app still thought they existed, so ink could land on the wrong pages and autosave would persist the mix-up. The whole selection is now removed in a single PDF write before any in-memory state changes, so a failed delete leaves the file and the view perfectly in sync (and it's faster too — one rewrite instead of one per page).
Opening a notebook after rotation no longer stutters: the new screen used to block the UI thread while it waited for the previous screen's ink save to finish writing — on a big notebook that was a visible freeze (and an ANR risk on slow storage) right after every rotation. The wait now happens on a background thread, so the first frames render instantly and the ink still loads with the just-saved strokes intact.
PDF cross-reference offsets are no longer truncated: xref streams written with 8-byte offset fields (/W [1 8 2]) used to be read through a 4-byte accumulator, silently corrupting the object table for those files. Offsets are now parsed at full width, and any offset that genuinely doesn't fit the file is treated as a corrupt PDF (a clear "can't edit" error) instead of silently pointing at the wrong object.
Corrupt compressed streams fail cleanly instead of half-decoding: a FlateDecode stream that ended early or demanded a preset dictionary we don't support used to return its partial output as if complete — for object and xref streams that meant garbage offsets rather than an error. Such streams now fail cleanly, and the affected file is reported as unreadable instead of being silently mangled.
Thumbnail rendering hardened against late reloads: the page-grid thumbnail engine could end up permanently rendering blank tiles if it was asked to reload after being closed (a latent path in the page reorder flow). Reloading now restarts the render worker pool, and close/reload can no longer race each other.