Commit 3950ef036ef277037189b2d119d1c5cbd04edd75
1 parent
5e5bd949
Exists in
master
and in
1 other branch
Removendo uso da função cairo_show_text que, aparentemente, causa segfaults em windows.
Showing
3 changed files
with
84 additions
and
55 deletions
Show diff stats
draw.c
... | ... | @@ -30,8 +30,11 @@ |
30 | 30 | #include <gtk/gtk.h> |
31 | 31 | #include <math.h> |
32 | 32 | #include <pw3270.h> |
33 | + #include <ctype.h> | |
33 | 34 | #include <lib3270.h> |
35 | + #include <lib3270/log.h> | |
34 | 36 | #include <lib3270/session.h> |
37 | + | |
35 | 38 | #include <v3270.h> |
36 | 39 | #include "private.h" |
37 | 40 | |
... | ... | @@ -142,8 +145,47 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H32 |
142 | 145 | |
143 | 146 | } |
144 | 147 | |
148 | +void v3270_draw_text_at(cairo_t *cr, int x, int y, v3270FontInfo *font, const char *str) { | |
149 | + | |
150 | + size_t szText = strlen(str); | |
151 | + | |
152 | + if(szText == 1 && isspace(*str)) { | |
153 | + return; | |
154 | + } | |
155 | + | |
156 | + // Tem string, desenha | |
157 | + cairo_status_t status; | |
158 | + cairo_glyph_t * glyphs = NULL; | |
159 | + int num_glyphs = 0; | |
160 | + cairo_text_cluster_t * clusters = NULL; | |
161 | + int num_clusters = 0; | |
162 | + cairo_text_cluster_flags_t cluster_flags; | |
163 | + cairo_scaled_font_t * scaled_font = cairo_get_scaled_font(cr); | |
164 | + | |
165 | + status = cairo_scaled_font_text_to_glyphs( | |
166 | + scaled_font, | |
167 | + (double) x, (double) (y+font->height), | |
168 | + str, szText, | |
169 | + &glyphs, &num_glyphs, | |
170 | + &clusters, &num_clusters, &cluster_flags ); | |
171 | + | |
172 | + if (status == CAIRO_STATUS_SUCCESS) { | |
173 | + cairo_show_text_glyphs(cr,str,szText,glyphs, num_glyphs,clusters, num_clusters, cluster_flags); | |
174 | + } | |
175 | + | |
176 | + if(glyphs) | |
177 | + cairo_glyph_free(glyphs); | |
178 | + | |
179 | + if(clusters) | |
180 | + cairo_text_cluster_free(clusters); | |
181 | + | |
182 | +} | |
183 | + | |
145 | 184 | void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, const char *str) { |
146 | 185 | |
186 | + v3270_draw_text_at(cr,rect->x,rect->y,font,str); | |
187 | + | |
188 | +/* | |
147 | 189 | cairo_status_t status; |
148 | 190 | cairo_glyph_t * glyphs = NULL; |
149 | 191 | int num_glyphs = 0; |
... | ... | @@ -168,7 +210,7 @@ void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, |
168 | 210 | |
169 | 211 | if(clusters) |
170 | 212 | cairo_text_cluster_free(clusters); |
171 | - | |
213 | +*/ | |
172 | 214 | } |
173 | 215 | |
174 | 216 | void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg) |
... | ... | @@ -470,6 +512,7 @@ void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *rect, unsigned char c |
470 | 512 | |
471 | 513 | void v3270_queue_draw_area(GtkWidget *widget, gint x, gint y, gint width, gint height) |
472 | 514 | { |
515 | + | |
473 | 516 | if(GTK_V3270(widget)->drawing && gtk_widget_get_realized(widget)) |
474 | 517 | { |
475 | 518 | gtk_widget_queue_draw_area(widget,x,y,width,height); | ... | ... |
... | ... | @@ -180,13 +180,8 @@ static void setup_luname_position(GdkRectangle *rect, v3270FontInfo *font, cairo |
180 | 180 | |
181 | 181 | if(luname) |
182 | 182 | { |
183 | -// cairo_move_to(cr,rect->x,rect->y+font->height); | |
184 | - | |
185 | 183 | gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_LUNAME); |
186 | 184 | v3270_draw_text(cr,rect,font,luname); |
187 | - | |
188 | -// cairo_show_text(cr,luname); | |
189 | -// cairo_stroke(cr); | |
190 | 185 | } |
191 | 186 | |
192 | 187 | cairo_restore(cr); |
... | ... | @@ -242,55 +237,41 @@ static void setup_double_char_position(GdkRectangle *rect, v3270FontInfo *metric |
242 | 237 | |
243 | 238 | } |
244 | 239 | |
240 | +static int draw_centered_char(cairo_t *cr, v3270FontInfo *metrics, int x, int y, const gchar chr) | |
241 | +{ | |
242 | + char str[2] = { chr, 0 }; | |
243 | +// cairo_text_extents_t extents; | |
244 | + | |
245 | + cairo_set_scaled_font(cr,metrics->scaled); | |
246 | +// cairo_text_extents(cr,str,&extents); | |
247 | + | |
248 | + v3270_draw_text_at(cr, x, y, metrics, str); | |
249 | + | |
250 | + return y+metrics->height+2; | |
251 | + | |
252 | +} | |
253 | + | |
245 | 254 | static void draw_undera(cairo_t *cr, H3270 *host, v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect) |
246 | 255 | { |
247 | -#ifdef DEBUG | |
248 | - cairo_set_source_rgb(cr,0.1,0.1,0.1); | |
249 | -#else | |
250 | 256 | gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); |
251 | -#endif | |
252 | 257 | |
253 | 258 | cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); |
254 | 259 | cairo_fill(cr); |
255 | 260 | |
256 | 261 | if(lib3270_get_undera(host)) |
257 | 262 | { |
258 | - const gchar *chr = lib3270_in_e(host) ? "B" : "A"; | |
259 | - cairo_text_extents_t extents; | |
260 | - int x,y; | |
261 | - | |
262 | - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); | |
263 | - cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); | |
264 | - cairo_fill(cr); | |
263 | + int y; | |
265 | 264 | |
266 | 265 | gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); |
267 | 266 | |
268 | - cairo_text_extents(cr,chr,&extents); | |
269 | - | |
270 | - x = rect->x + ((rect->width/2) - ((extents.width+extents.x_bearing)/2)); | |
271 | - y = rect->y + extents.height+((rect->height/2) - (extents.height/2)); | |
272 | - | |
273 | - cairo_move_to(cr,x,y); | |
274 | - cairo_show_text(cr,chr); | |
275 | - | |
276 | - cairo_move_to(cr,x+extents.x_bearing,y+2); | |
277 | - cairo_rel_line_to(cr,extents.width,0); | |
267 | + y = draw_centered_char(cr, metrics,rect->x,rect->y, lib3270_in_e(host) ? 'B' : 'A'); | |
278 | 268 | |
269 | + cairo_move_to(cr,rect->x,y); | |
270 | + cairo_rel_line_to(cr,10,0); | |
279 | 271 | cairo_stroke(cr); |
280 | 272 | |
281 | 273 | } |
282 | - | |
283 | -} | |
284 | - | |
285 | -static void draw_centered_char(cairo_t *cr, v3270FontInfo *metrics, int x, int y, const gchar chr) | |
286 | -{ | |
287 | - char str[2] = { chr, 0 }; | |
288 | - | |
289 | - cairo_text_extents_t extents; | |
290 | - cairo_text_extents(cr,str,&extents); | |
291 | - | |
292 | - cairo_move_to(cr,x+(((metrics->width+2)/2)-(extents.width/2)),y+extents.height+( (metrics->spacing/2) - (extents.height/2))); | |
293 | - cairo_show_text(cr,str); | |
274 | + debug("%s",__FUNCTION__); | |
294 | 275 | |
295 | 276 | } |
296 | 277 | |
... | ... | @@ -706,10 +687,12 @@ void v3270_update_luname(GtkWidget *widget,const gchar *name) |
706 | 687 | |
707 | 688 | if(name) |
708 | 689 | { |
709 | - cairo_move_to(cr,rect->x,rect->y+terminal->font.height); | |
690 | +// cairo_move_to(cr,rect->x,rect->y+terminal->font.height); | |
691 | +// cairo_show_text(cr,name); | |
692 | +// cairo_stroke(cr); | |
710 | 693 | gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_LUNAME); |
711 | - cairo_show_text(cr,name); | |
712 | - cairo_stroke(cr); | |
694 | + v3270_draw_text_at(cr, rect->x, rect->y, &terminal->font, name); | |
695 | + | |
713 | 696 | } |
714 | 697 | |
715 | 698 | cairo_destroy(cr); |
... | ... | @@ -757,10 +740,7 @@ static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, v3270FontInfo |
757 | 740 | buffer[7] = 0; |
758 | 741 | |
759 | 742 | cairo_text_extents(cr,buffer,&extents); |
760 | - | |
761 | - cairo_move_to(cr,(rect->x+rect->width)-(extents.width+2),rect->y+metrics->height); | |
762 | - cairo_show_text(cr, buffer); | |
763 | - cairo_stroke(cr); | |
743 | + v3270_draw_text_at(cr,(rect->x+rect->width)-(extents.width+2),rect->y,metrics,buffer); | |
764 | 744 | } |
765 | 745 | |
766 | 746 | void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr) |
... | ... | @@ -937,9 +917,10 @@ static void update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id |
937 | 917 | |
938 | 918 | if(flag) |
939 | 919 | { |
940 | - cairo_move_to(cr,0,terminal->font.height); | |
941 | - cairo_show_text(cr, text); | |
942 | - cairo_stroke(cr); | |
920 | + v3270_draw_text_at(cr,0,0,&terminal->font,text); | |
921 | +// cairo_move_to(cr,0,terminal->font.height); | |
922 | +// cairo_show_text(cr, text); | |
923 | +// cairo_stroke(cr); | |
943 | 924 | } |
944 | 925 | |
945 | 926 | cairo_destroy(cr); |
... | ... | @@ -1108,29 +1089,33 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
1108 | 1089 | switch(id) |
1109 | 1090 | { |
1110 | 1091 | case LIB3270_FLAG_BOXSOLID: |
1111 | - debug("%s",__FUNCTION__); | |
1092 | + debug("%s LIB3270_FLAG_BOXSOLID",__FUNCTION__); | |
1112 | 1093 | cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION); |
1113 | 1094 | v3270_draw_connection(cr,terminal->host,&terminal->font,terminal->color,r); |
1114 | - v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); | |
1115 | 1095 | cairo_destroy(cr); |
1096 | + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); | |
1116 | 1097 | break; |
1117 | 1098 | |
1118 | 1099 | case LIB3270_FLAG_UNDERA: |
1119 | - debug("%s",__FUNCTION__); | |
1100 | + debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); | |
1120 | 1101 | cr = set_update_region(terminal,&r,V3270_OIA_UNDERA); |
1102 | + debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); | |
1121 | 1103 | draw_undera(cr,terminal->host,&terminal->font,terminal->color,r); |
1122 | - v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); | |
1104 | + debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); | |
1123 | 1105 | cairo_destroy(cr); |
1106 | + debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); | |
1107 | + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); | |
1108 | + debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); | |
1124 | 1109 | break; |
1125 | 1110 | |
1126 | 1111 | case LIB3270_FLAG_TYPEAHEAD: |
1127 | - debug("%s",__FUNCTION__); | |
1112 | + debug("%s LIB3270_FLAG_TYPEAHEAD",__FUNCTION__); | |
1128 | 1113 | update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T'); |
1129 | 1114 | break; |
1130 | 1115 | |
1131 | 1116 | #ifdef HAVE_PRINTER |
1132 | 1117 | case LIB3270_FLAG_PRINTER: |
1133 | - debug("%s",__FUNCTION__); | |
1118 | + debug("%s LIB3270_FLAG_PRINTER",__FUNCTION__); | |
1134 | 1119 | update_text_field(terminal,on,V3270_OIA_PRINTER,'P'); |
1135 | 1120 | break; |
1136 | 1121 | #endif // HAVE_PRINTER | ... | ... |
private.h
... | ... | @@ -271,6 +271,7 @@ void v3270_register_io_handlers(v3270Class *cls); |
271 | 271 | |
272 | 272 | void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg); |
273 | 273 | void v3270_draw_text(cairo_t *cr, const GdkRectangle *rect, v3270FontInfo *font, const char *str); |
274 | +void v3270_draw_text_at(cairo_t *cr, int x, int y, v3270FontInfo *font, const char *str); | |
274 | 275 | |
275 | 276 | void v3270_start_timer(GtkWidget *terminal); |
276 | 277 | void v3270_stop_timer(GtkWidget *terminal); | ... | ... |