diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-04-22 15:59:22 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-04-22 16:01:33 +0200 |
| commit | 2878fa95ab4e30046472a8c1f7576aa6a39f8ba5 (patch) | |
| tree | b37fec88aee27a8e1095b649f10017d44ef69d60 /src/drivers | |
| parent | b38317b8a5c5aa6b37d4eb559b094da4e31d9a44 (diff) | |
Add optional argument to Fl_Printer::begin_job() to inform caller when an error occurs.
This solves an issue raised in fltk.general : Fl_Printer errors - how can I interpret them?
https://www.fltk.org/newsgroups.php?s38419+gfltk.general+v38427
Diffstat (limited to 'src/drivers')
| -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 |
4 files changed, 54 insertions, 20 deletions
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; |
