Commit c6eb5985cdadf9ad3324ec7584bfb31f44b7eb69
1 parent
317eaeb8
Exists in
master
and in
1 other branch
Simple trace window now restore handler on closing.
Showing
2 changed files
with
29 additions
and
5 deletions
Show diff stats
src/include/v3270/trace.h
| @@ -51,6 +51,7 @@ | @@ -51,6 +51,7 @@ | ||
| 51 | 51 | ||
| 52 | LIB3270_EXPORT GtkWidget * v3270_trace_new(); | 52 | LIB3270_EXPORT GtkWidget * v3270_trace_new(); |
| 53 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession); | 53 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession); |
| 54 | + LIB3270_EXPORT void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession); | ||
| 54 | LIB3270_EXPORT GType v3270_trace_get_type(void); | 55 | LIB3270_EXPORT GType v3270_trace_get_type(void); |
| 55 | LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); | 56 | LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); |
| 56 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); | 57 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); |
src/trace/trace.c
| @@ -65,6 +65,13 @@ | @@ -65,6 +65,13 @@ | ||
| 65 | guint log_handler; | 65 | guint log_handler; |
| 66 | gboolean * enabled; | 66 | gboolean * enabled; |
| 67 | gboolean destroy_on_close; | 67 | gboolean destroy_on_close; |
| 68 | + | ||
| 69 | + /// @brief lib3270's saved trace handler. | ||
| 70 | + struct { | ||
| 71 | + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); | ||
| 72 | + void *userdata; | ||
| 73 | + } trace; | ||
| 74 | + | ||
| 68 | }; | 75 | }; |
| 69 | 76 | ||
| 70 | const GtkWindowClass * v3270_trace_get_parent_class(void); | 77 | const GtkWindowClass * v3270_trace_get_parent_class(void); |
| @@ -109,7 +116,7 @@ static void destroy(GtkObject *widget) | @@ -109,7 +116,7 @@ static void destroy(GtkObject *widget) | ||
| 109 | 116 | ||
| 110 | if(hwnd->hSession) | 117 | if(hwnd->hSession) |
| 111 | { | 118 | { |
| 112 | - lib3270_set_trace_handler(hwnd->hSession,NULL,NULL); | 119 | + lib3270_set_trace_handler(hwnd->hSession,hwnd->trace.handler,hwnd->trace.userdata); |
| 113 | } | 120 | } |
| 114 | 121 | ||
| 115 | if(hwnd->log_handler) | 122 | if(hwnd->log_handler) |
| @@ -393,7 +400,7 @@ static void destroy(GtkObject *widget) | @@ -393,7 +400,7 @@ static void destroy(GtkObject *widget) | ||
| 393 | window->button = gtk_button_new_from_stock(GTK_STOCK_OK); | 400 | window->button = gtk_button_new_from_stock(GTK_STOCK_OK); |
| 394 | gtk_box_pack_end(GTK_BOX(widget),window->button,FALSE,FALSE,4); | 401 | gtk_box_pack_end(GTK_BOX(widget),window->button,FALSE,FALSE,4); |
| 395 | gtk_widget_set_sensitive(window->button,FALSE); | 402 | gtk_widget_set_sensitive(window->button,FALSE); |
| 396 | - gtk_widget_set_focus_on_click(GTK_BUTTON(window->button),FALSE); | 403 | + gtk_widget_set_focus_on_click(GTK_WIDGET(window->button),FALSE); |
| 397 | 404 | ||
| 398 | g_signal_connect(G_OBJECT(window->button),"clicked",G_CALLBACK(activate),window); | 405 | g_signal_connect(G_OBJECT(window->button),"clicked",G_CALLBACK(activate),window); |
| 399 | 406 | ||
| @@ -403,7 +410,6 @@ static void destroy(GtkObject *widget) | @@ -403,7 +410,6 @@ static void destroy(GtkObject *widget) | ||
| 403 | 410 | ||
| 404 | gtk_container_add(GTK_CONTAINER(window),vbox); | 411 | gtk_container_add(GTK_CONTAINER(window),vbox); |
| 405 | 412 | ||
| 406 | - | ||
| 407 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); | 413 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); |
| 408 | 414 | ||
| 409 | } | 415 | } |
| @@ -427,12 +433,29 @@ static void destroy(GtkObject *widget) | @@ -427,12 +433,29 @@ static void destroy(GtkObject *widget) | ||
| 427 | g_free(ptr); | 433 | g_free(ptr); |
| 428 | } | 434 | } |
| 429 | 435 | ||
| 436 | + void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession) { | ||
| 437 | + | ||
| 438 | + v3270_trace * trace = V3270_TRACE(widget); | ||
| 439 | + | ||
| 440 | + if(trace->hSession) { | ||
| 441 | + lib3270_set_trace_handler(trace->hSession,trace->trace.handler,trace->trace.userdata); | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | + trace->hSession = hSession; | ||
| 445 | + | ||
| 446 | + if(hSession) { | ||
| 447 | + lib3270_get_trace_handler(hSession,&trace->trace.handler,&trace->trace.userdata); | ||
| 448 | + lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); | ||
| 449 | + } | ||
| 450 | + | ||
| 451 | + } | ||
| 452 | + | ||
| 430 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession) { | 453 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession) { |
| 431 | 454 | ||
| 432 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); | 455 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); |
| 433 | void * terminal = lib3270_get_user_data(hSession); | 456 | void * terminal = lib3270_get_user_data(hSession); |
| 434 | 457 | ||
| 435 | - V3270_TRACE(widget)->hSession = hSession; | 458 | + V3270_TRACE(widget)->hSession = NULL; |
| 436 | 459 | ||
| 437 | gtk_window_set_default_size(GTK_WINDOW(widget),590,430); | 460 | gtk_window_set_default_size(GTK_WINDOW(widget),590,430); |
| 438 | 461 | ||
| @@ -441,7 +464,7 @@ static void destroy(GtkObject *widget) | @@ -441,7 +464,7 @@ static void destroy(GtkObject *widget) | ||
| 441 | gtk_window_set_attached_to(GTK_WINDOW(widget),GTK_WIDGET(terminal)); | 464 | gtk_window_set_attached_to(GTK_WINDOW(widget),GTK_WIDGET(terminal)); |
| 442 | } | 465 | } |
| 443 | 466 | ||
| 444 | - lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); | 467 | + v3270_trace_set_session(widget, hSession); |
| 445 | 468 | ||
| 446 | return widget; | 469 | return widget; |
| 447 | } | 470 | } |