Commit 86d3732f5f2a8647494559049223070276aba83b
1 parent
0a3c7900
Exists in
master
and in
5 other branches
Implementando funções de impressão
Showing
6 changed files
with
91 additions
and
26 deletions
Show diff stats
src/gtk/print.c
... | ... | @@ -39,11 +39,15 @@ |
39 | 39 | GdkColor color[V3270_COLOR_COUNT]; |
40 | 40 | H3270 * session; |
41 | 41 | gchar * font; |
42 | + guint fontsize; | |
43 | + cairo_font_weight_t fontweight; | |
42 | 44 | gchar * colorname; |
43 | 45 | int rows; |
44 | 46 | int cols; |
45 | 47 | int pages; |
46 | 48 | cairo_font_extents_t extents; |
49 | + double width; | |
50 | + double height; | |
47 | 51 | cairo_scaled_font_t * font_scaled; |
48 | 52 | |
49 | 53 | } PRINT_INFO; |
... | ... | @@ -52,12 +56,15 @@ |
52 | 56 | |
53 | 57 | static void setup_font(cairo_t *cr, PRINT_INFO *info) |
54 | 58 | { |
55 | - cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); | |
59 | + cairo_select_font_face(cr, info->font, CAIRO_FONT_SLANT_NORMAL, info->fontweight); | |
56 | 60 | |
57 | 61 | info->font_scaled = cairo_get_scaled_font(cr); |
58 | 62 | cairo_scaled_font_reference(info->font_scaled); |
59 | 63 | cairo_scaled_font_extents(info->font_scaled,&info->extents); |
60 | 64 | |
65 | + info->width = ((double) info->cols) * info->extents.max_x_advance; | |
66 | + info->height = ((double) info->rows) * (info->extents.height + info->extents.descent); | |
67 | + | |
61 | 68 | } |
62 | 69 | |
63 | 70 | static void begin_print_all(GtkPrintOperation *prt, GtkPrintContext *context, PRINT_INFO *info) |
... | ... | @@ -72,14 +79,47 @@ |
72 | 79 | |
73 | 80 | static void draw_page(GtkPrintOperation *prt, GtkPrintContext *context, gint pg, PRINT_INFO *info) |
74 | 81 | { |
75 | - cairo_t *cr = gtk_print_context_get_cairo_context(context); | |
82 | + int row; | |
83 | + int col; | |
84 | + cairo_t * cr = gtk_print_context_get_cairo_context(context); | |
85 | + int baddr = 0; | |
86 | + GdkRectangle rect; | |
76 | 87 | |
77 | 88 | cairo_set_scaled_font(cr,info->font_scaled); |
78 | 89 | |
79 | - cairo_move_to(cr,0,0); | |
80 | - cairo_show_text(cr, "Teste"); | |
90 | + memset(&rect,0,sizeof(rect)); | |
91 | + | |
92 | + rect.x = 0; | |
93 | + rect.y = 0; | |
94 | + rect.height = (info->extents.height + info->extents.descent); | |
95 | + rect.width = info->extents.max_x_advance; | |
81 | 96 | |
97 | +/* | |
98 | + gdk_cairo_set_source_color(cr,info->color+V3270_COLOR_BACKGROUND); | |
99 | + cairo_rectangle(cr, 0, 0, rect.width*info->cols, rect.height*info->rows); | |
100 | + cairo_fill(cr); | |
82 | 101 | cairo_stroke(cr); |
102 | +*/ | |
103 | + | |
104 | + rect.width++; | |
105 | + rect.height++; | |
106 | + | |
107 | + for(row = 0; row < info->rows; row++) | |
108 | + { | |
109 | + rect.x = 0; | |
110 | + for(col = 0; col < info->cols; col++) | |
111 | + { | |
112 | + unsigned char c; | |
113 | + unsigned short attr; | |
114 | + | |
115 | + if(!lib3270_get_element(info->session,baddr++,&c,&attr)) | |
116 | + v3270_draw_element(cr,c,attr,info->session,info->extents.height,&rect,info->color); | |
117 | + | |
118 | + rect.x += (rect.width-1); | |
119 | + } | |
120 | + rect.y += (rect.height-1); | |
121 | + | |
122 | + } | |
83 | 123 | } |
84 | 124 | |
85 | 125 | static void done(GtkPrintOperation *prt, GtkPrintOperationResult result, PRINT_INFO *info) |
... | ... | @@ -107,12 +147,33 @@ |
107 | 147 | |
108 | 148 | static void font_set(GtkFontButton *widget, PRINT_INFO *info) |
109 | 149 | { |
150 | + const gchar *name = gtk_font_button_get_font_name(widget); | |
151 | + | |
110 | 152 | if(info->font) |
111 | 153 | g_free(info->font); |
112 | 154 | |
113 | - info->font = g_strdup(gtk_font_button_get_font_name(widget)); | |
114 | - set_string_to_config("print","font","%s",info->font); | |
115 | - trace("Font set to \"%s\"",info->font); | |
155 | +#if GTK_CHECK_VERSION(3,2,0) | |
156 | + | |
157 | + info->font = g_strdup(name); | |
158 | + info->fontsize = gtk_font_chooser_get_font_size((GtkFontChooser *) widget); | |
159 | + | |
160 | +#else | |
161 | + { | |
162 | + PangoFontDescription *descr = pango_font_description_from_string(name); | |
163 | + | |
164 | + info->font = g_strdup(pango_font_description_get_family(descr)); | |
165 | + info->fontsize = pango_font_description_get_size(descr); | |
166 | + info->fontweight = CAIRO_FONT_WEIGHT_NORMAL; | |
167 | + | |
168 | + if(pango_font_description_get_weight(descr) == PANGO_WEIGHT_BOLD) | |
169 | + info->fontweight = CAIRO_FONT_WEIGHT_BOLD; | |
170 | + | |
171 | + pango_font_description_free(descr); | |
172 | + } | |
173 | +#endif // GTK(3,2,0) | |
174 | + | |
175 | + set_string_to_config("print","font",name); | |
176 | + trace("Font set to \"%s\" with size %d",info->font,info->fontsize); | |
116 | 177 | } |
117 | 178 | |
118 | 179 | static void color_scheme_changed(GtkComboBox *widget,PRINT_INFO *info) |
... | ... | @@ -139,12 +200,13 @@ |
139 | 200 | if(!info->colorname) |
140 | 201 | return; |
141 | 202 | |
142 | - trace("%s: %s->%s",__FUNCTION__,info->colorname,new_colors); | |
203 | +// trace("%s: %s->%s",__FUNCTION__,info->colorname,new_colors); | |
143 | 204 | |
144 | 205 | if(*info->colorname) |
145 | 206 | g_free(info->colorname); |
146 | 207 | |
147 | 208 | info->colorname = new_colors; |
209 | + | |
148 | 210 | } |
149 | 211 | |
150 | 212 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) |
... | ... | @@ -201,6 +263,7 @@ |
201 | 263 | |
202 | 264 | info->font = get_string_from_config("print","font","Courier 10"); |
203 | 265 | gtk_font_button_set_font_name((GtkFontButton *) widget,info->font); |
266 | + font_set((GtkFontButton *) widget,info); | |
204 | 267 | g_signal_connect(G_OBJECT(widget),"font-set",G_CALLBACK(font_set),info); |
205 | 268 | |
206 | 269 | // Color scheme dropdown |
... | ... | @@ -222,9 +285,11 @@ |
222 | 285 | return G_OBJECT(container); |
223 | 286 | } |
224 | 287 | |
225 | - static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *font_dialog, gpointer user_data) | |
288 | + static void custom_widget_apply(GtkPrintOperation *prt, GtkWidget *widget, PRINT_INFO *info) | |
226 | 289 | { |
227 | 290 | trace("%s",__FUNCTION__); |
291 | + set_string_to_config("print","colors",info->colorname); | |
292 | + v3270_set_color_table(info->color,info->colorname); | |
228 | 293 | } |
229 | 294 | |
230 | 295 | static GtkPrintOperation * begin_print_operation(GtkAction *action, GtkWidget *widget, PRINT_INFO **info) |
... | ... | @@ -236,6 +301,7 @@ |
236 | 301 | |
237 | 302 | *info = g_new0(PRINT_INFO,1); |
238 | 303 | (*info)->session = v3270_get_session(widget); |
304 | + (*info)->fontweight = CAIRO_FONT_WEIGHT_NORMAL; | |
239 | 305 | |
240 | 306 | // Basic setup |
241 | 307 | gtk_print_operation_set_allow_async(print,TRUE); | ... | ... |
src/gtk/uiparser/menuitem.c
src/gtk/uiparser/parsefile.c
... | ... | @@ -115,6 +115,7 @@ |
115 | 115 | const gchar * name = NULL; |
116 | 116 | gchar * key; |
117 | 117 | |
118 | +trace("%s ----",__FUNCTION__); | |
118 | 119 | if(action) |
119 | 120 | name = gtk_action_get_name(action); |
120 | 121 | |
... | ... | @@ -133,7 +134,6 @@ |
133 | 134 | g_object_ref(G_OBJECT(widget)); |
134 | 135 | g_hash_table_insert(info->element_list[id],key,widget); |
135 | 136 | |
136 | -// trace("%s - %s",__FUNCTION__,name); | |
137 | 137 | return widget; |
138 | 138 | } |
139 | 139 | ... | ... |
src/gtk/v3270/draw.c
... | ... | @@ -93,7 +93,7 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event) |
93 | 93 | #endif // GTk3 |
94 | 94 | |
95 | 95 | |
96 | -void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *color) | |
96 | +void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color) | |
97 | 97 | { |
98 | 98 | GdkColor *fg; |
99 | 99 | GdkColor *bg; |
... | ... | @@ -113,10 +113,10 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, con |
113 | 113 | bg = color+(attr & 0x000F); |
114 | 114 | } |
115 | 115 | |
116 | - v3270_draw_char(cr,chr,attr,metrics,rect,fg,bg); | |
116 | + v3270_draw_char(cr,chr,attr,session,height,rect,fg,bg); | |
117 | 117 | } |
118 | 118 | |
119 | -void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *fg, GdkColor *bg) | |
119 | +void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *fg, GdkColor *bg) | |
120 | 120 | { |
121 | 121 | // Clear element area |
122 | 122 | 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 |
201 | 201 | break; |
202 | 202 | |
203 | 203 | case 0x8c: // CG 0xf7, less or equal "≤" |
204 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
204 | + cairo_move_to(cr,rect->x,rect->y+height); | |
205 | 205 | cairo_show_text(cr, "≤"); |
206 | 206 | break; |
207 | 207 | |
208 | 208 | case 0xae: // CG 0xd9, greater or equal "≥" |
209 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
209 | + cairo_move_to(cr,rect->x,rect->y+height); | |
210 | 210 | cairo_show_text(cr, "≥"); |
211 | 211 | break; |
212 | 212 | |
213 | 213 | case 0xbe: // CG 0x3e, not equal "≠" |
214 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
214 | + cairo_move_to(cr,rect->x,rect->y+height); | |
215 | 215 | cairo_show_text(cr, "≠"); |
216 | 216 | break; |
217 | 217 | |
218 | 218 | case 0xad: // "[" |
219 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
219 | + cairo_move_to(cr,rect->x,rect->y+height); | |
220 | 220 | cairo_show_text(cr, "["); |
221 | 221 | break; |
222 | 222 | |
223 | 223 | case 0xbd: // "]" |
224 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
224 | + cairo_move_to(cr,rect->x,rect->y+height); | |
225 | 225 | cairo_show_text(cr, "]"); |
226 | 226 | break; |
227 | 227 | |
... | ... | @@ -231,11 +231,11 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const |
231 | 231 | } |
232 | 232 | else if(chr) |
233 | 233 | { |
234 | - gchar *utf = g_convert((char *) &chr, 1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); | |
234 | + gchar *utf = g_convert((char *) &chr, 1, "UTF-8", lib3270_get_charset(session), NULL, NULL, NULL); | |
235 | 235 | |
236 | 236 | if(utf) |
237 | 237 | { |
238 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
238 | + cairo_move_to(cr,rect->x,rect->y+height); | |
239 | 239 | cairo_show_text(cr, utf); |
240 | 240 | g_free(utf); |
241 | 241 | } |
... | ... | @@ -304,7 +304,7 @@ void v3270_reload(GtkWidget *widget) |
304 | 304 | if(addr == cursor) |
305 | 305 | v3270_update_cursor_rect(terminal,&rect,chr,attr); |
306 | 306 | |
307 | - v3270_draw_element(cr,chr,attr,&terminal->metrics,&rect,terminal->color); | |
307 | + v3270_draw_element(cr,chr,attr,terminal->host,terminal->metrics.height,&rect,terminal->color); | |
308 | 308 | |
309 | 309 | addr++; |
310 | 310 | rect.x += rect.width; |
... | ... | @@ -349,7 +349,7 @@ void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned sho |
349 | 349 | |
350 | 350 | cr = cairo_create(terminal->surface); |
351 | 351 | cairo_set_scaled_font(cr,terminal->font_scaled); |
352 | - v3270_draw_element(cr, chr, attr, &terminal->metrics, &rect,terminal->color); | |
352 | + v3270_draw_element(cr, chr, attr, terminal->host, terminal->metrics.height, &rect,terminal->color); | |
353 | 353 | cairo_destroy(cr); |
354 | 354 | |
355 | 355 | if(cursor) |
... | ... | @@ -386,7 +386,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short |
386 | 386 | |
387 | 387 | rect.x = 0; |
388 | 388 | rect.y = 0; |
389 | - v3270_draw_char(cr,chr,attr,&widget->metrics,&rect,bg,fg); | |
389 | + v3270_draw_char(cr,chr,attr,widget->host,widget->metrics.height,&rect,bg,fg); | |
390 | 390 | |
391 | 391 | cairo_destroy(cr); |
392 | 392 | } | ... | ... |
src/gtk/v3270/private.h
... | ... | @@ -103,8 +103,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned sho |
103 | 103 | |
104 | 104 | void v3270_register_io_handlers(v3270Class *cls); |
105 | 105 | |
106 | -void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *color); | |
107 | -void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, const struct v3270_metrics *metrics, GdkRectangle *rect, GdkColor *fg, GdkColor *bg); | |
106 | +void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *fg, GdkColor *bg); | |
108 | 107 | |
109 | 108 | void v3270_start_timer(GtkWidget *terminal); |
110 | 109 | void v3270_stop_timer(GtkWidget *terminal); | ... | ... |
src/gtk/v3270/v3270.h
... | ... | @@ -214,6 +214,7 @@ |
214 | 214 | void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, const gchar *name); |
215 | 215 | int v3270_set_color_entry(GdkColor *clr, enum V3270_COLOR id, const gchar *name); |
216 | 216 | void v3270_set_color_table(GdkColor *table, const gchar *colors); |
217 | + void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color); | |
217 | 218 | |
218 | 219 | G_END_DECLS |
219 | 220 | ... | ... |