Commit f4743ff85ad29d6665ee5ea9c6458dc9333aa17c

Authored by Perry Werneck
1 parent 5ecd10c2

Updating print dialog.

src/pw3270/linux/print.c
... ... @@ -87,8 +87,8 @@
87 87  
88 88 }
89 89  
90   -void setup_print_dialog(GtkPrintOperation * operation)
91   -{
  90 + void setup_print_dialog(GtkPrintOperation * operation)
  91 + {
92 92 GtkPrintSettings * settings = gtk_print_settings_new();
93 93 GtkPageSetup * setup = gtk_page_setup_new();
94 94 GtkPaperSize * papersize = NULL;
... ... @@ -138,5 +138,5 @@ void setup_print_dialog(GtkPrintOperation * operation)
138 138 gtk_page_setup_set_paper_size_and_default_margins(setup,papersize);
139 139 gtk_print_operation_set_default_page_setup(operation,setup);
140 140  
141   -}
  141 + }
142 142  
... ...
src/pw3270/print.c
... ... @@ -40,42 +40,6 @@
40 40  
41 41 /*--[ Implement ]------------------------------------------------------------------------------------*/
42 42  
43   -#ifdef _WIN32
44   -
45   -#define save_string(h,k,v) save_settings(k,v,h)
46   -#define save_double(h,k,v) registry_set_double(h,k,v)
47   -
48   -static void save_settings(const gchar *key, const gchar *value, HKEY hKey)
49   -{
50   - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1);
51   -}
52   -
53   -/*
54   - * From: http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c
55   - * something like this should really be in gobject!
56   - *
57   - * I Agree!! (Perry Werneck)
58   - *
59   - */
60   -static gchar * enum_to_string(GType type, guint enum_value)
61   -{
62   - GEnumClass *enum_class;
63   - GEnumValue *value;
64   - gchar *retval = NULL;
65   -
66   - enum_class = g_type_class_ref (type);
67   -
68   - value = g_enum_get_value(enum_class, enum_value);
69   - if (value)
70   - retval = g_strdup (value->value_nick);
71   -
72   - g_type_class_unref (enum_class);
73   -
74   - return retval;
75   -}
76   -
77   -#endif // _WIN32
78   -
79 43 static void show_print_error(GtkWidget *widget, GError *err)
80 44 {
81 45 GtkWidget *dialog = gtk_message_dialog_new_with_markup( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
... ... @@ -188,262 +152,6 @@ static gchar * enum_to_string(GType type, guint enum_value)
188 152 }
189 153 */
190 154  
191   -#ifdef _WIN32
192   - void update_settings(const gchar *key, const gchar *val, gpointer *settings)
193   - {
194   - trace("%s: %s=\"%s\"",__FUNCTION__,key,val);
195   - gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val);
196   - }
197   -
198   - // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.h
199   - #define MM_PER_INCH 25.4
200   - #define POINTS_PER_INCH 72
201   -
202   - // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.c
203   - static gdouble _gtk_print_convert_from_mm (gdouble len, GtkUnit unit)
204   - {
205   - switch (unit)
206   - {
207   - case GTK_UNIT_MM:
208   - return len;
209   - case GTK_UNIT_INCH:
210   - return len / MM_PER_INCH;
211   -
212   - default:
213   - g_warning ("Unsupported unit");
214   -
215   - /* Fall through */
216   - case GTK_UNIT_POINTS:
217   - return len / (MM_PER_INCH / POINTS_PER_INCH);
218   - break;
219   - }
220   - }
221   -
222   -#endif // _WIN32
223   -
224   -#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32)
225   -/*
226   -*/
227   -#endif // !WIN32
228   -
229   -/*
230   - static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info)
231   - {
232   - GtkPrintOperation * print = gtk_print_operation_new();
233   - GtkPrintSettings * settings = gtk_print_settings_new();
234   - GtkPageSetup * setup = gtk_page_setup_new();
235   - GtkPaperSize * papersize = NULL;
236   -
237   - *info = g_new0(PRINT_INFO,1);
238   - (*info)->session = v3270_get_session(widget);
239   - (*info)->cols = 80;
240   - (*info)->widget = widget;
241   -
242   - // Basic setup
243   - gtk_print_operation_set_allow_async(print,get_boolean_from_config("print","allow_async",TRUE));
244   -
245   - if(obj)
246   - {
247   - const gchar * attr = (const gchar *) g_object_get_data(obj,"jobname");
248   - if(attr)
249   - gtk_print_operation_set_job_name(print,attr);
250   - }
251   -
252   - gtk_print_operation_set_custom_tab_label(print, _( "Options" ) );
253   - gtk_print_operation_set_show_progress(print,TRUE);
254   -
255   - // Common signals
256   - g_signal_connect(print,"done",G_CALLBACK(done),*info);
257   -
258   -#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32)
259   - g_signal_connect(print,"create-custom-widget",G_CALLBACK(create_custom_widget), *info);
260   - g_signal_connect(print,"custom-widget-apply",G_CALLBACK(custom_widget_apply), *info);
261   -#else
262   - {
263   - g_autofree gchar *color_scheme = get_string_from_config("print","colors","");
264   -
265   - if(color_scheme && *color_scheme)
266   - v3270_set_color_table((*info)->color,color_scheme);
267   - else
268   - v3270_set_mono_color_table((*info)->color,"black","white");
269   -
270   - }
271   -#endif // !_WIN32
272   -
273   - // Load page and print settings
274   - {
275   -#ifdef ENABLE_WINDOWS_REGISTRY
276   -
277   - HKEY registry;
278   -
279   - if(get_registry_handle("print",&registry,KEY_READ))
280   - {
281   - HKEY hKey;
282   - DWORD disp;
283   - gchar * attr = g_object_get_data(obj,"papersize");
284   -
285   - registry_foreach(registry,"settings",update_settings,(gpointer) settings);
286   -
287   - if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
288   - {
289   - gdouble val;
290   -
291   - #define load_double(h,k,s) if(registry_get_double(h,k,&val)) s(setup, val,GTK_UNIT_MM);
292   -
293   - load_double(hKey, "MarginTop", gtk_page_setup_set_top_margin );
294   - load_double(hKey, "MarginBottom", gtk_page_setup_set_bottom_margin );
295   - load_double(hKey, "MarginLeft", gtk_page_setup_set_left_margin );
296   - load_double(hKey, "MarginRight", gtk_page_setup_set_right_margin );
297   -
298   - RegCloseKey(hKey);
299   - }
300   -
301   - if(attr)
302   - {
303   - // Paper is defined in xml, use it
304   - papersize = gtk_paper_size_new(attr);
305   - }
306   - else if(RegCreateKeyEx(registry,"paper",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
307   - {
308   - // Use saved paper size
309   - // Reference: https://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c
310   - struct _papersettings
311   - {
312   - const gchar * name;
313   - gchar * value;
314   - } papersettings[] =
315   - {
316   - { "PPDName", NULL },
317   - { "Name", NULL },
318   - { "DisplayName", NULL }
319   - };
320   -
321   - int f;
322   - gdouble width, height;
323   -
324   - // Read paper settings
325   - registry_get_double(hKey, "Width", &width);
326   - registry_get_double(hKey, "Height", &height);
327   -
328   - for(f=0;f<G_N_ELEMENTS(papersettings);f++)
329   - {
330   - BYTE data[4097];
331   - unsigned long datatype;
332   - unsigned long datalen = 4096;
333   -
334   - if(RegQueryValueExA(hKey,papersettings[f].name,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
335   - {
336   - data[datalen+1] = 0;
337   - trace("paper[%s]=\"%s\"",papersettings[f].name,data);
338   - papersettings[f].value = g_strdup((gchar *) data);
339   - }
340   - }
341   -
342   - #define ppd_name papersettings[0].value
343   - #define name papersettings[1].value
344   - #define display_name papersettings[2].value
345   -
346   - if(!display_name)
347   - display_name = g_strdup(name);
348   -
349   - if(ppd_name)
350   - {
351   - papersize = gtk_paper_size_new_from_ppd( ppd_name,
352   - display_name,
353   - _gtk_print_convert_from_mm(width,GTK_UNIT_POINTS),
354   - _gtk_print_convert_from_mm(height,GTK_UNIT_POINTS));
355   - }
356   - else if(name)
357   - {
358   - papersize = gtk_paper_size_new_custom(name, display_name,width, height, GTK_UNIT_MM);
359   - }
360   - else
361   - {
362   - g_warning("Invalid paper size settings, using defaults");
363   - papersize = gtk_paper_size_new(NULL);
364   - }
365   -
366   - // Release memory
367   - #undef ppd_name
368   - #undef display_name
369   - #undef name
370   -
371   - for(f=0;f<G_N_ELEMENTS(papersettings);f++)
372   - {
373   - if(papersettings[f].value)
374   - g_free(papersettings[f].value);
375   - }
376   -
377   - RegCloseKey(hKey);
378   -
379   - }
380   - else
381   - {
382   - // Create default
383   - papersize = gtk_paper_size_new(NULL);
384   - }
385   -
386   -
387   - RegCloseKey(registry);
388   - }
389   -
390   -#else
391   - GKeyFile * conf = get_application_keyfile();
392   - GError * err = NULL;
393   - gchar * attr = g_object_get_data(obj,"papersize");
394   -
395   - if(!gtk_print_settings_load_key_file(settings,conf,"print_settings",&err))
396   - {
397   - g_warning("Error getting print settings: %s",err->message);
398   - g_error_free(err);
399   - err = NULL;
400   - }
401   -
402   - if(!gtk_page_setup_load_key_file(setup,conf,"page_setup",&err))
403   - {
404   - g_warning("Error getting page setup: %s",err->message);
405   - g_error_free(err);
406   - err = NULL;
407   - }
408   -
409   - if(attr)
410   - {
411   - // Paper is defined in xml, use it
412   - papersize = gtk_paper_size_new(attr);
413   - }
414   - else if(g_key_file_has_group(conf,"paper_size"))
415   - {
416   - // Use saved paper size
417   - GError *err = NULL;
418   -
419   - papersize = gtk_paper_size_new_from_key_file(conf,"paper_size",&err);
420   - if(err)
421   - {
422   - g_warning("Error loading paper size: %s",err->message);
423   - g_error_free(err);
424   - }
425   -
426   - trace("Papersize: %p",papersize);
427   - }
428   - else
429   - {
430   - // Create default
431   - papersize = gtk_paper_size_new(NULL);
432   - }
433   -
434   -#endif
435   - }
436   -
437   - // Finish settings
438   - gtk_print_operation_set_print_settings(print,settings);
439   - gtk_page_setup_set_paper_size_and_default_margins(setup,papersize);
440   - gtk_print_operation_set_default_page_setup(print,setup);
441   -
442   - trace("%s ends",__FUNCTION__);
443   - return print;
444   - }
445   - */
446   -
447 155 void print_all_action(GtkAction *action, GtkWidget *widget)
448 156 {
449 157 pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_ALL);
... ... @@ -513,80 +221,8 @@ static gchar * enum_to_string(GType type, guint enum_value)
513 221  
514 222 }
515 223  
516   - /*
517   - LIB3270_EXPORT int pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, LIB3270_CONTENT_OPTION src)
  224 + void print_settings_action(GtkAction *action, GtkWidget *terminal)
518 225 {
519   - PRINT_INFO * info = NULL;
520   - GtkPrintOperation * print;
521   - gchar * text;
522   - GError * err = NULL;
523   -
524   - #ifdef X3270_TRACE
525   - if(action)
526   - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(GTK_ACTION(action)),widget);
527   - #endif
528   -
529   - g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL);
530   -
531   - print = begin_print_operation(action,widget,&info);
532   - if(!print)
533   - return -1;
534   -
535   - lib3270_get_screen_size(info->session,&info->rows,&info->cols);
536   -
537   - info->src = src;
538   -
539   - g_signal_connect(print,"begin_print",G_CALLBACK(begin_print),info);
540   -
541   - switch(src)
542   - {
543   - case LIB3270_CONTENT_ALL:
544   - case LIB3270_CONTENT_SELECTED:
545   - g_signal_connect(print,"draw_page",G_CALLBACK(draw_screen),info);
546   - break;
547   -
548   - case LIB3270_CONTENT_COPY:
549   -
550   - text = v3270_get_copy(widget);
551   -
552   - if(text)
553   - {
554   - int r;
555   -
556   - info->text = g_strsplit(text,"\n",-1);
557   - info->rows = g_strv_length(info->text);
558   -
559   - for(r=0;r < info->rows;r++)
560   - {
561   - size_t sz = strlen(info->text[r]);
562   - if(sz > info->cols)
563   - info->cols = sz;
564   - }
565   - g_free(text);
566   - }
567   - g_signal_connect(print,"draw_page",G_CALLBACK(draw_text),info);
568   - break;
569   -
570   -
571   - }
572   -
573   - // Run Print dialog
574   - gtk_print_operation_run(print,oper,GTK_WINDOW(gtk_widget_get_toplevel(widget)),&err);
575   -
576   - if(err)
577   - {
578   - show_print_error(widget,err);
579   - g_error_free(err);
580   - }
581   -
582   - g_object_unref(print);
583   -
584   - return 0;
585   - }
586   - */
587   -
588   -void print_settings_action(GtkAction *action, GtkWidget *terminal)
589   -{
590 226 const gchar * title = g_object_get_data(G_OBJECT(action),"title");
591 227 GtkWidget * widget;
592 228 GtkWidget * dialog = gtk_dialog_new_with_buttons ( gettext(title ? title : N_( "Print settings") ),
... ... @@ -640,4 +276,4 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal)
640 276  
641 277 gtk_widget_destroy(dialog);
642 278  
643   -}
  279 + }
... ...
src/pw3270/windows/print.c
... ... @@ -27,18 +27,198 @@
27 27 *
28 28 */
29 29  
30   - #include "private.h"
  30 + #include "../private.h"
31 31 #include <v3270.h>
32 32 #include <v3270/print.h>
33 33 #include <lib3270/selection.h>
34 34 #include <lib3270/trace.h>
35 35  
  36 + #define FONT_CONFIG "font-family"
  37 + #define DEFAULT_FONT "Courier New"
36 38  
37 39 /*--[ Implement ]------------------------------------------------------------------------------------*/
38 40  
  41 +#define save_string(h,k,v) save_settings(k,v,h)
  42 +#define save_double(h,k,v) registry_set_double(h,k,v)
39 43  
40   -void setup_print_dialog(GtkPrintOperation * operation)
  44 +static void save_settings(const gchar *key, const gchar *value, HKEY hKey)
41 45 {
  46 + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1);
  47 +}
  48 +
  49 +/*
  50 + * From: http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c
  51 + * something like this should really be in gobject!
  52 + *
  53 + * I Agree!! (Perry Werneck)
  54 + *
  55 + */
  56 +static gchar * enum_to_string(GType type, guint enum_value)
  57 +{
  58 + GEnumClass *enum_class;
  59 + GEnumValue *value;
  60 + gchar *retval = NULL;
  61 +
  62 + enum_class = g_type_class_ref (type);
  63 +
  64 + value = g_enum_get_value(enum_class, enum_value);
  65 + if (value)
  66 + retval = g_strdup (value->value_nick);
  67 +
  68 + g_type_class_unref (enum_class);
42 69  
  70 + return retval;
43 71 }
44 72  
  73 + void update_settings(const gchar *key, const gchar *val, gpointer *settings)
  74 + {
  75 + trace("%s: %s=\"%s\"",__FUNCTION__,key,val);
  76 + gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val);
  77 + }
  78 +
  79 + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.h
  80 + #define MM_PER_INCH 25.4
  81 + #define POINTS_PER_INCH 72
  82 +
  83 + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.c
  84 + static gdouble _gtk_print_convert_from_mm (gdouble len, GtkUnit unit)
  85 + {
  86 + switch (unit)
  87 + {
  88 + case GTK_UNIT_MM:
  89 + return len;
  90 + case GTK_UNIT_INCH:
  91 + return len / MM_PER_INCH;
  92 +
  93 + default:
  94 + g_warning ("Unsupported unit");
  95 +
  96 + /* Fall through */
  97 + case GTK_UNIT_POINTS:
  98 + return len / (MM_PER_INCH / POINTS_PER_INCH);
  99 + break;
  100 + }
  101 + }
  102 +
  103 + void setup_print_dialog(GtkPrintOperation * operation)
  104 + {
  105 + GtkPrintSettings * settings = gtk_print_settings_new();
  106 + GtkPageSetup * setup = gtk_page_setup_new();
  107 + GtkPaperSize * papersize = NULL;
  108 +
  109 +#ifdef ENABLE_WINDOWS_REGISTRY
  110 +
  111 + HKEY registry;
  112 +
  113 + if(get_registry_handle("print",&registry,KEY_READ))
  114 + {
  115 + HKEY hKey;
  116 + DWORD disp;
  117 +
  118 + registry_foreach(registry,"settings",update_settings,(gpointer) settings);
  119 +
  120 + if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
  121 + {
  122 + gdouble val;
  123 +
  124 + #define load_double(h,k,s) if(registry_get_double(h,k,&val)) s(setup, val,GTK_UNIT_MM);
  125 +
  126 + load_double(hKey, "MarginTop", gtk_page_setup_set_top_margin );
  127 + load_double(hKey, "MarginBottom", gtk_page_setup_set_bottom_margin );
  128 + load_double(hKey, "MarginLeft", gtk_page_setup_set_left_margin );
  129 + load_double(hKey, "MarginRight", gtk_page_setup_set_right_margin );
  130 +
  131 + RegCloseKey(hKey);
  132 + }
  133 +
  134 + if(RegCreateKeyEx(registry,"paper",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
  135 + {
  136 + // Use saved paper size
  137 + // Reference: https://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c
  138 + struct _papersettings
  139 + {
  140 + const gchar * name;
  141 + gchar * value;
  142 + } papersettings[] =
  143 + {
  144 + { "PPDName", NULL },
  145 + { "Name", NULL },
  146 + { "DisplayName", NULL }
  147 + };
  148 +
  149 + int f;
  150 + gdouble width, height;
  151 +
  152 + // Read paper settings
  153 + registry_get_double(hKey, "Width", &width);
  154 + registry_get_double(hKey, "Height", &height);
  155 +
  156 + for(f=0;f<G_N_ELEMENTS(papersettings);f++)
  157 + {
  158 + BYTE data[4097];
  159 + unsigned long datatype;
  160 + unsigned long datalen = 4096;
  161 +
  162 + if(RegQueryValueExA(hKey,papersettings[f].name,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
  163 + {
  164 + data[datalen+1] = 0;
  165 + trace("paper[%s]=\"%s\"",papersettings[f].name,data);
  166 + papersettings[f].value = g_strdup((gchar *) data);
  167 + }
  168 + }
  169 +
  170 + #define ppd_name papersettings[0].value
  171 + #define name papersettings[1].value
  172 + #define display_name papersettings[2].value
  173 +
  174 + if(!display_name)
  175 + display_name = g_strdup(name);
  176 +
  177 + if(ppd_name)
  178 + {
  179 + papersize = gtk_paper_size_new_from_ppd( ppd_name,
  180 + display_name,
  181 + _gtk_print_convert_from_mm(width,GTK_UNIT_POINTS),
  182 + _gtk_print_convert_from_mm(height,GTK_UNIT_POINTS));
  183 + }
  184 + else if(name)
  185 + {
  186 + papersize = gtk_paper_size_new_custom(name, display_name,width, height, GTK_UNIT_MM);
  187 + }
  188 + else
  189 + {
  190 + g_warning("Invalid paper size settings, using defaults");
  191 + papersize = gtk_paper_size_new(NULL);
  192 + }
  193 +
  194 + // Release memory
  195 + #undef ppd_name
  196 + #undef display_name
  197 + #undef name
  198 +
  199 + for(f=0;f<G_N_ELEMENTS(papersettings);f++)
  200 + {
  201 + if(papersettings[f].value)
  202 + g_free(papersettings[f].value);
  203 + }
  204 +
  205 + RegCloseKey(hKey);
  206 +
  207 + }
  208 + else
  209 + {
  210 + // Create default
  211 + papersize = gtk_paper_size_new(NULL);
  212 + }
  213 +
  214 + RegCloseKey(registry);
  215 +
  216 + }
  217 +#endif // ENABLE_WINDOWS_REGISTRY
  218 +
  219 + gtk_print_operation_set_print_settings(print,settings);
  220 + gtk_page_setup_set_paper_size_and_default_margins(setup,papersize);
  221 + gtk_print_operation_set_default_page_setup(print,setup);
  222 +
  223 + }
  224 +
... ...