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

Context menu WIP

options refactor
This commit is contained in:
Lea Anthony 2023-02-09 18:35:26 +11:00
parent cd1e3f5bb0
commit f951b51c11
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
59 changed files with 1205 additions and 643 deletions

View File

@ -7,13 +7,12 @@ import (
"github.com/wailsapp/wails/v3/examples/binding/services"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/options"
)
type localStruct struct{}
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Bind: []interface{}{
&localStruct{},
&services.GreetService{},

View File

@ -9,18 +9,16 @@ import (
"strconv"
"time"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "WebviewWindow Demo",
Description: "A demo of the WebviewWindow API",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
@ -67,45 +65,45 @@ func main() {
windowCounter++
})
if runtime.GOOS == "darwin" {
myMenu.Add("New WebviewWindow (TitleBarHiddenInset)").
myMenu.Add("New WebviewWindow (MacTitleBarHiddenInset)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHiddenInset,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHiddenInset,
InvisibleTitleBarHeight: 25,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHiddenInset WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHiddenInset WebviewWindow example</p>").
Show()
windowCounter++
})
myMenu.Add("New WebviewWindow (TitleBarHiddenInsetUnified)").
myMenu.Add("New WebviewWindow (MacTitleBarHiddenInsetUnified)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHiddenInsetUnified,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHiddenInsetUnified,
InvisibleTitleBarHeight: 50,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHiddenInsetUnified WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHiddenInsetUnified WebviewWindow example</p>").
Show()
windowCounter++
})
myMenu.Add("New WebviewWindow (TitleBarHidden)").
myMenu.Add("New WebviewWindow (MacTitleBarHidden)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHidden,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHidden,
InvisibleTitleBarHeight: 25,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHidden WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHidden WebviewWindow example</p>").
Show()
windowCounter++
})

View File

@ -5,17 +5,15 @@ import (
"log"
"time"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Clipboard Demo",
Description: "A demo of the clipboard API",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})

View File

@ -7,17 +7,15 @@ import (
"runtime"
"strings"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Dialogs Demo",
Description: "A demo of the dialogs API",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})

View File

@ -4,18 +4,36 @@
<meta charset="UTF-8">
<title>Title</title>
<style>body{ text-align: center; color: white; background-color: rgba(0,0,0,0); user-select: none; -ms-user-select: none; -webkit-user-select: none; }</style>
<style>.file{ width: 100px; height: 100px; border: 3px solid black; }</style>
</head>
<body>
<h1>Events Demo</h1>
<br/>
<div class="file" id="123abc" data-contextmenu-id="f" data-contextmenu-data="someid" draggable="true" ondragstart="dragstart()" ondragend="dragend()"></div>
<div class="file" id="234abc" draggable="true" ondragstart="dragstart()" ondragend="dragend()"></div>
<div class="file" id="345abc" draggable="true" ondragstart="dragstart()" ondragend="dragend()"></div>
<div id="results"></div>
</body>
<script>
wails.Events.On("myevent", function(data) {
let currentHTML = document.getElementById("results").innerHTML;
document.getElementById("results").innerHTML = currentHTML + "<br/>" + JSON.stringify(data);;
document.getElementById("results").innerHTML = currentHTML + "<br/>" + JSON.stringify(data);
})
window.addEventListener("dragstart", (event) =>
event.dataTransfer.setData("text/plain", "This text may be dragged")
);
window.addEventListener("contextmenu", (event) => {
console.log({event})
let element = event.target;
let contextMenuId = element.getAttribute("data-contextmenu-id");
if (contextMenuId) {
let contextMenuData = element.getAttribute("data-contextmenu-data");
console.log({contextMenuId, contextMenuData, x: event.clientX, y: event.clientY});
_wails.openContextMenu(contextMenuId, event.clientX, event.clientY, contextMenuData);
event.preventDefault();
}
});
</script>
</html>

View File

@ -6,11 +6,8 @@ import (
"log"
"time"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/events"
)
//go:embed assets
@ -18,10 +15,10 @@ var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Events Demo",
Description: "A demo of the Events API",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
@ -41,25 +38,25 @@ func main() {
}
})
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Events Demo",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInsetUnified,
Mac: application.MacWindow{
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInsetUnified,
InvisibleTitleBarHeight: 50,
},
})
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Events Demo",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInsetUnified,
Mac: application.MacWindow{
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInsetUnified,
InvisibleTitleBarHeight: 50,
},
})

View File

@ -8,14 +8,13 @@ import (
"time"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/options"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Menu Demo",
Description: "A demo of the menu system",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
@ -110,22 +109,22 @@ func main() {
mySystray.SetMenu(myMenu)
mySystray.SetIconPosition(application.NSImageLeading)
myWindow := app.NewWebviewWindowWithOptions(&options.WebviewWindow{
myWindow := app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Kitchen Sink",
Width: 600,
Height: 400,
AlwaysOnTop: true,
DisableResize: false,
BackgroundColour: &options.RGBA{
BackgroundColour: &application.RGBA{
Red: 255,
Green: 255,
Blue: 255,
Alpha: 30,
},
StartState: options.WindowStateMaximised,
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
Appearance: options.NSAppearanceNameDarkAqua,
StartState: application.WindowStateMaximised,
Mac: application.MacWindow{
Backdrop: application.MacBackdropTranslucent,
Appearance: application.NSAppearanceNameDarkAqua,
},
})
/*
@ -185,14 +184,14 @@ func main() {
*/
var myWindow2 *application.WebviewWindow
var myWindow2Lock sync.RWMutex
myWindow2 = app.NewWebviewWindowWithOptions(&options.WebviewWindow{
myWindow2 = app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "#2",
Width: 1024,
Height: 768,
AlwaysOnTop: false,
URL: "https://google.com",
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
Mac: application.MacWindow{
Backdrop: application.MacBackdropTranslucent,
},
})
//myWindow2.On(events.Mac.WindowDidMove, func() {

View File

@ -4,17 +4,15 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Menu Demo",
Description: "A demo of the menu system",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})

View File

@ -5,31 +5,29 @@ import (
"log"
"net/http"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Plain",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`<html><head><title>Plain Bundle</title></head><body><div class="main"><h1>Plain Bundle</h1><p>This is a plain bundle. It has no frontend code but this was Served by the AssetServer's Handler</p></div></body></html>`))

View File

@ -5,17 +5,15 @@ import (
"log"
"runtime"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "Systray Demo",
Description: "A demo of the Systray API",
Mac: options.Mac{
ActivationPolicy: options.ActivationPolicyAccessory,
Mac: application.MacOptions{
ActivationPolicy: application.ActivationPolicyAccessory,
},
})

View File

@ -9,18 +9,16 @@ import (
"strconv"
"time"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "WebviewWindow Demo",
Description: "A demo of the WebviewWindow API",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
@ -58,56 +56,56 @@ func main() {
myMenu.Add("New Frameless WebviewWindow").
SetAccelerator("CmdOrCtrl+F").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
X: rand.Intn(1000),
Y: rand.Intn(800),
Frameless: true,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
},
}).Show()
windowCounter++
})
if runtime.GOOS == "darwin" {
myMenu.Add("New WebviewWindow (TitleBarHiddenInset)").
myMenu.Add("New WebviewWindow (MacTitleBarHiddenInset)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHiddenInset,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHiddenInset,
InvisibleTitleBarHeight: 25,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHiddenInset WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHiddenInset WebviewWindow example</p>").
Show()
windowCounter++
})
myMenu.Add("New WebviewWindow (TitleBarHiddenInsetUnified)").
myMenu.Add("New WebviewWindow (MacTitleBarHiddenInsetUnified)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHiddenInsetUnified,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHiddenInsetUnified,
InvisibleTitleBarHeight: 50,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHiddenInsetUnified WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHiddenInsetUnified WebviewWindow example</p>").
Show()
windowCounter++
})
myMenu.Add("New WebviewWindow (TitleBarHidden)").
myMenu.Add("New WebviewWindow (MacTitleBarHidden)").
OnClick(func(ctx *application.Context) {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Mac: options.MacWindow{
TitleBar: options.TitleBarHidden,
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Mac: application.MacWindow{
TitleBar: application.MacTitleBarHidden,
InvisibleTitleBarHeight: 25,
},
}).
SetTitle("WebviewWindow "+strconv.Itoa(windowCounter)).
SetPosition(rand.Intn(1000), rand.Intn(800)).
SetHTML("<br/><br/><p>A TitleBarHidden WebviewWindow example</p>").
SetHTML("<br/><br/><p>A MacTitleBarHidden WebviewWindow example</p>").
Show()
windowCounter++
})

View File

@ -7,8 +7,6 @@ import (
"math/rand"
"strconv"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -16,11 +14,11 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "WebviewWindow Javascript Demo",
Description: "A demo of the WebviewWindow API from Javascript",
Icon: nil,
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
@ -32,8 +30,8 @@ func main() {
windowCounter := 1
newWindow := func() {
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
Assets: options.Assets{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Assets: application.AssetOptions{
FS: assets,
},
}).

View File

@ -115,7 +115,7 @@ func findApplicationNewCalls(context *Context) {
return true
}
// Check struct literal is of type "options.Application"
// Check struct literal is of type "application.Options"
selectorExpr, ok := structLit.Type.(*ast.SelectorExpr)
if !ok {
return true

View File

@ -5,7 +5,6 @@ import (
"log"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/options"
)
type GreetService struct {
@ -22,7 +21,7 @@ type OtherService struct {
}
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Bind: []interface{}{
&GreetService{},
&OtherService{},

View File

@ -5,11 +5,10 @@ import (
"log"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/options"
)
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Bind: []interface{}{
&GreetService{},
&OtherService{},

View File

@ -5,7 +5,6 @@ import (
"log"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/options"
)
type GreetService struct {
@ -18,7 +17,7 @@ func (*GreetService) Greet(name string) string {
}
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Bind: []interface{}{
&GreetService{},
},

View File

@ -0,0 +1,28 @@
import {newRuntimeCaller} from "./runtime";
let call = newRuntimeCaller("contextmenu");
function openContextMenu(id, x, y, data) {
return call("OpenContextMenu", {id, x, y, data});
}
function enableContextMenus(enabled) {
if (enabled) {
window.addEventListener('contextmenu', contextMenuHandler);
} else {
window.removeEventListener('contextmenu', contextMenuHandler);
}
}
function contextMenuHandler(e) {
let element = e.target;
let contextMenuId = element.getAttribute("data-contextmenu-id");
if (contextMenuId) {
let contextMenuData = element.getAttribute("data-contextmenu-data");
console.log({contextMenuId, contextMenuData, x: e.clientX, y: e.clientY});
e.preventDefault();
return openContextMenu(contextMenuId, e.clientX, e.clientY, contextMenuData);
}
}
enableContextMenus(true);

View File

@ -9,7 +9,6 @@ The electron alternative for Go
*/
/* jshint esversion: 9 */
import {dialogCallback, dialogErrorCallback, Error, Info, OpenFile, Question, SaveFile, Warning,} from "./dialogs";
import * as Clipboard from './clipboard';
import * as Application from './application';
@ -17,12 +16,13 @@ import * as Log from './log';
import {newWindow} from "./window";
import {dispatchCustomEvent, Emit, Off, OffAll, On, Once, OnMultiple} from "./events";
import {dialogCallback, dialogErrorCallback, Error, Info, OpenFile, Question, SaveFile, Warning,} from "./dialogs";
// Internal wails endpoints
window.wails = {
...newRuntime(-1),
};
// Internal wails endpoints
window._wails = {
dialogCallback,
dialogErrorCallback,
@ -63,3 +63,4 @@ if (DEBUG) {
console.log("Wails v3.0.0 Debug Mode Enabled");
}

View File

@ -13,6 +13,7 @@
"happy-dom": "^8.1.5",
"nanoid": "^4.0.0",
"npm-check-updates": "^16.6.3",
"svelte": "^3.55.1",
"vitest": "^0.28.3"
}
},
@ -4408,6 +4409,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svelte": {
"version": "3.55.1",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz",
"integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/tar": {
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
@ -8185,6 +8195,12 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"svelte": {
"version": "3.55.1",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz",
"integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==",
"dev": true
},
"tar": {
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",

View File

@ -11,6 +11,7 @@
"happy-dom": "^8.1.5",
"nanoid": "^4.0.0",
"npm-check-updates": "^16.6.3",
"svelte": "^3.55.1",
"vitest": "^0.28.3"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -5,8 +5,6 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v3/pkg/application"
)
@ -14,25 +12,25 @@ import (
var assets embed.FS
func main() {
app := application.New(options.Application{
app := application.New(application.Options{
Name: "{{.ProjectName}}",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWebviewWindowWithOptions(&options.WebviewWindow{
app.NewWebviewWindowWithOptions(&application.WebviewWindowOptions{
Title: "Plain Bundle",
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
Mac: application.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
Backdrop: application.MacBackdropTranslucent,
TitleBar: application.MacTitleBarHiddenInset,
},
URL: "/",
Assets: options.Assets{
Assets: application.AssetOptions{
FS: assets,
},
})

View File

@ -1,22 +1,17 @@
//go:build darwin
#import "app_delegate.h"
#import "../events/events.h"
extern bool hasListeners(unsigned int);
@implementation AppDelegate
- (void)dealloc
{
[super dealloc];
}
// Create the applicationShouldTerminateAfterLastWindowClosed: method
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
return self.shouldTerminateWhenLastWindowClosed;
}
// GENERATED EVENTS START
- (void)applicationDidBecomeActive:(NSNotification *)notification {
if( hasListeners(EventApplicationDidBecomeActive) ) {

View File

@ -9,10 +9,8 @@ import (
"github.com/wailsapp/wails/v3/pkg/logger"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/options"
"github.com/wailsapp/wails/v2/pkg/assetserver/webview"
"github.com/wailsapp/wails/v3/pkg/events"
)
var globalApplication *App
@ -21,7 +19,7 @@ func init() {
runtime.LockOSThread()
}
func New(appOptions options.Application) *App {
func New(appOptions Options) *App {
if globalApplication != nil {
return globalApplication
}
@ -44,7 +42,7 @@ func New(appOptions options.Application) *App {
return result
}
func mergeApplicationDefaults(o *options.Application) {
func mergeApplicationDefaults(o *Options) {
if o.Name == "" {
o.Name = "My Wails Application"
}
@ -79,6 +77,13 @@ type windowMessage struct {
var windowMessageBuffer = make(chan *windowMessage)
type dragAndDropMessage struct {
windowId uint
filenames []string
}
var windowDragAndDropBuffer = make(chan *dragAndDropMessage)
type webViewAssetRequest struct {
windowId uint
request webview.Request
@ -87,7 +92,7 @@ type webViewAssetRequest struct {
var webviewRequests = make(chan *webViewAssetRequest)
type App struct {
options options.Application
options Options
applicationEventListeners map[uint][]func()
applicationEventListenersLock sync.RWMutex
@ -179,10 +184,10 @@ func (a *App) error(message string, args ...any) {
})
}
func (a *App) NewWebviewWindowWithOptions(windowOptions *options.WebviewWindow) *WebviewWindow {
func (a *App) NewWebviewWindowWithOptions(windowOptions *WebviewWindowOptions) *WebviewWindow {
// Ensure we have sane defaults
if windowOptions == nil {
windowOptions = options.WindowDefaults
windowOptions = WebviewWindowDefaults
}
newWindow := NewWindow(windowOptions)
@ -247,6 +252,12 @@ func (a *App) Run() error {
a.handleWindowMessage(event)
}
}()
go func() {
for {
dragAndDropMessage := <-windowDragAndDropBuffer
a.handleDragAndDropMessage(dragAndDropMessage)
}
}()
go func() {
for {
@ -286,6 +297,19 @@ func (a *App) handleApplicationEvent(event uint) {
}
}
func (a *App) handleDragAndDropMessage(event *dragAndDropMessage) {
// Get window from window map
a.windowsLock.Lock()
window, ok := a.windows[event.windowId]
a.windowsLock.Unlock()
if !ok {
log.Printf("WebviewWindow #%d not found", event.windowId)
return
}
// Get callback from window
window.handleDragAndDropMessage(event)
}
func (a *App) handleWindowMessage(event *windowMessage) {
// Get window from window map
a.windowsLock.Lock()

View File

@ -230,6 +230,20 @@ func processURLRequest(windowID C.uint, wkUrlSchemeTask unsafe.Pointer) {
}
}
//export processDragItems
func processDragItems(windowID C.uint, arr **C.char, length C.int) {
var filenames []string
// Convert the C array to a Go slice
goSlice := (*[1 << 30]*C.char)(unsafe.Pointer(arr))[:length:length]
for _, str := range goSlice {
filenames = append(filenames, C.GoString(str))
}
windowDragAndDropBuffer <- &dragAndDropMessage{
windowId: uint(windowID),
filenames: filenames,
}
}
//export processMenuItemClick
func processMenuItemClick(menuID C.uint) {
menuItemClicked <- uint(menuID)

View File

@ -67,6 +67,8 @@ func (m *MessageProcessor) HandleRuntimeCall(rw http.ResponseWriter, r *http.Req
m.processApplicationMethod(method, rw, r, targetWindow, params)
case "log":
m.processLogMethod(method, rw, r, targetWindow, params)
case "contextmenu":
m.processContextMenuMethod(method, rw, r, targetWindow, params)
default:
m.httpError(rw, "Unknown runtime call: %s", object)
}

View File

@ -0,0 +1,30 @@
package application
import (
"net/http"
)
type ContextMenuData struct {
Id string `json:"id"`
X int `json:"x"`
Y int `json:"y"`
Data any `json:"data"`
}
func (m *MessageProcessor) processContextMenuMethod(method string, rw http.ResponseWriter, _ *http.Request, window *WebviewWindow, params QueryParams) {
switch method {
case "OpenContextMenu":
var data ContextMenuData
err := params.ToStruct(&data)
if err != nil {
m.httpError(rw, "error parsing contextmenu message: %s", err.Error())
return
}
window.openContextMenu(data)
m.ok(rw)
default:
m.httpError(rw, "Unknown clipboard method: %s", method)
}
}

View File

@ -1,13 +1,15 @@
package options
package application
import "github.com/wailsapp/wails/v3/pkg/logger"
import (
"github.com/wailsapp/wails/v3/pkg/logger"
)
type Application struct {
type Options struct {
Name string
Description string
Icon []byte
Mac Mac
Bind []interface{}
Mac MacOptions
Bind []any
Logger struct {
Silent bool
CustomLoggers []logger.Output

View File

@ -1,4 +1,4 @@
package options
package application
type ActivationPolicy int
@ -10,7 +10,7 @@ const (
ActivationPolicyProhibited
)
type Mac struct {
type MacOptions struct {
// ActivationPolicy is the activation policy for the application. Defaults to
// applicationActivationPolicyRegular.
ActivationPolicy ActivationPolicy
@ -44,13 +44,13 @@ const (
// MacWindow contains macOS specific options
type MacWindow struct {
Backdrop MacBackdrop
TitleBar TitleBar
TitleBar MacTitleBar
Appearance MacAppearanceType
InvisibleTitleBarHeight int
}
// TitleBar contains options for the Mac titlebar
type TitleBar struct {
// MacTitleBar contains options for the Mac titlebar
type MacTitleBar struct {
AppearsTransparent bool
Hide bool
HideTitle bool
@ -60,8 +60,8 @@ type TitleBar struct {
ToolbarStyle MacToolbarStyle
}
// TitleBarDefault results in the default Mac TitleBar
var TitleBarDefault = TitleBar{
// MacTitleBarDefault results in the default Mac MacTitleBar
var MacTitleBarDefault = MacTitleBar{
AppearsTransparent: false,
Hide: false,
HideTitle: false,
@ -72,10 +72,10 @@ var TitleBarDefault = TitleBar{
// Credit: Comments from Electron site
// TitleBarHidden results in a hidden title bar and a full size content window,
// MacTitleBarHidden results in a hidden title bar and a full size content window,
// yet the title bar still has the standard window controls (“traffic lights”)
// in the top left.
var TitleBarHidden = TitleBar{
var MacTitleBarHidden = MacTitleBar{
AppearsTransparent: true,
Hide: false,
HideTitle: true,
@ -84,9 +84,9 @@ var TitleBarHidden = TitleBar{
HideToolbarSeparator: false,
}
// TitleBarHiddenInset results in a hidden title bar with an alternative look where
// MacTitleBarHiddenInset results in a hidden title bar with an alternative look where
// the traffic light buttons are slightly more inset from the window edge.
var TitleBarHiddenInset = TitleBar{
var MacTitleBarHiddenInset = MacTitleBar{
AppearsTransparent: true,
Hide: false,
HideTitle: true,
@ -95,9 +95,9 @@ var TitleBarHiddenInset = TitleBar{
HideToolbarSeparator: true,
}
// TitleBarHiddenInsetUnified results in a hidden title bar with an alternative look where
// MacTitleBarHiddenInsetUnified results in a hidden title bar with an alternative look where
// the traffic light buttons are even more inset from the window edge.
var TitleBarHiddenInsetUnified = TitleBar{
var MacTitleBarHiddenInsetUnified = MacTitleBar{
AppearsTransparent: true,
Hide: false,
HideTitle: true,

View File

@ -1,4 +1,4 @@
package options
package application
import (
"io/fs"
@ -14,7 +14,7 @@ const (
WindowStateFullscreen
)
type WebviewWindow struct {
type WebviewWindowOptions struct {
Name string
Title string
Width, Height int
@ -29,7 +29,7 @@ type WebviewWindow struct {
StartState WindowState
Mac MacWindow
BackgroundColour *RGBA
Assets Assets
Assets AssetOptions
HTML string
JS string
CSS string
@ -41,14 +41,14 @@ type WebviewWindow struct {
Zoom float64
}
var WindowDefaults = &WebviewWindow{
var WebviewWindowDefaults = &WebviewWindowOptions{
Title: "",
Width: 800,
Height: 600,
URL: "",
}
type Assets struct {
type AssetOptions struct {
// FS to use for loading assets from
FS fs.FS
// Handler is a custom handler to use for serving assets. If this is set, the `URL` and `FS` fields are ignored.

View File

@ -0,0 +1,7 @@
//go:build darwin
#import <AppKit/AppKit.h>
@interface WebviewDrag : NSView <NSDraggingDestination>
@property unsigned int windowId;
@end

View File

@ -0,0 +1,60 @@
//go:build darwin
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import "webview_drag.h"
#import "../events/events.h"
extern void processDragItems(unsigned int windowId, char** arr, int length);
@implementation WebviewDrag
- (instancetype)initWithFrame:(NSRect)frameRect {
self = [super initWithFrame:frameRect];
if (self) {
[self registerForDraggedTypes:@[NSFilenamesPboardType]];
}
return self;
}
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
NSPasteboard *pasteboard = [sender draggingPasteboard];
if ([[pasteboard types] containsObject:NSFilenamesPboardType]) {
processWindowEvent(self.windowId, EventWebViewDraggingEntered);
return NSDragOperationCopy;
}
return NSDragOperationNone;
}
- (NSDragOperation)draggingExited:(id<NSDraggingInfo>)sender {
NSLog(@"I am here!!!!");
return NSDragOperationCopy;
}
- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender {
return YES;
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *pasteboard = [sender draggingPasteboard];
if ([[pasteboard types] containsObject:NSFilenamesPboardType]) {
NSArray *files = [pasteboard propertyListForType:NSFilenamesPboardType];
NSUInteger count = [files count];
char** cArray = (char**)malloc(count * sizeof(char*));
for (NSUInteger i = 0; i < count; i++) {
NSString* str = files[i];
cArray[i] = (char*)[str UTF8String];
}
processDragItems(self.windowId, cArray, (int)count);
free(cArray);
return YES;
}
return NO;
}
@end

View File

@ -12,7 +12,6 @@ import (
assetserveroptions "github.com/wailsapp/wails/v2/pkg/options/assetserver"
"github.com/wailsapp/wails/v3/internal/runtime"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/options"
)
type (
@ -26,7 +25,7 @@ type (
setMaxSize(width, height int)
execJS(js string)
restore()
setBackgroundColour(color *options.RGBA)
setBackgroundColour(color *RGBA)
run()
center()
size() (int, int)
@ -67,7 +66,7 @@ type (
)
type WebviewWindow struct {
options *options.WebviewWindow
options *WebviewWindowOptions
impl webviewWindowImpl
implLock sync.RWMutex
id uint
@ -89,7 +88,7 @@ func getWindowID() uint {
return windowID
}
func NewWindow(options *options.WebviewWindow) *WebviewWindow {
func NewWindow(options *WebviewWindowOptions) *WebviewWindow {
if options.Width == 0 {
options.Width = 800
}
@ -313,7 +312,7 @@ func (w *WebviewWindow) ExecJS(js string) {
func (w *WebviewWindow) Fullscreen() *WebviewWindow {
if w.impl == nil {
w.options.StartState = options.WindowStateFullscreen
w.options.StartState = WindowStateFullscreen
return w
}
if !w.IsFullscreen() {
@ -365,7 +364,7 @@ func (w *WebviewWindow) IsFullscreen() bool {
return w.impl.isFullscreen()
}
func (w *WebviewWindow) SetBackgroundColour(colour *options.RGBA) *WebviewWindow {
func (w *WebviewWindow) SetBackgroundColour(colour *RGBA) *WebviewWindow {
w.options.BackgroundColour = colour
if w.impl != nil {
w.impl.setBackgroundColour(colour)
@ -538,7 +537,7 @@ func (w *WebviewWindow) SetPosition(x, y int) *WebviewWindow {
func (w *WebviewWindow) Minimise() *WebviewWindow {
if w.impl == nil {
w.options.StartState = options.WindowStateMinimised
w.options.StartState = WindowStateMinimised
return w
}
if !w.IsMinimised() {
@ -549,7 +548,7 @@ func (w *WebviewWindow) Minimise() *WebviewWindow {
func (w *WebviewWindow) Maximise() *WebviewWindow {
if w.impl == nil {
w.options.StartState = options.WindowStateMaximised
w.options.StartState = WindowStateMaximised
return w
}
if !w.IsMaximised() {
@ -641,3 +640,15 @@ func (w *WebviewWindow) info(message string, args ...any) {
Time: time.Now(),
})
}
func (w *WebviewWindow) handleDragAndDropMessage(event *dragAndDropMessage) {
println("Drag and drop message received for " + w.Name())
// Print filenames
for _, file := range event.filenames {
println(file)
}
}
func (w *WebviewWindow) openContextMenu(data ContextMenuData) {
fmt.Printf("Opening context menu for %+v\n", data)
}

View File

@ -16,7 +16,7 @@
@end
@interface WebviewWindowDelegate : NSObject <NSWindowDelegate, WKScriptMessageHandler, WKNavigationDelegate, WKURLSchemeHandler>
@interface WebviewWindowDelegate : NSObject <NSWindowDelegate, WKScriptMessageHandler, WKNavigationDelegate, WKURLSchemeHandler, NSDraggingDestination>
@property bool hideOnClose;
@property (retain) WKWebView* webView;
@ -29,7 +29,6 @@
- (void)handleLeftMouseUp:(NSWindow *)window;
- (void)handleLeftMouseDown:(NSEvent*)event;
@end

View File

@ -1,16 +1,12 @@
//go:build darwin
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "webview_window.h"
#import "../events/events.h"
extern void processMessage(unsigned int, const char*);
extern void processURLRequest(unsigned int, void *);
extern bool hasListeners(unsigned int);
@implementation WebviewWindow
- (WebviewWindow*) initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
{
self = [super initWithContentRect:contentRect styleMask:windowStyle backing:bufferingType defer:deferCreation];
@ -20,11 +16,9 @@ extern bool hasListeners(unsigned int);
[self setMovableByWindowBackground:YES];
return self;
}
- (BOOL)canBecomeKeyWindow {
return YES;
}
- (BOOL) canBecomeMainWindow {
return YES;
}
@ -38,9 +32,7 @@ extern bool hasListeners(unsigned int);
return YES;
}
@end
@implementation WebviewWindowDelegate
- (BOOL)windowShouldClose:(NSWindow *)sender {
if( self.hideOnClose ) {
[NSApp hide:nil];
@ -48,7 +40,6 @@ extern bool hasListeners(unsigned int);
}
return true;
}
// Handle script messages from the external bridge
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message {
NSString *m = message.body;
@ -83,11 +74,9 @@ extern bool hasListeners(unsigned int);
- (void)handleLeftMouseUp:(NSWindow *)window {
self.leftMouseEvent = nil;
}
- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {
processURLRequest(self.windowId, urlSchemeTask);
}
- (void)webView:(nonnull WKWebView *)webView stopURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {
NSInputStream *stream = urlSchemeTask.request.HTTPBodyStream;
if (stream) {
@ -97,7 +86,6 @@ extern bool hasListeners(unsigned int);
}
}
}
// GENERATED EVENTS START
- (void)windowDidBecomeKey:(NSNotification *)notification {
if( hasListeners(EventWindowDidBecomeKey) ) {
@ -561,5 +549,17 @@ extern bool hasListeners(unsigned int);
}
}
- (void)webView:(WKWebView *)webview draggingEntered:(WKNavigation *)navigation {
if( hasListeners(EventWebViewDraggingEntered) ) {
processWindowEvent(self.windowId, EventWebViewDraggingEntered);
}
}
- (void)webView:(WKWebView *)webview draggingPerformed:(WKNavigation *)navigation {
if( hasListeners(EventWebViewDraggingPerformed) ) {
processWindowEvent(self.windowId, EventWebViewDraggingPerformed);
}
}
// GENERATED EVENTS END
@end

View File

@ -12,6 +12,8 @@ package application
#include "Cocoa/Cocoa.h"
#import <WebKit/WebKit.h>
#import <AppKit/AppKit.h>
#import "webview_drag.h"
extern void registerListener(unsigned int event);
@ -69,6 +71,12 @@ void* windowNew(unsigned int id, int width, int height, bool fraudulentWebsiteWa
delegate.webView = webView;
delegate.hideOnClose = false;
WebviewDrag* dragView = [[WebviewDrag alloc] initWithFrame:NSMakeRect(0, 0, width-1, height-1)];
[view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[view addSubview:dragView];
dragView.windowId = id;
return window;
}
@ -769,8 +777,6 @@ import (
"unsafe"
"github.com/wailsapp/wails/v3/pkg/events"
"github.com/wailsapp/wails/v3/pkg/options"
)
var showDevTools = func(window unsafe.Pointer) {}
@ -1049,10 +1055,10 @@ func (w *macosWebviewWindow) run() {
macOptions := w.parent.options.Mac
switch macOptions.Backdrop {
case options.MacBackdropTransparent:
case MacBackdropTransparent:
C.windowSetTransparent(w.nsWindow)
C.webviewSetTransparent(w.nsWindow)
case options.MacBackdropTranslucent:
case MacBackdropTranslucent:
C.windowSetTranslucent(w.nsWindow)
C.webviewSetTransparent(w.nsWindow)
}
@ -1077,11 +1083,11 @@ func (w *macosWebviewWindow) run() {
}
switch w.parent.options.StartState {
case options.WindowStateMaximised:
case WindowStateMaximised:
w.maximise()
case options.WindowStateMinimised:
case WindowStateMinimised:
w.minimise()
case options.WindowStateFullscreen:
case WindowStateFullscreen:
w.fullscreen()
}
@ -1108,7 +1114,7 @@ func (w *macosWebviewWindow) run() {
})
}
func (w *macosWebviewWindow) setBackgroundColour(colour *options.RGBA) {
func (w *macosWebviewWindow) setBackgroundColour(colour *RGBA) {
if colour == nil {
return
}

View File

@ -126,6 +126,8 @@ type macEvents struct {
WebViewDidReceiveServerRedirectForProvisionalNavigation WindowEventType
WebViewDidFinishNavigation WindowEventType
WebViewDidCommitNavigation WindowEventType
WebViewDraggingEntered WindowEventType
WebViewDraggingPerformed WindowEventType
}
func newMacEvents() macEvents {
@ -250,5 +252,7 @@ func newMacEvents() macEvents {
WebViewDidReceiveServerRedirectForProvisionalNavigation: 117,
WebViewDidFinishNavigation: 118,
WebViewDidCommitNavigation: 119,
WebViewDraggingEntered: 120,
WebViewDraggingPerformed: 121,
}
}

View File

@ -126,8 +126,10 @@ extern void processWindowEvent(unsigned int, unsigned int);
#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 117
#define EventWebViewDidFinishNavigation 118
#define EventWebViewDidCommitNavigation 119
#define EventWebViewDraggingEntered 120
#define EventWebViewDraggingPerformed 121
#define MAX_EVENTS 120
#define MAX_EVENTS 123
#endif

View File

@ -118,4 +118,7 @@ mac:WebViewDidStartProvisionalNavigation
mac:WebViewDidReceiveServerRedirectForProvisionalNavigation
mac:WebViewDidFinishNavigation
mac:WebViewDidCommitNavigation
mac:WebViewDraggingEntered
mac:WebViewDraggingPerformed

View File

@ -143,7 +143,7 @@ func main() {
}
// Load the window_delegate.m file
windowDelegate, err := os.ReadFile("../../pkg/application/window_delegate.m")
windowDelegate, err := os.ReadFile("../../pkg/application/webview_window.m")
if err != nil {
panic(err)
}
@ -173,7 +173,7 @@ func main() {
}
}
}
err = os.WriteFile("../../pkg/application/window_delegate.m", buffer.Bytes(), 0755)
err = os.WriteFile("../../pkg/application/webview_window.m", buffer.Bytes(), 0755)
if err != nil {
panic(err)
}