Commit e7efe4fea4cc7075e2d3dfe64f76e1f24d1950a3
1 parent
6267a1c5
Exists in
master
and in
5 other branches
Corrigindo diálogo de impressão
Showing
1 changed file
with
85 additions
and
67 deletions
Show diff stats
src/pw3270/print.c
... | ... | @@ -51,6 +51,7 @@ |
51 | 51 | int show_selection : 1; |
52 | 52 | PW3270_SRC src; |
53 | 53 | |
54 | + GtkWidget * widget; | |
54 | 55 | H3270 * session; |
55 | 56 | |
56 | 57 | int baddr; |
... | ... | @@ -221,76 +222,104 @@ static gchar * enum_to_string(GType type, guint enum_value) |
221 | 222 | |
222 | 223 | #endif // WIN32 |
223 | 224 | |
225 | + static void show_print_error(GtkWidget *widget, GError *err) | |
226 | + { | |
227 | + GtkWidget *dialog = gtk_message_dialog_new_with_markup( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
228 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
229 | + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
230 | + "%s",_( "Print operation failed" )); | |
231 | + | |
232 | + g_warning(err->message); | |
233 | + | |
234 | + gtk_window_set_title(GTK_WINDOW(dialog),_("Error")); | |
235 | + | |
236 | + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",err->message); | |
237 | + | |
238 | + gtk_dialog_run(GTK_DIALOG(dialog)); | |
239 | + gtk_widget_destroy(dialog); | |
240 | +} | |
241 | + | |
224 | 242 | static void done(GtkPrintOperation *prt, GtkPrintOperationResult result, PRINT_INFO *info) |
225 | 243 | { |
226 | -#ifdef WIN32 | |
244 | + if(result == GTK_PRINT_OPERATION_RESULT_ERROR) | |
245 | + { | |
246 | + GError * err = NULL; | |
227 | 247 | |
228 | - HKEY registry; | |
248 | + gtk_print_operation_get_error(prt,&err); | |
249 | + show_print_error(info->widget,err); | |
250 | + g_error_free(err); | |
229 | 251 | |
230 | - if(get_registry_handle("print",®istry,KEY_SET_VALUE)) | |
252 | + } | |
253 | + else | |
231 | 254 | { |
232 | - HKEY hKey; | |
233 | - DWORD disp; | |
255 | + // Save settings | |
256 | + GtkPrintSettings * settings = gtk_print_operation_get_print_settings(prt); | |
257 | + GtkPageSetup * pgsetup = gtk_print_operation_get_default_page_setup(prt); | |
234 | 258 | |
235 | - if(RegCreateKeyEx(registry,"settings",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS) | |
236 | - { | |
237 | - gtk_print_settings_foreach( gtk_print_operation_get_print_settings(prt), | |
238 | - (GtkPrintSettingsFunc) save_settings, | |
239 | - hKey ); | |
240 | - RegCloseKey(hKey); | |
241 | - } | |
259 | + trace("Saving settings PrintSettings=%p page_setup=%p",settings,pgsetup); | |
242 | 260 | |
243 | - if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS) | |
244 | - { | |
245 | - HKEY hPaperSize; | |
246 | - GtkPageSetup * setup = gtk_print_operation_get_default_page_setup(prt); | |
247 | - gchar * orientation = enum_to_string(GTK_TYPE_PAGE_ORIENTATION,gtk_page_setup_get_orientation(setup)); | |
261 | +#ifdef WIN32 | |
262 | + HKEY registry; | |
248 | 263 | |
249 | - // From http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c | |
250 | - save_double(hKey, "MarginTop", gtk_page_setup_get_top_margin(setup, GTK_UNIT_MM)); | |
251 | - save_double(hKey, "MarginBottom", gtk_page_setup_get_bottom_margin(setup, GTK_UNIT_MM)); | |
252 | - save_double(hKey, "MarginLeft", gtk_page_setup_get_left_margin(setup, GTK_UNIT_MM)); | |
253 | - save_double(hKey, "MarginRight", gtk_page_setup_get_right_margin(setup, GTK_UNIT_MM)); | |
254 | - save_string(hKey, "Orientation", orientation); | |
264 | + if(get_registry_handle("print",®istry,KEY_SET_VALUE)) | |
265 | + { | |
266 | + HKEY hKey; | |
267 | + DWORD disp; | |
255 | 268 | |
256 | - g_free (orientation); | |
269 | + if(RegCreateKeyEx(registry,"settings",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS) | |
270 | + { | |
271 | + gtk_print_settings_foreach( settings,(GtkPrintSettingsFunc) save_settings, hKey ); | |
272 | + RegCloseKey(hKey); | |
273 | + } | |
257 | 274 | |
258 | - if(RegCreateKeyEx(hKey,"papersize",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hPaperSize,&disp) == ERROR_SUCCESS) | |
275 | + if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS) | |
259 | 276 | { |
260 | - GtkPaperSize *size = gtk_page_setup_get_paper_size(setup); | |
261 | - if(size) | |
262 | - { | |
263 | - // From http://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c | |
264 | - const gchar *name = gtk_paper_size_get_name(size); | |
265 | - const gchar *display_name = gtk_paper_size_get_display_name(size); | |
266 | - const gchar *ppd_name = gtk_paper_size_get_ppd_name(size); | |
277 | + HKEY hPaperSize; | |
278 | + gchar * orientation = enum_to_string(GTK_TYPE_PAGE_ORIENTATION,gtk_page_setup_get_orientation(pgsetup)); | |
267 | 279 | |
268 | - if (ppd_name != NULL) | |
269 | - save_string(hPaperSize,"PPDName", ppd_name); | |
270 | - else | |
271 | - save_string(hPaperSize,"Name", name); | |
280 | + // From http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c | |
281 | + save_double(hKey, "MarginTop", gtk_page_setup_get_top_margin(pgsetup, GTK_UNIT_MM)); | |
282 | + save_double(hKey, "MarginBottom", gtk_page_setup_get_bottom_margin(pgsetup, GTK_UNIT_MM)); | |
283 | + save_double(hKey, "MarginLeft", gtk_page_setup_get_left_margin(pgsetup, GTK_UNIT_MM)); | |
284 | + save_double(hKey, "MarginRight", gtk_page_setup_get_right_margin(pgsetup, GTK_UNIT_MM)); | |
285 | + save_string(hKey, "Orientation", orientation); | |
272 | 286 | |
273 | - if (display_name) | |
274 | - save_string(hPaperSize,"DisplayName", display_name); | |
287 | + g_free (orientation); | |
275 | 288 | |
276 | - save_double(hPaperSize, "Width", gtk_paper_size_get_width (size, GTK_UNIT_MM)); | |
277 | - save_double(hPaperSize, "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM)); | |
289 | + if(RegCreateKeyEx(hKey,"papersize",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hPaperSize,&disp) == ERROR_SUCCESS) | |
290 | + { | |
291 | + GtkPaperSize *size = gtk_page_setup_get_paper_size(pgsetup); | |
292 | + if(size) | |
293 | + { | |
294 | + // From http://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c | |
295 | + const gchar *name = gtk_paper_size_get_name(size); | |
296 | + const gchar *display_name = gtk_paper_size_get_display_name(size); | |
297 | + const gchar *ppd_name = gtk_paper_size_get_ppd_name(size); | |
298 | + | |
299 | + if (ppd_name != NULL) | |
300 | + save_string(hPaperSize,"PPDName", ppd_name); | |
301 | + else | |
302 | + save_string(hPaperSize,"Name", name); | |
303 | + | |
304 | + if (display_name) | |
305 | + save_string(hPaperSize,"DisplayName", display_name); | |
306 | + | |
307 | + save_double(hPaperSize, "Width", gtk_paper_size_get_width (size, GTK_UNIT_MM)); | |
308 | + save_double(hPaperSize, "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM)); | |
309 | + } | |
310 | + RegCloseKey(hPaperSize); | |
278 | 311 | } |
279 | - RegCloseKey(hPaperSize); | |
312 | + RegCloseKey(hKey); | |
280 | 313 | } |
281 | - RegCloseKey(hKey); | |
282 | - } | |
283 | - | |
284 | - RegCloseKey(registry); | |
285 | - } | |
286 | 314 | |
315 | + RegCloseKey(registry); | |
316 | + } | |
287 | 317 | #else |
288 | - GKeyFile * conf = get_application_keyfile(); | |
289 | - | |
290 | - gtk_print_settings_to_key_file(gtk_print_operation_get_print_settings(prt),conf,"print_settings"); | |
291 | - gtk_page_setup_to_key_file(gtk_print_operation_get_default_page_setup(prt),conf,"page_setup"); | |
292 | - | |
318 | + GKeyFile * conf = get_application_keyfile(); | |
319 | + gtk_print_settings_to_key_file(settings,conf,"print_settings"); | |
320 | + gtk_page_setup_to_key_file(pgsetup,conf,"page_setup"); | |
293 | 321 | #endif |
322 | + } | |
294 | 323 | |
295 | 324 | if(info->font_scaled) |
296 | 325 | cairo_scaled_font_destroy(info->font_scaled); |
... | ... | @@ -470,6 +499,8 @@ static gchar * enum_to_string(GType type, guint enum_value) |
470 | 499 | GtkWidget * combo = g_object_get_data(G_OBJECT(widget),"combo"); |
471 | 500 | GdkColor * clr = g_object_get_data(G_OBJECT(combo),"selected"); |
472 | 501 | |
502 | + trace("%s starts combo=%p clr=%p widget=%p",__FUNCTION__,combo,clr,widget); | |
503 | + | |
473 | 504 | if(info->font) |
474 | 505 | set_string_to_config("print",FONT_CONFIG,info->font); |
475 | 506 | |
... | ... | @@ -487,7 +518,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
487 | 518 | set_string_to_config("print","colors","%s",str->str); |
488 | 519 | g_string_free(str,TRUE); |
489 | 520 | } |
490 | - g_object_unref(combo); | |
521 | + | |
491 | 522 | } |
492 | 523 | |
493 | 524 | #ifdef WIN32 |
... | ... | @@ -507,6 +538,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
507 | 538 | *info = g_new0(PRINT_INFO,1); |
508 | 539 | (*info)->session = v3270_get_session(widget); |
509 | 540 | (*info)->cols = 80; |
541 | + (*info)->widget = widget; | |
510 | 542 | |
511 | 543 | // Basic setup |
512 | 544 | gtk_print_operation_set_allow_async(print,get_boolean_from_config("print","allow_async",TRUE)); |
... | ... | @@ -692,22 +724,8 @@ static gchar * enum_to_string(GType type, guint enum_value) |
692 | 724 | |
693 | 725 | if(err) |
694 | 726 | { |
695 | - GtkWidget *dialog; | |
696 | - | |
697 | - g_warning(err->message); | |
698 | - | |
699 | - dialog = gtk_message_dialog_new_with_markup( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
700 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
701 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
702 | - "%s",_( "Print operation failed" )); | |
703 | - | |
704 | - gtk_window_set_title(GTK_WINDOW(dialog),_("Error")); | |
705 | - | |
706 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",err->message); | |
727 | + show_print_error(widget,err); | |
707 | 728 | g_error_free(err); |
708 | - | |
709 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
710 | - gtk_widget_destroy(dialog); | |
711 | 729 | } |
712 | 730 | |
713 | 731 | g_object_unref(print); | ... | ... |