From d52c26e82f906926284d86431a1f1c39eec135bb Mon Sep 17 00:00:00 2001 From: Travis McLane Date: Wed, 21 Jun 2023 12:36:10 -0500 Subject: [PATCH] [v3 linux] implement missing functions --- v3/pkg/application/application_linux.go | 5 ++++ v3/pkg/application/linux_cgo.go | 29 +++++++++++++++------- v3/pkg/application/linux_purego.go | 29 +++++++--------------- v3/pkg/application/webview_window_linux.go | 13 +++++++--- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/v3/pkg/application/application_linux.go b/v3/pkg/application/application_linux.go index 278ccdab..c5287e8c 100644 --- a/v3/pkg/application/application_linux.go +++ b/v3/pkg/application/application_linux.go @@ -95,6 +95,11 @@ func (m *linuxApp) destroy() { appDestroy(m.application) } +func (m *linuxApp) isOnMainThread() bool { + // FIXME: How do we detect this properly? + return false +} + // register our window to our parent mapping func (m *linuxApp) registerWindow(window pointer, id uint) { m.windowsLock.Lock() diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index cf7606f5..b2a35fca 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -8,6 +8,7 @@ import ( "unsafe" "github.com/wailsapp/wails/v2/pkg/assetserver/webview" + "github.com/wailsapp/wails/v3/pkg/events" ) /* @@ -42,8 +43,14 @@ static void dispatchOnMainThread(unsigned int id) { g_idle_add((GSourceFunc)dispatchCallback, (gpointer)args); } +typedef struct WindowEvent { + uint id; + uint event; +} WindowEvent; + // exported below void activateLinux(gpointer data); +extern void emit(WindowEvent* data); void handleClick(void*); extern gboolean onButtonEvent(GtkWidget *widget, GdkEventButton *event, gpointer user_data); extern void onDragNDrop( @@ -112,7 +119,6 @@ typedef struct Screen { static int GetNumScreens(){ return 0; } - */ import "C" @@ -669,17 +675,22 @@ func windowSetURL(webview pointer, uri string) { C.free(unsafe.Pointer(target)) } -func windowSetupSignalHandlers(windowId uint, window, webview pointer, hideOnClose bool) { +//export emit +func emit(we *C.WindowEvent) { + window := globalApplication.getWindowForID(uint(we.id)) + if window != nil { + window.emit(events.WindowEventType(we.event)) + } +} + +func windowSetupSignalHandlers(windowId uint, window, webview pointer, emit func(e events.WindowEventType)) { event := C.CString("delete-event") defer C.free(unsafe.Pointer(event)) - - // Window close handler - if hideOnClose { - C.signal_connect((*C.GtkWidget)(window), event, C.gtk_widget_hide_on_delete, C.NULL) - } else { - //FIXME: what event should be emitted? - // C.signal_connect((*C.GtkWidget)(window), event, C.close_button_pressed, w.parent.id) + wEvent := C.WindowEvent{ + id: C.uint(windowId), + event: C.uint(events.Common.WindowClosing), } + C.signal_connect((*C.GtkWidget)(window), event, C.emit, unsafe.Pointer(&wEvent)) /* event = C.CString("load-changed") diff --git a/v3/pkg/application/linux_purego.go b/v3/pkg/application/linux_purego.go index 8f46d334..49b05ece 100644 --- a/v3/pkg/application/linux_purego.go +++ b/v3/pkg/application/linux_purego.go @@ -10,6 +10,7 @@ import ( "github.com/ebitengine/purego" "github.com/wailsapp/wails/v2/pkg/assetserver/webview" + "github.com/wailsapp/wails/v3/pkg/events" ) type windowPointer uintptr @@ -74,8 +75,9 @@ var ( const ( // TODO: map distro => so filename - with fallback? - gtk3 = "libgtk-3.so.0" - gtk4 = "libgtk-4.so.1" + gtk3 = "libgtk-3.so.0" + gtk4 = "libgtk-4.so.1" + webkit4 = "libwebkit2gtk-4.1.so.0" ) var ( @@ -211,7 +213,6 @@ func init() { } version = 3 - var webkit4 string = "libwebkit2gtk-4.1.so" webkit, err = purego.Dlopen(webkit4, purego.RTLD_NOW|purego.RTLD_GLOBAL) if err != nil { panic(err) @@ -858,23 +859,11 @@ func windowSetURL(webview pointer, uri string) { webkitWebViewLoadUri(webview, uri) } -func windowSetupSignalHandlers(windowId uint, window, webview pointer, hideOnClose bool) { - // Window close handler - if hideOnClose { - handleDelete := purego.NewCallback(func(pointer) { - // FIXME: I think this should be the WebviewWindow - //w.close() - if !hideOnClose { - fmt.Println("Need to do more!") - } - }) - - gSignalConnectData(window, "delete-event", handleDelete, 0, false, 0) - - } else { - //FIXME: what event should be emitted? - // C.signal_connect((*C.GtkWidget)(window), event, C.close_button_pressed, w.parent.id) - } +func windowSetupSignalHandlers(windowId uint, window, webview pointer, emit func(e events.WindowEventType)) { + handleDelete := purego.NewCallback(func(pointer) { + emit(events.Common.WindowClosing) + }) + gSignalConnectData(window, "delete-event", handleDelete, 0, false, 0) /* event = C.CString("load-changed") diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go index c1eb7b2e..20b25ace 100644 --- a/v3/pkg/application/webview_window_linux.go +++ b/v3/pkg/application/webview_window_linux.go @@ -53,7 +53,10 @@ func (w *linuxWebviewWindow) enableDND() { } func (w *linuxWebviewWindow) connectSignals() { - windowSetupSignalHandlers(w.parent.id, w.window, w.webview, w.parent.options.HideOnClose) + cb := func(e events.WindowEventType) { + w.parent.emit(e) + } + windowSetupSignalHandlers(w.parent.id, w.window, w.webview, cb) } func (w *linuxWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) { @@ -193,9 +196,6 @@ func (w *linuxWebviewWindow) windowZoom() { func (w *linuxWebviewWindow) close() { windowClose(w.window) - if !w.parent.options.HideOnClose { - globalApplication.deleteWindowByID(w.parent.id) - } } func (w *linuxWebviewWindow) zoomIn() { @@ -490,3 +490,8 @@ func (w *linuxWebviewWindow) startResize(border string) error { func (w *linuxWebviewWindow) nativeWindowHandle() uintptr { return uintptr(w.window) } + +func (w *linuxWebviewWindow) print() error { + w.execJS("window.print();") + return nil +}