diff --git a/src/gtk/print.c b/src/gtk/print.c index 050e7e9..a5118b2 100644 --- a/src/gtk/print.c +++ b/src/gtk/print.c @@ -39,11 +39,15 @@ GdkColor color[V3270_COLOR_COUNT]; H3270 * session; gchar * font; + guint fontsize; + cairo_font_weight_t fontweight; gchar * colorname; int rows; int cols; int pages; cairo_font_extents_t extents; + double width; + double height; cairo_scaled_font_t * font_scaled; } PRINT_INFO; @@ -52,12 +56,15 @@ static void setup_font(cairo_t *cr, PRINT_INFO *info) { - cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, info->fontweight); info->font_scaled = cairo_get_scaled_font(cr); cairo_scaled_font_reference(info->font_scaled); cairo_scaled_font_extents(info->font_scaled,&info->extents); + info->width = ((double) info->cols) * info->extents.max_x_advance; + info->height = ((double) info->rows) * (info->extents.height + info->extents.descent); + } static void begin_print_all(GtkPrintOperation *prt, GtkPrintContext *context, PRINT_INFO *info) @@ -72,14 +79,47 @@ static void draw_page(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info) { - cairo_t *cr = gtk_print_context_get_cairo_context(context); + int row; + int col; + cairo_t * cr = gtk_print_context_get_cairo_context(context); + int baddr = 0; + GdkRectangle rect; cairo_set_scaled_font(cr,info->font_scaled); - cairo_move_to(cr,0,0); - cairo_show_text(cr, "Teste"); + memset(&rect,0,sizeof(rect)); + + rect.x = 0; + rect.y = 0; + rect.height = (info->extents.height + info->extents.descent); + rect.width = info->extents.max_x_advance; +/* + gdk_cairo_set_source_color(cr,info->color+V3270_COLOR_BACKGROUND); + cairo_rectangle(cr, 0, 0, rect.width*info->cols, rect.height*info->rows); + cairo_fill(cr); cairo_stroke(cr); +*/ + + rect.width++; + rect.height++; + + for(row = 0; row < info->rows; row++) + { + rect.x = 0; + for(col = 0; col < info->cols; col++) + { + unsigned char c; + unsigned short attr; + + if(!lib3270_get_element(info->session,baddr++,&c,&attr)) + v3270_draw_element(cr,c,attr,info->session,info->extents.height,&rect,info->color); + + rect.x += (rect.width-1); + } + rect.y += (rect.height-1); + + } } static void done(GtkPrintOperation *prt, GtkPrintOperationResult result, PRINT_INFO *info) @@ -107,12 +147,33 @@ static void font_set(GtkFontButton *widget, PRINT_INFO *info) { + const gchar *name = gtk_font_button_get_font_name(widget); + if(info->font) g_free(info->font); - info->font = g_strdup(gtk_font_button_get_font_name(widget)); - set_string_to_config("print","font","%s",info->font); - trace("Font set to \"%s\"",info->font); +#if GTK_CHECK_VERSION(3,2,0) + + info->font = g_strdup(name); + info->fontsize = gtk_font_chooser_get_font_size((GtkFontChooser *) widget); + +#else + { + PangoFontDescription *descr = pango_font_description_from_string(name); + + info->font = g_strdup(pango_font_description_get_family(descr)); + info->fontsize = pango_font_description_get_size(descr); + info->fontweight = CAIRO_FONT_WEIGHT_NORMAL; + + if(pango_font_description_get_weight(descr) == PANGO_WEIGHT_BOLD) + info->fontweight = CAIRO_FONT_WEIGHT_BOLD; + + pango_font_description_free(descr); + } +#endif // GTK(3,2,0) + + set_string_to_config("print","font",name); + trace("Font set to \"%s\" with size %d",info->font,info->fontsize); } static void color_scheme_changed(GtkComboBox *widget,PRINT_INFO *info) @@ -139,12 +200,13 @@ if(!info->colorname) return; - trace("%s: %s->%s",__FUNCTION__,info->colorname,new_colors); +// trace("%s: %s->%s",__FUNCTION__,info->colorname,new_colors); if(*info->colorname) g_free(info->colorname); info->colorname = new_colors; + } static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) @@ -201,6 +263,7 @@ info->font = get_string_from_config("print","font","Courier 10"); gtk_font_button_set_font_name((GtkFontButton *) widget,info->font); + font_set((GtkFontButton *) widget,info); g_signal_connect(G_OBJECT(widget),"font-set",G_CALLBACK(font_set),info); // Color scheme dropdown @@ -222,9 +285,11 @@ return G_OBJECT(container); } - static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *font_dialog, gpointer user_data) + static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *widget, PRINT_INFO *info) { trace("%s",__FUNCTION__); + set_string_to_config("print","colors",info->colorname); + v3270_set_color_table(info->color,info->colorname); } static GtkPrintOperation * begin_print_operation(GtkAction *action, GtkWidget *widget, PRINT_INFO **info) @@ -236,6 +301,7 @@ *info = g_new0(PRINT_INFO,1); (*info)->session = v3270_get_session(widget); + (*info)->fontweight = CAIRO_FONT_WEIGHT_NORMAL; // Basic setup gtk_print_operation_set_allow_async(print,TRUE); diff --git a/src/gtk/uiparser/menuitem.c b/src/gtk/uiparser/menuitem.c index e3e9663..3e52766 100644 --- a/src/gtk/uiparser/menuitem.c +++ b/src/gtk/uiparser/menuitem.c @@ -108,7 +108,6 @@ } } - return G_OBJECT(widget); } diff --git a/src/gtk/uiparser/parsefile.c b/src/gtk/uiparser/parsefile.c index 4d32cc4..e29c685 100644 --- a/src/gtk/uiparser/parsefile.c +++ b/src/gtk/uiparser/parsefile.c @@ -115,6 +115,7 @@ const gchar * name = NULL; gchar * key; +trace("%s ----",__FUNCTION__); if(action) name = gtk_action_get_name(action); @@ -133,7 +134,6 @@ g_object_ref(G_OBJECT(widget)); g_hash_table_insert(info->element_list[id],key,widget); -// trace("%s - %s",__FUNCTION__,name); return widget; } diff --git a/src/gtk/v3270/draw.c b/src/gtk/v3270/draw.c index 8f4792f..60ebd7a 100644 --- a/src/gtk/v3270/draw.c +++ b/src/gtk/v3270/draw.c @@ -93,7 +93,7 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event) #endif // GTk3 -void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *color) +void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color) { GdkColor *fg; GdkColor *bg; @@ -113,10 +113,10 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, con bg = color+(attr & 0x000F); } - v3270_draw_char(cr,chr,attr,metrics,rect,fg,bg); + v3270_draw_char(cr,chr,attr,session,height,rect,fg,bg); } -void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *fg, GdkColor *bg) +void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *fg, GdkColor *bg) { // Clear element area gdk_cairo_set_source_color(cr,fg); @@ -201,27 +201,27 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const break; case 0x8c: // CG 0xf7, less or equal "≤" - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, "≤"); break; case 0xae: // CG 0xd9, greater or equal "≥" - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, "≥"); break; case 0xbe: // CG 0x3e, not equal "≠" - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, "≠"); break; case 0xad: // "[" - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, "["); break; case 0xbd: // "]" - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, "]"); break; @@ -231,11 +231,11 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const } else if(chr) { - gchar *utf = g_convert((char *) &chr, 1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); + gchar *utf = g_convert((char *) &chr, 1, "UTF-8", lib3270_get_charset(session), NULL, NULL, NULL); if(utf) { - cairo_move_to(cr,rect->x,rect->y+metrics->height); + cairo_move_to(cr,rect->x,rect->y+height); cairo_show_text(cr, utf); g_free(utf); } @@ -304,7 +304,7 @@ void v3270_reload(GtkWidget *widget) if(addr == cursor) v3270_update_cursor_rect(terminal,&rect,chr,attr); - v3270_draw_element(cr,chr,attr,&terminal->metrics,&rect,terminal->color); + v3270_draw_element(cr,chr,attr,terminal->host,terminal->metrics.height,&rect,terminal->color); addr++; rect.x += rect.width; @@ -349,7 +349,7 @@ void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned sho cr = cairo_create(terminal->surface); cairo_set_scaled_font(cr,terminal->font_scaled); - v3270_draw_element(cr, chr, attr, &terminal->metrics, &rect,terminal->color); + v3270_draw_element(cr, chr, attr, terminal->host, terminal->metrics.height, &rect,terminal->color); cairo_destroy(cr); if(cursor) @@ -386,7 +386,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short rect.x = 0; rect.y = 0; - v3270_draw_char(cr,chr,attr,&widget->metrics,&rect,bg,fg); + v3270_draw_char(cr,chr,attr,widget->host,widget->metrics.height,&rect,bg,fg); cairo_destroy(cr); } diff --git a/src/gtk/v3270/private.h b/src/gtk/v3270/private.h index f1141b7..77848b8 100644 --- a/src/gtk/v3270/private.h +++ b/src/gtk/v3270/private.h @@ -103,8 +103,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned sho void v3270_register_io_handlers(v3270Class *cls); -void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *color); -void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *fg, GdkColor *bg); +void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *fg, GdkColor *bg); void v3270_start_timer(GtkWidget *terminal); void v3270_stop_timer(GtkWidget *terminal); diff --git a/src/gtk/v3270/v3270.h b/src/gtk/v3270/v3270.h index cac1a3f..3c1ad7e 100644 --- a/src/gtk/v3270/v3270.h +++ b/src/gtk/v3270/v3270.h @@ -214,6 +214,7 @@ void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, const gchar *name); int v3270_set_color_entry(GdkColor *clr, enum V3270_COLOR id, const gchar *name); void v3270_set_color_table(GdkColor *table, const gchar *colors); + void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color); G_END_DECLS -- libgit2 0.21.2