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); | ... | ... |