Commit 0e86747c50af0f0605cb9c9127dcec14af1de086
1 parent
e371f331
Exists in
master
and in
5 other branches
Tentando identificar o porque do desenho de um único caractere em windows está c…
…ausando queda do aplicativo
Showing
3 changed files
with
72 additions
and
10 deletions
Show diff stats
src/pw3270/v3270/draw.c
... | ... | @@ -140,7 +140,6 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H32 |
140 | 140 | cairo_stroke(cr); |
141 | 141 | } |
142 | 142 | |
143 | - | |
144 | 143 | } |
145 | 144 | |
146 | 145 | void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg) | ... | ... |
src/pw3270/v3270/oia.c
... | ... | @@ -35,6 +35,7 @@ |
35 | 35 | #include <gtk/gtk.h> |
36 | 36 | #include <string.h> |
37 | 37 | #include <errno.h> |
38 | + #include <ctype.h> | |
38 | 39 | |
39 | 40 | #ifdef HAVE_LIBM |
40 | 41 | #include <math.h> |
... | ... | @@ -278,6 +279,7 @@ static void draw_undera(cairo_t *cr, H3270 *host, struct v3270_metrics *metrics, |
278 | 279 | |
279 | 280 | } |
280 | 281 | |
282 | +/* | |
281 | 283 | static void draw_centered_text(cairo_t *cr, struct v3270_metrics *metrics, int x, int y, const gchar *str) |
282 | 284 | { |
283 | 285 | cairo_text_extents_t extents; |
... | ... | @@ -285,10 +287,23 @@ static void draw_centered_text(cairo_t *cr, struct v3270_metrics *metrics, int x |
285 | 287 | cairo_move_to(cr,x+(((metrics->width+2)/2)-(extents.width/2)),y+extents.height+( (metrics->spacing/2) - (extents.height/2))); |
286 | 288 | cairo_show_text(cr,str); |
287 | 289 | } |
290 | +*/ | |
291 | + | |
292 | +static void draw_centered_char(cairo_t *cr, struct v3270_metrics *metrics, int x, int y, const gchar chr) | |
293 | +{ | |
294 | + char str[2] = { chr, 0 }; | |
295 | + | |
296 | + cairo_text_extents_t extents; | |
297 | + cairo_text_extents(cr,str,&extents); | |
298 | + | |
299 | + cairo_move_to(cr,x+(((metrics->width+2)/2)-(extents.width/2)),y+extents.height+( (metrics->spacing/2) - (extents.height/2))); | |
300 | + cairo_show_text(cr,str); | |
301 | + | |
302 | +} | |
288 | 303 | |
289 | 304 | void v3270_draw_connection(cairo_t *cr, H3270 *host, struct v3270_metrics *metrics, GdkRGBA *color, const GdkRectangle *rect) |
290 | 305 | { |
291 | - const gchar *str; | |
306 | + gchar str = ' '; | |
292 | 307 | |
293 | 308 | gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); |
294 | 309 | cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); |
... | ... | @@ -306,13 +321,13 @@ void v3270_draw_connection(cairo_t *cr, H3270 *host, struct v3270_metrics *metri |
306 | 321 | } |
307 | 322 | |
308 | 323 | if(lib3270_in_ansi(host)) |
309 | - str = "N"; | |
324 | + str = 'N'; | |
310 | 325 | else if(lib3270_in_sscp(host)) |
311 | - str = "S"; | |
326 | + str = 'S'; | |
312 | 327 | else |
313 | - str = "?"; | |
328 | + str = '?'; | |
314 | 329 | |
315 | - draw_centered_text(cr,metrics,rect->x,rect->y,str); | |
330 | + draw_centered_char(cr,metrics,rect->x,rect->y,str); | |
316 | 331 | |
317 | 332 | } |
318 | 333 | |
... | ... | @@ -475,11 +490,52 @@ static void draw_status_message(cairo_t *cr, LIB3270_MESSAGE id, struct v3270_me |
475 | 490 | #endif // DEBUG |
476 | 491 | } |
477 | 492 | |
478 | - if(msg) | |
493 | + // Limpa o bloco | |
494 | + gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); | |
495 | + cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); | |
496 | + cairo_fill(cr); | |
497 | + | |
498 | + if(msg && *msg) | |
499 | + { | |
500 | + msg = gettext(msg); | |
501 | + } | |
502 | + | |
503 | + if(msg && *msg) | |
479 | 504 | { |
505 | + int x = rect->x+1; | |
506 | + | |
507 | + debug("%s(%s)",__FUNCTION__,msg); | |
508 | + | |
480 | 509 | gdk_cairo_set_source_rgba(cr,color+message[id].color); |
481 | - cairo_move_to(cr,rect->x,rect->y+metrics->height); | |
482 | - cairo_show_text(cr,gettext(msg)); | |
510 | + | |
511 | + if(*msg == 'X') | |
512 | + { | |
513 | + cairo_save(cr); | |
514 | + | |
515 | + cairo_move_to(cr,x+1,rect->y+(metrics->height)-(metrics->ascent)); | |
516 | + cairo_rel_line_to(cr,metrics->width,metrics->ascent); | |
517 | + cairo_rel_move_to(cr,-metrics->width,0); | |
518 | + cairo_rel_line_to(cr,metrics->width,-metrics->ascent); | |
519 | + | |
520 | + cairo_stroke(cr); | |
521 | + x += metrics->width; | |
522 | + msg++; | |
523 | + | |
524 | + cairo_restore(cr); | |
525 | + } | |
526 | + | |
527 | + while(isspace(*msg)) | |
528 | + { | |
529 | + msg++; | |
530 | + x += metrics->width; | |
531 | + } | |
532 | + | |
533 | + if(*msg) | |
534 | + { | |
535 | + cairo_move_to(cr,x,rect->y+metrics->height); | |
536 | + cairo_show_text(cr,msg); | |
537 | + } | |
538 | + | |
483 | 539 | } |
484 | 540 | |
485 | 541 | } |
... | ... | @@ -558,7 +614,7 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_me |
558 | 614 | |
559 | 615 | gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); |
560 | 616 | |
561 | - draw_centered_text(cr,metrics,lCol,row,"4"); | |
617 | + draw_centered_char(cr,metrics,lCol,row,'4'); | |
562 | 618 | |
563 | 619 | cairo_stroke(cr); |
564 | 620 | cairo_rectangle(cr, lCol, row, metrics->width+2, metrics->spacing); |
... | ... | @@ -690,6 +746,7 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) |
690 | 746 | |
691 | 747 | if(widget->accessible) |
692 | 748 | v3270_acessible_set_state(widget->accessible,id); |
749 | + | |
693 | 750 | } |
694 | 751 | |
695 | 752 | static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col) |
... | ... | @@ -1054,6 +1111,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
1054 | 1111 | switch(id) |
1055 | 1112 | { |
1056 | 1113 | case LIB3270_FLAG_BOXSOLID: |
1114 | + debug("%s",__FUNCTION__); | |
1057 | 1115 | cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION); |
1058 | 1116 | v3270_draw_connection(cr,terminal->host,&terminal->metrics,terminal->color,r); |
1059 | 1117 | gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); |
... | ... | @@ -1061,6 +1119,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
1061 | 1119 | break; |
1062 | 1120 | |
1063 | 1121 | case LIB3270_FLAG_UNDERA: |
1122 | + debug("%s",__FUNCTION__); | |
1064 | 1123 | cr = set_update_region(terminal,&r,V3270_OIA_UNDERA); |
1065 | 1124 | draw_undera(cr,terminal->host,&terminal->metrics,terminal->color,r); |
1066 | 1125 | gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); |
... | ... | @@ -1068,11 +1127,13 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
1068 | 1127 | break; |
1069 | 1128 | |
1070 | 1129 | case LIB3270_FLAG_TYPEAHEAD: |
1130 | + debug("%s",__FUNCTION__); | |
1071 | 1131 | update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T'); |
1072 | 1132 | break; |
1073 | 1133 | |
1074 | 1134 | #ifdef HAVE_PRINTER |
1075 | 1135 | case LIB3270_FLAG_PRINTER: |
1136 | + debug("%s",__FUNCTION__); | |
1076 | 1137 | update_text_field(terminal,on,V3270_OIA_PRINTER,'P'); |
1077 | 1138 | break; |
1078 | 1139 | #endif // HAVE_PRINTER |
... | ... | @@ -1087,6 +1148,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
1087 | 1148 | return; |
1088 | 1149 | } |
1089 | 1150 | |
1151 | + debug("%s",__FUNCTION__); | |
1090 | 1152 | } |
1091 | 1153 | |
1092 | 1154 | static gboolean blink_script(v3270 *widget) | ... | ... |
src/pw3270/v3270/widget.c