Commit 031fb7a718ce137de403fefd89366dc1953fc3f8
1 parent
a6c60ba3
Exists in
master
and in
5 other branches
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) | ... | ... |