diff --git a/v2/internal/frontend/desktop/linux/frontend.go b/v2/internal/frontend/desktop/linux/frontend.go index f0c12cb61..2ffd37ac2 100644 --- a/v2/internal/frontend/desktop/linux/frontend.go +++ b/v2/internal/frontend/desktop/linux/frontend.go @@ -8,10 +8,19 @@ package linux #include "gtk/gtk.h" +extern void callDispatchedMethod(int id); + +static inline void processDispatchID(gpointer id) { + callDispatchedMethod(GPOINTER_TO_INT(id)); +} + +static void gtkDispatch(int id) { + gdk_threads_add_idle((GSourceFunc)processDispatchID, GINT_TO_POINTER(id)); +} + */ import "C" import ( - "bytes" "context" "encoding/json" "github.com/wailsapp/wails/v2/internal/binding" @@ -19,11 +28,10 @@ import ( "github.com/wailsapp/wails/v2/internal/frontend/assetserver" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/pkg/options" - "github.com/xyproto/xpm" - "image/png" "log" "os" "strconv" + "sync" "text/template" ) @@ -48,31 +56,9 @@ type Frontend struct { servingFromDisk bool } -func png2XPM(pngData []byte) string { - - // Create a new XPM encoder - enc := xpm.NewEncoder("icon") - - // Open the PNG file - m, err := png.Decode(bytes.NewReader(pngData)) - if err != nil { - log.Fatal(err) - } - - var buf bytes.Buffer - - // Generate and output the XPM data - err = enc.Encode(&buf, m) - if err != nil { - log.Fatal(err) - } - return buf.String() - -} - func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.Logger, appBindings *binding.Bindings, dispatcher frontend.Dispatcher) *Frontend { - // Set GDK_BACKEND=x11 + // Set GDK_BACKEND=x11 to prevent warnings os.Setenv("GDK_BACKEND", "x11") result := &Frontend{ @@ -398,9 +384,19 @@ func (f *Frontend) startDrag() error { } func (f *Frontend) ExecJS(js string) { - //f.gtkWindow.Dispatch(func() { - // f.chromium.Eval(js) - //}) + f.dispatch(func() { + f.mainWindow.ExecJS(js) + }) +} + +func (f *Frontend) dispatch(fn func()) { + dispatchCallbackLock.Lock() + id := 0 + for fn := dispatchCallbacks[id]; fn != nil; id++ { + } + dispatchCallbacks[id] = fn + dispatchCallbackLock.Unlock() + C.gtkDispatch(C.int(id)) } //func (f *Frontend) navigationCompleted(sender *edge.ICoreWebView2, args *edge.ICoreWebView2NavigationCompletedEventArgs) { @@ -424,3 +420,21 @@ func processMessage(message *C.char) { goMessage := C.GoString(message) messageBuffer <- goMessage } + +// Map of functions passed to dispatch() +var dispatchCallbacks = make(map[int]func()) +var dispatchCallbackLock sync.Mutex + +//export callDispatchedMethod +func callDispatchedMethod(cid C.int) { + id := int(cid) + fn := dispatchCallbacks[id] + if fn != nil { + go fn() + dispatchCallbackLock.Lock() + delete(dispatchCallbacks, id) + dispatchCallbackLock.Unlock() + } else { + println("Error: No dispatch method with id", id, cid) + } +} diff --git a/v2/internal/frontend/desktop/linux/window.go b/v2/internal/frontend/desktop/linux/window.go index eb4585c51..0195ae7ab 100644 --- a/v2/internal/frontend/desktop/linux/window.go +++ b/v2/internal/frontend/desktop/linux/window.go @@ -111,6 +111,12 @@ GtkWidget* setupWebview(void* contentManager, GtkWindow* window) { return webview; } +void devtoolsEnabled(void* webview, int enabled) { + WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webview)); + gboolean genabled = enabled == 1 ? true : false; + webkit_settings_set_enable_developer_extras(settings, genabled); +} + */ import "C" import ( @@ -153,6 +159,10 @@ func NewWindow(appoptions *options.App, debug bool) *Window { webview := C.setupWebview(result.contentManager, result.asGTKWindow()) result.webview = unsafe.Pointer(webview) + if debug { + C.devtoolsEnabled(unsafe.Pointer(webview), C.int(1)) + } + // Setup window result.SetKeepAbove(appoptions.AlwaysOnTop) result.SetResizable(!appoptions.DisableResize) @@ -314,3 +324,9 @@ func (w *Window) SetTitle(title string) { defer C.free(unsafe.Pointer(cTitle)) C.gtk_window_set_title(w.asGTKWindow(), cTitle) } + +func (w *Window) ExecJS(js string) { + script := C.CString(js) + defer C.free(unsafe.Pointer(script)) + C.webkit_web_view_run_javascript((*C.WebKitWebView)(w.webview), script, nil, nil, nil) +}