From 2990717d6e2548837d0a81916c85299105b27b0c Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Sat, 11 Jan 2020 14:51:30 +0100 Subject: Implement Fl_Window::icon() and default_icon() for macOS The implementation is effective for macOS 10.10 and above. Demo program test/device uses the new implementation. --- src/Fl_cocoa.mm | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/Fl_cocoa.mm') diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index cb634a43c..3771b4312 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -582,6 +582,7 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop() #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14 if (views_use_CA) [(FLView*)[self contentView] reset_aux_bitmap]; #endif + [[self standardWindowButton:NSWindowDocumentIconButton] setImage:nil]; [super close]; // when a fullscreen window is closed, windowDidResize may be sent after the close message was sent // and before the FLWindow receives the final dealloc message @@ -1133,6 +1134,7 @@ static FLTextView *fltextview_instance = nil; - (BOOL)windowShouldClose:(id)fl; - (void)anyWindowWillClose:(NSNotification *)notif; - (void)doNothing:(id)unused; +- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu; @end @@ -1390,6 +1392,9 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; { return; } +- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu { + return NO; +} @end @interface FLAppDelegate : NSObject @@ -3075,6 +3080,16 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow() [cw setLevel:winlevel]; q_set_window_title(cw, w->label(), w->iconlabel()); + NSImage *icon = icon_image; // is a window or default icon present? + if (!icon) icon = ((Fl_Cocoa_Screen_Driver*)Fl::screen_driver())->default_icon; + if (icon && (winstyle & NSTitledWindowMask) && w->label() && strlen(w->label())>0) { + [cw setRepresentedFilename:[NSString stringWithFormat:@"/%@", [cw title]]]; + NSButton *icon_button = [cw standardWindowButton:NSWindowDocumentIconButton]; + if (icon_button) { + [icon setSize:[icon_button frame].size]; + [icon_button setImage:icon]; + } + } if (!force_position()) { if (w->modal()) { [cw center]; @@ -4435,6 +4450,52 @@ char *Fl_Darwin_System_Driver::preference_rootnode(Fl_Preferences *prefs, Fl_Pre return filename; } +Fl_Cocoa_Window_Driver::~Fl_Cocoa_Window_Driver() +{ + if (shape_data_) { + if (shape_data_->mask) { + CGImageRelease(shape_data_->mask); + } + delete shape_data_; + } + [icon_image release]; +} + +static NSImage* rgb_to_nsimage(const Fl_RGB_Image *rgb) { + if (!rgb) return nil; + int ld = rgb->ld(); + if (!ld) ld = rgb->w() * rgb->d(); + NSImage *win_icon = nil; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + if (fl_mac_os_version >= 101000) { + NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:rgb->w() pixelsHigh:rgb->h() + bitsPerSample:8 samplesPerPixel:rgb->d() hasAlpha:!(rgb->d() & 1) isPlanar:NO + colorSpaceName:(rgb->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace + bitmapFormat:NSAlphaNonpremultipliedBitmapFormat bytesPerRow:ld bitsPerPixel:rgb->d()*8]; // 10.4 + memcpy([bitmap bitmapData], rgb->array, rgb->h() * ld); + win_icon = [[NSImage alloc] initWithSize:NSMakeSize(0, 0)]; + [win_icon addRepresentation:bitmap]; + [bitmap release]; + } +#endif + return win_icon; +} + +void Fl_Cocoa_Window_Driver::icons(const Fl_RGB_Image *icons[], int count) { + [icon_image release]; + icon_image = nil; + if (count >= 1 && pWindow->border() && pWindow->label() && strlen(pWindow->label())) { + icon_image = rgb_to_nsimage(icons[0]); + } +} + +void Fl_Cocoa_Screen_Driver::default_icons(const Fl_RGB_Image *icons[], int count) { + [default_icon release]; + default_icon = nil; + if (count >= 1) { + default_icon = rgb_to_nsimage(icons[0]); + } +} // // End of "$Id$". -- cgit v1.2.3 From c90baf94929e0fc45448d0f8e7d311b4d9c861db Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Mon, 13 Jan 2020 18:01:29 +0100 Subject: Bring main window to front when it's not there. --- src/Fl_cocoa.mm | 1 + 1 file changed, 1 insertion(+) (limited to 'src/Fl_cocoa.mm') diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 3771b4312..5237276e7 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1306,6 +1306,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; FLWindow *nsw = (FLWindow*)[notif object]; Fl_Window *window = [nsw getFl_Window]; Fl::first_window(window); + if (!window->parent()) [nsw orderFront:nil]; update_e_xy_and_e_xy_root(nsw); if (fl_sys_menu_bar && Fl_MacOS_Sys_Menu_Bar_Driver::window_menu_style()) { // select the corresponding Window menu item -- cgit v1.2.3 From d598f9ea06f610053cd16b51cbe1aa477c8501ef Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Tue, 14 Jan 2020 16:30:51 +0100 Subject: Fix typo in comment --- src/Fl_cocoa.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Fl_cocoa.mm') diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 5237276e7..8b392cdba 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -4444,7 +4444,7 @@ char *Fl_Darwin_System_Driver::preference_rootnode(Fl_Preferences *prefs, Fl_Pre // Our C path names for preferences will be: // SYSTEM: "/Library/Preferences/$vendor/$application.prefs" - // SYSTEM: "/Users/$user/Preferences/$vendor/$application.prefs" + // USER: "/Users/$user/Library/Preferences/$vendor/$application.prefs" snprintf(filename + strlen(filename), FL_PATH_MAX - strlen(filename), "/%s/%s.prefs", vendor, application); -- cgit v1.2.3