Commit 0e86747c50af0f0605cb9c9127dcec14af1de086

Authored by perry.werneck@gmail.com
1 parent e371f331

Tentando identificar o porque do desenho de um único caractere em windows está c…

…ausando queda do aplicativo
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
... ... @@ -962,6 +962,7 @@ static void v3270_init(v3270 *widget)
962 962 widget->host->update_ssl = v3270_update_ssl;
963 963 widget->host->print = emit_print_signal;
964 964  
  965 +
965 966 // Reset timer
966 967 widget->activity.timestamp = time(0);
967 968 widget->activity.disconnect = 0;
... ...