Commit 5ecd10c2b5f83f0a7ce630eb78d6c6df45129b34

Authored by Perry Werneck
1 parent 7ec37943

Updating print dialog.

@@ -87,6 +87,7 @@ fi @@ -87,6 +87,7 @@ fi
87 case "$host" in 87 case "$host" in
88 *-mingw32|*-pc-msys) 88 *-mingw32|*-pc-msys)
89 89
  90 + app_cv_osname="windows"
90 EXEEXT=".exe" 91 EXEEXT=".exe"
91 DLLPREFIX="" 92 DLLPREFIX=""
92 DLLEXT=".dll" 93 DLLEXT=".dll"
@@ -111,7 +112,7 @@ case "$host" in @@ -111,7 +112,7 @@ case "$host" in
111 AC_CONFIG_FILES(win/makeruntime.sh) 112 AC_CONFIG_FILES(win/makeruntime.sh)
112 AC_CONFIG_FILES(win/copydeps.sh) 113 AC_CONFIG_FILES(win/copydeps.sh)
113 AC_CONFIG_FILES(win/$PACKAGE_TARNAME.nsi) 114 AC_CONFIG_FILES(win/$PACKAGE_TARNAME.nsi)
114 - AC_CONFIG_FILES(src/pw3270/resources.rc) 115 + AC_CONFIG_FILES(src/pw3270/windows/resources.rc)
115 116
116 if test "$host_cpu" = "x86_64"; then 117 if test "$host_cpu" = "x86_64"; then
117 app_cv_programfiles="PROGRAMFILES64" 118 app_cv_programfiles="PROGRAMFILES64"
@@ -138,6 +139,7 @@ case "$host" in @@ -138,6 +139,7 @@ case "$host" in
138 ;; 139 ;;
139 140
140 *) 141 *)
  142 + app_cv_osname="linux"
141 EXEEXT="" 143 EXEEXT=""
142 DLLPREFIX="lib" 144 DLLPREFIX="lib"
143 DLLEXT=".so" 145 DLLEXT=".so"
@@ -150,6 +152,7 @@ case "$host" in @@ -150,6 +152,7 @@ case "$host" in
150 152
151 esac 153 esac
152 154
  155 +AC_SUBST(OSNAME,$app_cv_osname)
153 AC_SUBST(DBG_CFLAGS) 156 AC_SUBST(DBG_CFLAGS)
154 AC_SUBST(RLS_CFLAGS) 157 AC_SUBST(RLS_CFLAGS)
155 AC_SUBST(EXEEXT) 158 AC_SUBST(EXEEXT)
@@ -153,6 +153,9 @@ @@ -153,6 +153,9 @@
153 </Unit> 153 </Unit>
154 <Unit filename="src/pw3270/include/v3270.h" /> 154 <Unit filename="src/pw3270/include/v3270.h" />
155 <Unit filename="src/pw3270/include/v3270ft.h" /> 155 <Unit filename="src/pw3270/include/v3270ft.h" />
  156 + <Unit filename="src/pw3270/linux/print.c">
  157 + <Option compilerVar="CC" />
  158 + </Unit>
156 <Unit filename="src/pw3270/main.c"> 159 <Unit filename="src/pw3270/main.c">
157 <Option compilerVar="CC" /> 160 <Option compilerVar="CC" />
158 </Unit> 161 </Unit>
@@ -229,6 +232,10 @@ @@ -229,6 +232,10 @@
229 <Unit filename="src/pw3270/window.c"> 232 <Unit filename="src/pw3270/window.c">
230 <Option compilerVar="CC" /> 233 <Option compilerVar="CC" />
231 </Unit> 234 </Unit>
  235 + <Unit filename="src/pw3270/windows/print.c">
  236 + <Option compilerVar="CC" />
  237 + </Unit>
  238 + <Unit filename="src/pw3270/windows/resources.rc.in" />
232 <Unit filename="src/sample/Makefile.in" /> 239 <Unit filename="src/sample/Makefile.in" />
233 <Unit filename="src/sample/connect.c"> 240 <Unit filename="src/sample/connect.c">
234 <Option compilerVar="CC" /> 241 <Option compilerVar="CC" />
src/pw3270/Makefile.in
@@ -35,7 +35,10 @@ LIB_SOURCES=\ @@ -35,7 +35,10 @@ LIB_SOURCES=\
35 print.c \ 35 print.c \
36 colors.c \ 36 colors.c \
37 tools.c \ 37 tools.c \
38 - plugin.c 38 + plugin.c \
  39 + $(wildcard @OSNAME@/*.c) \
  40 + $(wildcard @OSNAME@/*.rc)
  41 +
39 42
40 APP_SOURCES=\ 43 APP_SOURCES=\
41 main.c \ 44 main.c \
src/pw3270/linux/print.c 0 → 100644
@@ -0,0 +1,142 @@ @@ -0,0 +1,142 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include "../private.h"
  31 + #include <v3270.h>
  32 + #include <v3270/print.h>
  33 + #include <lib3270/selection.h>
  34 +
  35 + #define FONT_CONFIG "font-family"
  36 + #define DEFAULT_FONT "Courier New"
  37 +
  38 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  39 +
  40 + static GtkWidget * create_custom_widget(GtkPrintOperation *prt, gpointer G_GNUC_UNUSED(dunno))
  41 + {
  42 + GtkWidget * widget = gtk_frame_new("");
  43 + GtkWidget * settings = V3270_print_settings_new(v3270_print_operation_get_terminal(prt));
  44 +
  45 + // Load values from configuration
  46 + g_autofree gchar * font_family = get_string_from_config("print",FONT_CONFIG,DEFAULT_FONT);
  47 + if(font_family && *font_family)
  48 + v3270_print_settings_set_font_family(settings,font_family);
  49 +
  50 + g_autofree gchar * color_scheme = get_string_from_config("print","colors","");
  51 + if(color_scheme && *color_scheme)
  52 + v3270_print_settings_set_color_scheme(settings,color_scheme);
  53 +
  54 + // Create frame
  55 + GtkWidget *label = gtk_label_new(NULL);
  56 + gtk_label_set_markup(GTK_LABEL(label),_("<b>Text options</b>"));
  57 + gtk_frame_set_label_widget(GTK_FRAME(widget),label);
  58 +
  59 + gtk_container_set_border_width(GTK_CONTAINER(widget),12);
  60 +
  61 + // The print dialog doesn't follow the guidelines from https://developer.gnome.org/hig/stable/visual-layout.html.en )-:
  62 + gtk_frame_set_shadow_type(GTK_FRAME(widget),GTK_SHADOW_NONE);
  63 +
  64 + gtk_container_set_border_width(GTK_CONTAINER(settings),6);
  65 + g_object_set(G_OBJECT(settings),"margin-start",8,NULL);
  66 +
  67 + gtk_container_add(GTK_CONTAINER(widget),settings);
  68 +
  69 + gtk_widget_show_all(widget);
  70 +
  71 + return widget;
  72 + }
  73 +
  74 + static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *widget, gpointer G_GNUC_UNUSED(dunno))
  75 + {
  76 + GtkWidget * settings = gtk_bin_get_child(GTK_BIN(widget));
  77 +
  78 + v3270_print_operation_apply_settings(prt,settings);
  79 +
  80 + // Store font family
  81 + g_autofree gchar * font_family = v3270_print_settings_get_font_family(settings);
  82 + set_string_to_config("print",FONT_CONFIG,font_family);
  83 +
  84 + // Store save color settings
  85 + g_autofree gchar * colors = v3270_print_settings_get_color_scheme(settings);
  86 + set_string_to_config("print","colors","%s",colors);
  87 +
  88 + }
  89 +
  90 +void setup_print_dialog(GtkPrintOperation * operation)
  91 +{
  92 + GtkPrintSettings * settings = gtk_print_settings_new();
  93 + GtkPageSetup * setup = gtk_page_setup_new();
  94 + GtkPaperSize * papersize = NULL;
  95 +
  96 + g_signal_connect(operation,"create-custom-widget",G_CALLBACK(create_custom_widget),NULL);
  97 + g_signal_connect(operation,"custom-widget-apply",G_CALLBACK(custom_widget_apply), NULL);
  98 +
  99 + // Load page and print settings
  100 + GKeyFile * conf = get_application_keyfile();
  101 + GError * err = NULL;
  102 +
  103 + if(!gtk_print_settings_load_key_file(settings,conf,"print_settings",&err))
  104 + {
  105 + g_warning("Error getting print settings: %s",err->message);
  106 + g_error_free(err);
  107 + err = NULL;
  108 + }
  109 +
  110 + if(!gtk_page_setup_load_key_file(setup,conf,"page_setup",&err))
  111 + {
  112 + g_warning("Error getting page setup: %s",err->message);
  113 + g_error_free(err);
  114 + err = NULL;
  115 + }
  116 +
  117 + if(g_key_file_has_group(conf,"paper_size"))
  118 + {
  119 + // Use saved paper size
  120 + GError *err = NULL;
  121 +
  122 + papersize = gtk_paper_size_new_from_key_file(conf,"paper_size",&err);
  123 + if(err)
  124 + {
  125 + g_warning("Error loading paper size: %s",err->message);
  126 + g_error_free(err);
  127 + }
  128 +
  129 + trace("Papersize: %p",papersize);
  130 + }
  131 + else
  132 + {
  133 + // Create default
  134 + papersize = gtk_paper_size_new(NULL);
  135 + }
  136 +
  137 + gtk_print_operation_set_print_settings(operation,settings);
  138 + gtk_page_setup_set_paper_size_and_default_margins(setup,papersize);
  139 + gtk_print_operation_set_default_page_setup(operation,setup);
  140 +
  141 +}
  142 +
src/pw3270/print.c
@@ -38,151 +38,8 @@ @@ -38,151 +38,8 @@
38 #define FONT_CONFIG "font-family" 38 #define FONT_CONFIG "font-family"
39 #define DEFAULT_FONT "Courier New" 39 #define DEFAULT_FONT "Courier New"
40 40
41 -/*--[ Structs ]--------------------------------------------------------------------------------------*/  
42 -  
43 - typedef struct _print_info  
44 - {  
45 - GdkRGBA color[V3270_COLOR_COUNT];  
46 - int show_selection : 1;  
47 - LIB3270_CONTENT_OPTION src;  
48 -  
49 - GtkWidget * widget;  
50 - H3270 * session;  
51 -  
52 - int baddr;  
53 - int rows;  
54 - int cols; /**< Max line width */  
55 - int pages;  
56 - int lpp; /**< Lines per page */  
57 -  
58 - v3270FontInfo font;  
59 -  
60 - double left;  
61 - double width; /**< Report width */  
62 - double height; /**< Report height (all pages) */  
63 -  
64 - gchar **text;  
65 -  
66 - } PRINT_INFO;  
67 -  
68 -  
69 /*--[ Implement ]------------------------------------------------------------------------------------*/ 41 /*--[ Implement ]------------------------------------------------------------------------------------*/
70 42
71 - static void begin_print(GtkPrintOperation *prt, GtkPrintContext *context, PRINT_INFO *info)  
72 - {  
73 - cairo_font_extents_t extents;  
74 -  
75 - cairo_t * cr = gtk_print_context_get_cairo_context(context);  
76 - gchar * font = get_string_from_config("print",FONT_CONFIG,DEFAULT_FONT);  
77 -  
78 - trace("%s: operation=%p context=%p font=\"%s\"",__FUNCTION__,prt,context,font);  
79 -  
80 - // Setup font  
81 - if(*font)  
82 - {  
83 - PangoFontDescription * descr = pango_font_description_from_string(font);  
84 - if(descr)  
85 - {  
86 - cairo_select_font_face(cr, pango_font_description_get_family(descr),  
87 - CAIRO_FONT_SLANT_NORMAL,  
88 - pango_font_description_get_weight(descr) == PANGO_WEIGHT_BOLD ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL);  
89 -  
90 - {  
91 - double width = gtk_print_context_get_width(context);  
92 - double cols = (double) info->cols;  
93 - double current = width / cols;  
94 - double valid = current;  
95 -  
96 - do  
97 - {  
98 - valid = current;  
99 - current = valid +1.0;  
100 - cairo_set_font_size(cr,current);  
101 - cairo_font_extents(cr,&extents);  
102 - }  
103 - while( (cols * extents.max_x_advance) < width );  
104 -  
105 - trace("Font size: %d",(int) valid);  
106 - cairo_set_font_size(cr,valid);  
107 -  
108 - }  
109 -  
110 - pango_font_description_free(descr);  
111 - }  
112 - }  
113 - g_free(font);  
114 -  
115 - info->font.scaled = cairo_get_scaled_font(cr);  
116 - cairo_scaled_font_reference(info->font.scaled);  
117 - cairo_scaled_font_extents(info->font.scaled,&extents);  
118 -  
119 - info->font.height = extents.height;  
120 - info->font.descent = extents.descent;  
121 - info->font.width = extents.max_x_advance;  
122 -  
123 - info->width = ((double) info->cols) * extents.max_x_advance;  
124 - info->height = ((double) info->rows) * (extents.height + extents.descent);  
125 -  
126 - // Center image  
127 - info->left = (gtk_print_context_get_width(context)-info->width)/2;  
128 - if(info->left < 2)  
129 - info->left = 2;  
130 -  
131 - // Setup page size  
132 - info->lpp = (gtk_print_context_get_height(context) / (extents.height + extents.descent));  
133 - info->pages = (info->rows / info->lpp)+1;  
134 -  
135 - trace("%d lines per page, %d pages to print",info->lpp,info->pages);  
136 -  
137 - gtk_print_operation_set_n_pages(prt,info->pages);  
138 - }  
139 -  
140 - static void draw_screen(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info)  
141 - {  
142 - int row;  
143 - int col;  
144 - cairo_t * cr = gtk_print_context_get_cairo_context(context);  
145 - int baddr = info->baddr;  
146 - GdkRectangle rect;  
147 -  
148 - cairo_set_scaled_font(cr,info->font.scaled);  
149 -  
150 - memset(&rect,0,sizeof(rect));  
151 - rect.y = 2;  
152 - rect.height = (info->font.height + info->font.descent);  
153 - rect.width = info->font.width;  
154 -  
155 - // Clear page  
156 - gdk_cairo_set_source_rgba(cr,info->color+V3270_COLOR_BACKGROUND);  
157 - cairo_rectangle(cr, info->left-2, 0, (rect.width*info->cols)+4, (rect.height*info->rows)+4);  
158 - cairo_fill(cr);  
159 - cairo_stroke(cr);  
160 -  
161 - rect.width++;  
162 - rect.height++;  
163 -  
164 - for(row = 0; row < info->rows; row++)  
165 - {  
166 - rect.x = info->left;  
167 - for(col = 0; col < info->cols; col++)  
168 - {  
169 - unsigned char c;  
170 - unsigned short attr;  
171 -  
172 - if(!lib3270_get_element(info->session,baddr++,&c,&attr) && (info->src == LIB3270_CONTENT_ALL || (attr & LIB3270_ATTR_SELECTED)))  
173 - {  
174 - if(!info->show_selection)  
175 - attr &= ~LIB3270_ATTR_SELECTED;  
176 - v3270_draw_element(cr,c,attr,info->session,&info->font,&rect,info->color);  
177 - }  
178 -  
179 - rect.x += (rect.width-1);  
180 - }  
181 - rect.y += (rect.height-1);  
182 -  
183 - }  
184 - }  
185 -  
186 #ifdef _WIN32 43 #ifdef _WIN32
187 44
188 #define save_string(h,k,v) save_settings(k,v,h) 45 #define save_string(h,k,v) save_settings(k,v,h)
@@ -236,6 +93,7 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -236,6 +93,7 @@ static gchar * enum_to_string(GType type, guint enum_value)
236 gtk_widget_destroy(dialog); 93 gtk_widget_destroy(dialog);
237 } 94 }
238 95
  96 + /*
239 static void done(GtkPrintOperation *prt, GtkPrintOperationResult result, PRINT_INFO *info) 97 static void done(GtkPrintOperation *prt, GtkPrintOperationResult result, PRINT_INFO *info)
240 { 98 {
241 if(result == GTK_PRINT_OPERATION_RESULT_ERROR) 99 if(result == GTK_PRINT_OPERATION_RESULT_ERROR)
@@ -327,77 +185,8 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -327,77 +185,8 @@ static gchar * enum_to_string(GType type, guint enum_value)
327 185
328 } 186 }
329 187
330 - if(info->font.scaled)  
331 - cairo_scaled_font_destroy(info->font.scaled);  
332 -  
333 - if(info->text)  
334 - g_strfreev(info->text);  
335 -  
336 - if(info->font.family)  
337 - g_free(info->font.family);  
338 -  
339 - g_free(info);  
340 - }  
341 -  
342 - static void toggle_show_selection(GtkToggleButton *togglebutton,PRINT_INFO *info)  
343 - {  
344 - gboolean active = gtk_toggle_button_get_active(togglebutton);  
345 - info->show_selection = active ? 1 : 0;  
346 - set_boolean_to_config("print","selection",active);  
347 - }  
348 -  
349 - static GtkWidget * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info)  
350 - {  
351 - GtkWidget * widget = gtk_frame_new("");  
352 - GtkWidget * settings = V3270_print_settings_new(info->widget);  
353 -  
354 - // Load values from configuration  
355 - g_autofree gchar * font_family = get_string_from_config("print",FONT_CONFIG,DEFAULT_FONT);  
356 - if(font_family && *font_family)  
357 - v3270_print_settings_set_font_family(settings,font_family);  
358 -  
359 - g_autofree gchar * color_scheme = get_string_from_config("print","colors","");  
360 - if(color_scheme && *color_scheme)  
361 - v3270_print_settings_set_color_scheme(settings,color_scheme);  
362 -  
363 - // Create frame  
364 - GtkWidget *label = gtk_label_new(NULL);  
365 - gtk_label_set_markup(GTK_LABEL(label),_("<b>Text options</b>"));  
366 - gtk_frame_set_label_widget(GTK_FRAME(widget),label);  
367 -  
368 - gtk_container_set_border_width(GTK_CONTAINER(widget),12);  
369 -  
370 - // The print dialog doesn't follow the guidelines from https://developer.gnome.org/hig/stable/visual-layout.html.en )-:  
371 - gtk_frame_set_shadow_type(GTK_FRAME(widget),GTK_SHADOW_NONE);  
372 -  
373 - gtk_container_set_border_width(GTK_CONTAINER(settings),6);  
374 - g_object_set(G_OBJECT(settings),"margin-start",8,NULL);  
375 -  
376 - gtk_container_add(GTK_CONTAINER(widget),settings);  
377 -  
378 - gtk_widget_show_all(widget);  
379 -  
380 - return widget;  
381 - }  
382 -  
383 - static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *widget, PRINT_INFO *info)  
384 - {  
385 - GtkWidget * settings = gtk_bin_get_child(GTK_BIN(widget));  
386 -  
387 - info->show_selection = v3270_print_settings_get_show_selection(settings) ? 1 : 0;  
388 -  
389 - // Setup font family  
390 - if(info->font.family)  
391 - g_free(info->font.family);  
392 - info->font.family = v3270_print_settings_get_font_family(settings);  
393 - set_string_to_config("print",FONT_CONFIG,info->font.family);  
394 -  
395 - // Setup print settings  
396 - v3270_print_settings_get_rgba(settings, info->color, V3270_COLOR_COUNT);  
397 - g_autofree gchar * colors = v3270_print_settings_get_color_scheme(settings);  
398 - set_string_to_config("print","colors","%s",colors);  
399 -  
400 } 188 }
  189 + */
401 190
402 #ifdef _WIN32 191 #ifdef _WIN32
403 void update_settings(const gchar *key, const gchar *val, gpointer *settings) 192 void update_settings(const gchar *key, const gchar *val, gpointer *settings)
@@ -432,6 +221,12 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -432,6 +221,12 @@ static gchar * enum_to_string(GType type, guint enum_value)
432 221
433 #endif // _WIN32 222 #endif // _WIN32
434 223
  224 +#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32)
  225 +/*
  226 +*/
  227 +#endif // !WIN32
  228 +
  229 +/*
435 static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info) 230 static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info)
436 { 231 {
437 GtkPrintOperation * print = gtk_print_operation_new(); 232 GtkPrintOperation * print = gtk_print_operation_new();
@@ -467,16 +262,13 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -467,16 +262,13 @@ static gchar * enum_to_string(GType type, guint enum_value)
467 { 262 {
468 g_autofree gchar *color_scheme = get_string_from_config("print","colors",""); 263 g_autofree gchar *color_scheme = get_string_from_config("print","colors","");
469 264
470 - trace("info->color=%p",info->color);  
471 - trace("colorlist=%p",ptr);  
472 -  
473 if(color_scheme && *color_scheme) 265 if(color_scheme && *color_scheme)
474 - v3270_set_color_table(info->color,color_scheme); 266 + v3270_set_color_table((*info)->color,color_scheme);
475 else 267 else
476 - v3270_set_mono_color_table(info->color,"black","white"); 268 + v3270_set_mono_color_table((*info)->color,"black","white");
477 269
478 } 270 }
479 -#endif // _WIN32 271 +#endif // !_WIN32
480 272
481 // Load page and print settings 273 // Load page and print settings
482 { 274 {
@@ -650,6 +442,7 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -650,6 +442,7 @@ static gchar * enum_to_string(GType type, guint enum_value)
650 trace("%s ends",__FUNCTION__); 442 trace("%s ends",__FUNCTION__);
651 return print; 443 return print;
652 } 444 }
  445 + */
653 446
654 void print_all_action(GtkAction *action, GtkWidget *widget) 447 void print_all_action(GtkAction *action, GtkWidget *widget)
655 { 448 {
@@ -661,36 +454,66 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -661,36 +454,66 @@ static gchar * enum_to_string(GType type, guint enum_value)
661 pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_SELECTED); 454 pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_SELECTED);
662 } 455 }
663 456
664 - static void draw_text(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info) 457 + void print_copy_action(GtkAction *action, GtkWidget *widget)
665 { 458 {
666 - cairo_t * cr = gtk_print_context_get_cairo_context(context);  
667 - GdkRectangle rect;  
668 - int row = pg*info->lpp;  
669 - int l; 459 + pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_COPY);
  460 + }
  461 +
  462 + LIB3270_EXPORT int pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, LIB3270_CONTENT_OPTION src)
  463 + {
  464 + int rc = 0;
  465 +
  466 + g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL);
  467 +
  468 + if(action)
  469 + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(GTK_ACTION(action)),widget);
670 470
671 - cairo_set_scaled_font(cr,info->font.scaled); 471 + //
  472 + // Create and setup dialog
  473 + //
  474 + GtkPrintOperation * operation = v3270_print_operation_new(widget,src);
672 475
673 - memset(&rect,0,sizeof(rect));  
674 - rect.y = 2;  
675 - rect.height = (info->font.height + info->font.descent)+1;  
676 - rect.width = info->font.width+1; 476 + gtk_print_operation_set_allow_async(operation,get_boolean_from_config("print","allow_async",TRUE));
677 477
678 - for(l=0;l<info->lpp && row < info->rows;l++) 478 + setup_print_dialog(operation);
  479 +
  480 + //
  481 + // Run print dialog
  482 + //
  483 + GError *err = NULL;
  484 + gtk_print_operation_run(
  485 + operation,
  486 + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
  487 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  488 + &err
  489 + );
  490 +
  491 + if(err)
679 { 492 {
680 - cairo_move_to(cr,2,rect.y+rect.height);  
681 - cairo_show_text(cr, info->text[row]);  
682 - cairo_stroke(cr);  
683 - row++;  
684 - rect.y += (rect.height-1); 493 + GtkWidget *popup = gtk_message_dialog_new_with_markup(
  494 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  495 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  496 + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
  497 + _("Can't print")
  498 + );
  499 +
  500 + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed"));
  501 +
  502 + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",err->message);
  503 +
  504 + gtk_dialog_run(GTK_DIALOG(popup));
  505 + gtk_widget_destroy(popup);
  506 +
  507 + g_error_free(err);
  508 +
  509 + rc = -1;
685 } 510 }
686 511
687 - } 512 + return rc;
688 513
689 - void print_copy_action(GtkAction *action, GtkWidget *widget)  
690 - {  
691 - pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_COPY);  
692 } 514 }
693 515
  516 + /*
694 LIB3270_EXPORT int pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, LIB3270_CONTENT_OPTION src) 517 LIB3270_EXPORT int pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, LIB3270_CONTENT_OPTION src)
695 { 518 {
696 PRINT_INFO * info = NULL; 519 PRINT_INFO * info = NULL;
@@ -760,11 +583,11 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -760,11 +583,11 @@ static gchar * enum_to_string(GType type, guint enum_value)
760 583
761 return 0; 584 return 0;
762 } 585 }
  586 + */
763 587
764 void print_settings_action(GtkAction *action, GtkWidget *terminal) 588 void print_settings_action(GtkAction *action, GtkWidget *terminal)
765 { 589 {
766 const gchar * title = g_object_get_data(G_OBJECT(action),"title"); 590 const gchar * title = g_object_get_data(G_OBJECT(action),"title");
767 - PRINT_INFO info;  
768 GtkWidget * widget; 591 GtkWidget * widget;
769 GtkWidget * dialog = gtk_dialog_new_with_buttons ( gettext(title ? title : N_( "Print settings") ), 592 GtkWidget * dialog = gtk_dialog_new_with_buttons ( gettext(title ? title : N_( "Print settings") ),
770 GTK_WINDOW(gtk_widget_get_toplevel(terminal)), 593 GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
@@ -773,8 +596,6 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal) @@ -773,8 +596,6 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal)
773 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, 596 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
774 NULL ); 597 NULL );
775 598
776 - memset(&info,0,sizeof(info));  
777 -  
778 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); 599 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
779 600
780 // https://developer.gnome.org/hig/stable/visual-layout.html.en 601 // https://developer.gnome.org/hig/stable/visual-layout.html.en
@@ -788,14 +609,33 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal) @@ -788,14 +609,33 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal)
788 18 609 18
789 ); 610 );
790 611
791 - widget = GTK_WIDGET(create_custom_widget(NULL,&info)); 612 + // Create settings widget & load values from configuration.
  613 + GtkWidget * settings = V3270_print_settings_new(terminal);
792 614
793 - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(widget),TRUE,TRUE,2); 615 + // Load settings.
  616 + {
  617 + g_autofree gchar * font_family = get_string_from_config("print",FONT_CONFIG,DEFAULT_FONT);
  618 + if(font_family && *font_family)
  619 + v3270_print_settings_set_font_family(settings,font_family);
  620 +
  621 + g_autofree gchar * color_scheme = get_string_from_config("print","colors","");
  622 + if(color_scheme && *color_scheme)
  623 + v3270_print_settings_set_color_scheme(settings,color_scheme);
  624 + }
  625 +
  626 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),settings,TRUE,TRUE,2);
794 627
795 if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) 628 if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
796 { 629 {
797 // Accepted, save settings 630 // Accepted, save settings
798 - custom_widget_apply(NULL,widget,&info); 631 +
  632 + // Save font family
  633 + g_autofree gchar * font_family = v3270_print_settings_get_font_family(settings);
  634 + set_string_to_config("print",FONT_CONFIG,font_family);
  635 +
  636 + // Save colors
  637 + g_autofree gchar * colors = v3270_print_settings_get_color_scheme(settings);
  638 + set_string_to_config("print","colors","%s",colors);
799 } 639 }
800 640
801 gtk_widget_destroy(dialog); 641 gtk_widget_destroy(dialog);
src/pw3270/private.h
@@ -76,6 +76,9 @@ @@ -76,6 +76,9 @@
76 G_GNUC_INTERNAL GtkWidget * color_scheme_new(const GdkRGBA *current); 76 G_GNUC_INTERNAL GtkWidget * color_scheme_new(const GdkRGBA *current);
77 G_GNUC_INTERNAL void run_security_dialog(GtkWidget *widget); 77 G_GNUC_INTERNAL void run_security_dialog(GtkWidget *widget);
78 78
  79 + // Tools
  80 + G_GNUC_INTERNAL void setup_print_dialog(GtkPrintOperation * operation);
  81 +
79 // actions 82 // actions
80 G_GNUC_INTERNAL void paste_file_action(GtkAction *action, GtkWidget *widget); 83 G_GNUC_INTERNAL void paste_file_action(GtkAction *action, GtkWidget *widget);
81 G_GNUC_INTERNAL void hostname_action(GtkAction *action, GtkWidget *widget); 84 G_GNUC_INTERNAL void hostname_action(GtkAction *action, GtkWidget *widget);
src/pw3270/resources.rc.in
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -#include <windows.h>  
2 -  
3 -1 ICON @PACKAGE_TARNAME@.ico  
4 -  
5 -VS_VERSION_INFO VERSIONINFO  
6 -FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0  
7 -PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0  
8 -  
9 -BEGIN  
10 -  
11 - BLOCK "StringFileInfo"  
12 - BEGIN  
13 - BLOCK "080904E4"  
14 - BEGIN  
15 - VALUE "FileDescription", "@PACKAGE_DESCRIPTION@\0"  
16 - VALUE "CompanyName", "Banco do Brasil S/A.\0"  
17 - VALUE "FileVersion", "@WIN32_VERSION@\0"  
18 - VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0"  
19 - VALUE "OriginalFilename", "@PACKAGE_TARNAME@.exe\0"  
20 - VALUE "ProductName", "@PACKAGE_NAME@\0"  
21 - VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0"  
22 - END  
23 - END  
24 -  
25 - BLOCK "VarFileInfo"  
26 - BEGIN  
27 - VALUE "Translation", 0x809, 0x04E4  
28 - END  
29 -  
30 -END  
31 -  
src/pw3270/windows/print.c 0 → 100644
@@ -0,0 +1,44 @@ @@ -0,0 +1,44 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include "private.h"
  31 + #include <v3270.h>
  32 + #include <v3270/print.h>
  33 + #include <lib3270/selection.h>
  34 + #include <lib3270/trace.h>
  35 +
  36 +
  37 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  38 +
  39 +
  40 +void setup_print_dialog(GtkPrintOperation * operation)
  41 +{
  42 +
  43 +}
  44 +
src/pw3270/windows/resources.rc.in 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +#include <windows.h>
  2 +
  3 +1 ICON @PACKAGE_TARNAME@.ico
  4 +
  5 +VS_VERSION_INFO VERSIONINFO
  6 +FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0
  7 +PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0
  8 +
  9 +BEGIN
  10 +
  11 + BLOCK "StringFileInfo"
  12 + BEGIN
  13 + BLOCK "080904E4"
  14 + BEGIN
  15 + VALUE "FileDescription", "@PACKAGE_DESCRIPTION@\0"
  16 + VALUE "CompanyName", "Banco do Brasil S/A.\0"
  17 + VALUE "FileVersion", "@WIN32_VERSION@\0"
  18 + VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0"
  19 + VALUE "OriginalFilename", "@PACKAGE_TARNAME@.exe\0"
  20 + VALUE "ProductName", "@PACKAGE_NAME@\0"
  21 + VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0"
  22 + END
  23 + END
  24 +
  25 + BLOCK "VarFileInfo"
  26 + BEGIN
  27 + VALUE "Translation", 0x809, 0x04E4
  28 + END
  29 +
  30 +END
  31 +