From 935074ba0b5acc99f0bf82e73be1f002eab07157 Mon Sep 17 00:00:00 2001
From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
Date: Wed, 2 Feb 2022 11:05:39 +0100
Subject: [PATCH] macOS: add "Toggle printing of titlebar" to application menu.
---
FL/mac.H | 12 ++++++---
src/Fl_MacOS_Sys_Menu_Bar.mm | 8 +++---
src/Fl_cocoa.mm | 48 +++++++++++++++++++++++++++++++++---
3 files changed, 57 insertions(+), 11 deletions(-)
diff --git a/FL/mac.H b/FL/mac.H
index 588afcfc7..48aea6842 100644
--- a/FL/mac.H
+++ b/FL/mac.H
@@ -140,10 +140,14 @@ public:
/** Localizable text for the "About xxx" application menu item */
static const char *about;
/** Localizable text for the "Print Front Window" application menu item.
- This menu item won't be displayed if Fl_Mac_App_Menu::print
+ This menu item and next one won't be displayed if Fl_Mac_App_Menu::print
is set to an empty string.
*/
- static const char *print;
+ static const char *print_with_titlebar;
+ /** Localizable text for the "Print Front Window" application menu item. */
+ static const char *print_no_titlebar;
+ /** Localizable text for the "Toggle print titlebar" application menu item. */
+ static const char *toggle_print_titlebar;
/** Localizable text for the "Services" application menu item */
static const char *services;
/** Localizable text for the "Hide xxx" application menu item */
@@ -155,8 +159,8 @@ public:
/** Localizable text for the "Quit xxx" application menu item */
static const char *quit;
/** Adds custom menu item(s) to the application menu of the system menu bar.
- They are positioned after the "Print Front Window" item, or at its place
- if it was removed with Fl_Mac_App_Menu::print = "".
+ They are positioned after the "Print Front Window / Toggle printing of titlebar" items, or at their place
+ if they were removed with Fl_Mac_App_Menu::print = "".
\param m zero-ending array of Fl_Menu_Item 's.
*/
static void custom_application_menu_items(const Fl_Menu_Item *m);
diff --git a/src/Fl_MacOS_Sys_Menu_Bar.mm b/src/Fl_MacOS_Sys_Menu_Bar.mm
index 3320d0fa4..ad24ec5ef 100644
--- a/src/Fl_MacOS_Sys_Menu_Bar.mm
+++ b/src/Fl_MacOS_Sys_Menu_Bar.mm
@@ -74,7 +74,9 @@ Fl_MacOS_Sys_Menu_Bar_Driver* Fl_MacOS_Sys_Menu_Bar_Driver::driver() {
// Apple App Menu
const char *Fl_Mac_App_Menu::about = "About %@";
-const char *Fl_Mac_App_Menu::print = "Print Front Window";
+const char *Fl_Mac_App_Menu::print_with_titlebar = "Print Front Window & Titlebar";
+const char *Fl_Mac_App_Menu::print_no_titlebar = "Print Front Window";
+const char *Fl_Mac_App_Menu::toggle_print_titlebar = "Toggle printing of titlebar";
const char *Fl_Mac_App_Menu::services = "Services";
const char *Fl_Mac_App_Menu::hide = "Hide %@";
const char *Fl_Mac_App_Menu::hide_others = "Hide Others";
@@ -504,8 +506,8 @@ void Fl_Mac_App_Menu::custom_application_menu_items(const Fl_Menu_Item *m)
NSInteger to_index;
if ([[menu itemAtIndex:2] action] != @selector(printPanel)) { // the 'Print' item was removed
[menu insertItem:[NSMenuItem separatorItem] atIndex:1];
- to_index = 2;
- } else to_index = 3; // after the "Print Front Window" item
+ to_index = 3;
+ } else to_index = 4; // after the "Print Front Window/Toggle" items
NSInteger count = [menu numberOfItems];
createSubMenu(menu, m, NULL, @selector(customCallback)); // add new items at end of application menu
NSInteger count2 = [menu numberOfItems];
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index d9f6e0f2a..4b1850727 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -3902,6 +3902,28 @@ int Fl_Cocoa_Window_Driver::set_cursor(const Fl_RGB_Image *image, int hotx, int
return 1;
}
+@interface PrintWithTitlebarItem : NSMenuItem {
+}
+- (void) toggleCallback;
+@end
+
+@implementation PrintWithTitlebarItem
+- (void) toggleCallback {
+ NSMenuItem *item = [self representedObject];
+ const char *title;
+ if ([self state] == NSOnState) {
+ [self setState:NSOffState];
+ title = Fl_Mac_App_Menu::print_no_titlebar;
+ } else {
+ [self setState:NSOnState];
+ title = Fl_Mac_App_Menu::print_with_titlebar;
+ }
+ [item setTitle:NSLocalizedString([NSString stringWithUTF8String:title], nil)];
+}
+@end
+
+static PrintWithTitlebarItem *print_with_titlebar_item = NULL;
+
@interface FLaboutItemTarget : NSObject
{
}
@@ -3942,8 +3964,13 @@ int Fl_Cocoa_Window_Driver::set_cursor(const Fl_RGB_Image *image, int hotx, int
// scale the printer device so that the window fits on the page
float scale = 1;
printer.printable_rect(&w, &h);
- ww = win->decorated_w();
- wh = win->decorated_h();
+ if ([print_with_titlebar_item state] == NSOnState) {
+ ww = win->decorated_w();
+ wh = win->decorated_h();
+ } else {
+ ww = win->w();
+ wh = win->h();
+ }
if (ww>w || wh>h) {
scale = (float)w/win->w();
if ((float)h/wh < scale) scale = (float)h/wh;
@@ -3959,7 +3986,10 @@ int Fl_Cocoa_Window_Driver::set_cursor(const Fl_RGB_Image *image, int hotx, int
#else
printer.origin(w/2, h/2);
#endif
- printer.print_window(win, -ww/2, -wh/2);
+ if ([print_with_titlebar_item state] == NSOnState)
+ printer.draw_decorated_window(win, -ww/2, -wh/2);
+ else
+ printer.draw(win, -ww/2, -wh/2);
//printer.print_window_part(win,0,0,win->w(),win->h(), -ww/2, -wh/2);
printer.end_page();
printer.end_job();
@@ -3992,7 +4022,7 @@ static void createAppleMenu(void)
[menuItem setTarget:about];
[appleMenu addItem:[NSMenuItem separatorItem]];
// Print front window
- title = NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::print], nil);
+ title = NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::print_with_titlebar], nil);
if ([title length] > 0) {
menuItem = [appleMenu
addItemWithTitle:title
@@ -4000,6 +4030,16 @@ static void createAppleMenu(void)
keyEquivalent:@""];
[menuItem setTarget:about];
[menuItem setEnabled:YES];
+ // Toggle "Print Window with titlebar" / "Print Window"
+ title = NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::toggle_print_titlebar], nil);
+ print_with_titlebar_item = [[PrintWithTitlebarItem alloc] initWithTitle:title
+ action:@selector(toggleCallback)
+ keyEquivalent:@""];
+ [appleMenu addItem:print_with_titlebar_item];
+ [print_with_titlebar_item setTarget:print_with_titlebar_item];
+ [print_with_titlebar_item setRepresentedObject:menuItem];
+ [print_with_titlebar_item setState:NSOnState];
+ [print_with_titlebar_item setEnabled:YES];
[appleMenu addItem:[NSMenuItem separatorItem]];
}
if (fl_mac_os_version >= 100400) { // services+hide+quit already in menu in OS 10.3