FLTK logo

[master] 2662cad - Improve Fl_GTK_Printer_Driver::begin_job()

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 2662cad - Improve Fl_GTK_Printer_Driver::begin_job() "ManoloFLTK" 07:32 Apr 08  
 
commit 2662cad50bd4716e8bc20aaa1c3ed80653974165
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Mon Apr 8 16:29:25 2024 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Mon Apr 8 16:29:25 2024 +0200

    Improve Fl_GTK_Printer_Driver::begin_job()

 src/drivers/Posix/Fl_Posix_Printer_Driver.cxx | 37 ++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git src/drivers/Posix/Fl_Posix_Printer_Driver.cxx src/drivers/Posix/Fl_Posix_Printer_Driver.cxx
index e82126f..bc3b991 100644
--- src/drivers/Posix/Fl_Posix_Printer_Driver.cxx
+++ src/drivers/Posix/Fl_Posix_Printer_Driver.cxx
@@ -37,6 +37,9 @@ class Fl_Posix_Printer_Driver : public Fl_PostScript_File_Device {
 #include <FL/filename.H>
 #include "Fl_Posix_System_Driver.H"
 #define GTK_PAPER_NAME_LETTER "na_letter"
+#define GTK_PAPER_NAME_LEGAL "na_legal"
+#define GTK_PAPER_NAME_A3 "iso_a3"
+#define GTK_PAPER_NAME_A5 "iso_a5"
 #define GTK_RESPONSE_NONE 0
 #define GTK_RESPONSE_OK -5
 #define GTK_PRINT_PAGES_RANGES 2
@@ -85,7 +88,12 @@ public:
   struct GtkPageRange { int start, end; };
   typedef GtkPageRange* (*gtk_print_settings_get_page_ranges_t)(GtkPrintSettings*, int*);
   typedef void (*g_object_unref_t)(void* object);
+  typedef struct _GClosure GClosure;
+  typedef void  (*GClosureNotify)(void* data, GClosure *closure);
+  typedef void  (*GCallback)(void);
+  typedef void (*g_signal_connect_data_t)(void *,const char *, GCallback, void*, GClosureNotify, int);
   typedef void (*gtk_print_unix_dialog_set_embed_page_setup_t)(GtkPrintUnixDialog *dialog, gboolean embed);
+  typedef void (*gtk_widget_show_now_t)(GtkPrintUnixDialog *dialog);
   typedef const char * (*gtk_check_version_t)(unsigned, unsigned, unsigned);
 };
 
@@ -101,6 +109,16 @@ bool Fl_GTK_Printer_Driver::probe_for_GTK() {
   return Fl_Posix_System_Driver::probe_for_GTK(2, 10, &ptr_gtk);
 }
 
+static void run_response_handler(void *dialog, int response_id, void* data)
+{
+  int *ri = (int *)data;
+  *ri = response_id;
+}
+
+static int no_dispatch(int /*event*/, Fl_Window* /*win*/) {
+  return 0;
+}
+
 
 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;
@@ -116,7 +134,18 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag
   CALL_GTK(gtk_print_settings_set)(psettings, "output-uri", line); //2.10
   CALL_GTK(gtk_print_unix_dialog_set_settings)(pdialog, psettings); //2.10
   CALL_GTK(g_object_unref)(psettings);
-  int response_id = CALL_GTK(gtk_dialog_run)((GtkDialog*)pdialog);
+  int response_id = GTK_RESPONSE_NONE;
+  CALL_GTK(g_signal_connect_data)(pdialog, "response", GCallback(run_response_handler), &response_id, NULL,  0);
+  gtk_events_pending_t fl_gtk_events_pending = CALL_GTK(gtk_events_pending);
+  gtk_main_iteration_t fl_gtk_main_iteration = CALL_GTK(gtk_main_iteration);
+  CALL_GTK(gtk_widget_show_now)(pdialog); // map the GTK window on screen
+  Fl_Event_Dispatch old_dispatch = Fl::event_dispatch();
+  // prevent FLTK from processing any event
+  Fl::event_dispatch(no_dispatch);
+  while (response_id == GTK_RESPONSE_NONE) { // loop that shows the GTK dialog window
+    fl_gtk_main_iteration(); // one iteration of the GTK event loop
+    while (Fl::ready()) Fl::check(); // queued iterations of the FLTK event loop
+  }
   if (response_id == GTK_RESPONSE_OK) {
     GtkPageSetup *psetup = CALL_GTK(gtk_print_unix_dialog_get_page_setup)(pdialog); //2.10
     GtkPageOrientation orient = CALL_GTK(gtk_page_setup_get_orientation)(psetup); //2.10
@@ -124,6 +153,9 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag
     GtkPaperSize* psize = CALL_GTK(gtk_page_setup_get_paper_size)(psetup); //2.10
     const char *pname = CALL_GTK(gtk_paper_size_get_name)(psize); //2.10
     if (strcmp(pname, GTK_PAPER_NAME_LETTER) == 0) format = Fl_Paged_Device::LETTER;
+    else if (strcmp(pname, GTK_PAPER_NAME_LEGAL) == 0) format = Fl_Paged_Device::LEGAL;
+    else if (strcmp(pname, GTK_PAPER_NAME_A3) == 0) format = Fl_Paged_Device::A3;
+    else if (strcmp(pname, GTK_PAPER_NAME_A5) == 0) format = Fl_Paged_Device::A5;
     GtkPrinter *gprinter = CALL_GTK(gtk_print_unix_dialog_get_selected_printer)(pdialog); //2.10
     psettings = CALL_GTK(gtk_print_unix_dialog_get_settings)(pdialog); //2.10
     const char* p = CALL_GTK(gtk_print_settings_get)(psettings, "output-uri"); //2.10
@@ -183,10 +215,9 @@ int Fl_GTK_Printer_Driver::begin_job(int pagecount, int *firstpage, int *lastpag
     CALL_GTK(g_object_unref)(psettings);
   }
   CALL_GTK(gtk_widget_hide)((GtkWidget*)pdialog);
-  gtk_events_pending_t fl_gtk_events_pending = CALL_GTK(gtk_events_pending);
-  gtk_main_iteration_t fl_gtk_main_iteration = CALL_GTK(gtk_main_iteration);
   while (fl_gtk_events_pending()) fl_gtk_main_iteration();
   CALL_GTK(gtk_widget_destroy)((GtkWidget*)pdialog);
+  Fl::event_dispatch(old_dispatch);
   Fl_Window *first = Fl::first_window();
   if (first) {
     Fl_Surface_Device::push_current(Fl_Display_Device::display_device());
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.