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 Bundle

Plain 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 Bundle

Plain 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 }