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