| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Sorry, something went wrong.
The picture key reads the dev and writes nothing: a pointer to const. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Sorry, something went wrong.
…ure that changes nothing does nothing Reported: the navigation thumbnail repaints on every pointer hover over a notebook tab or a panel edge, widgets connected to it neither logically nor programmatically. Two ways such a hover reaches it, both closed: - The resize grip floating over the navigation area is a translucent overlay child, so GTK repaints what lies under it every time the grip is hovered -- its :hover state, its cursor, its own queue_draw on enter and leave -- and the area's draw handler ran with a clip of the grip's strip. It answered with a fresh full-size surface, a background render, the thumbnail copy, a pango layout for the zoom label and a blit, on every expose. The picture is now composed once per state -- keyed on the preview frame's hash, the widget's size, the image, the viewport state and the preview's plan -- and an expose with an equal key is one blit of the composed surface. A miss on the preview cacheline keeps the previous picture instead of leaking the surface and its context, as the early return used to. `-d perf' prints `[navigation] redraw: cached|composed, clip WxH at x,y of WxH', which also says who asked: the whole widget is a request of the module's own, a strip along an edge is the grip. - A layout pass allocates the centre again, GTK delivers it a configure-event, and dt_dev_configure_real() re-planned both pipes, recomputed the thumbnail size and raised DT_SIGNAL_CONTROL_REDRAW_ALL -- every panel, the navigation, the scopes -- whether or not anything changed. The theme gives every hovered tab and button a heavier font weight, which changes the widget's size request, so a layout pass is every hover. The box the pipes plan from is published by a setter that already reports whether it changed; when it did not, the configure now returns, `-d dev' printing the request with `unchanged' appended. Only the first configure and a real size, border or zoom change get past it. The signal layer's own trace is the tool for the next such report: `ansel -d signal --d-signal-act raise,print-trace --d-signal DT_SIGNAL_CONTROL_REDRAW_ALL' backtraces every raise; a redraw with no signal behind it is GTK's own, an overlay exposed or an allocation that moved. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The picture key reads the dev and writes nothing: a pointer to const. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Rebased onto fc54f74b5d (master, 2026-10-29) and force-pushed: c3a9b3fa56 → 7d819416b4. The code applied cleanly; the conflicts were in the docs only:
Build (clang-19, RelWithDebInfo) green; navigation.c and develop.c compile with -Werror; the blocking gates pass (check_layering, check_module_boundaries, check_return_types, check_list_order, pragma_once_to_guards --verify, check_conditional_includes, check_statelessness, check_unused_includes --changed: 0 introduced). Measured in the GUISame config copy, same image, -d perf -d dev -d signal --d-signal-act raise --d-signal DT_SIGNAL_CONTROL_REDRAW_ALL, master fc54f74b5d against this branch, pointer moved by hand, the log cut at the end of each phase. Navigation widget 385×179, device scale 1.
Then, on this branch: a window resize (372 configures, every one re-planned), ISO 12646 on and off, the margin slider, zoom, switching between landscape and portrait images, a lighttable round trip. All repainted and re-framed correctly. The configure guard fired 4 times, all on image switches, where _darkroom_image_loaded_callback() has already run dt_dev_pixelpipe_rebuild_all() and dt_dev_get_thumbnail_size(); each was followed by a fresh main backbuffer. studio_capture (read, not run) does the same rebuild before it configures. So:
Claims in the description and the doc that the measurement contradicts
Minor, in the code
The doc corrections are not in this push: it is the rebase only. |
Sorry, something went wrong.
…attern finds a home The rebase onto master took master's CLAUDE.md, which now holds the rules only, so the two paragraphs this branch had added there are gone. The overlay one moves to doc/gtk-patterns.md as its own dated section; the layout-pass one is folded into doc/darkroom-redraw.md, where it is recorded as not reproduced. The navigation section of doc/darkroom-redraw.md is dated and carries the numbers measured on 7d81941 against master fc54f74. It corrects three claims the measurement contradicts: a whole-widget clip is not only the module's own request, since the area's own :hover restyle gives one too; hovering the notebook tabs gives no configure of the centre on either build; and --d-signal-act takes one value per flag, print-trace being compiled for GCC builds only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Sorry, something went wrong.
The picture key reads the dev and writes nothing: a pointer to const. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
| Back | FazBrowse Home | New Git URL |
Reported after #1394: the navigation thumbnail repaints on every pointer hover over a notebook tab or a panel edge. Two ways a hover over an unrelated widget reaches it, both closed; the darkroom cannot be driven here, so which of the two fires on which widget is for the tester to read off the trace below.
The grip over the navigation area
The resize grips are translucent GtkEventBox overlay children floating over the area they resize. GTK3 composites overlay children over the main child, so invalidating the grip (its :hover state, its cursor, its own redraw on enter and leave) exposes the navigation area under it with a clip of the grip's strip, and the area's draw handler runs. It answered every expose with a fresh full-size surface, a background render, the thumbnail copy, a pango layout for the zoom label and a blit.
The picture is now composed once per state, keyed on the preview frame's hash, the widget's size, the image, the viewport state and the preview's plan, and an expose with an equal key is one blit. A miss on the preview cacheline keeps the previous picture instead of leaking the surface and its context, as the early return used to.
A configure that changes nothing
A layout pass allocates the centre again and GTK delivers it a configure-event; dt_dev_configure_real() re-planned both pipes, recomputed the thumbnail size and raised DT_SIGNAL_CONTROL_REDRAW_ALL (every panel, the navigation, the scopes) whether or not anything changed. The theme gives every hovered tab and button font-weight: 500, which changes the widget's size request, so a layout pass is every hover. The viewport box the pipes plan from is published by a setter that already reports whether it changed; when it did not, the configure returns. Only the first configure and a real size, border or zoom change get past it.
What to look at
Validation
GCC, clang build-warnsweep and build-nofeatures; the tools/check_* gates; the unit tests (the six LensSerious tests report "Not Run" in this tree, as before, their binaries are not built here); the image smoke test. The GUI itself is not verifiable here.
Docs: doc/darkroom-redraw.md (a new section on both), CLAUDE.md (the overlay rule and the trace).
🤖 Generated with Claude Code