[mac] Improve string/memory handling, dialog icon -> []byte

This commit is contained in:
Lea Anthony
2021-10-31 08:50:14 +11:00
parent 2dc126bf19
commit 7ef445f526
11 changed files with 192 additions and 137 deletions

View File

@@ -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 */

View File

@@ -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) {

View File

@@ -11,7 +11,7 @@
#import <Cocoa/Cocoa.h>
@interface WailsAlert : NSAlert
- (void)addButton:(const char*)text :(const char*)defaultButton :(const char*)cancelButton;
- (void)addButton:(NSString*)text :(NSString*)defaultButton :(NSString*)cancelButton;
@end

View File

@@ -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:@""];

View File

@@ -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

View File

@@ -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];
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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))

View File

@@ -55,7 +55,7 @@ type MessageDialogOptions struct {
Buttons []string
DefaultButton string
CancelButton string
Icon string
Icon []byte
}
type Frontend interface {