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) | ... | ... |