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,7 +140,6 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H32
140 cairo_stroke(cr); 140 cairo_stroke(cr);
141 } 141 }
142 142
143 -  
144 } 143 }
145 144
146 void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkRGBA *fg, GdkRGBA *bg) 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,6 +35,7 @@
35 #include <gtk/gtk.h> 35 #include <gtk/gtk.h>
36 #include <string.h> 36 #include <string.h>
37 #include <errno.h> 37 #include <errno.h>
  38 + #include <ctype.h>
38 39
39 #ifdef HAVE_LIBM 40 #ifdef HAVE_LIBM
40 #include <math.h> 41 #include <math.h>
@@ -278,6 +279,7 @@ static void draw_undera(cairo_t *cr, H3270 *host, struct v3270_metrics *metrics, @@ -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 static void draw_centered_text(cairo_t *cr, struct v3270_metrics *metrics, int x, int y, const gchar *str) 283 static void draw_centered_text(cairo_t *cr, struct v3270_metrics *metrics, int x, int y, const gchar *str)
282 { 284 {
283 cairo_text_extents_t extents; 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,10 +287,23 @@ static void draw_centered_text(cairo_t *cr, struct v3270_metrics *metrics, int x
285 cairo_move_to(cr,x+(((metrics->width+2)/2)-(extents.width/2)),y+extents.height+( (metrics->spacing/2) - (extents.height/2))); 287 cairo_move_to(cr,x+(((metrics->width+2)/2)-(extents.width/2)),y+extents.height+( (metrics->spacing/2) - (extents.height/2)));
286 cairo_show_text(cr,str); 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 void v3270_draw_connection(cairo_t *cr, H3270 *host, struct v3270_metrics *metrics, GdkRGBA *color, const GdkRectangle *rect) 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 gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); 308 gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND);
294 cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); 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,13 +321,13 @@ void v3270_draw_connection(cairo_t *cr, H3270 *host, struct v3270_metrics *metri
306 } 321 }
307 322
308 if(lib3270_in_ansi(host)) 323 if(lib3270_in_ansi(host))
309 - str = "N"; 324 + str = 'N';
310 else if(lib3270_in_sscp(host)) 325 else if(lib3270_in_sscp(host))
311 - str = "S"; 326 + str = 'S';
312 else 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,11 +490,52 @@ static void draw_status_message(cairo_t *cr, LIB3270_MESSAGE id, struct v3270_me
475 #endif // DEBUG 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 gdk_cairo_set_source_rgba(cr,color+message[id].color); 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,7 +614,7 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_me
558 614
559 gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); 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 cairo_stroke(cr); 619 cairo_stroke(cr);
564 cairo_rectangle(cr, lCol, row, metrics->width+2, metrics->spacing); 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,6 +746,7 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id)
690 746
691 if(widget->accessible) 747 if(widget->accessible)
692 v3270_acessible_set_state(widget->accessible,id); 748 v3270_acessible_set_state(widget->accessible,id);
  749 +
693 } 750 }
694 751
695 static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col) 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,6 +1111,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on)
1054 switch(id) 1111 switch(id)
1055 { 1112 {
1056 case LIB3270_FLAG_BOXSOLID: 1113 case LIB3270_FLAG_BOXSOLID:
  1114 + debug("%s",__FUNCTION__);
1057 cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION); 1115 cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION);
1058 v3270_draw_connection(cr,terminal->host,&terminal->metrics,terminal->color,r); 1116 v3270_draw_connection(cr,terminal->host,&terminal->metrics,terminal->color,r);
1059 gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); 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,6 +1119,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on)
1061 break; 1119 break;
1062 1120
1063 case LIB3270_FLAG_UNDERA: 1121 case LIB3270_FLAG_UNDERA:
  1122 + debug("%s",__FUNCTION__);
1064 cr = set_update_region(terminal,&r,V3270_OIA_UNDERA); 1123 cr = set_update_region(terminal,&r,V3270_OIA_UNDERA);
1065 draw_undera(cr,terminal->host,&terminal->metrics,terminal->color,r); 1124 draw_undera(cr,terminal->host,&terminal->metrics,terminal->color,r);
1066 gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); 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,11 +1127,13 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on)
1068 break; 1127 break;
1069 1128
1070 case LIB3270_FLAG_TYPEAHEAD: 1129 case LIB3270_FLAG_TYPEAHEAD:
  1130 + debug("%s",__FUNCTION__);
1071 update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T'); 1131 update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T');
1072 break; 1132 break;
1073 1133
1074 #ifdef HAVE_PRINTER 1134 #ifdef HAVE_PRINTER
1075 case LIB3270_FLAG_PRINTER: 1135 case LIB3270_FLAG_PRINTER:
  1136 + debug("%s",__FUNCTION__);
1076 update_text_field(terminal,on,V3270_OIA_PRINTER,'P'); 1137 update_text_field(terminal,on,V3270_OIA_PRINTER,'P');
1077 break; 1138 break;
1078 #endif // HAVE_PRINTER 1139 #endif // HAVE_PRINTER
@@ -1087,6 +1148,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) @@ -1087,6 +1148,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on)
1087 return; 1148 return;
1088 } 1149 }
1089 1150
  1151 + debug("%s",__FUNCTION__);
1090 } 1152 }
1091 1153
1092 static gboolean blink_script(v3270 *widget) 1154 static gboolean blink_script(v3270 *widget)
src/pw3270/v3270/widget.c
@@ -962,6 +962,7 @@ static void v3270_init(v3270 *widget) @@ -962,6 +962,7 @@ static void v3270_init(v3270 *widget)
962 widget->host->update_ssl = v3270_update_ssl; 962 widget->host->update_ssl = v3270_update_ssl;
963 widget->host->print = emit_print_signal; 963 widget->host->print = emit_print_signal;
964 964
  965 +
965 // Reset timer 966 // Reset timer
966 widget->activity.timestamp = time(0); 967 widget->activity.timestamp = time(0);
967 widget->activity.disconnect = 0; 968 widget->activity.disconnect = 0;