Commit c6eb5985cdadf9ad3324ec7584bfb31f44b7eb69

Authored by Perry Werneck
1 parent 317eaeb8
Exists in master and in 1 other branch develop

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 }