From bad9ad3dd773cbb456cd0829cbbe26b9e18bd69a Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 10 Nov 2021 08:42:04 +1100 Subject: [PATCH 1/3] [v2] Refactor app options --- .../frontend/desktop/windows/window.go | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/v2/internal/frontend/desktop/windows/window.go b/v2/internal/frontend/desktop/windows/window.go index 8087e37f..d6c8d42e 100644 --- a/v2/internal/frontend/desktop/windows/window.go +++ b/v2/internal/frontend/desktop/windows/window.go @@ -18,24 +18,24 @@ type Window struct { dispatchq []func() } -func NewWindow(parent winc.Controller, options *options.App) *Window { +func NewWindow(parent winc.Controller, appoptions *options.App) *Window { result := new(Window) - result.frontendOptions = options + result.frontendOptions = appoptions result.SetIsForm(true) var exStyle int - if options.Windows != nil { + if appoptions.Windows != nil { exStyle = w32.WS_EX_CONTROLPARENT | w32.WS_EX_APPWINDOW - if options.Windows.WindowIsTranslucent { + if appoptions.Windows.WindowIsTranslucent { exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP } } - if options.AlwaysOnTop { + if appoptions.AlwaysOnTop { exStyle |= w32.WS_EX_TOPMOST } var dwStyle = w32.WS_OVERLAPPEDWINDOW - if options.Frameless { + if appoptions.Frameless { dwStyle = w32.WS_POPUP } @@ -44,7 +44,7 @@ func NewWindow(parent winc.Controller, options *options.App) *Window { result.SetParent(parent) loadIcon := true - if options.Windows != nil && options.Windows.DisableWindowIcon == true { + if appoptions.Windows != nil && appoptions.Windows.DisableWindowIcon == true { loadIcon = false } if loadIcon { @@ -53,21 +53,21 @@ func NewWindow(parent winc.Controller, options *options.App) *Window { } } - result.SetSize(options.Width, options.Height) - result.SetText(options.Title) - if options.Frameless == false && !options.Fullscreen { - result.EnableMaxButton(!options.DisableResize) - result.EnableSizable(!options.DisableResize) - result.SetMinSize(options.MinWidth, options.MinHeight) - result.SetMaxSize(options.MaxWidth, options.MaxHeight) + result.SetSize(appoptions.Width, appoptions.Height) + result.SetText(appoptions.Title) + if appoptions.Frameless == false && !appoptions.Fullscreen { + result.EnableMaxButton(!appoptions.DisableResize) + result.EnableSizable(!appoptions.DisableResize) + result.SetMinSize(appoptions.MinWidth, appoptions.MinHeight) + result.SetMaxSize(appoptions.MaxWidth, appoptions.MaxHeight) } - if options.Windows != nil { - if options.Windows.WindowIsTranslucent { + if appoptions.Windows != nil { + if appoptions.Windows.WindowIsTranslucent { result.SetTranslucentBackground() } - if options.Windows.DisableWindowIcon { + if appoptions.Windows.DisableWindowIcon { result.DisableIcon() } } @@ -78,8 +78,8 @@ func NewWindow(parent winc.Controller, options *options.App) *Window { result.SetFont(winc.DefaultFont) - if options.Menu != nil { - result.SetApplicationMenu(options.Menu) + if appoptions.Menu != nil { + result.SetApplicationMenu(appoptions.Menu) } return result From 56ef4ddd47dfceaddf0af5bcdb73d6c37e2bd820 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 10 Nov 2021 18:11:54 +1100 Subject: [PATCH 2/3] [v2] Add WindowStartState. Fix startHidden option. Only windows supported atm --- .../frontend/desktop/windows/frontend.go | 29 ++++++++++++------- v2/pkg/options/options.go | 10 +++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 2f551cd1..018b4dfe 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -130,10 +130,6 @@ func (f *Frontend) Run(ctx context.Context) error { } }() - if f.frontendOptions.Fullscreen { - mainWindow.Fullscreen() - } - mainWindow.Run() mainWindow.Close() return nil @@ -412,11 +408,6 @@ func (f *Frontend) navigationCompleted(sender *edge.ICoreWebView2, args *edge.IC go f.frontendOptions.OnDomReady(f.ctx) } - // If you want to start hidden, return - if f.frontendOptions.StartHidden { - return - } - // Hack to make it visible: https://github.com/MicrosoftEdge/WebView2Feedback/issues/1077#issuecomment-825375026 err := f.chromium.Hide() if err != nil { @@ -426,6 +417,24 @@ func (f *Frontend) navigationCompleted(sender *edge.ICoreWebView2, args *edge.IC if err != nil { log.Fatal(err) } - f.mainWindow.Show() + + if f.frontendOptions.StartHidden { + return + } + + switch f.frontendOptions.WindowStartState { + case options.Maximised: + f.mainWindow.Maximise() + case options.Minimised: + f.mainWindow.Minimise() + case options.Fullscreen: + f.mainWindow.Fullscreen() + f.mainWindow.Show() + default: + if f.frontendOptions.Fullscreen { + f.mainWindow.Fullscreen() + } + f.mainWindow.Show() + } } diff --git a/v2/pkg/options/options.go b/v2/pkg/options/options.go index ce9a03a0..b82d1f72 100644 --- a/v2/pkg/options/options.go +++ b/v2/pkg/options/options.go @@ -15,6 +15,15 @@ import ( "github.com/wailsapp/wails/v2/pkg/logger" ) +type WindowStartState int + +const ( + Normal WindowStartState = 0 + Maximised WindowStartState = 1 + Minimised WindowStartState = 2 + Fullscreen WindowStartState = 3 +) + // App contains options for creating the App type App struct { Title string @@ -39,6 +48,7 @@ type App struct { OnDomReady func(ctx context.Context) `json:"-"` OnShutdown func(ctx context.Context) `json:"-"` Bind []interface{} + WindowStartState WindowStartState //ContextMenus []*menu.ContextMenu //TrayMenus []*menu.TrayMenu From c678ab7d0103f38e6d7345f9709a00a47d3fd182 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 16 Nov 2021 18:20:41 +1100 Subject: [PATCH 3/3] [mac] Potential file dialog fix. Fix for starthidden. Partial WindowStartState --- .../frontend/desktop/darwin/AppDelegate.h | 1 + .../frontend/desktop/darwin/AppDelegate.m | 8 +++++++- .../frontend/desktop/darwin/Application.h | 7 ++++++- .../frontend/desktop/darwin/Application.m | 20 ++++++++++++++++++- .../frontend/desktop/darwin/WailsContext.h | 1 + .../frontend/desktop/darwin/WailsContext.m | 14 +++++++------ .../frontend/desktop/darwin/WailsMenu.m | 4 ++-- v2/internal/frontend/desktop/darwin/window.go | 4 +++- 8 files changed, 47 insertions(+), 12 deletions(-) diff --git a/v2/internal/frontend/desktop/darwin/AppDelegate.h b/v2/internal/frontend/desktop/darwin/AppDelegate.h index 7760b09a..990c4e8a 100644 --- a/v2/internal/frontend/desktop/darwin/AppDelegate.h +++ b/v2/internal/frontend/desktop/darwin/AppDelegate.h @@ -14,6 +14,7 @@ @interface AppDelegate : NSResponder @property bool alwaysOnTop; +@property bool startHidden; @property (retain) WailsWindow* mainWindow; @end diff --git a/v2/internal/frontend/desktop/darwin/AppDelegate.m b/v2/internal/frontend/desktop/darwin/AppDelegate.m index 0d468bbf..a605022f 100644 --- a/v2/internal/frontend/desktop/darwin/AppDelegate.m +++ b/v2/internal/frontend/desktop/darwin/AppDelegate.m @@ -16,16 +16,22 @@ } - (void)applicationWillFinishLaunching:(NSNotification *)aNotification { [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - [self.mainWindow makeKeyAndOrderFront:self]; if (self.alwaysOnTop) { [self.mainWindow setLevel:NSStatusWindowLevel]; } + if ( !self.startHidden ) { + [self.mainWindow makeKeyAndOrderFront:self]; + } } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [NSApp activateIgnoringOtherApps:YES]; } +- (void)dealloc { + [super dealloc]; +} + @synthesize touchBar; @end diff --git a/v2/internal/frontend/desktop/darwin/Application.h b/v2/internal/frontend/desktop/darwin/Application.h index 3cfbb853..e42aab7b 100644 --- a/v2/internal/frontend/desktop/darwin/Application.h +++ b/v2/internal/frontend/desktop/darwin/Application.h @@ -12,7 +12,12 @@ #import #import "WailsContext.h" -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug); +#define WindowStartsNormal 0 +#define WindowStartsMaximised 1 +#define WindowStartsMinimised 2 +#define WindowStartsFullscreen 3 + +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden); void Run(void*); void SetTitle(void* ctx, const char *title); diff --git a/v2/internal/frontend/desktop/darwin/Application.m b/v2/internal/frontend/desktop/darwin/Application.m index 816fe225..f93a3e52 100644 --- a/v2/internal/frontend/desktop/darwin/Application.m +++ b/v2/internal/frontend/desktop/darwin/Application.m @@ -12,7 +12,7 @@ #import "WailsMenu.h" #import "WailsMenuItem.h" -WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug) { +WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden) { [NSApplication sharedApplication]; @@ -20,10 +20,27 @@ WailsContext* Create(const char* title, int width, int height, int frameless, in result.debug = debug; + if ( windowStartState == WindowStartsFullscreen ) { + fullscreen = 1; + } + [result CreateWindow:width :height :frameless :resizable :fullscreen :fullSizeContent :hideTitleBar :titlebarAppearsTransparent :hideTitle :useToolbar :hideToolbarSeparator :webviewIsTransparent :hideWindowOnClose :safeInit(appearance) :windowIsTranslucent]; [result SetTitle:safeInit(title)]; [result Center]; + switch( windowStartState ) { + case WindowStartsMaximised: + [result.mainWindow zoom:nil]; + break; + case WindowStartsMinimised: + //TODO: Can you start a mac app minimised? + break; + } + + if ( startsHidden == 1 ) { + result.startHidden = true; + } + result.alwaysOnTop = alwaysOnTop; result.hideOnClose = hideWindowOnClose; @@ -306,6 +323,7 @@ void Run(void *inctx) { ctx.appdelegate = delegate; delegate.mainWindow = ctx.mainWindow; delegate.alwaysOnTop = ctx.alwaysOnTop; + delegate.startHidden = ctx.startHidden; [ctx loadRequest:@"wails://wails/"]; [app setMainMenu:ctx.applicationMenu]; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.h b/v2/internal/frontend/desktop/darwin/WailsContext.h index c39687e9..022338c5 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.h +++ b/v2/internal/frontend/desktop/darwin/WailsContext.h @@ -26,6 +26,7 @@ @property bool hideOnClose; @property bool shuttingDown; +@property bool startHidden; @property NSSize maxSize; @property NSSize minSize; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.m b/v2/internal/frontend/desktop/darwin/WailsContext.m index 85da9009..9a82a9b1 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.m +++ b/v2/internal/frontend/desktop/darwin/WailsContext.m @@ -533,10 +533,10 @@ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:nil]; NSString *nsjson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; processOpenFileDialogResponse([nsjson UTF8String]); + [nsjson release]; + [arr release]; }]; - ON_MAIN_THREAD([dialog runModal];) - } @@ -579,11 +579,13 @@ // Setup callback handler [dialog beginSheetModalForWindow:self.mainWindow completionHandler:^(NSModalResponse returnCode) { NSURL *url = [dialog URL]; - processSaveFileDialogResponse([url.path UTF8String]); + if ( url != nil ) { + processSaveFileDialogResponse([url.path UTF8String]); + return; + } + processSaveFileDialogResponse(""); }]; - - ON_MAIN_THREAD([dialog runModal];) - + } - (void) SetAbout :(NSString*)title :(NSString*)description :(void*)imagedata :(int)datalen { diff --git a/v2/internal/frontend/desktop/darwin/WailsMenu.m b/v2/internal/frontend/desktop/darwin/WailsMenu.m index cebb31c4..7b20eb23 100644 --- a/v2/internal/frontend/desktop/darwin/WailsMenu.m +++ b/v2/internal/frontend/desktop/darwin/WailsMenu.m @@ -19,7 +19,7 @@ } - (NSMenuItem*) newMenuItemWithContext :(WailsContext*)ctx :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags { - NSMenuItem *result = [[NSMenuItem new] autorelease]; + NSMenuItem *result = [NSMenuItem new]; if ( title != nil ) { [result setTitle:title]; } @@ -45,7 +45,7 @@ [super initWithTitle:title]; } [self setAutoenablesItems:NO]; - return self; + return [self init]; } - (void) appendSubmenu :(WailsMenu*)child { diff --git a/v2/internal/frontend/desktop/darwin/window.go b/v2/internal/frontend/desktop/darwin/window.go index 5cf9e465..2ae07be3 100644 --- a/v2/internal/frontend/desktop/darwin/window.go +++ b/v2/internal/frontend/desktop/darwin/window.go @@ -47,6 +47,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { fullscreen := bool2Cint(frontendOptions.Fullscreen) alwaysOnTop := bool2Cint(frontendOptions.AlwaysOnTop) hideWindowOnClose := bool2Cint(frontendOptions.HideWindowOnClose) + startsHidden := bool2Cint(frontendOptions.StartHidden) debug := bool2Cint(debugMode) var fullSizeContent, hideTitleBar, hideTitle, useToolbar, webviewIsTransparent C.int @@ -55,6 +56,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { width := C.int(frontendOptions.Width) height := C.int(frontendOptions.Height) + windowStartState := C.int(int(frontendOptions.WindowStartState)) title = c.String(frontendOptions.Title) @@ -75,7 +77,7 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { } var context *C.WailsContext = C.Create(title, width, height, frameless, resizable, fullscreen, fullSizeContent, hideTitleBar, titlebarAppearsTransparent, hideTitle, useToolbar, hideToolbarSeparator, webviewIsTransparent, - alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, debug) + alwaysOnTop, hideWindowOnClose, appearance, windowIsTranslucent, debug, windowStartState, startsHidden) // Create menu result := &Window{