From 7ef445f5265042cee208f7cf322cab0b7055f587 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 31 Oct 2021 08:50:14 +1100 Subject: [PATCH] [mac] Improve string/memory handling, dialog icon -> []byte --- .../frontend/desktop/darwin/Application.h | 7 +- .../frontend/desktop/darwin/Application.m | 64 +++++++-- .../frontend/desktop/darwin/WailsAlert.h | 2 +- .../frontend/desktop/darwin/WailsAlert.m | 8 +- .../frontend/desktop/darwin/WailsContext.h | 18 ++- .../frontend/desktop/darwin/WailsContext.m | 82 +++++------ .../frontend/desktop/darwin/WailsMenu.h | 2 +- .../frontend/desktop/darwin/WailsMenu.m | 128 +++++++++--------- v2/internal/frontend/desktop/darwin/dialog.go | 10 +- .../frontend/desktop/darwin/frontend.go | 6 +- v2/internal/frontend/frontend.go | 2 +- 11 files changed, 192 insertions(+), 137 deletions(-) diff --git a/v2/internal/frontend/desktop/darwin/Application.h b/v2/internal/frontend/desktop/darwin/Application.h index cbb9c4bb..8bee9b95 100644 --- a/v2/internal/frontend/desktop/darwin/Application.h +++ b/v2/internal/frontend/desktop/darwin/Application.h @@ -36,11 +36,11 @@ void Quit(void*); const char* GetSize(void *ctx); const char* GetPos(void *ctx); -void ProcessURLResponse(void *inctx, const char *url, const char *contentType, const char *data, int datalength); +void ProcessURLResponse(void *inctx, const char *url, const char *contentType, void* data, int datalength); /* Dialogs */ -void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton); +void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton, void* iconData, int iconDataLength); void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters); void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters); @@ -54,4 +54,7 @@ void SetAbout(void *inctx, const char* title, const char* description, void* ima void* AppendMenuItem(void* inctx, void* nsmenu, const char* label, const char* shortcutKey, int modifiers, int disabled, int checked, int menuItemID); void AppendSeparator(void* inMenu); void UpdateMenuItem(void* nsmenuitem, int checked); + +NSString* safeInit(const char* input); + #endif /* Application_h */ diff --git a/v2/internal/frontend/desktop/darwin/Application.m b/v2/internal/frontend/desktop/darwin/Application.m index b2629f30..c9af9c31 100644 --- a/v2/internal/frontend/desktop/darwin/Application.m +++ b/v2/internal/frontend/desktop/darwin/Application.m @@ -18,8 +18,8 @@ WailsContext* Create(const char* title, int width, int height, int frameless, in result.debug = debug; - [result CreateWindow:width :height :frameless :resizable :fullscreen :fullSizeContent :hideTitleBar :titlebarAppearsTransparent :hideTitle :useToolbar :hideToolbarSeparator :webviewIsTransparent :hideWindowOnClose :appearance :windowIsTranslucent]; - [result SetTitle:title]; + [result CreateWindow:width :height :frameless :resizable :fullscreen :fullSizeContent :hideTitleBar :titlebarAppearsTransparent :hideTitle :useToolbar :hideToolbarSeparator :webviewIsTransparent :hideWindowOnClose :safeInit(appearance) :windowIsTranslucent]; + [result SetTitle:safeInit(title)]; [result Center]; result.alwaysOnTop = alwaysOnTop; @@ -28,10 +28,10 @@ WailsContext* Create(const char* title, int width, int height, int frameless, in return result; } -void ProcessURLResponse(void *inctx, const char *url, const char *contentType, const char* data, int datalength) { +void ProcessURLResponse(void *inctx, const char *url, const char *contentType, void* data, int datalength) { WailsContext *ctx = (__bridge WailsContext*) inctx; - NSString *nsurl = [[NSString alloc] initWithUTF8String:url]; - NSString *nsContentType = [[NSString alloc] initWithUTF8String:contentType]; + NSString *nsurl = safeInit(url); + NSString *nsContentType = safeInit(contentType); NSData *nsdata = [NSData dataWithBytes:data length:datalength]; [ctx processURLResponse:nsurl :nsContentType :nsdata]; @@ -39,7 +39,7 @@ void ProcessURLResponse(void *inctx, const char *url, const char *contentType, c void ExecJS(void* inctx, const char *script) { WailsContext *ctx = (__bridge WailsContext*) inctx; - NSString *nsscript = [NSString stringWithUTF8String:script]; + NSString *nsscript = safeInit(script); ON_MAIN_THREAD( [ctx ExecJS:nsscript]; ); @@ -47,8 +47,9 @@ void ExecJS(void* inctx, const char *script) { void SetTitle(void* inctx, const char *title) { WailsContext *ctx = (__bridge WailsContext*) inctx; + NSString *_title = safeInit(title); ON_MAIN_THREAD( - [ctx SetTitle:title]; + [ctx SetTitle:_title]; ); } @@ -176,24 +177,55 @@ void Show(void *inctx) { ); } -void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton) { +NSString* safeInit(const char* input) { + NSString *result = nil; + if (input != nil) { + result = [NSString stringWithUTF8String:input]; + } + return result; +} + +void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton, void* iconData, int iconDataLength) { WailsContext *ctx = (__bridge WailsContext*) inctx; + + NSString *_dialogType = safeInit(dialogType); + NSString *_title = safeInit(title); + NSString *_message = safeInit(message); + NSString *_button1 = safeInit(button1); + NSString *_button2 = safeInit(button2); + NSString *_button3 = safeInit(button3); + NSString *_button4 = safeInit(button4); + NSString *_defaultButton = safeInit(defaultButton); + NSString *_cancelButton = safeInit(cancelButton); + ON_MAIN_THREAD( - [ctx MessageDialog:dialogType :title :message :button1 :button2 :button3 :button4 :defaultButton :cancelButton]; + [ctx MessageDialog:_dialogType :_title :_message :_button1 :_button2 :_button3 :_button4 :_defaultButton :_cancelButton :iconData :iconDataLength]; ) } void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters) { + WailsContext *ctx = (__bridge WailsContext*) inctx; + NSString *_title = safeInit(title); + NSString *_defaultFilename = safeInit(defaultFilename); + NSString *_defaultDirectory = safeInit(defaultDirectory); + NSString *_filters = safeInit(filters); + ON_MAIN_THREAD( - [ctx OpenFileDialog:title :defaultFilename :defaultDirectory :allowDirectories :allowFiles :canCreateDirectories :treatPackagesAsDirectories :resolveAliases :showHiddenFiles :allowMultipleSelection :filters]; + [ctx OpenFileDialog:_title :_defaultFilename :_defaultDirectory :allowDirectories :allowFiles :canCreateDirectories :treatPackagesAsDirectories :resolveAliases :showHiddenFiles :allowMultipleSelection :_filters]; ) } void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters) { + WailsContext *ctx = (__bridge WailsContext*) inctx; + NSString *_title = safeInit(title); + NSString *_defaultFilename = safeInit(defaultFilename); + NSString *_defaultDirectory = safeInit(defaultDirectory); + NSString *_filters = safeInit(filters); + ON_MAIN_THREAD( - [ctx SaveFileDialog:title :defaultFilename :defaultDirectory :canCreateDirectories :treatPackagesAsDirectories :showHiddenFiles :filters]; + [ctx SaveFileDialog:_title :_defaultFilename :_defaultDirectory :canCreateDirectories :treatPackagesAsDirectories :showHiddenFiles :_filters]; ) } @@ -226,13 +258,19 @@ void SetAsApplicationMenu(void *inctx, void *inMenu) { void SetAbout(void *inctx, const char* title, const char* description, void* imagedata, int datalen) { WailsContext *ctx = (__bridge WailsContext*) inctx; - [ctx SetAbout :title :description :imagedata :datalen]; + NSString *_title = safeInit(title); + NSString *_description = safeInit(description); + + [ctx SetAbout :_title :_description :imagedata :datalen]; } void* AppendMenuItem(void* inctx, void* inMenu, const char* label, const char* shortcutKey, int modifiers, int disabled, int checked, int menuItemID) { WailsContext *ctx = (__bridge WailsContext*) inctx; WailsMenu *menu = (__bridge WailsMenu*) inMenu; - return [menu AppendMenuItem:ctx :label :shortcutKey :modifiers :disabled :checked :menuItemID]; + NSString *_label = safeInit(label); + NSString *_shortcutKey = safeInit(shortcutKey); + + return [menu AppendMenuItem:ctx :_label :_shortcutKey :modifiers :disabled :checked :menuItemID]; } void UpdateMenuItem(void* nsmenuitem, int checked) { diff --git a/v2/internal/frontend/desktop/darwin/WailsAlert.h b/v2/internal/frontend/desktop/darwin/WailsAlert.h index 69e8ee17..29dc839f 100644 --- a/v2/internal/frontend/desktop/darwin/WailsAlert.h +++ b/v2/internal/frontend/desktop/darwin/WailsAlert.h @@ -11,7 +11,7 @@ #import @interface WailsAlert : NSAlert -- (void)addButton:(const char*)text :(const char*)defaultButton :(const char*)cancelButton; +- (void)addButton:(NSString*)text :(NSString*)defaultButton :(NSString*)cancelButton; @end diff --git a/v2/internal/frontend/desktop/darwin/WailsAlert.m b/v2/internal/frontend/desktop/darwin/WailsAlert.m index 04105634..ab8420f5 100644 --- a/v2/internal/frontend/desktop/darwin/WailsAlert.m +++ b/v2/internal/frontend/desktop/darwin/WailsAlert.m @@ -11,14 +11,14 @@ @implementation WailsAlert -- (void)addButton:(const char*)text :(const char*)defaultButton :(const char*)cancelButton { +- (void)addButton:(NSString*)text :(NSString*)defaultButton :(NSString*)cancelButton { if( text == nil ) { return; } - NSButton *button = [self addButtonWithTitle:[NSString stringWithUTF8String:text]]; - if( defaultButton != nil && strcmp(text, defaultButton) == 0) { + NSButton *button = [self addButtonWithTitle:text]; + if( defaultButton != nil && [text isEqualToString:defaultButton]) { [button setKeyEquivalent:@"\r"]; - } else if( cancelButton != nil && strcmp(text, cancelButton) == 0) { + } else if( cancelButton != nil && [text isEqualToString:cancelButton]) { [button setKeyEquivalent:@"\033"]; } else { [button setKeyEquivalent:@""]; diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.h b/v2/internal/frontend/desktop/darwin/WailsContext.h index e26d9d08..0c5232f7 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.h +++ b/v2/internal/frontend/desktop/darwin/WailsContext.h @@ -44,17 +44,15 @@ @property (retain) NSMenu* applicationMenu; @property (retain) NSImage* aboutImage; -@property const char* aboutTitle; -@property const char* aboutDescription; -@property (retain) NSString* appName; -@property (retain) NSString* title; +@property (retain) NSString* aboutTitle; +@property (retain) NSString* aboutDescription; -- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(const char *)appearance :(bool)windowIsTranslucent; +- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(NSString *)appearance :(bool)windowIsTranslucent; - (void) SetSize:(int)width :(int)height; - (void) SetPosition:(int)x :(int) y; - (void) SetMinSize:(int)minWidth :(int)minHeight; - (void) SetMaxSize:(int)maxWidth :(int)maxHeight; -- (void) SetTitle:(const char*)title; +- (void) SetTitle:(NSString*)title; - (void) Center; - (void) Fullscreen; - (void) UnFullscreen; @@ -69,16 +67,16 @@ - (void) Show; - (void) Quit; -- (void) MessageDialog :(const char*)dialogType :(const char*)title :(const char*)message :(const char*)button1 :(const char*)button2 :(const char*)button3 :(const char*)button4 :(const char*)defaultButton :(const char*)cancelButton; -- (void) OpenFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(const char*)filters; -- (void) SaveFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(const char*)filters; +-(void) MessageDialog :(NSString*)dialogType :(NSString*)title :(NSString*)message :(NSString*)button1 :(NSString*)button2 :(NSString*)button3 :(NSString*)button4 :(NSString*)defaultButton :(NSString*)cancelButton :(void*)iconData :(int)iconDataLength; +- (void) OpenFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(NSString*)filters; +- (void) SaveFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(NSString*)filters; - (void) loadRequest:(NSString*)url; - (void) processURLResponse:(NSString *)url :(NSString *)contentType :(NSData*)data; - (void) ExecJS:(NSString*)script; - (NSScreen*) getCurrentScreen; -- (void) SetAbout :(const char*)title :(const char*)description :(void*)imagedata :(int)datalen; +- (void) SetAbout :(NSString*)title :(NSString*)description :(void*)imagedata :(int)datalen; @end diff --git a/v2/internal/frontend/desktop/darwin/WailsContext.m b/v2/internal/frontend/desktop/darwin/WailsContext.m index 7d117b64..ae755f9f 100644 --- a/v2/internal/frontend/desktop/darwin/WailsContext.m +++ b/v2/internal/frontend/desktop/darwin/WailsContext.m @@ -115,9 +115,8 @@ return screen; } -- (void) SetTitle:(const char *)title { - self.title = [NSString stringWithUTF8String:title]; - ON_MAIN_THREAD([self.mainWindow setTitle:self.title];) +- (void) SetTitle:(NSString*)title { + ON_MAIN_THREAD([self.mainWindow setTitle:title];) } - (void) Center { @@ -132,7 +131,7 @@ return NO; } -- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(const char *)appearance :(bool)windowIsTranslucent { +- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(NSString*)appearance :(bool)windowIsTranslucent { self.urlRequests = [NSMutableDictionary new]; @@ -184,8 +183,7 @@ } if (appearance != nil) { - NSString *name = [NSString stringWithUTF8String:appearance]; - NSAppearance *nsAppearance = [NSAppearance appearanceNamed:name]; + NSAppearance *nsAppearance = [NSAppearance appearanceNamed:appearance]; [self.mainWindow setAppearance:nsAppearance]; } @@ -415,25 +413,25 @@ /***** Dialogs ******/ --(void) MessageDialog :(const char*)dialogType :(const char*)title :(const char*)message :(const char*)button1 :(const char*)button2 :(const char*)button3 :(const char*)button4 :(const char*)defaultButton :(const char*)cancelButton { +-(void) MessageDialog :(NSString*)dialogType :(NSString*)title :(NSString*)message :(NSString*)button1 :(NSString*)button2 :(NSString*)button3 :(NSString*)button4 :(NSString*)defaultButton :(NSString*)cancelButton :(void*)iconData :(int)iconDataLength { WailsAlert *alert = [WailsAlert new]; int style = NSAlertStyleInformational; if (dialogType != nil ) { - if( strcmp(dialogType, "warning") == 0 ) { + if( [dialogType isEqualToString:@"warning"] ) { style = NSAlertStyleWarning; } - if( strcmp(dialogType, "error") == 0) { + if( [dialogType isEqualToString:@"error"] ) { style = NSAlertStyleCritical; } } [alert setAlertStyle:style]; - if( strlen(title) > 0 ) { - [alert setMessageText:[NSString stringWithUTF8String:title]]; + if( title != nil ) { + [alert setMessageText:title]; } - if( strlen(message) > 0 ) { - [alert setInformativeText:[NSString stringWithUTF8String:message]]; + if( message != nil ) { + [alert setInformativeText:message]; } [alert addButton:button1 :defaultButton :cancelButton]; @@ -441,7 +439,15 @@ [alert addButton:button3 :defaultButton :cancelButton]; [alert addButton:button4 :defaultButton :cancelButton]; + NSImage *icon = nil; + if (iconData != nil) { + NSData *imageData = [NSData dataWithBytes:iconData length:iconDataLength]; + icon = [[NSImage alloc] initWithData:imageData]; + } ON_MAIN_THREAD( + if( icon != nil) { + [alert setIcon:icon]; + } [alert.window setLevel:NSFloatingWindowLevel]; long response = [alert runModal]; @@ -462,30 +468,30 @@ ) } --(void) OpenFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(const char*)filters { +-(void) OpenFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(NSString*)filters { // Create the dialog NSOpenPanel *dialog = [NSOpenPanel openPanel]; // Valid but appears to do nothing.... :/ - if( strlen(title) > 0 ) { - [dialog setTitle:[NSString stringWithUTF8String:title]]; + if( title != nil ) { + [dialog setTitle:title]; } // Filters - semicolon delimited list of file extensions if( allowFiles ) { - if( filters != nil && strlen(filters) > 0) { - NSString *filterString = [[NSString stringWithUTF8String:filters] stringByReplacingOccurrencesOfString:@"*." withString:@""]; - filterString = [filterString stringByReplacingOccurrencesOfString:@" " withString:@""]; - NSArray *filterList = [filterString componentsSeparatedByString:@";"]; + if( filters != nil ) { + filters = [filters stringByReplacingOccurrencesOfString:@"*." withString:@""]; + filters = [filters stringByReplacingOccurrencesOfString:@" " withString:@""]; + NSArray *filterList = [filters componentsSeparatedByString:@";"]; [dialog setAllowedFileTypes:filterList]; } else { [dialog setAllowsOtherFileTypes:true]; } // Default Filename - if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) { - [dialog setNameFieldStringValue:[NSString stringWithUTF8String:defaultFilename]]; + if( defaultFilename != nil ) { + [dialog setNameFieldStringValue:defaultFilename]; } [dialog setAllowsMultipleSelection: allowMultipleSelection]; @@ -494,8 +500,8 @@ } // Default Directory - if( defaultDirectory != NULL && strlen(defaultDirectory) > 0 ) { - NSURL *url = [NSURL fileURLWithPath:[NSString stringWithUTF8String:defaultDirectory]]; + if( defaultDirectory != nil ) { + NSURL *url = [NSURL fileURLWithPath:defaultDirectory]; [dialog setDirectoryURL:url]; } @@ -523,34 +529,34 @@ } --(void) SaveFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(const char*)filters; { +-(void) SaveFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(NSString*)filters; { // Create the dialog NSSavePanel *dialog = [NSOpenPanel savePanel]; // Valid but appears to do nothing.... :/ - if( strlen(title) > 0 ) { - [dialog setTitle:[NSString stringWithUTF8String:title]]; + if( title != nil ) { + [dialog setTitle:title]; } // Filters - semicolon delimited list of file extensions - if( filters != nil && strlen(filters) > 0) { - NSString *filterString = [[NSString stringWithUTF8String:filters] stringByReplacingOccurrencesOfString:@"*." withString:@""]; - filterString = [filterString stringByReplacingOccurrencesOfString:@" " withString:@""]; - NSArray *filterList = [filterString componentsSeparatedByString:@";"]; + if( filters != nil ) { + filters = [filters stringByReplacingOccurrencesOfString:@"*." withString:@""]; + filters = [filters stringByReplacingOccurrencesOfString:@" " withString:@""]; + NSArray *filterList = [filters componentsSeparatedByString:@";"]; [dialog setAllowedFileTypes:filterList]; } else { [dialog setAllowsOtherFileTypes:true]; } // Default Filename - if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) { - [dialog setNameFieldStringValue:[NSString stringWithUTF8String:defaultFilename]]; + if( defaultFilename != nil ) { + [dialog setNameFieldStringValue:defaultFilename]; } // Default Directory - if( defaultDirectory != NULL && strlen(defaultDirectory) > 0 ) { - NSURL *url = [NSURL fileURLWithPath:[NSString stringWithUTF8String:defaultDirectory]]; + if( defaultDirectory != nil ) { + NSURL *url = [NSURL fileURLWithPath:defaultDirectory]; [dialog setDirectoryURL:url]; } @@ -569,7 +575,7 @@ } -- (void) SetAbout :(const char*)title :(const char*)description :(void*)imagedata :(int)datalen { +- (void) SetAbout :(NSString*)title :(NSString*)description :(void*)imagedata :(int)datalen { self.aboutTitle = title; self.aboutDescription = description; @@ -582,10 +588,10 @@ WailsAlert *alert = [WailsAlert new]; [alert setAlertStyle:NSAlertStyleInformational]; if( self.aboutTitle != nil ) { - [alert setMessageText:[NSString stringWithUTF8String:self.aboutTitle]]; + [alert setMessageText:self.aboutTitle]; } if( self.aboutDescription != nil ) { - [alert setInformativeText:[NSString stringWithUTF8String:self.aboutDescription]]; + [alert setInformativeText:self.aboutDescription]; } diff --git a/v2/internal/frontend/desktop/darwin/WailsMenu.h b/v2/internal/frontend/desktop/darwin/WailsMenu.h index c6dd405d..8ef12035 100644 --- a/v2/internal/frontend/desktop/darwin/WailsMenu.h +++ b/v2/internal/frontend/desktop/darwin/WailsMenu.h @@ -21,7 +21,7 @@ - (void) appendRole :(WailsContext*)ctx :(Role)role; - (NSMenuItem*) newMenuItemWithContext :(WailsContext*)ctx :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags; -- (void*) AppendMenuItem :(WailsContext*)ctx :(const char*)label :(const char *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID; +- (void*) AppendMenuItem :(WailsContext*)ctx :(NSString*)label :(NSString *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID; - (void) AppendSeparator; @end diff --git a/v2/internal/frontend/desktop/darwin/WailsMenu.m b/v2/internal/frontend/desktop/darwin/WailsMenu.m index 6090441b..0e2162dd 100644 --- a/v2/internal/frontend/desktop/darwin/WailsMenu.m +++ b/v2/internal/frontend/desktop/darwin/WailsMenu.m @@ -61,13 +61,12 @@ case AppMenu: { NSString *appName = [[NSProcessInfo processInfo] processName]; - NSString *cap = [appName capitalizedString]; - WailsMenu *appMenu = [[WailsMenu new] initWithNSTitle:cap]; - id quitTitle = [@"Quit " stringByAppendingString:cap]; + WailsMenu *appMenu = [[WailsMenu new] initWithNSTitle:appName]; + id quitTitle = [@"Quit " stringByAppendingString:appName]; NSMenuItem* quitMenuItem = [self newMenuItem:quitTitle :@selector(Quit) :@"q" :NSEventModifierFlagCommand]; quitMenuItem.target = ctx; if (ctx.aboutTitle != nil) { - [appMenu addItem:[self newMenuItemWithContext :ctx :[@"About " stringByAppendingString:cap] :@selector(About) :nil :0]]; + [appMenu addItem:[self newMenuItemWithContext :ctx :[@"About " stringByAppendingString:appName] :@selector(About) :nil :0]]; } [appMenu addItem:quitMenuItem]; [self appendSubmenu:appMenu]; @@ -83,7 +82,7 @@ [editMenu addItem:[self newMenuItem:@"Copy" :@selector(copy:) :@"c" :NSEventModifierFlagCommand]]; [editMenu addItem:[self newMenuItem:@"Paste" :@selector(paste:) :@"v" :NSEventModifierFlagCommand]]; [editMenu addItem:[self newMenuItem:@"Paste and Match Style" :@selector(pasteAsRichText:) :@"v" :(NSEventModifierFlagOption | NSEventModifierFlagShift | NSEventModifierFlagCommand)]]; - [editMenu addItem:[self newMenuItem:@"Delete" :@selector(delete:) :[self accel:"backspace"] :0]]; + [editMenu addItem:[self newMenuItem:@"Delete" :@selector(delete:) :[self accel:@"backspace"] :0]]; [editMenu addItem:[self newMenuItem:@"Select All" :@selector(selectAll:) :@"a" :NSEventModifierFlagCommand]]; [editMenu addItem:[NSMenuItem separatorItem]]; // NSMenuItem *speechMenuItem = [[NSMenuItem new] autorelease]; @@ -100,10 +99,11 @@ } } -- (void*) AppendMenuItem :(WailsContext*)ctx :(const char*)label :(const char *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID { +- (void*) AppendMenuItem :(WailsContext*)ctx :(NSString*)label :(NSString *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID { + NSString *nslabel = @""; if (label != nil ) { - nslabel = [NSString stringWithUTF8String:label]; + nslabel = label; } WailsMenuItem *menuItem = [WailsMenuItem new]; @@ -136,177 +136,177 @@ } -- (NSString*) accel :(const char *)key { +- (NSString*) accel :(NSString*)key { // Guard against no accelerator key if( key == NULL ) { - return [NSString stringWithUTF8String:""]; + return @""; } - if( STREQ(key, "backspace") ) { + if( [key isEqualToString:@"backspace"] ) { return unicode(0x0008); } - if( STREQ(key, "tab") ) { + if( [key isEqualToString:@"tab"] ) { return unicode(0x0009); } - if( STREQ(key, "return") ) { + if( [key isEqualToString:@"return"] ) { return unicode(0x000d); } - if( STREQ(key, "enter") ) { + if( [key isEqualToString:@"enter"] ) { return unicode(0x000d); } - if( STREQ(key, "escape") ) { + if( [key isEqualToString:@"escape"] ) { return unicode(0x001b); } - if( STREQ(key, "left") ) { + if( [key isEqualToString:@"left"] ) { return unicode(0x001c); } - if( STREQ(key, "right") ) { + if( [key isEqualToString:@"right"] ) { return unicode(0x001d); } - if( STREQ(key, "up") ) { + if( [key isEqualToString:@"up"] ) { return unicode(0x001e); } - if( STREQ(key, "down") ) { + if( [key isEqualToString:@"down"] ) { return unicode(0x001f); } - if( STREQ(key, "space") ) { + if( [key isEqualToString:@"space"] ) { return unicode(0x0020); } - if( STREQ(key, "delete") ) { + if( [key isEqualToString:@"delete"] ) { return unicode(0x007f); } - if( STREQ(key, "home") ) { + if( [key isEqualToString:@"home"] ) { return unicode(0x2196); } - if( STREQ(key, "end") ) { + if( [key isEqualToString:@"end"] ) { return unicode(0x2198); } - if( STREQ(key, "page up") ) { + if( [key isEqualToString:@"page up"] ) { return unicode(0x21de); } - if( STREQ(key, "page down") ) { + if( [key isEqualToString:@"page down"] ) { return unicode(0x21df); } - if( STREQ(key, "f1") ) { + if( [key isEqualToString:@"f1"] ) { return unicode(0xf704); } - if( STREQ(key, "f2") ) { + if( [key isEqualToString:@"f2"] ) { return unicode(0xf705); } - if( STREQ(key, "f3") ) { + if( [key isEqualToString:@"f3"] ) { return unicode(0xf706); } - if( STREQ(key, "f4") ) { + if( [key isEqualToString:@"f4"] ) { return unicode(0xf707); } - if( STREQ(key, "f5") ) { + if( [key isEqualToString:@"f5"] ) { return unicode(0xf708); } - if( STREQ(key, "f6") ) { + if( [key isEqualToString:@"f6"] ) { return unicode(0xf709); } - if( STREQ(key, "f7") ) { + if( [key isEqualToString:@"f7"] ) { return unicode(0xf70a); } - if( STREQ(key, "f8") ) { + if( [key isEqualToString:@"f8"] ) { return unicode(0xf70b); } - if( STREQ(key, "f9") ) { + if( [key isEqualToString:@"f9"] ) { return unicode(0xf70c); } - if( STREQ(key, "f10") ) { + if( [key isEqualToString:@"f10"] ) { return unicode(0xf70d); } - if( STREQ(key, "f11") ) { + if( [key isEqualToString:@"f11"] ) { return unicode(0xf70e); } - if( STREQ(key, "f12") ) { + if( [key isEqualToString:@"f12"] ) { return unicode(0xf70f); } - if( STREQ(key, "f13") ) { + if( [key isEqualToString:@"f13"] ) { return unicode(0xf710); } - if( STREQ(key, "f14") ) { + if( [key isEqualToString:@"f14"] ) { return unicode(0xf711); } - if( STREQ(key, "f15") ) { + if( [key isEqualToString:@"f15"] ) { return unicode(0xf712); } - if( STREQ(key, "f16") ) { + if( [key isEqualToString:@"f16"] ) { return unicode(0xf713); } - if( STREQ(key, "f17") ) { + if( [key isEqualToString:@"f17"] ) { return unicode(0xf714); } - if( STREQ(key, "f18") ) { + if( [key isEqualToString:@"f18"] ) { return unicode(0xf715); } - if( STREQ(key, "f19") ) { + if( [key isEqualToString:@"f19"] ) { return unicode(0xf716); } - if( STREQ(key, "f20") ) { + if( [key isEqualToString:@"f20"] ) { return unicode(0xf717); } - if( STREQ(key, "f21") ) { + if( [key isEqualToString:@"f21"] ) { return unicode(0xf718); } - if( STREQ(key, "f22") ) { + if( [key isEqualToString:@"f22"] ) { return unicode(0xf719); } - if( STREQ(key, "f23") ) { + if( [key isEqualToString:@"f23"] ) { return unicode(0xf71a); } - if( STREQ(key, "f24") ) { + if( [key isEqualToString:@"f24"] ) { return unicode(0xf71b); } - if( STREQ(key, "f25") ) { + if( [key isEqualToString:@"f25"] ) { return unicode(0xf71c); } - if( STREQ(key, "f26") ) { + if( [key isEqualToString:@"f26"] ) { return unicode(0xf71d); } - if( STREQ(key, "f27") ) { + if( [key isEqualToString:@"f27"] ) { return unicode(0xf71e); } - if( STREQ(key, "f28") ) { + if( [key isEqualToString:@"f28"] ) { return unicode(0xf71f); } - if( STREQ(key, "f29") ) { + if( [key isEqualToString:@"f29"] ) { return unicode(0xf720); } - if( STREQ(key, "f30") ) { + if( [key isEqualToString:@"f30"] ) { return unicode(0xf721); } - if( STREQ(key, "f31") ) { + if( [key isEqualToString:@"f31"] ) { return unicode(0xf722); } - if( STREQ(key, "f32") ) { + if( [key isEqualToString:@"f32"] ) { return unicode(0xf723); } - if( STREQ(key, "f33") ) { + if( [key isEqualToString:@"f33"] ) { return unicode(0xf724); } - if( STREQ(key, "f34") ) { + if( [key isEqualToString:@"f34"] ) { return unicode(0xf725); } - if( STREQ(key, "f35") ) { + if( [key isEqualToString:@"f35"] ) { return unicode(0xf726); } -// if( STREQ(key, "Insert") ) { +// if( [key isEqualToString:@"Insert"] ) { // return unicode(0xf727); // } -// if( STREQ(key, "PrintScreen") ) { +// if( [key isEqualToString:@"PrintScreen"] ) { // return unicode(0xf72e); // } -// if( STREQ(key, "ScrollLock") ) { +// if( [key isEqualToString:@"ScrollLock"] ) { // return unicode(0xf72f); // } - if( STREQ(key, "numLock") ) { + if( [key isEqualToString:@"numLock"] ) { return unicode(0xf739); } - return [NSString stringWithUTF8String:key]; + return key; } diff --git a/v2/internal/frontend/desktop/darwin/dialog.go b/v2/internal/frontend/desktop/darwin/dialog.go index 9e359f24..4037c6f2 100644 --- a/v2/internal/frontend/desktop/darwin/dialog.go +++ b/v2/internal/frontend/desktop/darwin/dialog.go @@ -16,6 +16,7 @@ import ( "fmt" "strings" "sync" + "unsafe" "github.com/leaanthony/slicer" "github.com/wailsapp/wails/v2/internal/frontend" @@ -155,7 +156,14 @@ func (f *Frontend) MessageDialog(options frontend.MessageDialogOptions) (string, buttons[index] = c.String(buttonText) } - C.MessageDialog(f.mainWindow.context, dialogType, title, message, buttons[0], buttons[1], buttons[2], buttons[3], defaultButton, cancelButton) + var iconData unsafe.Pointer + var iconDataLength C.int + if options.Icon != nil { + iconData = unsafe.Pointer(&options.Icon[0]) + iconDataLength = C.int(len(options.Icon)) + } + + C.MessageDialog(f.mainWindow.context, dialogType, title, message, buttons[0], buttons[1], buttons[2], buttons[3], defaultButton, cancelButton, iconData, iconDataLength) var result = <-messageDialogResponse diff --git a/v2/internal/frontend/desktop/darwin/frontend.go b/v2/internal/frontend/desktop/darwin/frontend.go index 7e5c2ff8..2e989066 100644 --- a/v2/internal/frontend/desktop/darwin/frontend.go +++ b/v2/internal/frontend/desktop/darwin/frontend.go @@ -274,8 +274,10 @@ func (f *Frontend) processRequest(r *request) { //TODO: Handle errors return } - data := C.CString(string(_contents)) - defer C.free(unsafe.Pointer(data)) + var data unsafe.Pointer + if _contents != nil { + data = unsafe.Pointer(&_contents[0]) + } mimetype := C.CString(_mimetype) defer C.free(unsafe.Pointer(mimetype)) diff --git a/v2/internal/frontend/frontend.go b/v2/internal/frontend/frontend.go index 2a486286..72d2ec26 100644 --- a/v2/internal/frontend/frontend.go +++ b/v2/internal/frontend/frontend.go @@ -55,7 +55,7 @@ type MessageDialogOptions struct { Buttons []string DefaultButton string CancelButton string - Icon string + Icon []byte } type Frontend interface {