¿Cómo hacer que Webview funcione con Lantern systray en Linux?

Estoy tratando de iniciar una vista web desde un ícono de la bandeja del sistema en Go. Estoy usando github.com/getlantern/systrayy github.com/webview/webview.

Estoy tratando de crear un icono de la bandeja del sistema multiplataforma que inicie una página web en una ventana de vista web. Esta es la interfaz de usuario de mi aplicación. Es parte de una aplicación más grande. Pero mi problema se reduce a estos dos componentes.

El código de ejemplo webview y getlantern por sí mismos funciona bien. Pero cuando llamo a vebview desde la bandeja del sistema, entra en pánico. Supongo que la bandeja del sistema se está ejecutando como una rutina separada. Ambos componentes usan cgo.

Todo funciona bien en Windows 10. Pero en Linux entra en pánico cuando llamo webview.New().

Si depuro en la llamada llego a C.webview_create(). Si entro en eso, obtengoCould not load source '_cgo_gotypes.go': Unsupported command: cannot process "source" request.

func NewWindow(debug bool, window unsafe.Pointer) WebView {
    w := &webview{}
    w.w = C.webview_create(boolToInt(debug), window) // fails here
    return w
}

Parece que no puede encontrar cgo correctamente. Pero el ejemplo funciona, así que debería estar bien.

No tengo ni idea de dónde ir desde aquí. ¿Algunas ideas?

  • El código funciona perfectamente en Windows 10 (con las dlls en la misma carpeta)
  • El mismo código falla en Linux Mint 20.3 (basado en Ubuntu 20.04)
  • Los ejemplos de Webview y GetLantern funcionan bien en Linux
  • Lanzamiento de Webview desde los trabajos principales
  • Lanzar el icono de la bandeja del sistema funciona
  • Pero al iniciar Webview desde el icono de la bandeja del sistema explota...

Falla en Linux. Funciona bien en Windows 10. Nombre de host de Linux 5.4.0-94-generic #106-Ubuntu SMP Jue 6 de enero 23:58:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 ir a la versión go1.17.6 linux/amd64

El siguiente código funciona en Windows pero entra en pánico en Linux.

package main

import (
    "log"
    "os"
    "test/assets"

    "github.com/getlantern/systray"
    "github.com/webview/webview"
)

func main() {
    // OpenWindow("https://google.ca") // if I call this, it works for this call. 
    systray.Run(stOnReady, stOnExit) // but it will still fail if called from here
}

var wv webview.WebView

func OpenWindow(url string) {

    wv = webview.New(true) // panics here 
    defer wv.Destroy()

    wv.SetTitle("Settings")
    wv.SetSize(600, 800, webview.HintNone)
    wv.Navigate(url)
    wv.Run()
}

func stOnReady() {
    systray.SetTemplateIcon(assets.Icon, assets.Icon)
    systray.SetTitle("Webview")
    systray.SetTooltip("Testing Vebview from Systray")

    mUrl := systray.AddMenuItem("Webview", "Webview")
    mQuitOrig := systray.AddMenuItem("Quit", "Quit the app")

    go func() {
        for {
            select {
            case <-mQuitOrig.ClickedCh:
                systray.Quit()
                os.Exit(0)

            case <-mUrl.ClickedCh:
                OpenWindow("https://google.ca")
            }
        }
    }()
}

func stOnExit() {
    log.Print("SysTray: exiting.")
}
Answer