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 | 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 | ... | ... |