5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 22:13:36 +08:00

[linux] Devtools + dispatch.

This commit is contained in:
Lea Anthony 2021-11-28 20:35:40 +11:00
parent 5f0352404b
commit 7eb8e6456e
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
2 changed files with 59 additions and 29 deletions

View File

@ -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)
}
}

View File

@ -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)
}