diff --git a/src/Fl_Screen_Driver.H b/src/Fl_Screen_Driver.H index 1f6c80f98..fae5b0ff2 100644 --- a/src/Fl_Screen_Driver.H +++ b/src/Fl_Screen_Driver.H @@ -201,6 +201,8 @@ public: virtual APP_SCALING_CAPABILITY rescalable() { return NO_APP_SCALING; } // supports Fl_Window::default_icons() virtual void default_icons(const Fl_RGB_Image *icons[], int count); + // this one is implemented in print_button.cxx + static int print_or_copy_window(Fl_Window*, bool, int); }; #endif // !FL_SCREEN_DRIVER_H diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 340fe2eff..d4a155af0 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3949,50 +3949,11 @@ static PrintWithTitlebarItem *print_with_titlebar_item = NULL; nil]; [NSApp orderFrontStandardAboutPanelWithOptions:options]; } -//#include - (void)printPanel { - Fl_Printer printer; - //Fl_PostScript_File_Device printer; - int w, h, ww, wh; - Fl_Window *win = Fl::first_window(); - if(!win) return; - if (win->parent()) win = win->top_window(); - if( printer.begin_job(1) ) return; - if( printer.begin_page() ) return; + bool grab_decoration = ([print_with_titlebar_item state] == NSOnState); fl_lock_function(); - // scale the printer device so that the window fits on the page - float scale = 1; - printer.printable_rect(&w, &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; - printer.scale(scale); - printer.printable_rect(&w, &h); - } -//#define ROTATE 1 -#ifdef ROTATE - printer.scale(scale * 0.8, scale * 0.8); - printer.printable_rect(&w, &h); - printer.origin(w/2, h/2 ); - printer.rotate(20.); -#else - printer.origin(w/2, h/2); -#endif - 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(); + Fl_Screen_Driver::print_or_copy_window(Fl::first_window(), grab_decoration, 1); fl_unlock_function(); } - (void)terminate:(id)sender diff --git a/src/print_button.cxx b/src/print_button.cxx index 35c7d1063..40836adc5 100644 --- a/src/print_button.cxx +++ b/src/print_button.cxx @@ -38,14 +38,17 @@ // Currently the shortcut can't be configured and is always ALT+SHIFT+'s'. // Todo: make the shortcut configurable. +#include +#include "Fl_Screen_Driver.H" +#include +#include +#include + +//#define USE_PRINT_BUTTON 1 #ifdef USE_PRINT_BUTTON -#include #include #include -#include -#include -#include #include #include @@ -66,7 +69,7 @@ static Fl_Check_Button *deco_button = 0; // window decoration button // 2: copy window to clipboard // else: see 2. -static void output_cb(Fl_Widget *o, void *data) { +static void output_cb(Fl_Widget * /*unused*/, void *data) { print_window->hide(); Fl_Window *win = Fl::first_window(); @@ -75,58 +78,7 @@ static void output_cb(Fl_Widget *o, void *data) { // print window again (which ends the program) if (!win) return; - - int mode = fl_int(data); - int deco = deco_button->value(); - int ww = deco ? win->decorated_w() : win->w(); - int wh = deco ? win->decorated_h() : win->h(); - - if (mode == 1) { // print window - - Fl_Printer printer; - int w, h; - if (printer.begin_job(1)) { // fail or cancel - print_window->show(); - return; - } - if (printer.begin_page()) { // fail or cancel - print_window->show(); - return; - } - printer.printable_rect(&w, &h); - // scale the printer device so that the window fits on the page - float scale = 1; - if (ww > w || wh > h) { - scale = (float)w / ww; - if ((float)h / wh < scale) - scale = (float)h / wh; - printer.scale(scale, scale); - printer.printable_rect(&w, &h); - } -#ifdef ROTATE - printer.scale(scale * 0.8, scale * 0.8); - printer.printable_rect(&w, &h); - printer.origin(w / 2, h / 2); - printer.rotate(ROTATE); - printer.print_widget(win, -win->w() / 2, -win->h() / 2); -#else - printer.origin(w / 2, h / 2); - printer.print_window(win, -ww / 2, -wh / 2); -#endif - printer.end_page(); - printer.end_job(); - - } else { // copy window to clipboard - - Fl_Copy_Surface *surf = new Fl_Copy_Surface(ww, wh); - if (deco) - surf->draw_decorated_window(win); // draw the window content - else - surf->draw(win); // draw the window content - delete surf; // put the window on the clipboard - - } // print | copy - + Fl_Screen_Driver::print_or_copy_window(win, deco_button->value(), fl_int(data)); print_window->show(); } @@ -190,3 +142,65 @@ int fl_create_print_window() { } #endif // USE_PRINT_BUTTON + +/** + To print or copy to clipboard a window. + \param win The window to process + \param grab_decoration true means the window titlebar is processed too + \param mode 1 means print, other means copy + */ +int Fl_Screen_Driver::print_or_copy_window(Fl_Window *win, bool grab_decoration, int mode) +{ + if (!win) return 0; + + int ww = grab_decoration ? win->decorated_w() : win->w(); + int wh = grab_decoration ? win->decorated_h() : win->h(); + + if (mode == 1) { // print window + + // exchange the 2 constructors below to test class Fl_PostScript_File_Device + Fl_Printer printer; + //Fl_PostScript_File_Device printer; + int w, h; + if (printer.begin_job(1)) { // fail or cancel + return 1; + } + if (printer.begin_page()) { // fail or cancel + return 1; + } + printer.printable_rect(&w, &h); + // scale the printer device so that the window fits on the page + float scale = 1; + if (ww > w || wh > h) { + scale = (float)w / ww; + if ((float)h / wh < scale) + scale = (float)h / wh; + printer.scale(scale, scale); + printer.printable_rect(&w, &h); + } +#ifdef ROTATE + printer.scale(scale * 0.8, scale * 0.8); + printer.printable_rect(&w, &h); + printer.origin(w / 2, h / 2); + printer.rotate(ROTATE); + printer.print_widget(win, -win->w() / 2, -win->h() / 2); +#else + printer.origin(w / 2, h / 2); + if (grab_decoration) printer.draw_decorated_window(win, -ww / 2, -wh / 2); + else printer.draw(win, -ww / 2, -wh / 2); +#endif + printer.end_page(); + printer.end_job(); + + } else { // copy window to clipboard + + Fl_Copy_Surface *surf = new Fl_Copy_Surface(ww, wh); + if (grab_decoration) + surf->draw_decorated_window(win); // draw the window content + else + surf->draw(win); // draw the window content + delete surf; // put the window on the clipboard + + } // print | copy + return 0; +}