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,7 +37,11 @@ | ||
37 | 37 | ||
38 | #include <pw3270/trace.h> | 38 | #include <pw3270/trace.h> |
39 | #include <lib3270/log.h> | 39 | #include <lib3270/log.h> |
40 | - | 40 | + |
41 | +#if defined( HAVE_SYSLOG ) | ||
42 | + #include <syslog.h> | ||
43 | +#endif // HAVE_SYSLOG | ||
44 | + | ||
41 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ | 45 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ |
42 | 46 | ||
43 | G_BEGIN_DECLS | 47 | G_BEGIN_DECLS |
@@ -54,7 +58,8 @@ | @@ -54,7 +58,8 @@ | ||
54 | GtkTextBuffer * text; | 58 | GtkTextBuffer * text; |
55 | GtkWidget * entry; | 59 | GtkWidget * entry; |
56 | GtkWidget * button; | 60 | GtkWidget * button; |
57 | - gchar **line; | 61 | + gchar **line; |
62 | + guint log_handler; | ||
58 | gboolean * enabled; | 63 | gboolean * enabled; |
59 | gboolean destroy_on_close; | 64 | gboolean destroy_on_close; |
60 | }; | 65 | }; |
@@ -102,6 +107,12 @@ static void destroy(GtkObject *widget) | @@ -102,6 +107,12 @@ static void destroy(GtkObject *widget) | ||
102 | { | 107 | { |
103 | pw3270_trace * hwnd = PW3270_TRACE(widget); | 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 | if(hwnd->line) | 116 | if(hwnd->line) |
106 | *hwnd->line = NULL; | 117 | *hwnd->line = NULL; |
107 | 118 | ||
@@ -163,12 +174,128 @@ static void destroy(GtkObject *widget) | @@ -163,12 +174,128 @@ static void destroy(GtkObject *widget) | ||
163 | trace("%s",__FUNCTION__); | 174 | trace("%s",__FUNCTION__); |
164 | activate_default(window); | 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 | static void pw3270_trace_init(pw3270_trace *window) | 277 | static void pw3270_trace_init(pw3270_trace *window) |
168 | { | 278 | { |
169 | GtkWidget *widget; | 279 | GtkWidget *widget; |
170 | GtkWidget *view; | 280 | GtkWidget *view; |
171 | GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | 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 | // Trace container | 300 | // Trace container |
174 | widget = gtk_scrolled_window_new(NULL,NULL); | 301 | widget = gtk_scrolled_window_new(NULL,NULL); |
@@ -203,7 +330,11 @@ static void destroy(GtkObject *widget) | @@ -203,7 +330,11 @@ static void destroy(GtkObject *widget) | ||
203 | 330 | ||
204 | gtk_widget_show_all(vbox); | 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 | GtkWidget * pw3270_trace_new(void) | 340 | GtkWidget * pw3270_trace_new(void) |