Merge pull request #358 from bnema/fix/cef-canvas-background
fix(cef): keep browser canvas white, move anti-flash to presentation layer
80 files · +1985 -2004
M go.mod +1 -1
| @@ -6,7 +6,7 @@ require ( | |||
| 6 | 6 | github.com/a-h/templ v0.3.1020 | |
| 7 | 7 | github.com/andybalholm/brotli v1.2.2 | |
| 8 | 8 | 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 | |
| 10 | 10 | github.com/bnema/purego-cef2gtk v0.8.5 | |
| 11 | 11 | github.com/bnema/purego-pipewire v0.1.5 | |
| 12 | 12 | github.com/bnema/purego-sqlite v0.1.4 | |
| @@ -6,7 +6,7 @@ require ( | |||||
| 6 | github.com/a-h/templ v0.3.1020 | 6 | github.com/a-h/templ v0.3.1020 | ||
| 7 | github.com/andybalholm/brotli v1.2.2 | 7 | github.com/andybalholm/brotli v1.2.2 | ||
| 8 | github.com/bnema/purego v0.11.0-bnema.4 | 8 | 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 |
| 10 | github.com/bnema/purego-cef2gtk v0.8.5 | 10 | github.com/bnema/purego-cef2gtk v0.8.5 | ||
| 11 | github.com/bnema/purego-pipewire v0.1.5 | 11 | github.com/bnema/purego-pipewire v0.1.5 | ||
| 12 | github.com/bnema/purego-sqlite v0.1.4 | 12 | 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 { | |||
| 27 | 27 | windowlessFrameRate int32 | |
| 28 | 28 | windowlessFrameRateMax int32 | |
| 29 | 29 | 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 | |
| 31 | 31 | 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 | 75 | func (f *WebViewFactory) setDefaultBackgroundColor(r, g, b, a float64) { | |
| 74 | 76 | const s = colorScale | |
| 75 | 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 | 98 | settings := purecef.NewBrowserSettings() | |
| 97 | 99 | cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate}) | |
| 98 | 100 | 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 | |
| 102 | 104 | ||
| 103 | 105 | // Defer browser creation until the bridge view has a non-zero size. | |
| 104 | 106 | // 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 | 144 | 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 | 150 | if !result.Completed() { | |
| 147 | 151 | wv.destroyViewBridgeOnGTKAsync() | |
| @@ -383,9 +387,9 @@ func (f *WebViewFactory) CreateRelated(ctx context.Context, parentID port.WebVie | |||
| 383 | 387 | settings := purecef.NewBrowserSettings() | |
| 384 | 388 | cef2gtk.ConfigureBrowserSettings(&settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: f.windowlessFrameRate}) | |
| 385 | 389 | 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 | |
| 389 | 393 | ||
| 390 | 394 | if err := f.configureInitialBrowserCreation(ctx, popupWV, popupWV.client, &windowInfo, &settings, func(w, h int32) { | |
| 391 | 395 | f.handlePopupShellInitialResize(ctx, popupWV, func(w, h int32) { | |
| @@ -27,7 +27,7 @@ type WebViewFactory struct { | |||||
| 27 | windowlessFrameRate int32 | 27 | windowlessFrameRate int32 | ||
| 28 | windowlessFrameRateMax int32 | 28 | windowlessFrameRateMax int32 | ||
| 29 | inputConfig RuntimeInputConfig | 29 | 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 |
| 31 | audioOutputFactory port.AudioOutputFactory | 31 | 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 = colorScale | 76 | 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_ENABLED | 100 | 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 = bg | 102 | + | // 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 area | 106 | // 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 = popupRoot | 144 | 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_ENABLED | 389 | 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 = bg | 391 | + | // 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 { | |||
| 51 | 51 | ||
| 52 | 52 | var unsupportedPaintOnce sync.Once | |
| 53 | 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 | 63 | hooks.OnUnsupportedPaint = func() { | |
| 55 | 64 | unsupportedPaintOnce.Do(func() { | |
| 56 | 65 | if wv.ctx != nil { | |
| @@ -51,6 +51,15 @@ func newDumberRenderHandler(wv *WebView) purecef.RenderHandler { | |||||
| 51 | 51 | ||||
| 52 | var unsupportedPaintOnce sync.Once | 52 | 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 { | |||
| 239 | 239 | backgroundColor uint32 | |
| 240 | 240 | 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 | 254 | // Touchpad input diagnostics are debounced to avoid flooding logs while | |
| 243 | 255 | // debugging continuous scroll streams. | |
| 244 | 256 | touchpadNavigation *touchpadNavigationRecognizer | |
| @@ -992,7 +1004,7 @@ func (wv *WebView) prepareNativePopup( | |||
| 992 | 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 | 1008 | clientSlot.Set(client) | |
| 997 | 1009 | return true | |
| 998 | 1010 | } | |
| @@ -1007,9 +1019,8 @@ func (wv *WebView) nativePopupPreparationSnapshot() (nativePopupPreparation, boo | |||
| 1007 | 1019 | return nativePopupPreparation{}, false | |
| 1008 | 1020 | } | |
| 1009 | 1021 | return nativePopupPreparation{ | |
| 1010 | - | parent: wv.nativePopupParent, | |
| 1011 | - | frameRate: wv.windowlessFrameRate, | |
| 1012 | - | backgroundColor: wv.backgroundColor, | |
| 1022 | + | parent: wv.nativePopupParent, | |
| 1023 | + | frameRate: wv.windowlessFrameRate, | |
| 1013 | 1024 | }, true | |
| 1014 | 1025 | } | |
| 1015 | 1026 | ||
| @@ -1045,7 +1056,6 @@ func configureNativePopupWindow( | |||
| 1045 | 1056 | windowInfo *purecef.WindowInfo, | |
| 1046 | 1057 | settings *purecef.BrowserSettings, | |
| 1047 | 1058 | frameRate int32, | |
| 1048 | - | backgroundColor uint32, | |
| 1049 | 1059 | ) { | |
| 1050 | 1060 | cef2gtk.ConfigureWindowInfo(windowInfo, cef2gtk.WindowInfoOptions{}) | |
| 1051 | 1061 | if externalBeginFrameEnabled() { | |
| @@ -1056,15 +1066,13 @@ func configureNativePopupWindow( | |||
| 1056 | 1066 | } | |
| 1057 | 1067 | cef2gtk.ConfigureBrowserSettings(settings, cef2gtk.BrowserSettingsOptions{WindowlessFrameRate: frameRate}) | |
| 1058 | 1068 | 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 | |
| 1062 | 1071 | } | |
| 1063 | 1072 | ||
| 1064 | 1073 | type nativePopupPreparation struct { | |
| 1065 | - | parent *WebView | |
| 1066 | - | frameRate int32 | |
| 1067 | - | backgroundColor uint32 | |
| 1074 | + | parent *WebView | |
| 1075 | + | frameRate int32 | |
| 1068 | 1076 | } | |
| 1069 | 1077 | ||
| 1070 | 1078 | func (wv *WebView) handleNativePopupAborted() { | |
| @@ -1244,6 +1252,7 @@ func (wv *WebView) destroyViewBridgeOnGTKThread() { | |||
| 1244 | 1252 | if wv == nil || wv.viewBridge == nil { | |
| 1245 | 1253 | return | |
| 1246 | 1254 | } | |
| 1255 | + | wv.removeBackgroundFlashGuard() | |
| 1247 | 1256 | if wv.removeSizeObserver != nil { | |
| 1248 | 1257 | wv.removeSizeObserver() | |
| 1249 | 1258 | wv.removeSizeObserver = nil | |
| @@ -239,6 +239,18 @@ type WebView struct { | |||||
| 239 | backgroundColor uint32 | 239 | backgroundColor uint32 | ||
| 240 | inputConfig RuntimeInputConfig | 240 | 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 while | 254 | // Touchpad input diagnostics are debounced to avoid flooding logs while | ||
| 243 | // debugging continuous scroll streams. | 255 | // debugging continuous scroll streams. | ||
| 244 | touchpadNavigation *touchpadNavigationRecognizer | 256 | 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 true | 1009 | return true | ||
| 998 | } | 1010 | } | ||
| @@ -1007,9 +1019,8 @@ func (wv *WebView) nativePopupPreparationSnapshot() (nativePopupPreparation, boo | |||||
| 1007 | return nativePopupPreparation{}, false | 1019 | 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 | }, true | 1024 | }, 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 = 1 | 1068 | settings.LocalStorage = 1 | ||
| 1059 | - | if backgroundColor != 0 { | 1069 | + | // Always opaque white; the popup shell WebView carries the theme flash guard. |
| 1060 | - | settings.BackgroundColor = backgroundColor | 1070 | + | settings.BackgroundColor = opaqueWhiteBackground |
| 1061 | - | } | |||
| 1062 | } | 1071 | } | ||
| 1063 | 1072 | ||||
| 1064 | type nativePopupPreparation struct { | 1073 | type nativePopupPreparation struct { | ||
| 1065 | - | parent *WebView | 1074 | + | parent *WebView |
| 1066 | - | frameRate int32 | 1075 | + | 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 | return | 1253 | 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 = nil | 1258 | wv.removeSizeObserver = nil | ||
M internal/infrastructure/cef/webview_handlers_test.go +2 -2
| @@ -380,14 +380,14 @@ func TestConfigureNativePopupWindow_UsesSharedTextureWindowlessDefaults(t *testi | |||
| 380 | 380 | windowInfo := purecef.NewWindowInfo() | |
| 381 | 381 | settings := purecef.NewBrowserSettings() | |
| 382 | 382 | ||
| 383 | - | configureNativePopupWindow(&windowInfo, &settings, 72, 0xFF112233) | |
| 383 | + | configureNativePopupWindow(&windowInfo, &settings, 72) | |
| 384 | 384 | ||
| 385 | 385 | require.Equal(t, purecef.WindowHandle(0), windowInfo.ParentWindow) | |
| 386 | 386 | require.Equal(t, int32(1), windowInfo.WindowlessRenderingEnabled) | |
| 387 | 387 | require.Equal(t, int32(1), windowInfo.SharedTextureEnabled) | |
| 388 | 388 | require.Equal(t, int32(72), settings.WindowlessFrameRate) | |
| 389 | 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 | 393 | 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 | |||
| 377 | 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 | 381 | if obj == nil || obj.rawPtr == nil { | |
| 382 | 382 | return 0 | |
| 383 | 383 | } | |
| 384 | 384 | 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)) | |
| 395 | 386 | return int32(ret) | |
| 396 | 387 | } | |
| 397 | 388 | ||
| @@ -471,21 +462,12 @@ func (obj *translatorTestImpl) SetChildRefPtrClientAndReturnParent(val Translato | |||
| 471 | 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 | 466 | if obj == nil || obj.rawPtr == nil { | |
| 476 | 467 | return 0 | |
| 477 | 468 | } | |
| 478 | 469 | 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)) | |
| 489 | 471 | return int32(ret) | |
| 490 | 472 | } | |
| 491 | 473 | ||
| @@ -628,21 +610,12 @@ func (obj *translatorTestImpl) SetChildRawPtrLibrary(val TranslatorTestScopedLib | |||
| 628 | 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 | 614 | if obj == nil || obj.rawPtr == nil { | |
| 633 | 615 | return 0 | |
| 634 | 616 | } | |
| 635 | 617 | 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)) | |
| 646 | 619 | return int32(ret) | |
| 647 | 620 | } | |
| 648 | 621 | ||
| @@ -664,21 +637,12 @@ func (obj *translatorTestImpl) SetChildRawPtrClient(val TranslatorTestScopedClie | |||
| 664 | 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 | 641 | if obj == nil || obj.rawPtr == nil { | |
| 669 | 642 | return 0 | |
| 670 | 643 | } | |
| 671 | 644 | 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)) | |
| 682 | 646 | return int32(ret) | |
| 683 | 647 | } | |
| 684 | 648 | ||
| @@ -718,6 +682,19 @@ func wrapTranslatorTest(ptr unsafe.Pointer) TranslatorTest { | |||
| 718 | 682 | 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 | 698 | // TranslatorTestRefPtrLibrary Library-side test object for RefPtr. | |
| 722 | 699 | type TranslatorTestRefPtrLibrary = portin.TranslatorTestRefPtrLibrary | |
| 723 | 700 | ||
| @@ -782,6 +759,19 @@ func wrapTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLib | |||
| 782 | 759 | 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 | 775 | // TranslatorTestRefPtrLibraryChild Library-side child test object for RefPtr. | |
| 786 | 776 | type TranslatorTestRefPtrLibraryChild = portin.TranslatorTestRefPtrLibraryChild | |
| 787 | 777 | ||
| @@ -846,6 +836,19 @@ func wrapTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefP | |||
| 846 | 836 | 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 | 852 | // TranslatorTestRefPtrLibraryChildChild Another library-side child test object for RefPtr. | |
| 850 | 853 | type TranslatorTestRefPtrLibraryChildChild = portin.TranslatorTestRefPtrLibraryChildChild | |
| 851 | 854 | ||
| @@ -910,6 +913,19 @@ func wrapTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTes | |||
| 910 | 913 | 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 | 929 | // TranslatorTestRefPtrClient Client-side test object for RefPtr. | |
| 914 | 930 | type TranslatorTestRefPtrClient = portin.TranslatorTestRefPtrClient | |
| 915 | 931 | ||
| @@ -1212,6 +1228,19 @@ func wrapTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScop | |||
| 1212 | 1228 | 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 | 1244 | // TranslatorTestScopedLibraryChildChild Another library-side child test object for OwnPtr/RawPtr. | |
| 1216 | 1245 | type TranslatorTestScopedLibraryChildChild = portin.TranslatorTestScopedLibraryChildChild | |
| 1217 | 1246 | ||
| @@ -1276,6 +1305,19 @@ func wrapTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTes | |||
| 1276 | 1305 | 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 | 1321 | // TranslatorTestScopedClient Client-side test object for OwnPtr/RawPtr. | |
| 1280 | 1322 | type TranslatorTestScopedClient = portin.TranslatorTestScopedClient | |
| 1281 | 1323 | ||
| @@ -1452,25 +1494,25 @@ func wrapTranslatorTestScopedClientChild(ptr unsafe.Pointer) TranslatorTestScope | |||
| 1452 | 1494 | // TranslatorTestCreate Create the test object. | |
| 1453 | 1495 | func TranslatorTestCreate() TranslatorTest { | |
| 1454 | 1496 | ret := capi.CEFTranslatorTestCreate() | |
| 1455 | - | return wrapTranslatorTest(ret) | |
| 1497 | + | return takeTranslatorTest(ret) | |
| 1456 | 1498 | } | |
| 1457 | 1499 | ||
| 1458 | 1500 | // TranslatorTestRefPtrLibraryCreate Create the test object. | |
| 1459 | 1501 | func TranslatorTestRefPtrLibraryCreate(value int32) TranslatorTestRefPtrLibrary { | |
| 1460 | 1502 | ret := capi.CEFTranslatorTestRefPtrLibraryCreate(value) | |
| 1461 | - | return wrapTranslatorTestRefPtrLibrary(ret) | |
| 1503 | + | return takeTranslatorTestRefPtrLibrary(ret) | |
| 1462 | 1504 | } | |
| 1463 | 1505 | ||
| 1464 | 1506 | // TranslatorTestRefPtrLibraryChildCreate Create the test object. | |
| 1465 | 1507 | func TranslatorTestRefPtrLibraryChildCreate(value int32, otherValue int32) TranslatorTestRefPtrLibraryChild { | |
| 1466 | 1508 | ret := capi.CEFTranslatorTestRefPtrLibraryChildCreate(value, otherValue) | |
| 1467 | - | return wrapTranslatorTestRefPtrLibraryChild(ret) | |
| 1509 | + | return takeTranslatorTestRefPtrLibraryChild(ret) | |
| 1468 | 1510 | } | |
| 1469 | 1511 | ||
| 1470 | 1512 | // TranslatorTestRefPtrLibraryChildChildCreate Create the test object. | |
| 1471 | 1513 | func TranslatorTestRefPtrLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestRefPtrLibraryChildChild { | |
| 1472 | 1514 | ret := capi.CEFTranslatorTestRefPtrLibraryChildChildCreate(value, otherValue, otherOtherValue) | |
| 1473 | - | return wrapTranslatorTestRefPtrLibraryChildChild(ret) | |
| 1515 | + | return takeTranslatorTestRefPtrLibraryChildChild(ret) | |
| 1474 | 1516 | } | |
| 1475 | 1517 | ||
| 1476 | 1518 | // TranslatorTestScopedLibraryCreate Create the test object. | |
| @@ -1482,11 +1524,11 @@ func TranslatorTestScopedLibraryCreate(value int32) TranslatorTestScopedLibrary | |||
| 1482 | 1524 | // TranslatorTestScopedLibraryChildCreate Create the test object. | |
| 1483 | 1525 | func TranslatorTestScopedLibraryChildCreate(value int32, otherValue int32) TranslatorTestScopedLibraryChild { | |
| 1484 | 1526 | ret := capi.CEFTranslatorTestScopedLibraryChildCreate(value, otherValue) | |
| 1485 | - | return wrapTranslatorTestScopedLibraryChild(ret) | |
| 1527 | + | return takeTranslatorTestScopedLibraryChild(ret) | |
| 1486 | 1528 | } | |
| 1487 | 1529 | ||
| 1488 | 1530 | // TranslatorTestScopedLibraryChildChildCreate Create the test object. | |
| 1489 | 1531 | func TranslatorTestScopedLibraryChildChildCreate(value int32, otherValue int32, otherOtherValue int32) TranslatorTestScopedLibraryChildChild { | |
| 1490 | 1532 | ret := capi.CEFTranslatorTestScopedLibraryChildChildCreate(value, otherValue, otherOtherValue) | |
| 1491 | - | return wrapTranslatorTestScopedLibraryChildChild(ret) | |
| 1533 | + | return takeTranslatorTestScopedLibraryChildChild(ret) | |
| 1492 | 1534 | } | |
| @@ -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 0 | 382 | return 0 | ||
| 383 | } | 383 | } | ||
| 384 | rawPtr := obj.rawPtr | 384 | rawPtr := obj.rawPtr | ||
| 385 | - | var valRaw []uintptr | 385 | + | 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 0 | 467 | return 0 | ||
| 477 | } | 468 | } | ||
| 478 | rawPtr := obj.rawPtr | 469 | rawPtr := obj.rawPtr | ||
| 479 | - | var valRaw []uintptr | 470 | + | 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 0 | 615 | return 0 | ||
| 634 | } | 616 | } | ||
| 635 | rawPtr := obj.rawPtr | 617 | rawPtr := obj.rawPtr | ||
| 636 | - | var valRaw []uintptr | 618 | + | 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 0 | 642 | return 0 | ||
| 670 | } | 643 | } | ||
| 671 | rawPtr := obj.rawPtr | 644 | rawPtr := obj.rawPtr | ||
| 672 | - | var valRaw []uintptr | 645 | + | 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 impl | 682 | 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.TranslatorTestRefPtrLibrary | 699 | type TranslatorTestRefPtrLibrary = portin.TranslatorTestRefPtrLibrary | ||
| 723 | 700 | ||||
| @@ -782,6 +759,19 @@ func wrapTranslatorTestRefPtrLibrary(ptr unsafe.Pointer) TranslatorTestRefPtrLib | |||||
| 782 | return impl | 759 | 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.TranslatorTestRefPtrLibraryChild | 776 | type TranslatorTestRefPtrLibraryChild = portin.TranslatorTestRefPtrLibraryChild | ||
| 787 | 777 | ||||
| @@ -846,6 +836,19 @@ func wrapTranslatorTestRefPtrLibraryChild(ptr unsafe.Pointer) TranslatorTestRefP | |||||
| 846 | return impl | 836 | 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.TranslatorTestRefPtrLibraryChildChild | 853 | type TranslatorTestRefPtrLibraryChildChild = portin.TranslatorTestRefPtrLibraryChildChild | ||
| 851 | 854 | ||||
| @@ -910,6 +913,19 @@ func wrapTranslatorTestRefPtrLibraryChildChild(ptr unsafe.Pointer) TranslatorTes | |||||
| 910 | return impl | 913 | 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.TranslatorTestRefPtrClient | 930 | type TranslatorTestRefPtrClient = portin.TranslatorTestRefPtrClient | ||
| 915 | 931 | ||||
| @@ -1212,6 +1228,19 @@ func wrapTranslatorTestScopedLibraryChild(ptr unsafe.Pointer) TranslatorTestScop | |||||
| 1212 | return impl | 1228 | 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.TranslatorTestScopedLibraryChildChild | 1245 | type TranslatorTestScopedLibraryChildChild = portin.TranslatorTestScopedLibraryChildChild | ||
| 1217 | 1246 | ||||
| @@ -1276,6 +1305,19 @@ func wrapTranslatorTestScopedLibraryChildChild(ptr unsafe.Pointer) TranslatorTes | |||||
| 1276 | return impl | 1305 | 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.TranslatorTestScopedClient | 1322 | 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 | } | ||