Commit e531b6956da5b684676b6cd4f002dd341e090701
1 parent
af7a6404
Exists in
master
and in
1 other branch
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,6 +110,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | ||
110 | if(trace) { | 110 | if(trace) { |
111 | g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); | 111 | g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); |
112 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); | 112 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); |
113 | + lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); | ||
113 | gtk_widget_show_all(trace); | 114 | gtk_widget_show_all(trace); |
114 | } | 115 | } |
115 | 116 |
src/trace/trace.c
@@ -57,10 +57,10 @@ | @@ -57,10 +57,10 @@ | ||
57 | struct _v3270_trace | 57 | struct _v3270_trace |
58 | { | 58 | { |
59 | GtkWindow parent; | 59 | GtkWindow parent; |
60 | - GtkAdjustment * scroll; | ||
61 | GtkTextBuffer * text; | 60 | GtkTextBuffer * text; |
62 | GtkWidget * entry; | 61 | GtkWidget * entry; |
63 | GtkWidget * button; | 62 | GtkWidget * button; |
63 | + GtkWidget * scroll; | ||
64 | GtkWidget * view; | 64 | GtkWidget * view; |
65 | H3270 * hSession; | 65 | H3270 * hSession; |
66 | gchar **line; | 66 | gchar **line; |
@@ -108,12 +108,8 @@ | @@ -108,12 +108,8 @@ | ||
108 | 108 | ||
109 | } | 109 | } |
110 | 110 | ||
111 | -#if GTK_CHECK_VERSION(3,0,0) | ||
112 | static void destroy(GtkWidget *widget) | 111 | static void destroy(GtkWidget *widget) |
113 | -#else | ||
114 | -static void destroy(GtkObject *widget) | ||
115 | -#endif | ||
116 | - { | 112 | +{ |
117 | v3270_trace * hwnd = V3270_TRACE(widget); | 113 | v3270_trace * hwnd = V3270_TRACE(widget); |
118 | 114 | ||
119 | if(hwnd->hSession) | 115 | if(hwnd->hSession) |
@@ -160,16 +156,7 @@ static void destroy(GtkObject *widget) | @@ -160,16 +156,7 @@ static void destroy(GtkObject *widget) | ||
160 | window_class->activate_default = activate_default; | 156 | window_class->activate_default = activate_default; |
161 | widget_class->delete_event = delete_event; | 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,17 +319,13 @@ static void destroy(GtkObject *widget) | ||
332 | { | 319 | { |
333 | PangoFontDescription* fontdesc = pango_font_description_from_string(name); | 320 | PangoFontDescription* fontdesc = pango_font_description_from_string(name); |
334 | 321 | ||
335 | -#if GTK_CHECK_VERSION(3,0,0) | ||
336 | gtk_widget_override_font(V3270_TRACE(widget)->view, fontdesc); | 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 | pango_font_description_free(fontdesc); | 324 | pango_font_description_free(fontdesc); |
342 | } | 325 | } |
343 | 326 | ||
344 | static void v3270_trace_init(v3270_trace *window) | 327 | static void v3270_trace_init(v3270_trace *window) |
345 | - { | 328 | +{ |
346 | GtkWidget * widget; | 329 | GtkWidget * widget; |
347 | #if GTK_CHECK_VERSION(3,0,0) | 330 | #if GTK_CHECK_VERSION(3,0,0) |
348 | GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | 331 | GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); |
@@ -370,9 +353,8 @@ static void destroy(GtkObject *widget) | @@ -370,9 +353,8 @@ static void destroy(GtkObject *widget) | ||
370 | window->hSession = NULL; | 353 | window->hSession = NULL; |
371 | 354 | ||
372 | // Trace container | 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 | window->view = gtk_text_view_new(); | 359 | window->view = gtk_text_view_new(); |
378 | v3270_trace_set_font_from_string(GTK_WIDGET(window),"Monospaced"); | 360 | v3270_trace_set_font_from_string(GTK_WIDGET(window),"Monospaced"); |
@@ -380,19 +362,11 @@ static void destroy(GtkObject *widget) | @@ -380,19 +362,11 @@ static void destroy(GtkObject *widget) | ||
380 | window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view)); | 362 | window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view)); |
381 | gtk_text_view_set_editable(GTK_TEXT_VIEW(window->view), TRUE); | 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 | // Edit box | 368 | // Edit box |
391 | -#if GTK_CHECK_VERSION(3,0,0) | ||
392 | widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); | 369 | widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); |
393 | -#else | ||
394 | - widget = gtk_hbox_new(FALSE,0); | ||
395 | -#endif // GTK_CHECK_VERSION | ||
396 | gtk_box_pack_start(GTK_BOX(widget),gtk_label_new( _( "Command:" )),FALSE,TRUE,4); | 370 | gtk_box_pack_start(GTK_BOX(widget),gtk_label_new( _( "Command:" )),FALSE,TRUE,4); |
397 | window->entry = gtk_entry_new(); | 371 | window->entry = gtk_entry_new(); |
398 | gtk_box_pack_start(GTK_BOX(widget),window->entry,TRUE,TRUE,4); | 372 | gtk_box_pack_start(GTK_BOX(widget),window->entry,TRUE,TRUE,4); |
@@ -413,7 +387,6 @@ static void destroy(GtkObject *widget) | @@ -413,7 +387,6 @@ static void destroy(GtkObject *widget) | ||
413 | gtk_container_add(GTK_CONTAINER(window),vbox); | 387 | gtk_container_add(GTK_CONTAINER(window),vbox); |
414 | 388 | ||
415 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); | 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 | GtkWidget * v3270_trace_new() | 392 | GtkWidget * v3270_trace_new() |
@@ -471,34 +444,47 @@ static void destroy(GtkObject *widget) | @@ -471,34 +444,47 @@ static void destroy(GtkObject *widget) | ||
471 | return widget; | 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 | GtkTextIter itr; | 456 | GtkTextIter itr; |
478 | - gchar * msg; | ||
479 | - v3270_trace * hwnd = V3270_TRACE(widget); | 457 | + v3270_trace * hwnd = V3270_TRACE(data->widget); |
480 | 458 | ||
481 | gtk_text_buffer_get_end_iter(hwnd->text,&itr); | 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 | else | 465 | else |
490 | { | 466 | { |
491 | gtk_text_buffer_insert(hwnd->text,&itr,"** Invalid UTF8 String **",-1); | 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 |