diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Paged_Device.cxx | 6 | ||||
| -rw-r--r-- | src/Fl_Printer.cxx | 16 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm | 13 | ||||
| -rw-r--r-- | src/drivers/Posix/Fl_Posix_Printer_Driver.cxx | 29 | ||||
| -rw-r--r-- | src/drivers/PostScript/Fl_PostScript.cxx | 2 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx | 30 |
6 files changed, 60 insertions, 36 deletions
diff --git a/src/Fl_Paged_Device.cxx b/src/Fl_Paged_Device.cxx index cc61f4cc0..3d96d797f 100644 --- a/src/Fl_Paged_Device.cxx +++ b/src/Fl_Paged_Device.cxx @@ -31,9 +31,11 @@ \param[in] pagecount the total number of pages of the job (or 0 if you don't know the number of pages) \param[out] frompage if non-null, *frompage is set to the first page the user wants printed \param[out] topage if non-null, *topage is set to the last page the user wants printed - \return 0 if OK, non-zero if any error + \param[out] perr_message if non-null and if the returned value is > 1, *perr_message is set to a string + describing the error. That string can be delete[]'d after use. + \return 0 if OK, 1 if user cancelled the job, > 1 if any error. */ -int Fl_Paged_Device::begin_job(int pagecount, int *frompage, int *topage) {return 1;} +int Fl_Paged_Device::begin_job(int pagecount, int *frompage, int *topage, char **perr_message) {return 1;} /** \brief Begins a new printed page diff --git a/src/Fl_Printer.cxx b/src/Fl_Printer.cxx index 390f1e6e1..3f8e50355 100644 --- a/src/Fl_Printer.cxx +++ b/src/Fl_Printer.cxx @@ -132,21 +132,9 @@ Fl_Printer::Fl_Printer(void) { driver(printer->driver()); } -/** - Begins a print job. - Opens a platform-specific dialog window allowing the user to set several options including - the desired printer and the page orientation. Optionally, the user can also select a range of pages to be - printed. This range is returned to the caller that is in charge of sending only these pages - for printing. - - \param[in] pagecount the total number of pages of the job (or 0 if you don't know the number of pages) - \param[out] frompage if non-null, *frompage is set to the first page the user wants printed - \param[out] topage if non-null, *topage is set to the last page the user wants printed - \return 0 if OK, non-zero if any error occurred or if the user cancelled the print request. - */ -int Fl_Printer::begin_job(int pagecount, int *frompage, int *topage) +int Fl_Printer::begin_job(int pagecount, int *frompage, int *topage, char **perr_message) { - return printer->begin_job(pagecount, frompage, topage); + return printer->begin_job(pagecount, frompage, topage, perr_message); } int Fl_Printer::begin_page(void) diff --git a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm index 4c6e794f3..4fa639d6a 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm +++ b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm @@ -57,7 +57,7 @@ private: PMPageFormat pageFormat; PMPrintSettings printSettings; Fl_Cocoa_Printer_Driver(void); - int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL); + int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message = NULL); int begin_page (void); int printable_rect(int *w, int *h); void margins(int *left, int *top, int *right, int *bottom); @@ -101,7 +101,7 @@ Fl_Cocoa_Printer_Driver::~Fl_Cocoa_Printer_Driver(void) { } @end -int Fl_Cocoa_Printer_Driver::begin_job (int pagecount, int *frompage, int *topage) +int Fl_Cocoa_Printer_Driver::begin_job (int pagecount, int *frompage, int *topage, char **perr_message) //printing using a Quartz graphics context //returns 0 iff OK { @@ -194,7 +194,14 @@ int Fl_Cocoa_Printer_Driver::begin_job (int pagecount, int *frompage, int *topag #endif //__LP64__ } - if (status != noErr) return 1; + if (status != noErr) { + if (perr_message) { + NSError *nserr = [NSError errorWithDomain:NSCocoaErrorDomain code:status userInfo:nil]; + NSString *s = [nserr localizedDescription]; + if (s) *perr_message = strdup([s UTF8String]); + } + return 2; + } y_offset = x_offset = 0; return 0; } diff --git a/src/drivers/Posix/Fl_Posix_Printer_Driver.cxx b/src/drivers/Posix/Fl_Posix_Printer_Driver.cxx index 56849ad39..bf206070e 100644 --- a/src/drivers/Posix/Fl_Posix_Printer_Driver.cxx +++ b/src/drivers/Posix/Fl_Posix_Printer_Driver.cxx @@ -28,7 +28,7 @@ /** Support for printing on the Unix/Linux platform */ class Fl_Posix_Printer_Driver : public Fl_PostScript_File_Device { - virtual int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL); + virtual int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message=NULL); }; #if HAVE_DLSYM && HAVE_DLFCN_H @@ -57,7 +57,7 @@ public: GtkPrintJob *pjob; // data shared between begin_job() and end_job() char tmpfilename[50]; // name of temporary PostScript file containing to-be-printed data - virtual int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL); + virtual int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message=NULL); virtual void end_job(); static bool probe_for_GTK(); static void *ptr_gtk; // points to the GTK dynamic lib or NULL @@ -103,7 +103,7 @@ bool Fl_GTK_Printer_Driver::probe_for_GTK() { } -int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpage) { +int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpage, char **perr_message) { enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4; enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT ; @@ -157,6 +157,12 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag if (output) { Fl_PostScript_File_Device::begin_job(output, 0, format, layout); response_id = GTK_RESPONSE_OK; + } else { + response_id = GTK_RESPONSE_NONE + GTK_RESPONSE_OK + 1; + if (perr_message) { + *perr_message = new char[strlen(line)+50]; + sprintf(*perr_message, "Can't open output file %s", line); + } } } else if ( CALL_GTK(gtk_printer_accepts_ps)(gprinter) && //2.10 CALL_GTK(gtk_printer_is_active)(gprinter) ) { // 2.10 @@ -167,6 +173,12 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag Fl_PostScript_File_Device::begin_job(output, 0, format, layout); pjob = CALL_GTK(gtk_print_job_new)("FLTK print job", gprinter, psettings, psetup); //2.10 response_id = GTK_RESPONSE_OK; + } else { + response_id = GTK_RESPONSE_NONE + GTK_RESPONSE_OK + 1; + if (perr_message) { + *perr_message = new char[strlen(tmpfilename)+50]; + sprintf(*perr_message, "Can't create temporary file %s", tmpfilename); + } } } CALL_GTK(g_object_unref)(psettings); @@ -183,7 +195,7 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag while (Fl::ready()) Fl::check(); Fl_Surface_Device::pop_current(); } - return (response_id == GTK_RESPONSE_OK ? 0 : 1); + return (response_id == GTK_RESPONSE_OK ? 0 : (response_id == GTK_RESPONSE_NONE ? 1 : 2)); } static void pJobCompleteFunc(Fl_GTK_Printer_Driver::GtkPrintJob *print_job, Fl_GTK_Printer_Driver::gboolean *user_data, const Fl_GTK_Printer_Driver::GError *error) { @@ -221,7 +233,7 @@ Fl_Paged_Device* Fl_Printer::newPrinterDriver(void) } /* Begins a print job. */ -int Fl_Posix_Printer_Driver::begin_job(int pages, int *firstpage, int *lastpage) { +int Fl_Posix_Printer_Driver::begin_job(int pages, int *firstpage, int *lastpage, char **perr_message) { enum Fl_Paged_Device::Page_Format format; enum Fl_Paged_Device::Page_Layout layout; @@ -309,8 +321,11 @@ int Fl_Posix_Printer_Driver::begin_job(int pages, int *firstpage, int *lastpage) Fl_PostScript_Graphics_Driver *ps = driver(); ps->output = popen(command, "w"); if (!ps->output) { - fl_alert("could not run command: %s\n",command); - return 1; + if (perr_message) { + *perr_message = new char[strlen(command) + 50]; + sprintf(*perr_message, "could not run command: %s", command); + } + return 2; } ps->close_command(pclose); this->set_current(); diff --git a/src/drivers/PostScript/Fl_PostScript.cxx b/src/drivers/PostScript/Fl_PostScript.cxx index 9994a515d..f182720b8 100644 --- a/src/drivers/PostScript/Fl_PostScript.cxx +++ b/src/drivers/PostScript/Fl_PostScript.cxx @@ -109,7 +109,7 @@ int Fl_PostScript_File_Device::begin_job (FILE *ps_output, int pagecount, return 0; } -int Fl_PostScript_File_Device::begin_job(int pagecount, int* from, int* to) +int Fl_PostScript_File_Device::begin_job(int pagecount, int* from, int* to, char **) { return 1; } diff --git a/src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx index ba33e1ebe..980533045 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx @@ -38,7 +38,7 @@ private: int top_margin; void absolute_printable_rect(int *x, int *y, int *w, int *h); Fl_WinAPI_Printer_Driver(void); - int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL); + int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message = NULL); int begin_page (void); int printable_rect(int *w, int *h); void margins(int *left, int *top, int *right, int *bottom); @@ -85,7 +85,7 @@ static void WIN_SetupPrinterDeviceContext(HDC prHDC) } -int Fl_WinAPI_Printer_Driver::begin_job (int pagecount, int *frompage, int *topage) +int Fl_WinAPI_Printer_Driver::begin_job (int pagecount, int *frompage, int *topage, char **perr_message) // returns 0 iff OK { if (pagecount == 0) pagecount = 10000; @@ -116,14 +116,26 @@ int Fl_WinAPI_Printer_Driver::begin_job (int pagecount, int *frompage, int *topa prerr = StartDoc (hPr, &di); if (prerr < 1) { abortPrint = TRUE; - //fl_alert ("StartDoc error %d", prerr); - err = 1; + DWORD dw = GetLastError(); + err = (dw == ERROR_CANCELLED ? 1 : 2); + if (perr_message && err == 2) { + wchar_t *lpMsgBuf; + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dw, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR) &lpMsgBuf, + 0, NULL); + unsigned srclen = lstrlenW(lpMsgBuf) - 2; // ignore terminal ^M + unsigned l = fl_utf8fromwc(NULL, 0, lpMsgBuf, srclen); + char *tmp = new char[l+1]; + fl_utf8fromwc(tmp, l, lpMsgBuf, srclen); + LocalFree(lpMsgBuf); + *perr_message = new char[l + 50]; + sprintf(*perr_message, "begin_job() failed with error %d: %s", dw, tmp); + delete[] tmp; + } } - } else { - commdlgerr = CommDlgExtendedError (); - fl_alert ("Unable to create print context, error %lu", - (unsigned long) commdlgerr); - err = 1; } } else { err = 1; |
