diff --git a/v2/internal/ffenestri/ffenestri_darwin.c b/v2/internal/ffenestri/ffenestri_darwin.c index 89b8daf0..dd5890e6 100644 --- a/v2/internal/ffenestri/ffenestri_darwin.c +++ b/v2/internal/ffenestri/ffenestri_darwin.c @@ -1789,7 +1789,7 @@ void Run(struct Application *app, int argc, char **argv) { // Disable damn smart quotes // Credit: https://stackoverflow.com/a/31640511 id userDefaults = msg_reg(c("NSUserDefaults"), s("standardUserDefaults")); - ((id(*)(id, SEL, id, id))objc_msgSend)(userDefaults, s("setBool:forKey:"), NO, str("NSAutomaticQuoteSubstitutionEnabled")); + ((id(*)(id, SEL, BOOL, id))objc_msgSend)(userDefaults, s("setBool:forKey:"), false, str("NSAutomaticQuoteSubstitutionEnabled")); // Setup drag message handler msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("windowDrag")); @@ -1939,6 +1939,24 @@ void Quit(struct Application *app) { Hide(app); } +id createImageFromBase64Data(const char *data, bool isTemplateImage) { + id nsdata = ALLOC("NSData"); + id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(nsdata, s("initWithBase64EncodedString:options:"), str(data), 0); + + // If it's not valid base64 data, use the broken image + if ( imageData == NULL ) { + imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(nsdata, s("initWithBase64EncodedString:options:"), str(BrokenImage), 0); + } + id result = ALLOC("NSImage"); + msg_id(result, s("initWithData:"), imageData); + + if( isTemplateImage ) { + msg_bool(result, s("setTemplate:"), YES); + } + + return result; +} + void* NewApplication(const char *title, int width, int height, int resizable, int devtools, int fullscreen, int startHidden, int logLevel, int hideWindowOnClose) { // Load the tray icons diff --git a/v2/internal/ffenestri/ffenestri_darwin.h b/v2/internal/ffenestri/ffenestri_darwin.h index b7633b7a..111de5ff 100644 --- a/v2/internal/ffenestri/ffenestri_darwin.h +++ b/v2/internal/ffenestri/ffenestri_darwin.h @@ -117,6 +117,8 @@ #define NSAlertSecondButtonReturn 1001 #define NSAlertThirdButtonReturn 1002 +#define BrokenImage "iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAMAAABl5a5YAAABj1BMVEWopan///+koqSWk5P9/v3///////////+AgACMiovz8/PB0fG9z+3i4+WysbGBfX1Erh80rACLiYqBxolEsDhHlDEbqQDDx+CNho7W1tj4+/bw+O3P5Mn4/f/W1tbK6sX////b2dn////////////8/Pz6+vro6Ojj4+P////G1PL////EzNydmp2cmZnd3eDF1PHs8v/o8P/Q3vrS3vfE0vCdmpqZkpr19/3N2vXI1vPH1fOgnqDg6frP3PbCytvHx8irqq6HhIZtuGtjnlZetU1Xs0NWskBNsi7w9v/d6P7w9P3S4Pzr8Pvl7PrY5PrU4PjQ3fjD1Ozo6Om30NjGzNi7ubm34K+UxKmbnaWXlJeUjpSPi4tppF1TtjxSsTf2+f7L2PTr7e3H2+3V7+q+0uXg4OPg4eLR1uG7z+Hg4ODGzODV2N7V1trP5dmxzs65vcfFxMWq0cKxxr+/vr+0s7apxbWaxrCv2qao05+dlp2Uuo2Dn4F8vIB6xnyAoHmAym9zqGpctENLryNFsgoblJpnAAAAKnRSTlP+hP7+5ZRmYgL+/f39/f39/f38/Pz8/Pv69+7j083My8GocnBPTTMWEgjxeITOAAABEklEQVQY0y3KZXuCYBiG4ceYuu7u3nyVAaKOMBBQ7O5Yd3f3fvheDnd9u8/jBkGwNxP6sjOWVQvY/ftrzfT6bd3yEhCnYZqiaYoKiwX/gXkFiHySTcUTLJMsZ9v8nQvgssWYOEKedKpcOO6CUXD5IlGEY5hLUbyDAAZ6HRf1bnkoavOsFQibg+Q4nuNYL+ON5PHD5nBaraRVyxnzGf6BJzUi2QQCQgMyk8tleL7dg1owpJ17D5IkvV100EingeOopPyo6vfAuXF+9hbDTknZCIaUoeK4efKwG4iT6xDewd7imGlid7gGwv37b6Oh9jwaTdOf/Tc1qH7UZVmuP6G5qZfBr9cAGNy4KiDd4tXIs7tS+QO9aUKvPAIKuQAAAABJRU5ErkJggg==" + struct Application; int releaseNSObject(void *const context, struct hashmap_element_s *const e); void TitlebarAppearsTransparent(struct Application* app); @@ -139,4 +141,6 @@ void* lookupStringConstant(id constantName); void HasURLHandlers(struct Application* app); +id createImageFromBase64Data(const char *data, bool isTemplateImage); + #endif \ No newline at end of file diff --git a/v2/internal/ffenestri/menu_darwin.c b/v2/internal/ffenestri/menu_darwin.c index c566fe0a..f7f90d46 100644 --- a/v2/internal/ffenestri/menu_darwin.c +++ b/v2/internal/ffenestri/menu_darwin.c @@ -651,13 +651,7 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char // Process image if( image != NULL && strlen(image) > 0) { - id data = ALLOC("NSData"); - id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(data, s("initWithBase64EncodedString:options:"), str(image), 0); - id nsimage = ALLOC("NSImage"); - msg_id(nsimage, s("initWithData:"), imageData); - if( templateImage ) { - msg_bool(nsimage, s("setTemplate:"), YES); - } + id nsimage = createImageFromBase64Data(image, templateImage); msg_id(item, s("setImage:"), nsimage); } diff --git a/v2/internal/ffenestri/traymenu_darwin.c b/v2/internal/ffenestri/traymenu_darwin.c index af21d975..d22aa0a5 100644 --- a/v2/internal/ffenestri/traymenu_darwin.c +++ b/v2/internal/ffenestri/traymenu_darwin.c @@ -102,14 +102,7 @@ void UpdateTrayIcon(TrayMenu *trayMenu) { // If we don't have the image in the icon cache then assume it's base64 encoded image data if (trayImage == NULL) { - id data = ALLOC("NSData"); - id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(data, s("initWithBase64EncodedString:options:"), str(trayMenu->icon), 0); - trayImage = ALLOC("NSImage"); - msg_id(trayImage, s("initWithData:"), imageData); - - if( trayMenu->templateImage ) { - msg_bool(trayImage, s("setTemplate:"), YES); - } + trayImage = createImageFromBase64Data(trayMenu->icon, trayMenu->templateImage); } msg_int(statusBarButton, s("setImagePosition:"), trayMenu->trayIconPosition);