Commit 317eaeb83be6d78bff20c59f81d7c6b621d08d14
1 parent
eddb2894
Exists in
master
and in
1 other branch
Updating simple trace window.
Showing
4 changed files
with
68 additions
and
21 deletions
Show diff stats
src/include/v3270.h
@@ -165,6 +165,9 @@ | @@ -165,6 +165,9 @@ | ||
165 | #endif // v3270_char | 165 | #endif // v3270_char |
166 | 166 | ||
167 | GtkWidget * v3270_new(void); | 167 | GtkWidget * v3270_new(void); |
168 | + | ||
169 | + GtkWidget * v3270_new_trace_window(GtkWidget *widget); | ||
170 | + | ||
168 | GType v3270_get_type(void); | 171 | GType v3270_get_type(void); |
169 | 172 | ||
170 | void v3270_reload(GtkWidget * widget); | 173 | void v3270_reload(GtkWidget * widget); |
src/include/v3270/trace.h
@@ -56,6 +56,7 @@ | @@ -56,6 +56,7 @@ | ||
56 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); | 56 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); |
57 | LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget); | 57 | LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget); |
58 | LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); | 58 | LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); |
59 | + LIB3270_EXPORT void v3270_trace_set_font_from_string(GtkWidget *widget, const gchar *name); | ||
59 | 60 | ||
60 | G_END_DECLS | 61 | G_END_DECLS |
61 | 62 |
src/testprogram/testprogram.c
@@ -81,6 +81,13 @@ static gboolean popup_menu(GtkWidget *widget, G_GNUC_UNUSED gboolean selected, g | @@ -81,6 +81,13 @@ static gboolean popup_menu(GtkWidget *widget, G_GNUC_UNUSED gboolean selected, g | ||
81 | 81 | ||
82 | } | 82 | } |
83 | 83 | ||
84 | +static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSession) { | ||
85 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0); | ||
86 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0); | ||
87 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_EVENT_TRACE,0); | ||
88 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_NETWORK_TRACE,0); | ||
89 | +} | ||
90 | + | ||
84 | static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | 91 | static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { |
85 | 92 | ||
86 | /* | 93 | /* |
@@ -99,7 +106,12 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | @@ -99,7 +106,12 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | ||
99 | // gchar * filename = NULL; | 106 | // gchar * filename = NULL; |
100 | GValue val = G_VALUE_INIT; | 107 | GValue val = G_VALUE_INIT; |
101 | 108 | ||
102 | - // lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); | 109 | + GtkWidget *trace = v3270_new_trace_window(terminal); |
110 | + if(trace) { | ||
111 | + g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); | ||
112 | + lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); | ||
113 | + gtk_widget_show_all(trace); | ||
114 | + } | ||
103 | 115 | ||
104 | const gchar *url = getenv("LIB3270_DEFAULT_HOST"); | 116 | const gchar *url = getenv("LIB3270_DEFAULT_HOST"); |
105 | if(url) { | 117 | if(url) { |
src/trace/trace.c
@@ -35,6 +35,8 @@ | @@ -35,6 +35,8 @@ | ||
35 | #include <libintl.h> | 35 | #include <libintl.h> |
36 | #include <glib/gi18n.h> | 36 | #include <glib/gi18n.h> |
37 | 37 | ||
38 | + #include <lib3270.h> | ||
39 | + #include <lib3270/trace.h> | ||
38 | #include <v3270/trace.h> | 40 | #include <v3270/trace.h> |
39 | 41 | ||
40 | #if defined( HAVE_SYSLOG ) | 42 | #if defined( HAVE_SYSLOG ) |
@@ -57,6 +59,8 @@ | @@ -57,6 +59,8 @@ | ||
57 | GtkTextBuffer * text; | 59 | GtkTextBuffer * text; |
58 | GtkWidget * entry; | 60 | GtkWidget * entry; |
59 | GtkWidget * button; | 61 | GtkWidget * button; |
62 | + GtkWidget * view; | ||
63 | + H3270 * hSession; | ||
60 | gchar **line; | 64 | gchar **line; |
61 | guint log_handler; | 65 | guint log_handler; |
62 | gboolean * enabled; | 66 | gboolean * enabled; |
@@ -103,6 +107,11 @@ static void destroy(GtkObject *widget) | @@ -103,6 +107,11 @@ static void destroy(GtkObject *widget) | ||
103 | { | 107 | { |
104 | v3270_trace * hwnd = V3270_TRACE(widget); | 108 | v3270_trace * hwnd = V3270_TRACE(widget); |
105 | 109 | ||
110 | + if(hwnd->hSession) | ||
111 | + { | ||
112 | + lib3270_set_trace_handler(hwnd->hSession,NULL,NULL); | ||
113 | + } | ||
114 | + | ||
106 | if(hwnd->log_handler) | 115 | if(hwnd->log_handler) |
107 | { | 116 | { |
108 | g_log_remove_handler(NULL,hwnd->log_handler); | 117 | g_log_remove_handler(NULL,hwnd->log_handler); |
@@ -310,19 +319,27 @@ static void destroy(GtkObject *widget) | @@ -310,19 +319,27 @@ static void destroy(GtkObject *widget) | ||
310 | 319 | ||
311 | } | 320 | } |
312 | 321 | ||
322 | + void v3270_trace_set_font_from_string(GtkWidget *widget, const gchar *name) | ||
323 | + { | ||
324 | + PangoFontDescription* fontdesc = pango_font_description_from_string(name); | ||
325 | + | ||
326 | +#if GTK_CHECK_VERSION(3,0,0) | ||
327 | + gtk_widget_override_font(V3270_TRACE(widget)->view, fontdesc); | ||
328 | +#else | ||
329 | + gtk_widget_modify_font(V3270_TRACE(widget)->view, fontdesc); | ||
330 | +#endif // GTK_CHECK_VERSION | ||
331 | + | ||
332 | + pango_font_description_free(fontdesc); | ||
333 | + } | ||
334 | + | ||
313 | static void v3270_trace_init(v3270_trace *window) | 335 | static void v3270_trace_init(v3270_trace *window) |
314 | { | 336 | { |
315 | GtkWidget * widget; | 337 | GtkWidget * widget; |
316 | - GtkWidget * view; | ||
317 | #if GTK_CHECK_VERSION(3,0,0) | 338 | #if GTK_CHECK_VERSION(3,0,0) |
318 | GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | 339 | GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); |
319 | #else | 340 | #else |
320 | GtkWidget * vbox = gtk_vbox_new(FALSE,0); | 341 | GtkWidget * vbox = gtk_vbox_new(FALSE,0); |
321 | #endif // GTK_CHECK_VERSION | 342 | #endif // GTK_CHECK_VERSION |
322 | - gchar * fontname = "Monospace"; | ||
323 | - PangoFontDescription * fontdesc = pango_font_description_from_string(fontname); | ||
324 | - | ||
325 | - g_free(fontname); | ||
326 | 343 | ||
327 | // Top menu | 344 | // Top menu |
328 | { | 345 | { |
@@ -341,25 +358,23 @@ static void destroy(GtkObject *widget) | @@ -341,25 +358,23 @@ static void destroy(GtkObject *widget) | ||
341 | gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0); | 358 | gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0); |
342 | } | 359 | } |
343 | 360 | ||
361 | + window->hSession = NULL; | ||
362 | + | ||
344 | // Trace container | 363 | // Trace container |
345 | widget = gtk_scrolled_window_new(NULL,NULL); | 364 | widget = gtk_scrolled_window_new(NULL,NULL); |
346 | window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); | 365 | window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); |
347 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); | 366 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); |
348 | - view = gtk_text_view_new(); | ||
349 | 367 | ||
350 | -#if GTK_CHECK_VERSION(3,0,0) | ||
351 | - gtk_widget_override_font(GTK_WIDGET(view), fontdesc); | ||
352 | -#else | ||
353 | - gtk_widget_modify_font(GTK_WIDGET(view), fontdesc); | ||
354 | -#endif // GTK_CHECK_VERSION | 368 | + window->view = gtk_text_view_new(); |
369 | + v3270_trace_set_font_from_string(GTK_WIDGET(window),"Monospaced"); | ||
355 | 370 | ||
356 | - window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); | ||
357 | - gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE); | 371 | + window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view)); |
372 | + gtk_text_view_set_editable(GTK_TEXT_VIEW(window->view), TRUE); | ||
358 | 373 | ||
359 | #if GTK_CHECK_VERSION(3,8,0) | 374 | #if GTK_CHECK_VERSION(3,8,0) |
360 | - gtk_container_add(GTK_CONTAINER(widget),view); | 375 | + gtk_container_add(GTK_CONTAINER(widget),window->view); |
361 | #else | 376 | #else |
362 | - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget),view); | 377 | + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget),window->view); |
363 | #endif // GTK_CHECK_VERSION | 378 | #endif // GTK_CHECK_VERSION |
364 | gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); | 379 | gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); |
365 | 380 | ||
@@ -388,30 +403,46 @@ static void destroy(GtkObject *widget) | @@ -388,30 +403,46 @@ static void destroy(GtkObject *widget) | ||
388 | 403 | ||
389 | gtk_container_add(GTK_CONTAINER(window),vbox); | 404 | gtk_container_add(GTK_CONTAINER(window),vbox); |
390 | 405 | ||
391 | - pango_font_description_free(fontdesc); | ||
392 | 406 | ||
393 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); | 407 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); |
394 | 408 | ||
395 | } | 409 | } |
396 | 410 | ||
397 | - GtkWidget * v3270_trace_new(H3270 *hSession) | 411 | + GtkWidget * v3270_trace_new() |
398 | { | 412 | { |
399 | return g_object_new(V3270_TYPE_TRACE, NULL); | 413 | return g_object_new(V3270_TYPE_TRACE, NULL); |
400 | } | 414 | } |
401 | 415 | ||
416 | + GtkWidget * v3270_new_trace_window(GtkWidget *widget) | ||
417 | + { | ||
418 | + return v3270_trace_new_from_session(v3270_get_session(widget)); | ||
419 | + } | ||
420 | + | ||
421 | + static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args) | ||
422 | + { | ||
423 | + gchar *ptr = g_strdup_vprintf(fmt,args); | ||
424 | + gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_display_charset(hSession),"?",NULL,NULL,NULL); | ||
425 | + v3270_trace_printf(GTK_WIDGET(userdata),"%s",utftext); | ||
426 | + g_free(utftext); | ||
427 | + g_free(ptr); | ||
428 | + } | ||
429 | + | ||
402 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession) { | 430 | LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession) { |
431 | + | ||
403 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); | 432 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); |
404 | void * terminal = lib3270_get_user_data(hSession); | 433 | void * terminal = lib3270_get_user_data(hSession); |
405 | 434 | ||
435 | + V3270_TRACE(widget)->hSession = hSession; | ||
436 | + | ||
406 | gtk_window_set_default_size(GTK_WINDOW(widget),590,430); | 437 | gtk_window_set_default_size(GTK_WINDOW(widget),590,430); |
407 | 438 | ||
408 | if(terminal && GTK_IS_V3270(terminal)) | 439 | if(terminal && GTK_IS_V3270(terminal)) |
409 | { | 440 | { |
410 | - GtkWidget * toplevel = gtk_widget_get_toplevel(GTK_WIDGET(terminal)); | ||
411 | - gtk_window_set_attached_to(GTK_WINDOW(widget),toplevel); | ||
412 | - | 441 | + gtk_window_set_attached_to(GTK_WINDOW(widget),GTK_WIDGET(terminal)); |
413 | } | 442 | } |
414 | 443 | ||
444 | + lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); | ||
445 | + | ||
415 | return widget; | 446 | return widget; |
416 | } | 447 | } |
417 | 448 |