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,6 +68,17 @@ | ||
68 | 68 | ||
69 | LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint def); | 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 | #ifdef HAVE_GTKMAC | 82 | #ifdef HAVE_GTKMAC |
72 | #include <gtk-mac-bundle.h> | 83 | #include <gtk-mac-bundle.h> |
73 | LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); | 84 | LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); |
src/pw3270/print.c
@@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
39 | { | 39 | { |
40 | GdkColor color[V3270_COLOR_COUNT]; | 40 | GdkColor color[V3270_COLOR_COUNT]; |
41 | int show_selection : 1; | 41 | int show_selection : 1; |
42 | - int all : 1; | 42 | + PW3270_SRC src; |
43 | 43 | ||
44 | H3270 * session; | 44 | H3270 * session; |
45 | gchar * font; | 45 | gchar * font; |
@@ -66,6 +66,7 @@ | @@ -66,6 +66,7 @@ | ||
66 | { | 66 | { |
67 | cairo_t *cr = gtk_print_context_get_cairo_context(context); | 67 | cairo_t *cr = gtk_print_context_get_cairo_context(context); |
68 | 68 | ||
69 | + trace("Font: %s",info->font); | ||
69 | cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, info->fontweight); | 70 | cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, info->fontweight); |
70 | 71 | ||
71 | info->font_scaled = cairo_get_scaled_font(cr); | 72 | info->font_scaled = cairo_get_scaled_font(cr); |
@@ -127,7 +128,7 @@ | @@ -127,7 +128,7 @@ | ||
127 | unsigned char c; | 128 | unsigned char c; |
128 | unsigned short attr; | 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 | if(!info->show_selection) | 133 | if(!info->show_selection) |
133 | attr &= ~LIB3270_ATTR_SELECTED; | 134 | attr &= ~LIB3270_ATTR_SELECTED; |
@@ -298,15 +299,30 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -298,15 +299,30 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
298 | set_boolean_to_config("print","selection",active); | 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 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) | 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 | GtkWidget * container = gtk_table_new(3,2,FALSE); | 317 | GtkWidget * container = gtk_table_new(3,2,FALSE); |
318 | + static const gchar * text[] = { N_( "_Font:" ), N_( "C_olor scheme:" ) }; | ||
305 | GtkWidget * label[G_N_ELEMENTS(text)]; | 319 | GtkWidget * label[G_N_ELEMENTS(text)]; |
306 | GtkWidget * widget; | 320 | GtkWidget * widget; |
307 | int f; | 321 | int f; |
308 | gchar * ptr; | 322 | gchar * ptr; |
309 | 323 | ||
324 | + trace("%s starts",__FUNCTION__); | ||
325 | + | ||
310 | for(f=0;f<G_N_ELEMENTS(label);f++) | 326 | for(f=0;f<G_N_ELEMENTS(label);f++) |
311 | { | 327 | { |
312 | label[f] = gtk_label_new_with_mnemonic(gettext(text[f])); | 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,19 +339,11 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
323 | #endif // GTK(3,2,0) | 339 | #endif // GTK(3,2,0) |
324 | gtk_table_attach(GTK_TABLE(container),widget,1,2,0,1,GTK_EXPAND|GTK_FILL,GTK_FILL,5,0); | 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 | gtk_font_button_set_font_name((GtkFontButton *) widget,info->font); | 343 | gtk_font_button_set_font_name((GtkFontButton *) widget,info->font); |
328 | font_set((GtkFontButton *) widget,info); | 344 | font_set((GtkFontButton *) widget,info); |
329 | g_signal_connect(G_OBJECT(widget),"font-set",G_CALLBACK(font_set),info); | 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 | widget = color_scheme_new(info->color); | 347 | widget = color_scheme_new(info->color); |
340 | gtk_label_set_mnemonic_widget(GTK_LABEL(label[1]),widget); | 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,7 +353,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
345 | // Selection checkbox | 353 | // Selection checkbox |
346 | widget = gtk_check_button_new_with_label(_("Print selection box")); | 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 | info->show_selection = get_boolean_from_config("print","selection",FALSE); | 358 | info->show_selection = get_boolean_from_config("print","selection",FALSE); |
351 | gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),info->show_selection); | 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,7 +369,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
361 | // Show and return | 369 | // Show and return |
362 | gtk_widget_show_all(container); | 370 | gtk_widget_show_all(container); |
363 | 371 | ||
364 | - trace("%s ends",__FUNCTION__); | 372 | + trace("%s ends container=%p",__FUNCTION__,container); |
365 | return G_OBJECT(container); | 373 | return G_OBJECT(container); |
366 | } | 374 | } |
367 | 375 | ||
@@ -419,8 +427,13 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -419,8 +427,13 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
419 | 427 | ||
420 | // Common signals | 428 | // Common signals |
421 | g_signal_connect(print,"done",G_CALLBACK(done),*info); | 429 | g_signal_connect(print,"done",G_CALLBACK(done),*info); |
430 | + | ||
431 | +#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32) | ||
422 | g_signal_connect(print,"create-custom-widget",G_CALLBACK(create_custom_widget), *info); | 432 | g_signal_connect(print,"create-custom-widget",G_CALLBACK(create_custom_widget), *info); |
423 | g_signal_connect(print,"custom-widget-apply",G_CALLBACK(custom_widget_apply), *info); | 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 | // Load page and print settings | 438 | // Load page and print settings |
426 | { | 439 | { |
@@ -485,6 +498,9 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -485,6 +498,9 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
485 | 498 | ||
486 | void print_all_action(GtkAction *action, GtkWidget *widget) | 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 | PRINT_INFO * info = NULL; | 504 | PRINT_INFO * info = NULL; |
489 | GtkPrintOperation * print = begin_print_operation(G_OBJECT(action),widget,&info); | 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,10 +519,14 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
503 | 519 | ||
504 | 520 | ||
505 | g_object_unref(print); | 521 | g_object_unref(print); |
522 | +*/ | ||
506 | } | 523 | } |
507 | 524 | ||
508 | void print_selected_action(GtkAction *action, GtkWidget *widget) | 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 | PRINT_INFO * info = NULL; | 530 | PRINT_INFO * info = NULL; |
511 | int start, end, rows; | 531 | int start, end, rows; |
512 | GtkPrintOperation * print = begin_print_operation(G_OBJECT(action),widget,&info);; | 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,6 +557,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
537 | gtk_print_operation_run(print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,GTK_WINDOW(gtk_widget_get_toplevel(widget)),NULL); | 557 | gtk_print_operation_run(print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,GTK_WINDOW(gtk_widget_get_toplevel(widget)),NULL); |
538 | 558 | ||
539 | g_object_unref(print); | 559 | g_object_unref(print); |
560 | +*/ | ||
540 | } | 561 | } |
541 | 562 | ||
542 | static void draw_text(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info) | 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,3 +619,23 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
598 | g_object_unref(print); | 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 | + } |