Commit e531b6956da5b684676b6cd4f002dd341e090701

Authored by Perry Werneck
1 parent af7a6404
Exists in master and in 1 other branch develop

Using IDLE method to update trace window to avoid multi-thread problems.

Showing 2 changed files with 36 additions and 49 deletions   Show diff stats
src/testprogram/testprogram.c
... ... @@ -110,6 +110,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
110 110 if(trace) {
111 111 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal));
112 112 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE);
  113 + lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE);
113 114 gtk_widget_show_all(trace);
114 115 }
115 116  
... ...
src/trace/trace.c
... ... @@ -57,10 +57,10 @@
57 57 struct _v3270_trace
58 58 {
59 59 GtkWindow parent;
60   - GtkAdjustment * scroll;
61 60 GtkTextBuffer * text;
62 61 GtkWidget * entry;
63 62 GtkWidget * button;
  63 + GtkWidget * scroll;
64 64 GtkWidget * view;
65 65 H3270 * hSession;
66 66 gchar **line;
... ... @@ -108,12 +108,8 @@
108 108  
109 109 }
110 110  
111   -#if GTK_CHECK_VERSION(3,0,0)
112 111 static void destroy(GtkWidget *widget)
113   -#else
114   -static void destroy(GtkObject *widget)
115   -#endif
116   - {
  112 +{
117 113 v3270_trace * hwnd = V3270_TRACE(widget);
118 114  
119 115 if(hwnd->hSession)
... ... @@ -160,16 +156,7 @@ static void destroy(GtkObject *widget)
160 156 window_class->activate_default = activate_default;
161 157 widget_class->delete_event = delete_event;
162 158  
163   -#if GTK_CHECK_VERSION(3,0,0)
164   - {
165   - widget_class->destroy = destroy;
166   - }
167   -#else
168   - {
169   - GtkObjectClass *object_class = (GtkObjectClass*) klass;
170   - object_class->destroy = destroy;
171   - }
172   -#endif // GTK3
  159 + widget_class->destroy = destroy;
173 160  
174 161 }
175 162  
... ... @@ -332,17 +319,13 @@ static void destroy(GtkObject *widget)
332 319 {
333 320 PangoFontDescription* fontdesc = pango_font_description_from_string(name);
334 321  
335   -#if GTK_CHECK_VERSION(3,0,0)
336 322 gtk_widget_override_font(V3270_TRACE(widget)->view, fontdesc);
337   -#else
338   - gtk_widget_modify_font(V3270_TRACE(widget)->view, fontdesc);
339   -#endif // GTK_CHECK_VERSION
340 323  
341 324 pango_font_description_free(fontdesc);
342 325 }
343 326  
344 327 static void v3270_trace_init(v3270_trace *window)
345   - {
  328 +{
346 329 GtkWidget * widget;
347 330 #if GTK_CHECK_VERSION(3,0,0)
348 331 GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
... ... @@ -370,9 +353,8 @@ static void destroy(GtkObject *widget)
370 353 window->hSession = NULL;
371 354  
372 355 // Trace container
373   - widget = gtk_scrolled_window_new(NULL,NULL);
374   - window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget));
375   - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  356 + window->scroll = gtk_scrolled_window_new(NULL,NULL);
  357 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window->scroll),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
376 358  
377 359 window->view = gtk_text_view_new();
378 360 v3270_trace_set_font_from_string(GTK_WIDGET(window),"Monospaced");
... ... @@ -380,19 +362,11 @@ static void destroy(GtkObject *widget)
380 362 window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view));
381 363 gtk_text_view_set_editable(GTK_TEXT_VIEW(window->view), TRUE);
382 364  
383   -#if GTK_CHECK_VERSION(3,8,0)
384   - gtk_container_add(GTK_CONTAINER(widget),window->view);
385   -#else
386   - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget),window->view);
387   -#endif // GTK_CHECK_VERSION
388   - gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0);
  365 + gtk_container_add(GTK_CONTAINER(window->scroll),window->view);
  366 + gtk_box_pack_start(GTK_BOX(vbox),window->scroll,TRUE,TRUE,0);
389 367  
390 368 // Edit box
391   -#if GTK_CHECK_VERSION(3,0,0)
392 369 widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
393   -#else
394   - widget = gtk_hbox_new(FALSE,0);
395   -#endif // GTK_CHECK_VERSION
396 370 gtk_box_pack_start(GTK_BOX(widget),gtk_label_new( _( "Command:" )),FALSE,TRUE,4);
397 371 window->entry = gtk_entry_new();
398 372 gtk_box_pack_start(GTK_BOX(widget),window->entry,TRUE,TRUE,4);
... ... @@ -413,7 +387,6 @@ static void destroy(GtkObject *widget)
413 387 gtk_container_add(GTK_CONTAINER(window),vbox);
414 388  
415 389 window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window);
416   -
417 390 }
418 391  
419 392 GtkWidget * v3270_trace_new()
... ... @@ -471,34 +444,47 @@ static void destroy(GtkObject *widget)
471 444 return widget;
472 445 }
473 446  
  447 + struct bg_print_data
  448 + {
  449 + GtkWidget * widget;
  450 + gchar * msg;
  451 + };
474 452  
475   - void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)
  453 + static void bg_trace_vprintf(struct bg_print_data *data)
476 454 {
  455 +
477 456 GtkTextIter itr;
478   - gchar * msg;
479   - v3270_trace * hwnd = V3270_TRACE(widget);
  457 + v3270_trace * hwnd = V3270_TRACE(data->widget);
480 458  
481 459 gtk_text_buffer_get_end_iter(hwnd->text,&itr);
482 460  
483   - msg = g_strdup_vprintf(fmt,args);
484   -
485   - if(g_utf8_validate(msg,strlen(msg),NULL))
  461 + if(g_utf8_validate(data->msg,strlen(data->msg),NULL))
486 462 {
487   - gtk_text_buffer_insert(hwnd->text,&itr,msg,strlen(msg));
  463 + gtk_text_buffer_insert(hwnd->text,&itr,data->msg,strlen(data->msg));
488 464 }
489 465 else
490 466 {
491 467 gtk_text_buffer_insert(hwnd->text,&itr,"** Invalid UTF8 String **",-1);
492 468 }
493   - g_free(msg);
494 469  
495   - gtk_text_buffer_get_end_iter(hwnd->text,&itr);
  470 + // gtk_text_buffer_get_end_iter(hwnd->text,&itr);
  471 + // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(hwnd->view), &itr, 0.0, FALSE, 0.0, 0.0);
496 472  
497   -#if GTK_CHECK_VERSION(2,14,0)
498   - gtk_adjustment_set_value(hwnd->scroll,gtk_adjustment_get_upper(hwnd->scroll));
499   -#else
500   - gtk_adjustment_set_value(hwnd->scroll,(GTK_ADJUSTMENT(hwnd->scroll))->upper);
501   -#endif //
  473 + //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll));
  474 + //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj));
  475 + //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj);
  476 +
  477 + g_free(data->msg);
  478 + }
  479 +
  480 + void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)
  481 + {
  482 + struct bg_print_data * data = g_new0(struct bg_print_data,1);
  483 +
  484 + data->widget = widget;
  485 + data->msg = g_strdup_vprintf(fmt,args);
  486 +
  487 + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_vprintf, data, g_free);
502 488  
503 489 }
504 490  
... ...