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/WinAPI | |
| 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/WinAPI')
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Printer_Driver.cxx | 30 |
1 files changed, 21 insertions, 9 deletions
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; |
