detached 08629e9

Merge pull request #358 from bnema/fix/cef-canvas-background

fix(cef): keep browser canvas white, move anti-flash to presentation layer
commit
08629e9db8c0d3927d6b60bbac71329688bebd29
author
bnema · · 2026-07-22 05:43 UTC
committer
GitHub · · 2026-07-22 05:43 UTC
merge of
3b318d2 + 902c404 · diff against the first parent
signature
GPG UnverifiedB5690EEEBB952194 The key is unknown
80 files · +1985 -2004
M go.mod +1 -1
@@ -6,7 +6,7 @@ require (
66 github.com/a-h/templ v0.3.1020
77 github.com/andybalholm/brotli v1.2.2
88 github.com/bnema/purego v0.11.0-bnema.4
9- github.com/bnema/purego-cef v0.13.4
9+ github.com/bnema/purego-cef v0.14.1
1010 github.com/bnema/purego-cef2gtk v0.8.5
1111 github.com/bnema/purego-pipewire v0.1.5
1212 github.com/bnema/purego-sqlite v0.1.4
@@ -6,7 +6,7 @@ require (
6 github.com/a-h/templ v0.3.10206 github.com/a-h/templ v0.3.1020
7 github.com/andybalholm/brotli v1.2.27 github.com/andybalholm/brotli v1.2.2
8 github.com/bnema/purego v0.11.0-bnema.48 github.com/bnema/purego v0.11.0-bnema.4
9- github.com/bnema/purego-cef v0.13.49+ github.com/bnema/purego-cef v0.14.1
10 github.com/bnema/purego-cef2gtk v0.8.510 github.com/bnema/purego-cef2gtk v0.8.5
11 github.com/bnema/purego-pipewire v0.1.511 github.com/bnema/purego-pipewire v0.1.5
12 github.com/bnema/purego-sqlite v0.1.412 github.com/bnema/purego-sqlite v0.1.4
M go.sum +2 -2 generated file: collapsed
A internal/infrastructure/cef/background_guard.go +106 -0
@@ -0,0 +1,106 @@
1+package cef
2+
3+import (
4+ "fmt"
5+
6+ "github.com/bnema/puregotk/v4/gdk"
7+ "github.com/bnema/puregotk/v4/gtk"
8+)
9+
10+// opaqueWhiteBackground is Chromium's standard windowless canvas fallback. It is
11+// baked into every BrowserSettings.BackgroundColor so pages that paint nothing
12+// get an opaque white canvas (never a theme-dark one). A zero value must not be
13+// used: in windowless/OSR mode a zero-alpha background enables transparent
14+// painting, which this engine does not want.
15+const opaqueWhiteBackground uint32 = 0xFFFFFFFF
16+
17+// flashGuardCSSClassPrefix scopes each WebView's transient background provider to
18+// its own render widget so guards from different tabs never collide.
19+const flashGuardCSSClassPrefix = "dumber-cef-flash-guard-"
20+
21+// colorByteMask isolates a single 8-bit channel from a packed ARGB value.
22+const colorByteMask = 0xFF
23+
24+// applyBackgroundFlashGuard paints the theme background color behind the CEF
25+// render widget until the first frame is presented. It is the presentation-layer
26+// replacement for the former dark BrowserSettings.BackgroundColor: Chromium's
27+// canvas is now always opaque white, so the anti-white-flash lives here instead.
28+// The bridge widget (a GtkPicture/GtkGLArea) renders its CSS background until an
29+// opaque frame texture covers it, at which point markFirstFramePainted tears the
30+// guard down. Must run on the GTK main thread.
31+func (wv *WebView) applyBackgroundFlashGuard(widget *gtk.Widget) {
32+ if wv == nil || widget == nil {
33+ return
34+ }
35+ argb := wv.backgroundColor
36+ if argb == 0 {
37+ return // No theme color configured; nothing to guard against.
38+ }
39+ display := gdk.DisplayGetDefault()
40+ if display == nil {
41+ return
42+ }
43+
44+ a := float64((argb>>24)&colorByteMask) / colorScale
45+ r := (argb >> 16) & colorByteMask
46+ g := (argb >> 8) & colorByteMask
47+ b := argb & colorByteMask
48+ class := fmt.Sprintf("%s%d", flashGuardCSSClassPrefix, uint64(wv.id))
49+ css := fmt.Sprintf(".%s { background-color: rgba(%d, %d, %d, %.4f); }", class, r, g, b, a)
50+
51+ provider := gtk.NewCssProvider()
52+ if provider == nil {
53+ return
54+ }
55+ provider.LoadFromString(css)
56+
57+ wv.bgGuardMu.Lock()
58+ defer wv.bgGuardMu.Unlock()
59+ if wv.firstFramePainted.Load() {
60+ return // First frame already arrived before the guard could be installed.
61+ }
62+ widget.AddCssClass(class)
63+ gtk.StyleContextAddProviderForDisplay(display, provider, uint(gtk.STYLE_PROVIDER_PRIORITY_APPLICATION))
64+ wv.bgGuardProvider = provider
65+ wv.bgGuardWidget = widget
66+ wv.bgGuardClass = class
67+}
68+
69+// markFirstFramePainted records that the first CEF frame has been presented and
70+// schedules teardown of the background flash guard so later frames render
71+// normally. Safe to call from any thread and idempotent.
72+func (wv *WebView) markFirstFramePainted() {
73+ if wv == nil || !wv.firstFramePainted.CompareAndSwap(false, true) {
74+ return
75+ }
76+ wv.runOnGTK(func() {
77+ wv.removeBackgroundFlashGuard()
78+ })
79+}
80+
81+// removeBackgroundFlashGuard detaches the transient theme-background provider and
82+// clears the render widget's guard class. Must run on the GTK main thread. It is
83+// safe to call when no guard is installed.
84+func (wv *WebView) removeBackgroundFlashGuard() {
85+ if wv == nil {
86+ return
87+ }
88+ wv.bgGuardMu.Lock()
89+ provider := wv.bgGuardProvider
90+ widget := wv.bgGuardWidget
91+ class := wv.bgGuardClass
92+ wv.bgGuardProvider = nil
93+ wv.bgGuardWidget = nil
94+ wv.bgGuardClass = ""
95+ wv.bgGuardMu.Unlock()
96+
97+ if provider == nil {
98+ return
99+ }
100+ if widget != nil && class != "" {
101+ widget.RemoveCssClass(class)
102+ }
103+ if display := gdk.DisplayGetDefault(); display != nil {
104+ gtk.StyleContextRemoveProviderForDisplay(display, provider)
105+ }
106+}
@@ -0,0 +1,106 @@
1+package cef
2+
3+import (
4+ "fmt"
5+
6+ "github.com/bnema/puregotk/v4/gdk"
7+ "github.com/bnema/puregotk/v4/gtk"
8+)
9+
10+// opaqueWhiteBackground is Chromium's standard windowless canvas fallback. It is
11+// baked into every BrowserSettings.BackgroundColor so pages that paint nothing
12+// get an opaque white canvas (never a theme-dark one). A zero value must not be
13+// used: in windowless/OSR mode a zero-alpha background enables transparent
14+// painting, which this engine does not want.
15+const opaqueWhiteBackground uint32 = 0xFFFFFFFF
16+
17+// flashGuardCSSClassPrefix scopes each WebView's transient background provider to
18+// its own render widget so guards from different tabs never collide.
19+const flashGuardCSSClassPrefix = "dumber-cef-flash-guard-"
20+
21+// colorByteMask isolates a single 8-bit channel from a packed ARGB value.
22+const colorByteMask = 0xFF
23+
24+// applyBackgroundFlashGuard paints the theme background color behind the CEF
25+// render widget until the first frame is presented. It is the presentation-layer
26+// replacement for the former dark BrowserSettings.BackgroundColor: Chromium's
27+// canvas is now always opaque white, so the anti-white-flash lives here instead.
28+// The bridge widget (a GtkPicture/GtkGLArea) renders its CSS background until an
29+// opaque frame texture covers it, at which point markFirstFramePainted tears the
30+// guard down. Must run on the GTK main thread.
31+func (wv *WebView) applyBackgroundFlashGuard(widget *gtk.Widget) {
32+ if wv == nil || widget == nil {
33+ return
34+ }
35+ argb := wv.backgroundColor
36+ if argb == 0 {
37+ return // No theme color configured; nothing to guard against.
38+ }
39+ display := gdk.DisplayGetDefault()
40+ if display == nil {
41+ return
42+ }
43+
44+ a := float64((argb>>24)&colorByteMask) / colorScale
45+ r := (argb >> 16) & colorByteMask
46+ g := (argb >> 8) & colorByteMask
47+ b := argb & colorByteMask
48+ class := fmt.Sprintf("%s%d", flashGuardCSSClassPrefix, uint64(wv.id))
49+ css := fmt.Sprintf(".%s { background-color: rgba(%d, %d, %d, %.4f); }", class, r, g, b, a)
50+
51+ provider := gtk.NewCssProvider()
52+ if provider == nil {
53+ return
54+ }
55+ provider.LoadFromString(css)
56+
57+ wv.bgGuardMu.Lock()
58+ defer wv.bgGuardMu.Unlock()
59+ if wv.firstFramePainted.Load() {
60+ return // First frame already arrived before the guard could be installed.
61+ }
62+ widget.AddCssClass(class)
63+ gtk.StyleContextAddProviderForDisplay(display, provider, uint(gtk.STYLE_PROVIDER_PRIORITY_APPLICATION))
64+ wv.bgGuardProvider = provider
65+ wv.bgGuardWidget = widget
66+ wv.bgGuardClass = class
67+}
68+
69+// markFirstFramePainted records that the first CEF frame has been presented and
70+// schedules teardown of the background flash guard so later frames render
71+// normally. Safe to call from any thread and idempotent.
72+func (wv *WebView) markFirstFramePainted() {
73+ if wv == nil || !wv.firstFramePainted.CompareAndSwap(false, true) {
74+ return
75+ }
76+ wv.runOnGTK(func() {
77+ wv.removeBackgroundFlashGuard()
78+ })
79+}
80+
81+// removeBackgroundFlashGuard detaches the transient theme-background provider and
82+// clears the render widget's guard class. Must run on the GTK main thread. It is
83+// safe to call when no guard is installed.
84+func (wv *WebView) removeBackgroundFlashGuard() {
85+ if wv == nil {
86+ return
87+ }
88+ wv.bgGuardMu.Lock()
89+ provider := wv.bgGuardProvider
90+ widget := wv.bgGuardWidget
91+ class := wv.bgGuardClass
92+ wv.bgGuardProvider = nil
93+ wv.bgGuardWidget = nil
94+ wv.bgGuardClass = ""
95+ wv.bgGuardMu.Unlock()
96+
97+ if provider == nil {
98+ return
99+ }
100+ if widget != nil && class != "" {
101+ widget.RemoveCssClass(class)
102+ }
103+ if display := gdk.DisplayGetDefault(); display != nil {
104+ gtk.StyleContextRemoveProviderForDisplay(display, provider)
105+ }
106+}
M internal/infrastructure/cef/factory.go +12 -8
@@ -27,7 +27,7 @@ type WebViewFactory struct {
2727 windowlessFrameRate int32
2828 windowlessFrameRateMax int32
2929 inputConfig RuntimeInputConfig
30- bgColor atomic.Uint32 // packed ARGB for BrowserSettings.BackgroundColor
30+ bgColor atomic.Uint32 // packed ARGB theme color for the presentation-layer flash guard
3131 audioOutputFactory port.AudioOutputFactory
3232 }
3333
@@ -69,7 +69,9 @@ func newWebViewFactory(engine *Engine, opts webViewFactoryOptions) *WebViewFacto
6969 }
7070 }
7171
72-// setDefaultBackgroundColor stores a packed ARGB color for new browser creation.
72+// setDefaultBackgroundColor stores the packed ARGB theme color used by the
73+// presentation-layer flash guard on newly-created WebViews. It no longer feeds
74+// BrowserSettings.BackgroundColor, which is always opaque white.
7375 func (f *WebViewFactory) setDefaultBackgroundColor(r, g, b, a float64) {
7476 const s = colorScale
7577 argb := uint32(a*s)<<24 | uint32(r*s)<<16 | uint32(g*s)<<8 | uint32(b*s)
@@ -96,9 +98,9 @@ func (f *WebViewFactory) Create(ctx context.Context) (port.WebView, error) {
9698 settings := purecef.NewBrowserSettings()
9799 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})
98100 settings.LocalStorage = 1 // CEF_STATE_ENABLED
99- if bg := f.bgColor.Load(); bg != 0 {
100- settings.BackgroundColor = bg
101- }
101+ // Always opaque white: Chromium's standard canvas fallback. The theme
102+ // background is applied at the presentation layer as a flash guard instead.
103+ settings.BackgroundColor = opaqueWhiteBackground
102104
103105 // Defer browser creation until the bridge view has a non-zero size.
104106 // CEF requires GetViewRect to return a non-empty rect, but the GL area
@@ -142,6 +144,8 @@ func (f *WebViewFactory) newWebView(ctx context.Context) (*WebView, error) {
142144 wv.nativeWidget = popupRoot
143145 }
144146 }
147+ // Guard the render widget with the theme background until the first frame.
148+ wv.applyBackgroundFlashGuard(nativeWidget)
145149 })
146150 if !result.Completed() {
147151 wv.destroyViewBridgeOnGTKAsync()
@@ -383,9 +387,9 @@ func (f *WebViewFactory) CreateRelated(ctx context.Context, parentID port.WebVie
383387 settings := purecef.NewBrowserSettings()
384388 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})
385389 settings.LocalStorage = 1 // CEF_STATE_ENABLED
386- if bg := f.bgColor.Load(); bg != 0 {
387- settings.BackgroundColor = bg
388- }
390+ // Always opaque white: the theme background is applied as a presentation-layer
391+ // flash guard, not baked into Chromium's canvas.
392+ settings.BackgroundColor = opaqueWhiteBackground
389393
390394 if err := f.configureInitialBrowserCreation(ctx, popupWV, popupWV.client, &windowInfo, &settings, func(w, h int32) {
391395 f.handlePopupShellInitialResize(ctx, popupWV, func(w, h int32) {
@@ -27,7 +27,7 @@ type WebViewFactory struct {
27 windowlessFrameRate int3227 windowlessFrameRate int32
28 windowlessFrameRateMax int3228 windowlessFrameRateMax int32
29 inputConfig RuntimeInputConfig29 inputConfig RuntimeInputConfig
30- bgColor atomic.Uint32 // packed ARGB for BrowserSettings.BackgroundColor30+ bgColor atomic.Uint32 // packed ARGB theme color for the presentation-layer flash guard
31 audioOutputFactory port.AudioOutputFactory31 audioOutputFactory port.AudioOutputFactory
32 }32 }
33 33
@@ -69,7 +69,9 @@ func newWebViewFactory(engine *Engine, opts webViewFactoryOptions) *WebViewFacto
69 }69 }
70 }70 }
71 71
72-// setDefaultBackgroundColor stores a packed ARGB color for new browser creation.72+// setDefaultBackgroundColor stores the packed ARGB theme color used by the
73+// presentation-layer flash guard on newly-created WebViews. It no longer feeds
74+// BrowserSettings.BackgroundColor, which is always opaque white.
73 func (f *WebViewFactory) setDefaultBackgroundColor(r, g, b, a float64) {75 func (f *WebViewFactory) setDefaultBackgroundColor(r, g, b, a float64) {
74 const s = colorScale76 const s = colorScale
75 argb := uint32(a*s)<<24 | uint32(r*s)<<16 | uint32(g*s)<<8 | uint32(b*s)77 argb := uint32(a*s)<<24 | uint32(r*s)<<16 | uint32(g*s)<<8 | uint32(b*s)
@@ -96,9 +98,9 @@ func (f *WebViewFactory) Create(ctx context.Context) (port.WebView, error) {
96 settings := purecef.NewBrowserSettings()98 settings := purecef.NewBrowserSettings()
97 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})99 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})
98 settings.LocalStorage = 1 // CEF_STATE_ENABLED100 settings.LocalStorage = 1 // CEF_STATE_ENABLED
99- if bg := f.bgColor.Load(); bg != 0 {101+ // Always opaque white: Chromium's standard canvas fallback. The theme
100- settings.BackgroundColor = bg102+ // background is applied at the presentation layer as a flash guard instead.
101- }103+ settings.BackgroundColor = opaqueWhiteBackground
102 104
103 // Defer browser creation until the bridge view has a non-zero size.105 // Defer browser creation until the bridge view has a non-zero size.
104 // CEF requires GetViewRect to return a non-empty rect, but the GL area106 // CEF requires GetViewRect to return a non-empty rect, but the GL area
@@ -142,6 +144,8 @@ func (f *WebViewFactory) newWebView(ctx context.Context) (*WebView, error) {
142 wv.nativeWidget = popupRoot144 wv.nativeWidget = popupRoot
143 }145 }
144 }146 }
147+ // Guard the render widget with the theme background until the first frame.
148+ wv.applyBackgroundFlashGuard(nativeWidget)
145 })149 })
146 if !result.Completed() {150 if !result.Completed() {
147 wv.destroyViewBridgeOnGTKAsync()151 wv.destroyViewBridgeOnGTKAsync()
@@ -383,9 +387,9 @@ func (f *WebViewFactory) CreateRelated(ctx context.Context, parentID port.WebVie
383 settings := purecef.NewBrowserSettings()387 settings := purecef.NewBrowserSettings()
384 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})388 cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate})
385 settings.LocalStorage = 1 // CEF_STATE_ENABLED389 settings.LocalStorage = 1 // CEF_STATE_ENABLED
386- if bg := f.bgColor.Load(); bg != 0 {390+ // Always opaque white: the theme background is applied as a presentation-layer
387- settings.BackgroundColor = bg391+ // flash guard, not baked into Chromium's canvas.
388- }392+ settings.BackgroundColor = opaqueWhiteBackground
389 393
390 if err := f.configureInitialBrowserCreation(ctx, popupWV, popupWV.client, &windowInfo, &settings, func(w, h int32) {394 if err := f.configureInitialBrowserCreation(ctx, popupWV, popupWV.client, &windowInfo, &settings, func(w, h int32) {
391 f.handlePopupShellInitialResize(ctx, popupWV, func(w, h int32) {395 f.handlePopupShellInitialResize(ctx, popupWV, func(w, h int32) {
M internal/infrastructure/cef/render_handler_adapter.go +9 -0
@@ -51,6 +51,15 @@ func newDumberRenderHandler(wv *WebView) purecef.RenderHandler {
5151
5252 var unsupportedPaintOnce sync.Once
5353 hooks := startupPresentationHooks(activeStartupTrace())
54+ // Tear down the theme background flash guard once the first frame is
55+ // presented, without dropping the startup trace mark the bridge already set.
56+ firstAcceleratedPaint := hooks.OnFirstAcceleratedPaint
57+ hooks.OnFirstAcceleratedPaint = func() {
58+ if firstAcceleratedPaint != nil {
59+ firstAcceleratedPaint()
60+ }
61+ wv.markFirstFramePainted()
62+ }
5463 hooks.OnUnsupportedPaint = func() {
5564 unsupportedPaintOnce.Do(func() {
5665 if wv.ctx != nil {
@@ -51,6 +51,15 @@ func newDumberRenderHandler(wv *WebView) purecef.RenderHandler {
51 51
52 var unsupportedPaintOnce sync.Once52 var unsupportedPaintOnce sync.Once
53 hooks := startupPresentationHooks(activeStartupTrace())53 hooks := startupPresentationHooks(activeStartupTrace())
54+ // Tear down the theme background flash guard once the first frame is
55+ // presented, without dropping the startup trace mark the bridge already set.
56+ firstAcceleratedPaint := hooks.OnFirstAcceleratedPaint
57+ hooks.OnFirstAcceleratedPaint = func() {
58+ if firstAcceleratedPaint != nil {
59+ firstAcceleratedPaint()
60+ }
61+ wv.markFirstFramePainted()
62+ }
54 hooks.OnUnsupportedPaint = func() {63 hooks.OnUnsupportedPaint = func() {
55 unsupportedPaintOnce.Do(func() {64 unsupportedPaintOnce.Do(func() {
56 if wv.ctx != nil {65 if wv.ctx != nil {
M internal/infrastructure/cef/webview.go +20 -11
@@ -239,6 +239,18 @@ type WebView struct {
239239 backgroundColor uint32
240240 inputConfig RuntimeInputConfig
241241
242+ // Background flash guard: a theme-colored CSS provider painted behind the
243+ // render widget until the first CEF frame is presented. It replaces the
244+ // former dark BrowserSettings.BackgroundColor anti-white-flash, whose canvas
245+ // is now always opaque white. State is guarded by bgGuardMu; firstFramePainted
246+ // gates the one-shot teardown and resets naturally when a fresh WebView is
247+ // created after a browser recreation.
248+ firstFramePainted atomic.Bool
249+ bgGuardMu sync.Mutex
250+ bgGuardProvider *gtk.CssProvider
251+ bgGuardWidget *gtk.Widget
252+ bgGuardClass string
253+
242254 // Touchpad input diagnostics are debounced to avoid flooding logs while
243255 // debugging continuous scroll streams.
244256 touchpadNavigation *touchpadNavigationRecognizer
@@ -992,7 +1004,7 @@ func (wv *WebView) prepareNativePopup(
9921004 prep.parent.trackPendingNativePopup(popupID, wv)
9931005 }
9941006
995- configureNativePopupWindow(windowInfo, settings, prep.frameRate, prep.backgroundColor)
1007+ configureNativePopupWindow(windowInfo, settings, prep.frameRate)
9961008 clientSlot.Set(client)
9971009 return true
9981010 }
@@ -1007,9 +1019,8 @@ func (wv *WebView) nativePopupPreparationSnapshot() (nativePopupPreparation, boo
10071019 return nativePopupPreparation{}, false
10081020 }
10091021 return nativePopupPreparation{
1010- parent: wv.nativePopupParent,
1011- frameRate: wv.windowlessFrameRate,
1012- backgroundColor: wv.backgroundColor,
1022+ parent: wv.nativePopupParent,
1023+ frameRate: wv.windowlessFrameRate,
10131024 }, true
10141025 }
10151026
@@ -1045,7 +1056,6 @@ func configureNativePopupWindow(
10451056 windowInfo *purecef.WindowInfo,
10461057 settings *purecef.BrowserSettings,
10471058 frameRate int32,
1048- backgroundColor uint32,
10491059 ) {
10501060 cef2gtk.ConfigureWindowInfo(windowInfo, cef2gtk.WindowInfoOptions{})
10511061 if externalBeginFrameEnabled() {
@@ -1056,15 +1066,13 @@ func configureNativePopupWindow(
10561066 }
10571067 cef2gtk.ConfigureBrowserSettings(settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: frameRate})
10581068 settings.LocalStorage = 1
1059- if backgroundColor != 0 {
1060- settings.BackgroundColor = backgroundColor
1061- }
1069+ // Always opaque white; the popup shell WebView carries the theme flash guard.
1070+ settings.BackgroundColor = opaqueWhiteBackground
10621071 }
10631072
10641073 type nativePopupPreparation struct {
1065- parent *WebView
1066- frameRate int32
1067- backgroundColor uint32
1074+ parent *WebView
1075+ frameRate int32
10681076 }
10691077
10701078 func (wv *WebView) handleNativePopupAborted() {
@@ -1244,6 +1252,7 @@ func (wv *WebView) destroyViewBridgeOnGTKThread() {
12441252 if wv == nil || wv.viewBridge == nil {
12451253 return
12461254 }
1255+ wv.removeBackgroundFlashGuard()
12471256 if wv.removeSizeObserver != nil {
12481257 wv.removeSizeObserver()
12491258 wv.removeSizeObserver = nil
@@ -239,6 +239,18 @@ type WebView struct {
239 backgroundColor uint32239 backgroundColor uint32
240 inputConfig RuntimeInputConfig240 inputConfig RuntimeInputConfig
241 241
242+ // Background flash guard: a theme-colored CSS provider painted behind the
243+ // render widget until the first CEF frame is presented. It replaces the
244+ // former dark BrowserSettings.BackgroundColor anti-white-flash, whose canvas
245+ // is now always opaque white. State is guarded by bgGuardMu; firstFramePainted
246+ // gates the one-shot teardown and resets naturally when a fresh WebView is
247+ // created after a browser recreation.
248+ firstFramePainted atomic.Bool
249+ bgGuardMu sync.Mutex
250+ bgGuardProvider *gtk.CssProvider
251+ bgGuardWidget *gtk.Widget
252+ bgGuardClass string
253+
242 // Touchpad input diagnostics are debounced to avoid flooding logs while254 // Touchpad input diagnostics are debounced to avoid flooding logs while
243 // debugging continuous scroll streams.255 // debugging continuous scroll streams.
244 touchpadNavigation *touchpadNavigationRecognizer256 touchpadNavigation *touchpadNavigationRecognizer
@@ -992,7 +1004,7 @@ func (wv *WebView) prepareNativePopup(
992 prep.parent.trackPendingNativePopup(popupID, wv)1004 prep.parent.trackPendingNativePopup(popupID, wv)
993 }1005 }
994 1006
995- configureNativePopupWindow(windowInfo, settings, prep.frameRate, prep.backgroundColor)1007+ configureNativePopupWindow(windowInfo, settings, prep.frameRate)
996 clientSlot.Set(client)1008 clientSlot.Set(client)
997 return true1009 return true
998 }1010 }
@@ -1007,9 +1019,8 @@ func (wv *WebView) nativePopupPreparationSnapshot() (nativePopupPreparation, boo
1007 return nativePopupPreparation{}, false1019 return nativePopupPreparation{}, false
1008 }1020 }
1009 return nativePopupPreparation{1021 return nativePopupPreparation{
1010- parent: wv.nativePopupParent,1022+ parent: wv.nativePopupParent,
1011- frameRate: wv.windowlessFrameRate,1023+ frameRate: wv.windowlessFrameRate,
1012- backgroundColor: wv.backgroundColor,
1013 }, true1024 }, true
1014 }1025 }
1015 1026
@@ -1045,7 +1056,6 @@ func configureNativePopupWindow(
1045 windowInfo *purecef.WindowInfo,1056 windowInfo *purecef.WindowInfo,
1046 settings *purecef.BrowserSettings,1057 settings *purecef.BrowserSettings,
1047 frameRate int32,1058 frameRate int32,
1048- backgroundColor uint32,
1049 ) {1059 ) {
1050 cef2gtk.ConfigureWindowInfo(windowInfo, cef2gtk.WindowInfoOptions{})1060 cef2gtk.ConfigureWindowInfo(windowInfo, cef2gtk.WindowInfoOptions{})
1051 if externalBeginFrameEnabled() {1061 if externalBeginFrameEnabled() {
@@ -1056,15 +1066,13 @@ func configureNativePopupWindow(
1056 }1066 }
1057 cef2gtk.ConfigureBrowserSettings(settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: frameRate})1067 cef2gtk.ConfigureBrowserSettings(settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: frameRate})
1058 settings.LocalStorage = 11068 settings.LocalStorage = 1
1059- if backgroundColor != 0 {1069+ // Always opaque white; the popup shell WebView carries the theme flash guard.
1060- settings.BackgroundColor = backgroundColor1070+ settings.BackgroundColor = opaqueWhiteBackground
1061- }
1062 }1071 }
1063 1072
1064 type nativePopupPreparation struct {1073 type nativePopupPreparation struct {
1065- parent *WebView1074+ parent *WebView
1066- frameRate int321075+ frameRate int32
1067- backgroundColor uint32
1068 }1076 }
1069 1077
1070 func (wv *WebView) handleNativePopupAborted() {1078 func (wv *WebView) handleNativePopupAborted() {
@@ -1244,6 +1252,7 @@ func (wv *WebView) destroyViewBridgeOnGTKThread() {
1244 if wv == nil || wv.viewBridge == nil {1252 if wv == nil || wv.viewBridge == nil {
1245 return1253 return
1246 }1254 }
1255+ wv.removeBackgroundFlashGuard()
1247 if wv.removeSizeObserver != nil {1256 if wv.removeSizeObserver != nil {
1248 wv.removeSizeObserver()1257 wv.removeSizeObserver()
1249 wv.removeSizeObserver = nil1258 wv.removeSizeObserver = nil
M internal/infrastructure/cef/webview_handlers_test.go +2 -2
@@ -380,14 +380,14 @@ func TestConfigureNativePopupWindow_UsesSharedTextureWindowlessDefaults(t *testi
380380 windowInfo := purecef.NewWindowInfo()
381381 settings := purecef.NewBrowserSettings()
382382
383- configureNativePopupWindow(&windowInfo, &settings, 72, 0xFF112233)
383+ configureNativePopupWindow(&windowInfo, &settings, 72)
384384
385385 require.Equal(t, purecef.WindowHandle(0), windowInfo.ParentWindow)
386386 require.Equal(t, int32(1), windowInfo.WindowlessRenderingEnabled)
387387 require.Equal(t, int32(1), windowInfo.SharedTextureEnabled)
388388 require.Equal(t, int32(72), settings.WindowlessFrameRate)
389389 require.Equal(t, int32(1), settings.LocalStorage)
390- require.Equal(t, uint32(0xFF112233), settings.BackgroundColor)
390+ require.Equal(t, opaqueWhiteBackground, settings.BackgroundColor)
391391 }
392392
393393 func TestOnLoadStartFiresCommittedAndUpdatesURI(t *testing.T) {
@@ -380,14 +380,14 @@ func TestConfigureNativePopupWindow_UsesSharedTextureWindowlessDefaults(t *testi
380 windowInfo := purecef.NewWindowInfo()380 windowInfo := purecef.NewWindowInfo()
381 settings := purecef.NewBrowserSettings()381 settings := purecef.NewBrowserSettings()
382 382
383- configureNativePopupWindow(&windowInfo, &settings, 72, 0xFF112233)383+ configureNativePopupWindow(&windowInfo, &settings, 72)
384 384
385 require.Equal(t, purecef.WindowHandle(0), windowInfo.ParentWindow)385 require.Equal(t, purecef.WindowHandle(0), windowInfo.ParentWindow)
386 require.Equal(t, int32(1), windowInfo.WindowlessRenderingEnabled)386 require.Equal(t, int32(1), windowInfo.WindowlessRenderingEnabled)
387 require.Equal(t, int32(1), windowInfo.SharedTextureEnabled)387 require.Equal(t, int32(1), windowInfo.SharedTextureEnabled)
388 require.Equal(t, int32(72), settings.WindowlessFrameRate)388 require.Equal(t, int32(72), settings.WindowlessFrameRate)
389 require.Equal(t, int32(1), settings.LocalStorage)389 require.Equal(t, int32(1), settings.LocalStorage)
390- require.Equal(t, uint32(0xFF112233), settings.BackgroundColor)390+ require.Equal(t, opaqueWhiteBackground, settings.BackgroundColor)
391 }391 }
392 392
393 func TestOnLoadStartFiresCommittedAndUpdatesURI(t *testing.T) {393 func TestOnLoadStartFiresCommittedAndUpdatesURI(t *testing.T) {
M vendor/github.com/bnema/purego-cef/cef/cef_browser_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_command_line_gen.go +15 -2 generated file: collapsed
A vendor/github.com/bnema/purego-cef/cef/cef_component_updater_gen.go +323 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_cookie_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_drag_data_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_image_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_media_router_gen.go +24 -41 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_menu_model_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_parser_gen.go +10 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_preference_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_print_settings_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_process_message_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_request_context_gen.go +16 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_request_gen.go +42 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_resource_bundle_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_response_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_shared_memory_region_gen.go +3 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_shared_process_message_builder_gen.go +20 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_stream_gen.go +34 -5 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_task_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_task_manager_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_thread_gen.go +14 -1 generated file: collapsed
A vendor/github.com/bnema/purego-cef/cef/cef_types_component_gen.go +45 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_types_content_settings_gen.go +72 -79 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_types_gen.go +59 -52 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_urlrequest_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_v8_gen.go +166 -19 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_values_gen.go +62 -7 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_waitable_event_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_xml_reader_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_zip_reader_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_api_version_test__gen.go +86 -871 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_test_server_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_translator_test__gen.go +92 -50
@@ -377,21 +377,12 @@ func (obj *translatorTestImpl) SetChildRefPtrLibraryAndReturnParent(val Translat
377377 return wrapTranslatorTestRefPtrLibrary(unsafe.Pointer(ret))
378378 }
379379
380-func (obj *translatorTestImpl) SetRefPtrLibraryList(val []TranslatorTestRefPtrLibrary, val1 int32, val2 int32) int32 {
380+func (obj *translatorTestImpl) SetRefPtrLibraryList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
381381 if obj == nil || obj.rawPtr == nil {
382382 return 0
383383 }
384384 rawPtr := obj.rawPtr
385- var valRaw []uintptr
386- var valPtr unsafe.Pointer
387- if len(val) > 0 {
388- valRaw = make([]uintptr, len(val))
389- for i, elem := range val {
390- valRaw[i] = uintptr(extractRawPointer(elem))
391- }
392- valPtr = unsafe.Pointer(&valRaw[0])
393- }
394- ret := rawPtr.CallSetRefPtrLibraryList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
385+ ret := rawPtr.CallSetRefPtrLibraryList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
395386 return int32(ret)
396387 }
397388
@@ -471,21 +462,12 @@ func (obj *translatorTestImpl) SetChildRefPtrClientAndReturnParent(val Translato
471462 return wrapTranslatorTestRefPtrClient(unsafe.Pointer(ret))
472463 }
473464
474-func (obj *translatorTestImpl) SetRefPtrClientList(val []TranslatorTestRefPtrClient, val1 int32, val2 int32) int32 {
465+func (obj *translatorTestImpl) SetRefPtrClientList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
475466 if obj == nil || obj.rawPtr == nil {
476467 return 0
477468 }
478469 rawPtr := obj.rawPtr
479- var valRaw []uintptr
480- var valPtr unsafe.Pointer
481- if len(val) > 0 {
482- valRaw = make([]uintptr, len(val))
483- for i, elem := range val {
484- valRaw[i] = uintptr(extractRawPointer(elem))
485- }
486- valPtr = unsafe.Pointer(&valRaw[0])
487- }
488- ret := rawPtr.CallSetRefPtrClientList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
470+ ret := rawPtr.CallSetRefPtrClientList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
489471 return int32(ret)
490472 }
491473
@@ -628,21 +610,12 @@ func (obj *translatorTestImpl) SetChildRawPtrLibrary(val TranslatorTestScopedLib
628610 return int32(ret)
629611 }
630612
631-func (obj *translatorTestImpl) SetRawPtrLibraryList(val []TranslatorTestScopedLibrary, val1 int32, val2 int32) int32 {
613+func (obj *translatorTestImpl) SetRawPtrLibraryList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
632614 if obj == nil || obj.rawPtr == nil {
633615 return 0
634616 }
635617 rawPtr := obj.rawPtr
636- var valRaw []uintptr
637- var valPtr unsafe.Pointer
638- if len(val) > 0 {
639- valRaw = make([]uintptr, len(val))
640- for i, elem := range val {
641- valRaw[i] = uintptr(extractRawPointer(elem))
642- }
643- valPtr = unsafe.Pointer(&valRaw[0])
644- }
645- ret := rawPtr.CallSetRawPtrLibraryList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
618+ ret := rawPtr.CallSetRawPtrLibraryList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
646619 return int32(ret)
647620 }
648621
@@ -664,21 +637,12 @@ func (obj *translatorTestImpl) SetChildRawPtrClient(val TranslatorTestScopedClie
664637 return int32(ret)
665638 }
666639
667-func (obj *translatorTestImpl) SetRawPtrClientList(val []TranslatorTestScopedClient, val1 int32, val2 int32) int32 {
640+func (obj *translatorTestImpl) SetRawPtrClientList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
668641 if obj == nil || obj.rawPtr == nil {
669642 return 0
670643 }
671644 rawPtr := obj.rawPtr
672- var valRaw []uintptr
673- var valPtr unsafe.Pointer
674- if len(val) > 0 {
675- valRaw = make([]uintptr, len(val))
676- for i, elem := range val {
677- valRaw[i] = uintptr(extractRawPointer(elem))
678- }
679- valPtr = unsafe.Pointer(&valRaw[0])
680- }
681- ret := rawPtr.CallSetRawPtrClientList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
645+ ret := rawPtr.CallSetRawPtrClientList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
682646 return int32(ret)
683647 }
684648
@@ -718,6 +682,19 @@ func wrapTranslatorTest(ptr unsafe.Pointer) TranslatorTest {
718682 return impl
719683 }
720684
685+// takeTranslatorTest adopts a CEF TranslatorTest pointer whose reference is already owned by
686+// the caller (as returned by a global factory function). Unlike wrapTranslatorTest it
687+// does NOT call AddRef, because the C API already transferred one reference to us.
688+func takeTranslatorTest(ptr unsafe.Pointer) TranslatorTest {
689+ if ptr == nil {
690+ return nil
691+ }
692+ r := (*capi.CEFTranslatorTestT)(ptr)
693+ impl := &translatorTestImpl{rawPtr: r}
694+ runtime.SetFinalizer(impl, (*translatorTestImpl).Release)
695+ return impl
696+}
697+
721698 // TranslatorTestRefPtrLibrary Library-side test object for RefPtr.
722699 type TranslatorTestRefPtrLibrary = portin.TranslatorTestRefPtrLibrary
723700
@@ -782,6 +759,19 @@ func wrapTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLib
782759 return impl
783760 }
784761
762+// takeTranslatorTestRefPtrLibrary adopts a CEF TranslatorTestRefPtrLibrary pointer whose reference is already owned by
763+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibrary it
764+// does NOT call AddRef, because the C API already transferred one reference to us.
765+func takeTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLibrary {
766+ if ptr == nil {
767+ return nil
768+ }
769+ r := (*capi.CEFTranslatorTestRefPtrLibraryT)(ptr)
770+ impl := &translatorTestRefPtrLibraryImpl{rawPtr: r}
771+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryImpl).Release)
772+ return impl
773+}
774+
785775 // TranslatorTestRefPtrLibraryChild Library-side child test object for RefPtr.
786776 type TranslatorTestRefPtrLibraryChild = portin.TranslatorTestRefPtrLibraryChild
787777
@@ -846,6 +836,19 @@ func wrapTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefP
846836 return impl
847837 }
848838
839+// takeTranslatorTestRefPtrLibraryChild adopts a CEF TranslatorTestRefPtrLibraryChild pointer whose reference is already owned by
840+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibraryChild it
841+// does NOT call AddRef, because the C API already transferred one reference to us.
842+func takeTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefPtrLibraryChild {
843+ if ptr == nil {
844+ return nil
845+ }
846+ r := (*capi.CEFTranslatorTestRefPtrLibraryChildT)(ptr)
847+ impl := &translatorTestRefPtrLibraryChildImpl{rawPtr: r}
848+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryChildImpl).Release)
849+ return impl
850+}
851+
849852 // TranslatorTestRefPtrLibraryChildChild Another library-side child test object for RefPtr.
850853 type TranslatorTestRefPtrLibraryChildChild = portin.TranslatorTestRefPtrLibraryChildChild
851854
@@ -910,6 +913,19 @@ func wrapTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTes
910913 return impl
911914 }
912915
916+// takeTranslatorTestRefPtrLibraryChildChild adopts a CEF TranslatorTestRefPtrLibraryChildChild pointer whose reference is already owned by
917+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibraryChildChild it
918+// does NOT call AddRef, because the C API already transferred one reference to us.
919+func takeTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTestRefPtrLibraryChildChild {
920+ if ptr == nil {
921+ return nil
922+ }
923+ r := (*capi.CEFTranslatorTestRefPtrLibraryChildChildT)(ptr)
924+ impl := &translatorTestRefPtrLibraryChildChildImpl{rawPtr: r}
925+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryChildChildImpl).Release)
926+ return impl
927+}
928+
913929 // TranslatorTestRefPtrClient Client-side test object for RefPtr.
914930 type TranslatorTestRefPtrClient = portin.TranslatorTestRefPtrClient
915931
@@ -1212,6 +1228,19 @@ func wrapTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScop
12121228 return impl
12131229 }
12141230
1231+// takeTranslatorTestScopedLibraryChild adopts a CEF TranslatorTestScopedLibraryChild pointer whose reference is already owned by
1232+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestScopedLibraryChild it
1233+// does NOT call AddRef, because the C API already transferred one reference to us.
1234+func takeTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScopedLibraryChild {
1235+ if ptr == nil {
1236+ return nil
1237+ }
1238+ r := (*capi.CEFTranslatorTestScopedLibraryChildT)(ptr)
1239+ impl := &translatorTestScopedLibraryChildImpl{rawPtr: r}
1240+ runtime.SetFinalizer(impl, (*translatorTestScopedLibraryChildImpl).Release)
1241+ return impl
1242+}
1243+
12151244 // TranslatorTestScopedLibraryChildChild Another library-side child test object for OwnPtr/RawPtr.
12161245 type TranslatorTestScopedLibraryChildChild = portin.TranslatorTestScopedLibraryChildChild
12171246
@@ -1276,6 +1305,19 @@ func wrapTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTes
12761305 return impl
12771306 }
12781307
1308+// takeTranslatorTestScopedLibraryChildChild adopts a CEF TranslatorTestScopedLibraryChildChild pointer whose reference is already owned by
1309+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestScopedLibraryChildChild it
1310+// does NOT call AddRef, because the C API already transferred one reference to us.
1311+func takeTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTestScopedLibraryChildChild {
1312+ if ptr == nil {
1313+ return nil
1314+ }
1315+ r := (*capi.CEFTranslatorTestScopedLibraryChildChildT)(ptr)
1316+ impl := &translatorTestScopedLibraryChildChildImpl{rawPtr: r}
1317+ runtime.SetFinalizer(impl, (*translatorTestScopedLibraryChildChildImpl).Release)
1318+ return impl
1319+}
1320+
12791321 // TranslatorTestScopedClient Client-side test object for OwnPtr/RawPtr.
12801322 type TranslatorTestScopedClient = portin.TranslatorTestScopedClient
12811323
@@ -1452,25 +1494,25 @@ func wrapTranslatorTestScopedClientChild(ptr unsafe.Pointer) TranslatorTestScope
14521494 // TranslatorTestCreate Create the test object.
14531495 func TranslatorTestCreate() TranslatorTest {
14541496 ret := capi.CEFTranslatorTestCreate()
1455- return wrapTranslatorTest(ret)
1497+ return takeTranslatorTest(ret)
14561498 }
14571499
14581500 // TranslatorTestRefPtrLibraryCreate Create the test object.
14591501 func TranslatorTestRefPtrLibraryCreate(value int32) TranslatorTestRefPtrLibrary {
14601502 ret := capi.CEFTranslatorTestRefPtrLibraryCreate(value)
1461- return wrapTranslatorTestRefPtrLibrary(ret)
1503+ return takeTranslatorTestRefPtrLibrary(ret)
14621504 }
14631505
14641506 // TranslatorTestRefPtrLibraryChildCreate Create the test object.
14651507 func TranslatorTestRefPtrLibraryChildCreate(value int32, otherValue int32) TranslatorTestRefPtrLibraryChild {
14661508 ret := capi.CEFTranslatorTestRefPtrLibraryChildCreate(value, otherValue)
1467- return wrapTranslatorTestRefPtrLibraryChild(ret)
1509+ return takeTranslatorTestRefPtrLibraryChild(ret)
14681510 }
14691511
14701512 // TranslatorTestRefPtrLibraryChildChildCreate Create the test object.
14711513 func TranslatorTestRefPtrLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestRefPtrLibraryChildChild {
14721514 ret := capi.CEFTranslatorTestRefPtrLibraryChildChildCreate(value, otherValue, otherOtherValue)
1473- return wrapTranslatorTestRefPtrLibraryChildChild(ret)
1515+ return takeTranslatorTestRefPtrLibraryChildChild(ret)
14741516 }
14751517
14761518 // TranslatorTestScopedLibraryCreate Create the test object.
@@ -1482,11 +1524,11 @@ func TranslatorTestScopedLibraryCreate(value int32) TranslatorTestScopedLibrary
14821524 // TranslatorTestScopedLibraryChildCreate Create the test object.
14831525 func TranslatorTestScopedLibraryChildCreate(value int32, otherValue int32) TranslatorTestScopedLibraryChild {
14841526 ret := capi.CEFTranslatorTestScopedLibraryChildCreate(value, otherValue)
1485- return wrapTranslatorTestScopedLibraryChild(ret)
1527+ return takeTranslatorTestScopedLibraryChild(ret)
14861528 }
14871529
14881530 // TranslatorTestScopedLibraryChildChildCreate Create the test object.
14891531 func TranslatorTestScopedLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestScopedLibraryChildChild {
14901532 ret := capi.CEFTranslatorTestScopedLibraryChildChildCreate(value, otherValue, otherOtherValue)
1491- return wrapTranslatorTestScopedLibraryChildChild(ret)
1533+ return takeTranslatorTestScopedLibraryChildChild(ret)
14921534 }
@@ -377,21 +377,12 @@ func (obj *translatorTestImpl) SetChildRefPtrLibraryAndReturnParent(val Translat
377 return wrapTranslatorTestRefPtrLibrary(unsafe.Pointer(ret))377 return wrapTranslatorTestRefPtrLibrary(unsafe.Pointer(ret))
378 }378 }
379 379
380-func (obj *translatorTestImpl) SetRefPtrLibraryList(val []TranslatorTestRefPtrLibrary, val1 int32, val2 int32) int32 {380+func (obj *translatorTestImpl) SetRefPtrLibraryList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
381 if obj == nil || obj.rawPtr == nil {381 if obj == nil || obj.rawPtr == nil {
382 return 0382 return 0
383 }383 }
384 rawPtr := obj.rawPtr384 rawPtr := obj.rawPtr
385- var valRaw []uintptr385+ ret := rawPtr.CallSetRefPtrLibraryList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
386- var valPtr unsafe.Pointer
387- if len(val) > 0 {
388- valRaw = make([]uintptr, len(val))
389- for i, elem := range val {
390- valRaw[i] = uintptr(extractRawPointer(elem))
391- }
392- valPtr = unsafe.Pointer(&valRaw[0])
393- }
394- ret := rawPtr.CallSetRefPtrLibraryList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
395 return int32(ret)386 return int32(ret)
396 }387 }
397 388
@@ -471,21 +462,12 @@ func (obj *translatorTestImpl) SetChildRefPtrClientAndReturnParent(val Translato
471 return wrapTranslatorTestRefPtrClient(unsafe.Pointer(ret))462 return wrapTranslatorTestRefPtrClient(unsafe.Pointer(ret))
472 }463 }
473 464
474-func (obj *translatorTestImpl) SetRefPtrClientList(val []TranslatorTestRefPtrClient, val1 int32, val2 int32) int32 {465+func (obj *translatorTestImpl) SetRefPtrClientList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
475 if obj == nil || obj.rawPtr == nil {466 if obj == nil || obj.rawPtr == nil {
476 return 0467 return 0
477 }468 }
478 rawPtr := obj.rawPtr469 rawPtr := obj.rawPtr
479- var valRaw []uintptr470+ ret := rawPtr.CallSetRefPtrClientList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
480- var valPtr unsafe.Pointer
481- if len(val) > 0 {
482- valRaw = make([]uintptr, len(val))
483- for i, elem := range val {
484- valRaw[i] = uintptr(extractRawPointer(elem))
485- }
486- valPtr = unsafe.Pointer(&valRaw[0])
487- }
488- ret := rawPtr.CallSetRefPtrClientList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
489 return int32(ret)471 return int32(ret)
490 }472 }
491 473
@@ -628,21 +610,12 @@ func (obj *translatorTestImpl) SetChildRawPtrLibrary(val TranslatorTestScopedLib
628 return int32(ret)610 return int32(ret)
629 }611 }
630 612
631-func (obj *translatorTestImpl) SetRawPtrLibraryList(val []TranslatorTestScopedLibrary, val1 int32, val2 int32) int32 {613+func (obj *translatorTestImpl) SetRawPtrLibraryList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
632 if obj == nil || obj.rawPtr == nil {614 if obj == nil || obj.rawPtr == nil {
633 return 0615 return 0
634 }616 }
635 rawPtr := obj.rawPtr617 rawPtr := obj.rawPtr
636- var valRaw []uintptr618+ ret := rawPtr.CallSetRawPtrLibraryList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
637- var valPtr unsafe.Pointer
638- if len(val) > 0 {
639- valRaw = make([]uintptr, len(val))
640- for i, elem := range val {
641- valRaw[i] = uintptr(extractRawPointer(elem))
642- }
643- valPtr = unsafe.Pointer(&valRaw[0])
644- }
645- ret := rawPtr.CallSetRawPtrLibraryList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
646 return int32(ret)619 return int32(ret)
647 }620 }
648 621
@@ -664,21 +637,12 @@ func (obj *translatorTestImpl) SetChildRawPtrClient(val TranslatorTestScopedClie
664 return int32(ret)637 return int32(ret)
665 }638 }
666 639
667-func (obj *translatorTestImpl) SetRawPtrClientList(val []TranslatorTestScopedClient, val1 int32, val2 int32) int32 {640+func (obj *translatorTestImpl) SetRawPtrClientList(valcount int, val unsafe.Pointer, val1 int32, val2 int32) int32 {
668 if obj == nil || obj.rawPtr == nil {641 if obj == nil || obj.rawPtr == nil {
669 return 0642 return 0
670 }643 }
671 rawPtr := obj.rawPtr644 rawPtr := obj.rawPtr
672- var valRaw []uintptr645+ ret := rawPtr.CallSetRawPtrClientList(uintptr(valcount), uintptr(val), uintptr(val1), uintptr(val2))
673- var valPtr unsafe.Pointer
674- if len(val) > 0 {
675- valRaw = make([]uintptr, len(val))
676- for i, elem := range val {
677- valRaw[i] = uintptr(extractRawPointer(elem))
678- }
679- valPtr = unsafe.Pointer(&valRaw[0])
680- }
681- ret := rawPtr.CallSetRawPtrClientList(uintptr(len(val)), uintptr(valPtr), uintptr(val1), uintptr(val2))
682 return int32(ret)646 return int32(ret)
683 }647 }
684 648
@@ -718,6 +682,19 @@ func wrapTranslatorTest(ptr unsafe.Pointer) TranslatorTest {
718 return impl682 return impl
719 }683 }
720 684
685+// takeTranslatorTest adopts a CEF TranslatorTest pointer whose reference is already owned by
686+// the caller (as returned by a global factory function). Unlike wrapTranslatorTest it
687+// does NOT call AddRef, because the C API already transferred one reference to us.
688+func takeTranslatorTest(ptr unsafe.Pointer) TranslatorTest {
689+ if ptr == nil {
690+ return nil
691+ }
692+ r := (*capi.CEFTranslatorTestT)(ptr)
693+ impl := &translatorTestImpl{rawPtr: r}
694+ runtime.SetFinalizer(impl, (*translatorTestImpl).Release)
695+ return impl
696+}
697+
721 // TranslatorTestRefPtrLibrary Library-side test object for RefPtr.698 // TranslatorTestRefPtrLibrary Library-side test object for RefPtr.
722 type TranslatorTestRefPtrLibrary = portin.TranslatorTestRefPtrLibrary699 type TranslatorTestRefPtrLibrary = portin.TranslatorTestRefPtrLibrary
723 700
@@ -782,6 +759,19 @@ func wrapTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLib
782 return impl759 return impl
783 }760 }
784 761
762+// takeTranslatorTestRefPtrLibrary adopts a CEF TranslatorTestRefPtrLibrary pointer whose reference is already owned by
763+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibrary it
764+// does NOT call AddRef, because the C API already transferred one reference to us.
765+func takeTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLibrary {
766+ if ptr == nil {
767+ return nil
768+ }
769+ r := (*capi.CEFTranslatorTestRefPtrLibraryT)(ptr)
770+ impl := &translatorTestRefPtrLibraryImpl{rawPtr: r}
771+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryImpl).Release)
772+ return impl
773+}
774+
785 // TranslatorTestRefPtrLibraryChild Library-side child test object for RefPtr.775 // TranslatorTestRefPtrLibraryChild Library-side child test object for RefPtr.
786 type TranslatorTestRefPtrLibraryChild = portin.TranslatorTestRefPtrLibraryChild776 type TranslatorTestRefPtrLibraryChild = portin.TranslatorTestRefPtrLibraryChild
787 777
@@ -846,6 +836,19 @@ func wrapTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefP
846 return impl836 return impl
847 }837 }
848 838
839+// takeTranslatorTestRefPtrLibraryChild adopts a CEF TranslatorTestRefPtrLibraryChild pointer whose reference is already owned by
840+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibraryChild it
841+// does NOT call AddRef, because the C API already transferred one reference to us.
842+func takeTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefPtrLibraryChild {
843+ if ptr == nil {
844+ return nil
845+ }
846+ r := (*capi.CEFTranslatorTestRefPtrLibraryChildT)(ptr)
847+ impl := &translatorTestRefPtrLibraryChildImpl{rawPtr: r}
848+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryChildImpl).Release)
849+ return impl
850+}
851+
849 // TranslatorTestRefPtrLibraryChildChild Another library-side child test object for RefPtr.852 // TranslatorTestRefPtrLibraryChildChild Another library-side child test object for RefPtr.
850 type TranslatorTestRefPtrLibraryChildChild = portin.TranslatorTestRefPtrLibraryChildChild853 type TranslatorTestRefPtrLibraryChildChild = portin.TranslatorTestRefPtrLibraryChildChild
851 854
@@ -910,6 +913,19 @@ func wrapTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTes
910 return impl913 return impl
911 }914 }
912 915
916+// takeTranslatorTestRefPtrLibraryChildChild adopts a CEF TranslatorTestRefPtrLibraryChildChild pointer whose reference is already owned by
917+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestRefPtrLibraryChildChild it
918+// does NOT call AddRef, because the C API already transferred one reference to us.
919+func takeTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTestRefPtrLibraryChildChild {
920+ if ptr == nil {
921+ return nil
922+ }
923+ r := (*capi.CEFTranslatorTestRefPtrLibraryChildChildT)(ptr)
924+ impl := &translatorTestRefPtrLibraryChildChildImpl{rawPtr: r}
925+ runtime.SetFinalizer(impl, (*translatorTestRefPtrLibraryChildChildImpl).Release)
926+ return impl
927+}
928+
913 // TranslatorTestRefPtrClient Client-side test object for RefPtr.929 // TranslatorTestRefPtrClient Client-side test object for RefPtr.
914 type TranslatorTestRefPtrClient = portin.TranslatorTestRefPtrClient930 type TranslatorTestRefPtrClient = portin.TranslatorTestRefPtrClient
915 931
@@ -1212,6 +1228,19 @@ func wrapTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScop
1212 return impl1228 return impl
1213 }1229 }
1214 1230
1231+// takeTranslatorTestScopedLibraryChild adopts a CEF TranslatorTestScopedLibraryChild pointer whose reference is already owned by
1232+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestScopedLibraryChild it
1233+// does NOT call AddRef, because the C API already transferred one reference to us.
1234+func takeTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScopedLibraryChild {
1235+ if ptr == nil {
1236+ return nil
1237+ }
1238+ r := (*capi.CEFTranslatorTestScopedLibraryChildT)(ptr)
1239+ impl := &translatorTestScopedLibraryChildImpl{rawPtr: r}
1240+ runtime.SetFinalizer(impl, (*translatorTestScopedLibraryChildImpl).Release)
1241+ return impl
1242+}
1243+
1215 // TranslatorTestScopedLibraryChildChild Another library-side child test object for OwnPtr/RawPtr.1244 // TranslatorTestScopedLibraryChildChild Another library-side child test object for OwnPtr/RawPtr.
1216 type TranslatorTestScopedLibraryChildChild = portin.TranslatorTestScopedLibraryChildChild1245 type TranslatorTestScopedLibraryChildChild = portin.TranslatorTestScopedLibraryChildChild
1217 1246
@@ -1276,6 +1305,19 @@ func wrapTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTes
1276 return impl1305 return impl
1277 }1306 }
1278 1307
1308+// takeTranslatorTestScopedLibraryChildChild adopts a CEF TranslatorTestScopedLibraryChildChild pointer whose reference is already owned by
1309+// the caller (as returned by a global factory function). Unlike wrapTranslatorTestScopedLibraryChildChild it
1310+// does NOT call AddRef, because the C API already transferred one reference to us.
1311+func takeTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTestScopedLibraryChildChild {
1312+ if ptr == nil {
1313+ return nil
1314+ }
1315+ r := (*capi.CEFTranslatorTestScopedLibraryChildChildT)(ptr)
1316+ impl := &translatorTestScopedLibraryChildChildImpl{rawPtr: r}
1317+ runtime.SetFinalizer(impl, (*translatorTestScopedLibraryChildChildImpl).Release)
1318+ return impl
1319+}
1320+
1279 // TranslatorTestScopedClient Client-side test object for OwnPtr/RawPtr.1321 // TranslatorTestScopedClient Client-side test object for OwnPtr/RawPtr.
1280 type TranslatorTestScopedClient = portin.TranslatorTestScopedClient1322 type TranslatorTestScopedClient = portin.TranslatorTestScopedClient
1281 1323
@@ -1452,25 +1494,25 @@ func wrapTranslatorTestScopedClientChild(ptr unsafe.Pointer) TranslatorTestScope
1452 // TranslatorTestCreate Create the test object.1494 // TranslatorTestCreate Create the test object.
1453 func TranslatorTestCreate() TranslatorTest {1495 func TranslatorTestCreate() TranslatorTest {
1454 ret := capi.CEFTranslatorTestCreate()1496 ret := capi.CEFTranslatorTestCreate()
1455- return wrapTranslatorTest(ret)1497+ return takeTranslatorTest(ret)
1456 }1498 }
1457 1499
1458 // TranslatorTestRefPtrLibraryCreate Create the test object.1500 // TranslatorTestRefPtrLibraryCreate Create the test object.
1459 func TranslatorTestRefPtrLibraryCreate(value int32) TranslatorTestRefPtrLibrary {1501 func TranslatorTestRefPtrLibraryCreate(value int32) TranslatorTestRefPtrLibrary {
1460 ret := capi.CEFTranslatorTestRefPtrLibraryCreate(value)1502 ret := capi.CEFTranslatorTestRefPtrLibraryCreate(value)
1461- return wrapTranslatorTestRefPtrLibrary(ret)1503+ return takeTranslatorTestRefPtrLibrary(ret)
1462 }1504 }
1463 1505
1464 // TranslatorTestRefPtrLibraryChildCreate Create the test object.1506 // TranslatorTestRefPtrLibraryChildCreate Create the test object.
1465 func TranslatorTestRefPtrLibraryChildCreate(value int32, otherValue int32) TranslatorTestRefPtrLibraryChild {1507 func TranslatorTestRefPtrLibraryChildCreate(value int32, otherValue int32) TranslatorTestRefPtrLibraryChild {
1466 ret := capi.CEFTranslatorTestRefPtrLibraryChildCreate(value, otherValue)1508 ret := capi.CEFTranslatorTestRefPtrLibraryChildCreate(value, otherValue)
1467- return wrapTranslatorTestRefPtrLibraryChild(ret)1509+ return takeTranslatorTestRefPtrLibraryChild(ret)
1468 }1510 }
1469 1511
1470 // TranslatorTestRefPtrLibraryChildChildCreate Create the test object.1512 // TranslatorTestRefPtrLibraryChildChildCreate Create the test object.
1471 func TranslatorTestRefPtrLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestRefPtrLibraryChildChild {1513 func TranslatorTestRefPtrLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestRefPtrLibraryChildChild {
1472 ret := capi.CEFTranslatorTestRefPtrLibraryChildChildCreate(value, otherValue, otherOtherValue)1514 ret := capi.CEFTranslatorTestRefPtrLibraryChildChildCreate(value, otherValue, otherOtherValue)
1473- return wrapTranslatorTestRefPtrLibraryChildChild(ret)1515+ return takeTranslatorTestRefPtrLibraryChildChild(ret)
1474 }1516 }
1475 1517
1476 // TranslatorTestScopedLibraryCreate Create the test object.1518 // TranslatorTestScopedLibraryCreate Create the test object.
@@ -1482,11 +1524,11 @@ func TranslatorTestScopedLibraryCreate(value int32) TranslatorTestScopedLibrary
1482 // TranslatorTestScopedLibraryChildCreate Create the test object.1524 // TranslatorTestScopedLibraryChildCreate Create the test object.
1483 func TranslatorTestScopedLibraryChildCreate(value int32, otherValue int32) TranslatorTestScopedLibraryChild {1525 func TranslatorTestScopedLibraryChildCreate(value int32, otherValue int32) TranslatorTestScopedLibraryChild {
1484 ret := capi.CEFTranslatorTestScopedLibraryChildCreate(value, otherValue)1526 ret := capi.CEFTranslatorTestScopedLibraryChildCreate(value, otherValue)
1485- return wrapTranslatorTestScopedLibraryChild(ret)1527+ return takeTranslatorTestScopedLibraryChild(ret)
1486 }1528 }
1487 1529
1488 // TranslatorTestScopedLibraryChildChildCreate Create the test object.1530 // TranslatorTestScopedLibraryChildChildCreate Create the test object.
1489 func TranslatorTestScopedLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestScopedLibraryChildChild {1531 func TranslatorTestScopedLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestScopedLibraryChildChild {
1490 ret := capi.CEFTranslatorTestScopedLibraryChildChildCreate(value, otherValue, otherOtherValue)1532 ret := capi.CEFTranslatorTestScopedLibraryChildChildCreate(value, otherValue, otherOtherValue)
1491- return wrapTranslatorTestScopedLibraryChildChild(ret)1533+ return takeTranslatorTestScopedLibraryChildChild(ret)
1492 }1534 }
A vendor/github.com/bnema/purego-cef/cef/v8_helpers.go +19 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_browser_view_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_display_gen.go +17 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_label_button_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_menu_button_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_panel_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_scroll_view_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_textfield_gen.go +14 -60 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_window_gen.go +14 -1 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/capi/cef_component_updater_gen.go +130 -0 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/capi/cef_types_component_gen.go +11 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/cef_types_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/cef_v8_gen.go +44 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/register_gen.go +2 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/test_cef_api_version_test__gen.go +0 -459 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/views_cef_textfield_gen.go +33 -107 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/cefapi/contract.go +11 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/loader/loader.go +23 -18 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/in/cef_component_updater_gen.go +24 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_media_router_gen.go +2 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_shared_memory_region_gen.go +1 -5 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_shared_process_message_builder_gen.go +1 -5 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/in/cef_types_component_gen.go +9 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_v8_gen.go +8 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_values_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/test_cef_api_version_test__gen.go +8 -63 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/test_cef_translator_test__gen.go +8 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/views_cef_textfield_gen.go +0 -7 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/out/cef_component_updater_gen.go +29 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_parser_gen.go +3 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_preference_gen.go +2 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_shared_process_message_builder_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_stream_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_v8_gen.go +11 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_values_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/test_cef_api_version_test__gen.go +4 -51 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/test_cef_translator_test__gen.go +4 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/views_cef_textfield_gen.go +0 -7 generated file: collapsed
M vendor/modules.txt +2 -1 generated file: collapsed

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close