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