Commit 031fb7a718ce137de403fefd89366dc1953fc3f8

Authored by perry.werneck@gmail.com
1 parent a6c60ba3

Melhorando janela de log

Showing 1 changed file with 134 additions and 3 deletions   Show diff stats
src/pw3270/trace.c
... ... @@ -37,7 +37,11 @@
37 37  
38 38 #include <pw3270/trace.h>
39 39 #include <lib3270/log.h>
40   -
  40 +
  41 +#if defined( HAVE_SYSLOG )
  42 + #include <syslog.h>
  43 +#endif // HAVE_SYSLOG
  44 +
41 45 /*--[ Widget definition ]----------------------------------------------------------------------------*/
42 46  
43 47 G_BEGIN_DECLS
... ... @@ -54,7 +58,8 @@
54 58 GtkTextBuffer * text;
55 59 GtkWidget * entry;
56 60 GtkWidget * button;
57   - gchar **line;
  61 + gchar **line;
  62 + guint log_handler;
58 63 gboolean * enabled;
59 64 gboolean destroy_on_close;
60 65 };
... ... @@ -102,6 +107,12 @@ static void destroy(GtkObject *widget)
102 107 {
103 108 pw3270_trace * hwnd = PW3270_TRACE(widget);
104 109  
  110 + if(hwnd->log_handler)
  111 + {
  112 + g_log_remove_handler(NULL,hwnd->log_handler);
  113 + hwnd->log_handler = 0;
  114 + }
  115 +
105 116 if(hwnd->line)
106 117 *hwnd->line = NULL;
107 118  
... ... @@ -163,12 +174,128 @@ static void destroy(GtkObject *widget)
163 174 trace("%s",__FUNCTION__);
164 175 activate_default(window);
165 176 }
  177 +
  178 + static void menu_save(GtkWidget *button, pw3270_trace *window)
  179 + {
  180 +
  181 + }
  182 +
  183 + static void menu_close(GtkWidget *button, GtkWidget *window)
  184 + {
  185 + gtk_widget_destroy(window);
  186 + }
  187 +
  188 + struct submenu
  189 + {
  190 + const gchar * stock_id;
  191 + GCallback action;
  192 + };
  193 +
  194 + static void build_menu(GtkWidget *menubar, pw3270_trace *window, const gchar *name, const struct submenu *item, size_t sz)
  195 + {
  196 + int f;
  197 + GtkWidget * menu = gtk_menu_new();
  198 + GtkWidget * topitem = gtk_image_menu_item_new_from_stock( name, NULL );
  199 +
  200 + gtk_menu_item_set_submenu(GTK_MENU_ITEM(topitem), menu);
  201 +
  202 + for(f=0;f<sz;f++)
  203 + {
  204 + GtkWidget *widget = gtk_image_menu_item_new_from_stock( item[f].stock_id, NULL );
  205 + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widget);
  206 + g_signal_connect(G_OBJECT(widget), "activate",item[f].action,window);
  207 + }
  208 +
  209 + gtk_menu_shell_append(GTK_MENU_SHELL(menubar), topitem);
  210 + }
  211 +
  212 + static void glog(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,GtkWidget *window)
  213 + {
  214 + #ifndef LOG_INFO
  215 + #define LOG_INFO 0
  216 + #endif // LOG_INFO
  217 +
  218 + #ifndef LOG_ERR
  219 + #define LOG_ERR 0
  220 + #endif // LOG_ERR
  221 +
  222 + #ifndef LOG_DEBUG
  223 + #define LOG_DEBUG 0
  224 + #endif // LOG_DEBUG
  225 +
  226 + static const struct _logtype
  227 + {
  228 + GLogLevelFlags log_level;
  229 + int priority;
  230 + const gchar * msg;
  231 + } logtype[] =
  232 + {
  233 + { G_LOG_FLAG_RECURSION, LOG_INFO, "recursion" },
  234 + { G_LOG_FLAG_FATAL, LOG_ERR, "fatal error" },
  235 +
  236 + /* GLib log levels */
  237 + { G_LOG_LEVEL_ERROR, LOG_ERR, "error" },
  238 + { G_LOG_LEVEL_CRITICAL, LOG_ERR, "critical error" },
  239 + { G_LOG_LEVEL_WARNING, LOG_ERR, "warning" },
  240 + { G_LOG_LEVEL_MESSAGE, LOG_ERR, "message" },
  241 + { G_LOG_LEVEL_INFO, LOG_INFO, "info" },
  242 + { G_LOG_LEVEL_DEBUG, LOG_DEBUG, "debug" },
  243 + };
  244 +
  245 + int f;
  246 +
  247 + for(f=0;f<G_N_ELEMENTS(logtype);f++)
  248 + {
  249 + if(logtype[f].log_level == log_level)
  250 + {
  251 + gchar *ptr;
  252 + gchar *text = g_strdup_printf("%s: %s %s",logtype[f].msg,log_domain ? log_domain : "",message);
  253 + for(ptr = text;*ptr;ptr++)
  254 + {
  255 + if(*ptr < ' ')
  256 + *ptr = ' ';
  257 + }
  258 +
  259 + pw3270_trace_printf(window,"%s\n",text);
  260 +
  261 +#ifdef HAVE_SYSLOG
  262 + syslog(logtype[f].priority,"%s",text);
  263 +#endif // HAVE_SYSLOG
  264 + g_free(text);
  265 + return;
  266 + }
  267 + }
  268 +
  269 + pw3270_trace_printf(window,"%s %s\n",log_domain ? log_domain : "", message);
  270 +
  271 +#ifdef HAVE_SYSLOG
  272 + syslog(LOG_INFO,"%s %s",log_domain ? log_domain : "", message);
  273 +#endif // HAVE_SYSLOG
  274 +
  275 + }
166 276  
167 277 static void pw3270_trace_init(pw3270_trace *window)
168 278 {
169 279 GtkWidget *widget;
170 280 GtkWidget *view;
171 281 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
  282 +
  283 + // Top menu
  284 + {
  285 +
  286 + static const struct submenu filemenu[] =
  287 + {
  288 + { GTK_STOCK_SAVE_AS, G_CALLBACK(menu_save) },
  289 + { GTK_STOCK_QUIT, G_CALLBACK(menu_close) },
  290 +
  291 + };
  292 +
  293 + widget = gtk_menu_bar_new();
  294 +
  295 + build_menu(widget, window, GTK_STOCK_FILE, filemenu, G_N_ELEMENTS(filemenu));
  296 +
  297 + gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0);
  298 + }
172 299  
173 300 // Trace container
174 301 widget = gtk_scrolled_window_new(NULL,NULL);
... ... @@ -203,7 +330,11 @@ static void destroy(GtkObject *widget)
203 330  
204 331 gtk_widget_show_all(vbox);
205 332  
206   - gtk_container_add(GTK_CONTAINER(window),vbox);
  333 + gtk_container_add(GTK_CONTAINER(window),vbox);
  334 +
  335 + window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window);
  336 + trace("Log handler set to %d",window->log_handler);
  337 +
207 338 }
208 339  
209 340 GtkWidget * pw3270_trace_new(void)
... ...