summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2020-04-22 15:59:22 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2020-04-22 16:01:33 +0200
commit2878fa95ab4e30046472a8c1f7576aa6a39f8ba5 (patch)
treeb37fec88aee27a8e1095b649f10017d44ef69d60 /src/drivers
parentb38317b8a5c5aa6b37d4eb559b094da4e31d9a44 (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.mm13
-rw-r--r--src/drivers/Posix/Fl_Posix_Printer_Driver.cxx29
-rw-r--r--src/drivers/PostScript/Fl_PostScript.cxx2
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx30
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;