fix(cef): force repaint after zoom via NotifyScreenInfoChanged()
WasResized() is a no-op when view dimensions haven't changed (zoom only affects Blink's CSS layout, not the pixel buffer size). Replace with NotifyScreenInfoChanged() which invalidates the surface ID and forces the renderer to produce a new compositor frame at the new zoom level.
- commit
- afef29b11ef1d018f86a957e08e74071d16ea95d
- author
- brice · · 2026-03-21 10:54 UTC
- committer
- brice · · 2026-03-28 04:37 UTC
- parent
- 3d3e3a9
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +7 -4
M internal/infrastructure/cef/webview.go +7 -4
| @@ -333,10 +333,13 @@ func (wv *WebView) SetZoomLevel(_ context.Context, factor float64) error { | |||
| 333 | 333 | Msg("cef: SetZoomLevel") | |
| 334 | 334 | host.SetZoomLevel(cefLevel) | |
| 335 | 335 | wv.zoomFactor.Store(factor) | |
| 336 | - | // Force CEF to re-render at the new zoom level. In OSR mode, SetZoomLevel | |
| 337 | - | // alone doesn't trigger a repaint — WasResized makes CEF re-query | |
| 338 | - | // GetViewRect and issue a fresh OnPaint. | |
| 339 | - | host.WasResized() | |
| 336 | + | // Force CEF to produce a new frame at the new zoom level. In OSR mode, | |
| 337 | + | // SetZoomLevel changes the Blink layout zoom but doesn't guarantee a | |
| 338 | + | // repaint. WasResized is a no-op when view dimensions haven't changed. | |
| 339 | + | // NotifyScreenInfoChanged forces surface ID invalidation + a full | |
| 340 | + | // SynchronizeVisualProperties cycle, which makes the renderer produce | |
| 341 | + | // a new compositor frame at the new zoom level. | |
| 342 | + | host.NotifyScreenInfoChanged() | |
| 340 | 343 | return nil | |
| 341 | 344 | } | |
| 342 | 345 | ||
| @@ -333,10 +333,13 @@ func (wv *WebView) SetZoomLevel(_ context.Context, factor float64) error { | |||||
| 333 | Msg("cef: SetZoomLevel") | 333 | Msg("cef: SetZoomLevel") | ||
| 334 | host.SetZoomLevel(cefLevel) | 334 | host.SetZoomLevel(cefLevel) | ||
| 335 | wv.zoomFactor.Store(factor) | 335 | wv.zoomFactor.Store(factor) | ||
| 336 | - | // Force CEF to re-render at the new zoom level. In OSR mode, SetZoomLevel | 336 | + | // Force CEF to produce a new frame at the new zoom level. In OSR mode, |
| 337 | - | // alone doesn't trigger a repaint — WasResized makes CEF re-query | 337 | + | // SetZoomLevel changes the Blink layout zoom but doesn't guarantee a |
| 338 | - | // GetViewRect and issue a fresh OnPaint. | 338 | + | // repaint. WasResized is a no-op when view dimensions haven't changed. |
| 339 | - | host.WasResized() | 339 | + | // NotifyScreenInfoChanged forces surface ID invalidation + a full |
| 340 | + | // SynchronizeVisualProperties cycle, which makes the renderer produce | |||
| 341 | + | // a new compositor frame at the new zoom level. | |||
| 342 | + | host.NotifyScreenInfoChanged() | |||
| 340 | return nil | 343 | return nil | ||
| 341 | } | 344 | } | ||
| 342 | 345 | ||||