Commit 81955debe2c9b8df6b02a69b4edf53f709d1d6e1

Authored by Perry Werneck
1 parent 96de119b
Exists in master and in 1 other branch develop

Updating trace widget.

Showing 1 changed file with 84 additions and 5 deletions   Show diff stats
src/trace/widget.c
... ... @@ -68,11 +68,13 @@
68 68 struct _V3270Trace
69 69 {
70 70 GtkGrid parent;
71   - H3270 * hSession; /// @brief TN3270 Session.
72   - GtkWidget * terminal; /// @brief V3270 Widget.
  71 + H3270 * hSession; ///< @brief TN3270 Session.
  72 + GtkWidget * terminal; ///< @brief V3270 Widget.
73 73  
74   - GtkTextBuffer * text; /// @brief Trace window contents.
75   - GtkEntry * entry; /// @brief Command line entry.
  74 + GtkTextBuffer * text; ///< @brief Trace window contents.
  75 + GtkEntry * entry; ///< @brief Command line entry.
  76 +
  77 + guint log_handler; ///< @brief GTK Log Handler.
76 78  
77 79 /// @brief lib3270's saved trace handler.
78 80 struct {
... ... @@ -122,6 +124,12 @@
122 124  
123 125 V3270Trace *trace = GTK_V3270_TRACE(object);
124 126  
  127 + if(trace->log_handler)
  128 + {
  129 + g_log_remove_handler(NULL,trace->log_handler);
  130 + trace->log_handler = 0;
  131 + }
  132 +
125 133 set_session(trace,NULL);
126 134 g_clear_object(&trace->terminal);
127 135  
... ... @@ -167,6 +175,63 @@
167 175 v3270_trace_execute(widget, gtk_entry_get_text(entry));
168 176 }
169 177  
  178 + static void log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, GtkWidget *widget)
  179 + {
  180 + #ifndef LOG_INFO
  181 + #define LOG_INFO 0
  182 + #endif // LOG_INFO
  183 +
  184 + #ifndef LOG_ERR
  185 + #define LOG_ERR 0
  186 + #endif // LOG_ERR
  187 +
  188 + #ifndef LOG_DEBUG
  189 + #define LOG_DEBUG 0
  190 + #endif // LOG_DEBUG
  191 +
  192 + static const struct _logtype
  193 + {
  194 + GLogLevelFlags log_level;
  195 + const gchar * msg;
  196 + } logtype[] =
  197 + {
  198 + { G_LOG_FLAG_RECURSION, "recursion" },
  199 + { G_LOG_FLAG_FATAL, "fatal error" },
  200 +
  201 + /* GLib log levels */
  202 + { G_LOG_LEVEL_ERROR, "error" },
  203 + { G_LOG_LEVEL_CRITICAL, "critical error" },
  204 + { G_LOG_LEVEL_WARNING, "warning" },
  205 + { G_LOG_LEVEL_MESSAGE, "message" },
  206 + { G_LOG_LEVEL_INFO, "info" },
  207 + { G_LOG_LEVEL_DEBUG, "debug" },
  208 + };
  209 +
  210 + size_t f;
  211 +
  212 + for(f=0;f<G_N_ELEMENTS(logtype);f++)
  213 + {
  214 + if(logtype[f].log_level == log_level)
  215 + {
  216 + g_autofree gchar *text = g_strdup_printf("%s: %s %s",logtype[f].msg,log_domain ? log_domain : "",message);
  217 +
  218 + gchar *ptr;
  219 + for(ptr = text;*ptr;ptr++)
  220 + {
  221 + if(*ptr < ' ')
  222 + *ptr = ' ';
  223 + }
  224 +
  225 + v3270_trace_printf(widget,"%s\n",text);
  226 +
  227 + return;
  228 + }
  229 + }
  230 +
  231 + v3270_trace_printf(widget,"%s %s\n",log_domain ? log_domain : "", message);
  232 +
  233 + }
  234 +
170 235 static void V3270Trace_init(V3270Trace *widget)
171 236 {
172 237 gtk_grid_set_row_spacing(GTK_GRID(widget),6);
... ... @@ -214,6 +279,8 @@
214 279  
215 280 }
216 281  
  282 + // Grab GTK messages.
  283 + widget->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) log_handler, widget);
217 284  
218 285 }
219 286  
... ... @@ -331,7 +398,19 @@
331 398 GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
332 399 V3270Trace * trace = v3270_trace_new(widget);
333 400  
334   - gtk_window_set_default_size(GTK_WINDOW(widget),590,430);
  401 + // Set window title and default size
  402 + {
  403 + const gchar * url = lib3270_get_url(v3270_get_session(widget));
  404 + g_autofree gchar * title = NULL;
  405 +
  406 + if(url)
  407 + title = g_strdup_printf("%s - %s - Trace", v3270_get_session_name(widget), url);
  408 + else
  409 + title = g_strdup_printf("%s - Trace", v3270_get_session_name(widget), url);
  410 +
  411 + gtk_window_set_title(GTK_WINDOW(window), title);
  412 + gtk_window_set_default_size(GTK_WINDOW(widget),590,430);
  413 + }
335 414  
336 415 // Top menu
337 416 {
... ...