diff --git a/exp/examples/clipboard/main.go b/exp/examples/clipboard/main.go
index 7d5c777e0..1526d7798 100644
--- a/exp/examples/clipboard/main.go
+++ b/exp/examples/clipboard/main.go
@@ -5,14 +5,20 @@ import (
"log"
"time"
+ "github.com/wailsapp/wails/exp/pkg/options"
+
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
- app := application.New()
- app.SetName("Clipboard Demo")
- app.SetDescription("A demo of the clipboard")
+ app := application.New(options.Application{
+ Name: "Clipboard Demo",
+ Description: "A demo of the clipboard API",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
// Create a custom menu
menu := app.NewMenu()
diff --git a/exp/examples/dialogs/main.go b/exp/examples/dialogs/main.go
index 0354fee7a..92f695f40 100644
--- a/exp/examples/dialogs/main.go
+++ b/exp/examples/dialogs/main.go
@@ -7,15 +7,20 @@ import (
"runtime"
"strings"
+ "github.com/wailsapp/wails/exp/pkg/options"
+
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
- app := application.New()
- app.SetName("Dialogs Demo")
- app.SetDescription("A demo of the Wails dialogs")
-
+ app := application.New(options.Application{
+ Name: "Dialogs Demo",
+ Description: "A demo of the dialogs API",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
// Create a custom menu
menu := app.NewMenu()
menu.AddRole(application.AppMenu)
diff --git a/exp/examples/kitchensink/main.go b/exp/examples/kitchensink/main.go
index a7138db78..415093a3f 100644
--- a/exp/examples/kitchensink/main.go
+++ b/exp/examples/kitchensink/main.go
@@ -12,9 +12,11 @@ import (
)
func main() {
- app := application.NewWithOptions(&options.Application{
- Mac: &options.Mac{
- //ActivationPolicy: options.ActivationPolicyAccessory,
+ app := application.New(options.Application{
+ Name: "Menu Demo",
+ Description: "A demo of the menu system",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
/*
@@ -121,7 +123,7 @@ func main() {
Alpha: 30,
},
StartState: options.WindowStateMaximised,
- Mac: &options.MacWindow{
+ Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
Appearance: options.NSAppearanceNameDarkAqua,
},
@@ -189,7 +191,7 @@ func main() {
Height: 768,
AlwaysOnTop: false,
URL: "https://google.com",
- Mac: &options.MacWindow{
+ Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
},
})
@@ -206,7 +208,7 @@ func main() {
myWindow2Lock.RLock()
myWindow.SetTitle("Wooooo")
myWindow.SetAlwaysOnTop(true)
- myWindow2.SetTitle("OMFG")
+ myWindow2.SetTitle("OMG")
myWindow2.SetURL("https://wails.io")
myWindow.SetMinSize(600, 600)
myWindow.SetMaxSize(650, 650)
diff --git a/exp/examples/menu/main.go b/exp/examples/menu/main.go
index 6f3581113..83f71f578 100644
--- a/exp/examples/menu/main.go
+++ b/exp/examples/menu/main.go
@@ -4,14 +4,20 @@ import (
_ "embed"
"log"
+ "github.com/wailsapp/wails/exp/pkg/options"
+
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
- app := application.New()
- app.SetName("Menu Demo")
- app.SetDescription("A demo of the menu system")
+ app := application.New(options.Application{
+ Name: "Menu Demo",
+ Description: "A demo of the menu system",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
// Create a custom menu
menu := app.NewMenu()
diff --git a/exp/examples/plain/main.go b/exp/examples/plain/main.go
index cdd59c2af..0b41d13a9 100644
--- a/exp/examples/plain/main.go
+++ b/exp/examples/plain/main.go
@@ -10,15 +10,19 @@ import (
)
func main() {
- app := application.New()
-
+ app := application.New(options.Application{
+ Name: "Plain",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
// Create window
app.NewWindowWithOptions(&options.Window{
- Title: "Plain Bundle",
- EnableDevTools: true,
- HTML: `
Plain BundlePlain Bundle
This is a plain bundle. It has no frontend code.
`,
- CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
- Mac: &options.MacWindow{
+ Title: "Plain Bundle",
+ HTML: `Plain BundlePlain Bundle
This is a plain bundle. It has no frontend code.
`,
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
diff --git a/exp/examples/systray/main.go b/exp/examples/systray/main.go
index 5b746dc82..f037bbb6a 100644
--- a/exp/examples/systray/main.go
+++ b/exp/examples/systray/main.go
@@ -3,6 +3,7 @@ package main
import (
_ "embed"
"log"
+ "runtime"
"github.com/wailsapp/wails/exp/pkg/options"
@@ -10,17 +11,27 @@ import (
)
func main() {
- app := application.New()
- app.SetActivationPolicy(options.ActivationPolicyAccessory)
+ app := application.New(options.Application{
+ Name: "Systray Demo",
+ Description: "A demo of the Systray API",
+ Mac: options.Mac{
+ ActivationPolicy: options.ActivationPolicyAccessory,
+ },
+ })
- systemTray := app.NewSystemTray().SetIcon(application.DefaultMacTemplateIcon)
+ systemTray := app.NewSystemTray()
+ if runtime.GOOS == "darwin" {
+ systemTray.SetIcon(application.DefaultMacTemplateIcon)
+ }
myMenu := app.NewMenu()
myMenu.Add("Hello World!").OnClick(func(ctx *application.Context) {
- ctx.ClickedMenuItem().SetLabel("Clicked!")
+ app.NewInfoDialog().SetTitle("Hello World!").SetMessage("Hello World!").Show()
})
subMenu := myMenu.AddSubmenu("Submenu")
- subMenu.Add("Submenu Item")
+ subMenu.Add("Click me!").OnClick(func(ctx *application.Context) {
+ ctx.ClickedMenuItem().SetLabel("Clicked!")
+ })
myMenu.AddSeparator()
myMenu.Add("Quit").OnClick(func(ctx *application.Context) {
app.Quit()
diff --git a/exp/examples/window/main.go b/exp/examples/window/main.go
index 38bc80b94..df6e842e0 100644
--- a/exp/examples/window/main.go
+++ b/exp/examples/window/main.go
@@ -17,10 +17,13 @@ import (
)
func main() {
- app := application.New()
- app.SetName("Window Demo")
- app.ApplicationShouldTerminateAfterLastWindowClosed()
- app.SetDescription("A demo of the windowing capabilities")
+ app := application.New(options.Application{
+ Name: "Window Demo",
+ Description: "A demo of the Window API",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
app.On(events.Mac.ApplicationDidFinishLaunching, func() {
log.Println("ApplicationDidFinishLaunching")
})
diff --git a/exp/pkg/application/application.go b/exp/pkg/application/application.go
index e670d391a..43fb2125b 100644
--- a/exp/pkg/application/application.go
+++ b/exp/pkg/application/application.go
@@ -16,28 +16,35 @@ func init() {
runtime.LockOSThread()
}
-func New() *App {
+func New(appOptions options.Application) *App {
if globalApplication != nil {
return globalApplication
}
- return NewWithOptions(options.ApplicationDefaults)
-}
-func NewWithOptions(appOptions options.Application) *App {
- if globalApplication != nil {
- return globalApplication
- }
- appOptions = options.ApplicationDefaults
+ mergeApplicationDefaults(&appOptions)
+
result := &App{
options: appOptions,
applicationEventListeners: make(map[uint][]func()),
systemTrays: make(map[uint]*SystemTray),
- icon: DefaultApplicationIcon,
}
globalApplication = result
return result
}
+func mergeApplicationDefaults(o *options.Application) {
+ if o.Name == "" {
+ o.Name = "My Wails Application"
+ }
+ if o.Description == "" {
+ o.Description = "An application written using Wails"
+ }
+ if o.Icon == nil {
+ o.Icon = DefaultApplicationIcon
+ }
+
+}
+
type platformApp interface {
run() error
destroy()
@@ -89,10 +96,7 @@ type App struct {
ApplicationMenu *Menu
// About MessageDialog
- name string
- description string
- icon []byte
- clipboard *Clipboard
+ clipboard *Clipboard
}
func (a *App) getSystemTrayID() uint {
@@ -202,9 +206,7 @@ func (a *App) Run() error {
a.impl.setApplicationMenu(a.ApplicationMenu)
// set the application icon
- if a.icon != nil {
- a.impl.setIcon(a.icon)
- }
+ a.impl.setIcon(a.options.Icon)
return a.impl.run()
}
@@ -288,47 +290,15 @@ func (a *App) Quit() {
a.impl.destroy()
}
-func (a *App) SetActivationPolicy(accessory options.ActivationPolicy) {
- a.options.Mac.ActivationPolicy = accessory
-}
-
func (a *App) SetMenu(menu *Menu) {
a.ApplicationMenu = menu
if a.impl != nil {
a.impl.setApplicationMenu(menu)
}
}
-
-func (a *App) SetName(name string) {
- a.name = name
-}
-
-func (a *App) Name() string {
- return a.name
-}
-
-func (a *App) SetIcon(icon []byte) {
- a.icon = icon
- if a.impl != nil {
- a.impl.setIcon(icon)
- }
-}
-
-func (a *App) Icon() []byte {
- return a.icon
-}
-
-func (a *App) SetDescription(description string) {
- a.description = description
-}
-
-func (a *App) Description() string {
- return a.description
-}
-
func (a *App) ShowAboutDialog() {
if a.impl != nil {
- a.impl.showAboutDialog(a.name, a.description, a.icon)
+ a.impl.showAboutDialog(a.options.Name, a.options.Description, a.options.Icon)
}
}
@@ -383,8 +353,3 @@ func (a *App) dispatchOnMainThread(fn func()) {
// Call platform specific dispatch function
a.impl.dispatchOnMainThread(id)
}
-
-func (a *App) ApplicationShouldTerminateAfterLastWindowClosed() {
- a.options.Mac.ApplicationShouldTerminateAfterLastWindowClosed = true
-
-}
diff --git a/exp/pkg/application/dialogs_darwin.go b/exp/pkg/application/dialogs_darwin.go
index b2818750a..717465095 100644
--- a/exp/pkg/application/dialogs_darwin.go
+++ b/exp/pkg/application/dialogs_darwin.go
@@ -339,8 +339,8 @@ func (m *macosDialog) show() {
} else {
// if it's an error, use the application icon
if m.dialog.dialogType == ErrorDialog {
- iconData = unsafe.Pointer(&globalApplication.icon[0])
- iconLength = C.int(len(globalApplication.icon))
+ iconData = unsafe.Pointer(&globalApplication.options.Icon[0])
+ iconLength = C.int(len(globalApplication.options.Icon))
}
}
diff --git a/exp/pkg/application/menuitem_darwin.go b/exp/pkg/application/menuitem_darwin.go
index 9288aaa65..ce79ece3e 100644
--- a/exp/pkg/application/menuitem_darwin.go
+++ b/exp/pkg/application/menuitem_darwin.go
@@ -402,7 +402,7 @@ func newSpeechMenu() *MenuItem {
}
func newHideMenuItem() *MenuItem {
- return newMenuItem("Hide " + globalApplication.Name()).
+ return newMenuItem("Hide " + globalApplication.options.Name).
SetAccelerator("CmdOrCtrl+h").
OnClick(func(ctx *Context) {
C.hideApplication()
@@ -482,7 +482,7 @@ func newDeleteMenuItem() *MenuItem {
}
func newQuitMenuItem() *MenuItem {
- return newMenuItem("Quit " + globalApplication.Name()).
+ return newMenuItem("Quit " + globalApplication.options.Name).
SetAccelerator("CmdOrCtrl+q").
OnClick(func(ctx *Context) {
globalApplication.Quit()
@@ -498,7 +498,7 @@ func newSelectAllMenuItem() *MenuItem {
}
func newAboutMenuItem() *MenuItem {
- return newMenuItem("About " + globalApplication.Name()).
+ return newMenuItem("About " + globalApplication.options.Name).
OnClick(func(ctx *Context) {
globalApplication.ShowAboutDialog()
})
diff --git a/exp/pkg/application/roles.go b/exp/pkg/application/roles.go
index e85844e24..0aec3bd48 100644
--- a/exp/pkg/application/roles.go
+++ b/exp/pkg/application/roles.go
@@ -98,7 +98,7 @@ func newAppMenu() *MenuItem {
appMenu.AddRole(UnHide)
appMenu.AddSeparator()
appMenu.AddRole(Quit)
- subMenu := newSubMenuItem(globalApplication.Name())
+ subMenu := newSubMenuItem(globalApplication.options.Name)
subMenu.submenu = appMenu
return subMenu
}
diff --git a/exp/pkg/options/application.go b/exp/pkg/options/application.go
index d941c46ee..2359ce2bb 100644
--- a/exp/pkg/options/application.go
+++ b/exp/pkg/options/application.go
@@ -1,11 +1,8 @@
package options
type Application struct {
- Mac Mac
-}
-
-var ApplicationDefaults = Application{
- Mac: Mac{
- ActivationPolicy: ActivationPolicyRegular,
- },
+ Name string
+ Description string
+ Icon []byte
+ Mac Mac
}
diff --git a/exp/pkg/options/mac.go b/exp/pkg/options/mac.go
index 81ebf9efa..ec5f2cc33 100644
--- a/exp/pkg/options/mac.go
+++ b/exp/pkg/options/mac.go
@@ -4,6 +4,8 @@ type ActivationPolicy int
const (
ActivationPolicyRegular ActivationPolicy = iota
+ // ActivationPolicyAccessory is used for applications that do not have a main window,
+ // such as system tray applications or background applications.
ActivationPolicyAccessory
ActivationPolicyProhibited
)
@@ -11,7 +13,8 @@ const (
type Mac struct {
// ActivationPolicy is the activation policy for the application. Defaults to
// applicationActivationPolicyRegular.
- ActivationPolicy ActivationPolicy
+ ActivationPolicy ActivationPolicy
+ // If set to true, the application will terminate when the last window is closed.
ApplicationShouldTerminateAfterLastWindowClosed bool
}