Commit 25c36ce46ad518f2ca1f851d607e69c31a375773
1 parent
b2e41aad
Exists in
master
and in
5 other branches
gtk3 for windows da segfault quando usa "custom widgets" no dialogo de impressao
Showing
2 changed files
with
66 additions
and
14 deletions
Show diff stats
src/include/pw3270.h
| ... | ... | @@ -68,6 +68,17 @@ |
| 68 | 68 | |
| 69 | 69 | LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint def); |
| 70 | 70 | |
| 71 | + typedef enum pw3270_src | |
| 72 | + { | |
| 73 | + PW3270_SRC_ALL, /**< Screen contents */ | |
| 74 | + PW3270_SRC_SELECTED, /**< Selected region */ | |
| 75 | + | |
| 76 | + PW3270_SRC_USER | |
| 77 | + } PW3270_SRC; | |
| 78 | + | |
| 79 | + LIB3270_EXPORT void pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, PW3270_SRC src); | |
| 80 | + | |
| 81 | + | |
| 71 | 82 | #ifdef HAVE_GTKMAC |
| 72 | 83 | #include <gtk-mac-bundle.h> |
| 73 | 84 | LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); | ... | ... |
src/pw3270/print.c
| ... | ... | @@ -39,7 +39,7 @@ |
| 39 | 39 | { |
| 40 | 40 | GdkColor color[V3270_COLOR_COUNT]; |
| 41 | 41 | int show_selection : 1; |
| 42 | - int all : 1; | |
| 42 | + PW3270_SRC src; | |
| 43 | 43 | |
| 44 | 44 | H3270 * session; |
| 45 | 45 | gchar * font; |
| ... | ... | @@ -66,6 +66,7 @@ |
| 66 | 66 | { |
| 67 | 67 | cairo_t *cr = gtk_print_context_get_cairo_context(context); |
| 68 | 68 | |
| 69 | + trace("Font: %s",info->font); | |
| 69 | 70 | cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, info->fontweight); |
| 70 | 71 | |
| 71 | 72 | info->font_scaled = cairo_get_scaled_font(cr); |
| ... | ... | @@ -127,7 +128,7 @@ |
| 127 | 128 | unsigned char c; |
| 128 | 129 | unsigned short attr; |
| 129 | 130 | |
| 130 | - if(!lib3270_get_element(info->session,baddr++,&c,&attr) && (info->all || (attr & LIB3270_ATTR_SELECTED))) | |
| 131 | + if(!lib3270_get_element(info->session,baddr++,&c,&attr) && (info->src == PW3270_SRC_ALL || (attr & LIB3270_ATTR_SELECTED))) | |
| 131 | 132 | { |
| 132 | 133 | if(!info->show_selection) |
| 133 | 134 | attr &= ~LIB3270_ATTR_SELECTED; |
| ... | ... | @@ -298,15 +299,30 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 298 | 299 | set_boolean_to_config("print","selection",active); |
| 299 | 300 | } |
| 300 | 301 | |
| 302 | + static void load_settings(PRINT_INFO *i) | |
| 303 | + { | |
| 304 | + gchar *ptr = get_string_from_config("print","colors",""); | |
| 305 | + | |
| 306 | + i->font = get_string_from_config("print","font","Courier 10"); | |
| 307 | + | |
| 308 | + if(*ptr) | |
| 309 | + v3270_set_color_table(i->color,ptr); | |
| 310 | + else | |
| 311 | + v3270_set_mono_color_table(i->color,"black","white"); | |
| 312 | + g_free(ptr); | |
| 313 | + } | |
| 314 | + | |
| 301 | 315 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) |
| 302 | 316 | { |
| 303 | - static const gchar * text[] = { N_( "_Font:" ), N_( "C_olor scheme:" ) }; | |
| 304 | 317 | GtkWidget * container = gtk_table_new(3,2,FALSE); |
| 318 | + static const gchar * text[] = { N_( "_Font:" ), N_( "C_olor scheme:" ) }; | |
| 305 | 319 | GtkWidget * label[G_N_ELEMENTS(text)]; |
| 306 | 320 | GtkWidget * widget; |
| 307 | 321 | int f; |
| 308 | 322 | gchar * ptr; |
| 309 | 323 | |
| 324 | + trace("%s starts",__FUNCTION__); | |
| 325 | + | |
| 310 | 326 | for(f=0;f<G_N_ELEMENTS(label);f++) |
| 311 | 327 | { |
| 312 | 328 | label[f] = gtk_label_new_with_mnemonic(gettext(text[f])); |
| ... | ... | @@ -323,19 +339,11 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 323 | 339 | #endif // GTK(3,2,0) |
| 324 | 340 | gtk_table_attach(GTK_TABLE(container),widget,1,2,0,1,GTK_EXPAND|GTK_FILL,GTK_FILL,5,0); |
| 325 | 341 | |
| 326 | - info->font = get_string_from_config("print","font","Courier 10"); | |
| 342 | + load_settings(info); | |
| 327 | 343 | gtk_font_button_set_font_name((GtkFontButton *) widget,info->font); |
| 328 | 344 | font_set((GtkFontButton *) widget,info); |
| 329 | 345 | g_signal_connect(G_OBJECT(widget),"font-set",G_CALLBACK(font_set),info); |
| 330 | 346 | |
| 331 | - // Color scheme dropdown | |
| 332 | - ptr = get_string_from_config("print","colors",""); | |
| 333 | - if(*ptr) | |
| 334 | - v3270_set_color_table(info->color,ptr); | |
| 335 | - else | |
| 336 | - v3270_set_mono_color_table(info->color,"black","white"); | |
| 337 | - g_free(ptr); | |
| 338 | - | |
| 339 | 347 | widget = color_scheme_new(info->color); |
| 340 | 348 | gtk_label_set_mnemonic_widget(GTK_LABEL(label[1]),widget); |
| 341 | 349 | |
| ... | ... | @@ -345,7 +353,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 345 | 353 | // Selection checkbox |
| 346 | 354 | widget = gtk_check_button_new_with_label(_("Print selection box")); |
| 347 | 355 | |
| 348 | - if(info->all) | |
| 356 | + if(info->src == PW3270_SRC_ALL) | |
| 349 | 357 | { |
| 350 | 358 | info->show_selection = get_boolean_from_config("print","selection",FALSE); |
| 351 | 359 | gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),info->show_selection); |
| ... | ... | @@ -361,7 +369,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 361 | 369 | // Show and return |
| 362 | 370 | gtk_widget_show_all(container); |
| 363 | 371 | |
| 364 | - trace("%s ends",__FUNCTION__); | |
| 372 | + trace("%s ends container=%p",__FUNCTION__,container); | |
| 365 | 373 | return G_OBJECT(container); |
| 366 | 374 | } |
| 367 | 375 | |
| ... | ... | @@ -419,8 +427,13 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 419 | 427 | |
| 420 | 428 | // Common signals |
| 421 | 429 | g_signal_connect(print,"done",G_CALLBACK(done),*info); |
| 430 | + | |
| 431 | +#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32) | |
| 422 | 432 | g_signal_connect(print,"create-custom-widget",G_CALLBACK(create_custom_widget), *info); |
| 423 | 433 | g_signal_connect(print,"custom-widget-apply",G_CALLBACK(custom_widget_apply), *info); |
| 434 | +#else | |
| 435 | + load_settings(*info); | |
| 436 | +#endif // WIN32 | |
| 424 | 437 | |
| 425 | 438 | // Load page and print settings |
| 426 | 439 | { |
| ... | ... | @@ -485,6 +498,9 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 485 | 498 | |
| 486 | 499 | void print_all_action(GtkAction *action, GtkWidget *widget) |
| 487 | 500 | { |
| 501 | + pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, PW3270_SRC_ALL); | |
| 502 | + | |
| 503 | +/* | |
| 488 | 504 | PRINT_INFO * info = NULL; |
| 489 | 505 | GtkPrintOperation * print = begin_print_operation(G_OBJECT(action),widget,&info); |
| 490 | 506 | |
| ... | ... | @@ -503,10 +519,14 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 503 | 519 | |
| 504 | 520 | |
| 505 | 521 | g_object_unref(print); |
| 522 | +*/ | |
| 506 | 523 | } |
| 507 | 524 | |
| 508 | 525 | void print_selected_action(GtkAction *action, GtkWidget *widget) |
| 509 | 526 | { |
| 527 | + pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, PW3270_SRC_SELECTED); | |
| 528 | + | |
| 529 | +/* | |
| 510 | 530 | PRINT_INFO * info = NULL; |
| 511 | 531 | int start, end, rows; |
| 512 | 532 | GtkPrintOperation * print = begin_print_operation(G_OBJECT(action),widget,&info);; |
| ... | ... | @@ -537,6 +557,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 537 | 557 | gtk_print_operation_run(print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,GTK_WINDOW(gtk_widget_get_toplevel(widget)),NULL); |
| 538 | 558 | |
| 539 | 559 | g_object_unref(print); |
| 560 | +*/ | |
| 540 | 561 | } |
| 541 | 562 | |
| 542 | 563 | static void draw_text(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info) |
| ... | ... | @@ -598,3 +619,23 @@ static gchar * enum_to_string(GType type, guint enum_value) |
| 598 | 619 | g_object_unref(print); |
| 599 | 620 | } |
| 600 | 621 | |
| 622 | + LIB3270_EXPORT void pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, PW3270_SRC src) | |
| 623 | + { | |
| 624 | + PRINT_INFO * info = NULL; | |
| 625 | + GtkPrintOperation * print = begin_print_operation(action,widget,&info); | |
| 626 | + | |
| 627 | + #ifdef X3270_TRACE | |
| 628 | + if(action) | |
| 629 | + lib3270_trace_event(NULL,"Action %s activated on widget %p\n",gtk_action_get_name(GTK_ACTION(action)),widget); | |
| 630 | + #endif | |
| 631 | + | |
| 632 | + lib3270_get_screen_size(info->session,&info->rows,&info->cols); | |
| 633 | + | |
| 634 | + info->src = src; | |
| 635 | + g_signal_connect(print,"begin_print",G_CALLBACK(begin_print),info); | |
| 636 | + g_signal_connect(print,"draw_page",G_CALLBACK(draw_screen),info); | |
| 637 | + | |
| 638 | + // Run Print dialog | |
| 639 | + gtk_print_operation_run(print,oper,GTK_WINDOW(gtk_widget_get_toplevel(widget)),NULL); | |
| 640 | + g_object_unref(print); | |
| 641 | + } | ... | ... |