Skip to content
Open
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
00c3f54
Create webkit-6 versions of 'window' C files
Sammy-T Jun 7, 2025
e77ee76
Add webkit-6 to build constraints and cgo config
Sammy-T Jun 7, 2025
38518af
Construct gtk4 window
Sammy-T Jun 12, 2025
2425085
Manually create webview with content manager
Sammy-T Jun 13, 2025
9ed2b41
Add webkit-6 alt key mask
Sammy-T Jun 13, 2025
be76818
Run and quit main loop
Sammy-T Jun 13, 2025
e856b99
Add webkit-6 clipboard interaction
Sammy-T Jun 18, 2025
9958514
Connect buttons
Sammy-T Jun 18, 2025
214921f
Get gtk4 monitors
Sammy-T Jun 18, 2025
5684697
Implement menu and action handling
Sammy-T Jun 23, 2025
556a47f
Create 'show-inspector' action
Sammy-T Jun 23, 2025
d22e1e9
Clean up window and menu refs
Sammy-T Jun 24, 2025
05f422c
Get and set window size
Sammy-T Jul 15, 2025
020af54
Clean up window_webkit6.c
Sammy-T Jul 15, 2025
640e579
Implement gtk4 message dialog
Sammy-T Jul 15, 2025
5ec61d7
Implement gtk4 file chooser dialog
Sammy-T Jul 15, 2025
6361992
Enable webkit-6 gpu policy settings
Sammy-T Jul 15, 2025
612fa9f
Fix comment typo
Sammy-T Jul 15, 2025
8ed9e73
Add gtk4 drag and drop foundation
Sammy-T Jul 15, 2025
0813c1f
Use program name as app id
Sammy-T Jul 15, 2025
6fef5d5
Fix hardware acceleration selection
Sammy-T Jul 20, 2025
66060e8
Merge branch 'master' into feature/webkitgtk6
Sammy-T Sep 9, 2025
f1cd238
Remove `g_application_default_flags` redefinition
Sammy-T Sep 29, 2025
e5750dd
Switch to `GtkButtonsType`
Sammy-T Sep 29, 2025
74c4e1f
Use sync.map for action id to menu item mapping
Sammy-T Sep 30, 2025
ca4d259
Nil check main loop variable
Sammy-T Sep 30, 2025
a952372
Fix `sendShowInspectorMessage` definition
Sammy-T Sep 30, 2025
5e26557
Remove `activate` from header
Sammy-T Sep 30, 2025
f60318e
Fix title setting
Sammy-T Sep 30, 2025
c2da19c
Check map result before asserting menu item
Sammy-T Sep 30, 2025
e384e7b
Revert extraneous c-string free
Sammy-T Sep 30, 2025
c102d74
Clean up previous menu
Sammy-T Sep 30, 2025
c4b1e29
Fix webkit-6 window IsMinimized
Sammy-T Oct 16, 2025
3fec4fa
Enable drag and drop
Sammy-T Oct 16, 2025
de00f12
Set window transparency
Sammy-T Oct 17, 2025
e91a12c
Check for potential string concat overflow
Sammy-T Oct 17, 2025
1b40dda
Apply suggestions
Sammy-T Oct 17, 2025
aa57d0b
Replace ulong with gulong
Sammy-T Oct 17, 2025
96fe012
Merge branch 'master' into feature/webkitgtk6
Sammy-T Nov 9, 2025
bd50c5a
Replace webkit_6 ifdef with separate files
Sammy-T Nov 9, 2025
d7f30aa
Merge branch 'master' into feature/webkitgtk6
leaanthony Nov 9, 2025
2af5ef4
Duplicate g_value to unset and free
Sammy-T Nov 22, 2025
1f0dcce
Switch from stream_read_all to stream_read
Sammy-T Nov 22, 2025
d0a0c5a
Merge branch 'master' into feature/webkitgtk6
leaanthony Nov 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions v2/internal/frontend/desktop/linux/clipboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,56 @@
package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo !webkit2_41 pkg-config: webkit2gtk-4.0
#cgo webkit_6 CFLAGS: -DWEBKIT_6
#cgo !webkit_6 pkg-config: gtk+-3.0
#cgo webkit_6 pkg-config: gtk4
#cgo !(webkit2_41 || webkit_6) pkg-config: webkit2gtk-4.0
#cgo webkit2_41 pkg-config: webkit2gtk-4.1
#cgo webkit_6 pkg-config: webkitgtk-6.0

#include "gtk/gtk.h"

#ifdef WEBKIT_6
#include "webkit/webkit.h"
#else
#include "webkit2/webkit2.h"
#endif

static gchar* GetClipboardText() {
GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
return gtk_clipboard_wait_for_text(clip);
#ifdef WEBKIT_6
GdkClipboard *clip = gdk_display_get_primary_clipboard(gdk_display_get_default());
GdkContentProvider *provider = gdk_clipboard_get_content(clip);

GValue value = G_VALUE_INIT;
g_value_init(&value, G_TYPE_STRING);

if(!gdk_content_provider_get_value(provider, &value, NULL)) {
return "";
}

return g_value_get_string(&value);
#else
GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
return gtk_clipboard_wait_for_text(clip);
#endif
}

static void SetClipboardText(gchar* text) {
GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
gtk_clipboard_set_text(clip, text, -1);
#ifdef WEBKIT_6
GdkDisplay *display = gdk_display_get_default();

GdkClipboard *clip = gdk_display_get_primary_clipboard(display);
gdk_clipboard_set_text(clip, text);

clip = gdk_display_get_clipboard(display);
gdk_clipboard_set_text(clip, text);
#else
GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
gtk_clipboard_set_text(clip, text, -1);

clip = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
gtk_clipboard_set_text(clip, text, -1);
clip = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
gtk_clipboard_set_text(clip, text, -1);
#endif
}
*/
import "C"
Expand Down
27 changes: 12 additions & 15 deletions v2/internal/frontend/desktop/linux/frontend.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,20 @@
package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo !webkit2_41 pkg-config: webkit2gtk-4.0
#cgo webkit_6 CFLAGS: -DWEBKIT_6
#cgo !webkit_6 pkg-config: gtk+-3.0
#cgo webkit_6 pkg-config: gtk4
#cgo !(webkit2_41 || webkit_6) pkg-config: webkit2gtk-4.0
#cgo webkit2_41 pkg-config: webkit2gtk-4.1
#cgo webkit_6 pkg-config: webkitgtk-6.0

#include "gtk/gtk.h"

#ifdef WEBKIT_6
#include "webkit/webkit.h"
#else
#include "webkit2/webkit2.h"
#endif

// CREDIT: https://github.com/rainycape/magick
#include <errno.h>
Expand Down Expand Up @@ -130,7 +138,7 @@ type Frontend struct {
}

func (f *Frontend) RunMainLoop() {
C.gtk_main()
runMainLoop()
}

func (f *Frontend) WindowClose() {
Expand All @@ -146,7 +154,7 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.
_ = os.Setenv("GDK_BACKEND", "x11")
}

if ok := C.gtk_init_check(nil, nil); ok != 1 {
if ok := initGtk(); ok != 1 {
panic(errors.New("failed to init GTK"))
}
})
Expand Down Expand Up @@ -419,17 +427,6 @@ func (f *Frontend) Notify(name string, data ...interface{}) {
f.mainWindow.ExecJS(`window.wails.EventsNotify('` + template.JSEscapeString(string(payload)) + `');`)
}

var edgeMap = map[string]uintptr{
"n-resize": C.GDK_WINDOW_EDGE_NORTH,
"ne-resize": C.GDK_WINDOW_EDGE_NORTH_EAST,
"e-resize": C.GDK_WINDOW_EDGE_EAST,
"se-resize": C.GDK_WINDOW_EDGE_SOUTH_EAST,
"s-resize": C.GDK_WINDOW_EDGE_SOUTH,
"sw-resize": C.GDK_WINDOW_EDGE_SOUTH_WEST,
"w-resize": C.GDK_WINDOW_EDGE_WEST,
"nw-resize": C.GDK_WINDOW_EDGE_NORTH_WEST,
}

func (f *Frontend) processMessage(message string) {
if message == "DomReady" {
if f.frontendOptions.OnDomReady != nil {
Expand Down
71 changes: 71 additions & 0 deletions v2/internal/frontend/desktop/linux/frontend_c.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//go:build linux
// +build linux

package linux

/*
#cgo webkit_6 CFLAGS: -DWEBKIT_6
#cgo !webkit_6 pkg-config: gtk+-3.0
#cgo webkit_6 pkg-config: gtk4

#include "gtk/gtk.h"

#ifdef WEBKIT_6
const GdkSurfaceEdge N_RESIZE = GDK_SURFACE_EDGE_NORTH;
const GdkSurfaceEdge NE_RESIZE = GDK_SURFACE_EDGE_NORTH_EAST;
const GdkSurfaceEdge E_RESIZE = GDK_SURFACE_EDGE_EAST;
const GdkSurfaceEdge SE_RESIZE = GDK_SURFACE_EDGE_SOUTH_EAST;
const GdkSurfaceEdge S_RESIZE = GDK_SURFACE_EDGE_SOUTH;
const GdkSurfaceEdge SW_RESIZE = GDK_SURFACE_EDGE_SOUTH_WEST;
const GdkSurfaceEdge W_RESIZE = GDK_SURFACE_EDGE_WEST;
const GdkSurfaceEdge NW_RESIZE = GDK_SURFACE_EDGE_NORTH_WEST;
#else
const GdkWindowEdge N_RESIZE = GDK_WINDOW_EDGE_NORTH;
const GdkWindowEdge NE_RESIZE = GDK_WINDOW_EDGE_NORTH_EAST;
const GdkWindowEdge E_RESIZE = GDK_WINDOW_EDGE_EAST;
const GdkWindowEdge SE_RESIZE = GDK_WINDOW_EDGE_SOUTH_EAST;
const GdkWindowEdge S_RESIZE = GDK_WINDOW_EDGE_SOUTH;
const GdkWindowEdge SW_RESIZE = GDK_WINDOW_EDGE_SOUTH_WEST;
const GdkWindowEdge W_RESIZE = GDK_WINDOW_EDGE_WEST;
const GdkWindowEdge NW_RESIZE = GDK_WINDOW_EDGE_NORTH_WEST;
#endif

void runMainLoop() {
#ifdef WEBKIT_6
GMainLoop *mainLoop = g_main_loop_new(NULL, true);
setMainLoop(mainLoop);
g_main_loop_run(mainLoop);
#else
gtk_main();
#endif
}

gboolean initGtk() {
#ifdef WEBKIT_6
return gtk_init_check();
#else
return gtk_init_check(NULL, NULL);
#endif
}

*/
import "C"

var edgeMap = map[string]uintptr{
"n-resize": C.N_RESIZE,
"ne-resize": C.NE_RESIZE,
"e-resize": C.E_RESIZE,
"se-resize": C.SE_RESIZE,
"s-resize": C.S_RESIZE,
"sw-resize": C.SW_RESIZE,
"w-resize": C.W_RESIZE,
"nw-resize": C.NW_RESIZE,
}

func runMainLoop() {
C.runMainLoop()
}

func initGtk() C.gboolean {
return C.initGtk()
}
6 changes: 3 additions & 3 deletions v2/internal/frontend/desktop/linux/gtk.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
//go:build linux
// +build linux
//go:build linux && !webkit_6
// +build linux,!webkit_6

package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo pkg-config: gtk+-3.0
#cgo !webkit2_41 pkg-config: webkit2gtk-4.0
#cgo webkit2_41 pkg-config: webkit2gtk-4.1

Expand Down
65 changes: 65 additions & 0 deletions v2/internal/frontend/desktop/linux/gtk_webkit6.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
//go:build linux && webkit_6
// +build linux,webkit_6

package linux

import "C"
import (
"github.com/wailsapp/wails/v2/pkg/menu"
)

//export handleMenuRadioItemClick
func handleMenuRadioItemClick(rName *C.char, prev *C.char, curr *C.char) {
radioActionName := C.GoString(rName)
prevId := C.GoString(prev)
itemId := C.GoString(curr)

actionName := radioActionName + "::" + itemId
it, ok := gActionIdToMenuItem.Load(actionName)
if !ok {
return
}

item := it.(*menu.MenuItem)

prevActionId := radioActionName + "::" + prevId
prevIt, ok := gActionIdToMenuItem.Load(prevActionId)
if !ok {
return
}

prevItem := prevIt.(*menu.MenuItem)

prevItem.Checked = false
item.Checked = true

go item.Click(&menu.CallbackData{MenuItem: item})
}

//export handleMenuCheckItemClick
func handleMenuCheckItemClick(aName *C.char, checked C.int) {
actionName := C.GoString(aName)
it, ok := gActionIdToMenuItem.Load(actionName)
if !ok {
return
}

item := it.(*menu.MenuItem)

item.Checked = int(checked) == 1

go item.Click(&menu.CallbackData{MenuItem: item})
}

//export handleMenuItemClick
func handleMenuItemClick(aName *C.char) {
actionName := C.GoString(aName)
it, ok := gActionIdToMenuItem.Load(actionName)
if !ok {
return
}

item := it.(*menu.MenuItem)

go item.Click(&menu.CallbackData{MenuItem: item})
}
3 changes: 2 additions & 1 deletion v2/internal/frontend/desktop/linux/invoke.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo !webkit_6 pkg-config: gtk+-3.0
#cgo webkit_6 pkg-config: gtk4

#include <stdio.h>
#include "gtk/gtk.h"
Expand Down
14 changes: 11 additions & 3 deletions v2/internal/frontend/desktop/linux/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@
package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo !webkit2_41 pkg-config: webkit2gtk-4.0
#cgo webkit_6 CFLAGS: -DWEBKIT_6
#cgo !webkit_6 pkg-config: gtk+-3.0
#cgo webkit_6 pkg-config: gtk4
#cgo !(webkit2_41 || webkit_6) pkg-config: webkit2gtk-4.0
#cgo webkit2_41 pkg-config: webkit2gtk-4.1
#cgo webkit_6 pkg-config: webkitgtk-6.0


#include "gtk/gtk.h"

#ifdef WEBKIT_6
const GdkModifierType ALT_KEY_MASK = GDK_ALT_MASK;
#else
const GdkModifierType ALT_KEY_MASK = GDK_MOD1_MASK;
#endif
*/
import "C"
import (
Expand Down Expand Up @@ -103,7 +111,7 @@ func parseModifiers(modifiers []keys.Modifier) C.GdkModifierType {
case keys.ControlKey, keys.CmdOrCtrlKey:
result |= C.GDK_CONTROL_MASK
case keys.OptionOrAltKey:
result |= C.GDK_MOD1_MASK
result |= C.ALT_KEY_MASK
}
}
return result
Expand Down
20 changes: 20 additions & 0 deletions v2/internal/frontend/desktop/linux/loop_webkit6.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build linux && webkit_6
// +build linux,webkit_6

package linux

/*
#cgo pkg-config: gtk4

#include "gtk/gtk.h"

extern void setMainLoop(GMainLoop *loop);
*/
import "C"

var mainLoop *C.GMainLoop

//export setMainLoop
func setMainLoop(loop *C.GMainLoop) {
mainLoop = loop
}
13 changes: 8 additions & 5 deletions v2/internal/frontend/desktop/linux/menu.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
//go:build linux
// +build linux
//go:build linux && !webkit_6
// +build linux,!webkit_6

package linux

/*
#cgo linux pkg-config: gtk+-3.0
#cgo pkg-config: gtk+-3.0
#cgo !webkit2_41 pkg-config: webkit2gtk-4.0
#cgo webkit2_41 pkg-config: webkit2gtk-4.1

Expand Down Expand Up @@ -34,8 +34,11 @@ void addAccelerator(GtkWidget* menuItem, GtkAccelGroup* group, guint key, GdkMod
}
*/
import "C"
import "github.com/wailsapp/wails/v2/pkg/menu"
import "unsafe"
import (
"unsafe"

"github.com/wailsapp/wails/v2/pkg/menu"
)

var menuIdCounter int
var menuItemToId map[*menu.MenuItem]int
Expand Down
Loading