377cca8e9bf0f7e8b1ebb36abbf08f5fe4909d17
The exit-frame self-check compared the y label strip to the pixel and printed a FAIL at GDK_SCALE=2 where it measured 174 -> 172. Measured (temporary probe, reverted): the strip is `widest major tick label + padding`, and the tick step follows the axes length, which the resize changes -- 18 majors over 1440 device px with "-800m" widest, 8 over 1080 with "-500m", 78 vs 76 px in the bitmap font. The layout was recomputed; the equality was the wrong assertion. The check now asserts what actually distinguishes a recompute from a scaled stale layout: the axes and its strips tile the *current* viewport, and the strip is nearer the previous strip than that strip scaled by the resize ratio (2 px of drift against a scaled 118). `on_exit_timer`'s main-context pump can re-enter its own 20 ms timeout, which ran the exit block twice in one observed run; `on_teardown` is guarded the same way so the producer join, the window destruction and the quit happen exactly once. A window closed by hand takes the same ordering through `GtkWindow::close-request`, which `gtk_window_destroy()` does not emit.
Languages
C++
95.7%
CMake
2.4%
Python
1.7%
Shell
0.2%