📄 log.c
字号:
/* * Logging Window and handler * * Authors: Gerhard Khueny <e9625442@student.tuwien.ac.at> * * TODO: * * Fixes: * * For license terms, see the file COPYING in the project directory. *//* log.c */#include <config.h>#include <glib.h>#include "log.h"static GtkWidget *log_text, *log_window;static gint loglevel;static void log_window_clear(GtkWidget * button);static void log_set_level(GtkWidget * item, gpointer data);static gint log_window_close(GtkWidget * window, gpointer data);GtkWidget *log_window_new(){ GtkWidget *window, *levelopt, *button, *vbox, *frame, *hboxtop, *hboxtext, *vscrollbar, *label, *menu, *menuitem; GtkAdjustment *textadv; GtkTooltips *tooltips; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); levelopt = gtk_option_menu_new(); button = gtk_button_new_with_label("CLEAR TEXT"); vbox = gtk_vbox_new(FALSE, 5); hboxtop = gtk_hbox_new(FALSE, 2); hboxtext = gtk_hbox_new(FALSE, 2); textadv = (GtkAdjustment *) gtk_adjustment_new(0.5, 0, 1, 0.1, 0, 1); log_text = gtk_text_new(NULL, textadv); frame = gtk_frame_new("Logging"); vscrollbar = gtk_vscrollbar_new(textadv); label = gtk_label_new("LOG-Level:"); menu = gtk_menu_new(); tooltips = gtk_tooltips_new(); gtk_tooltips_set_tip(tooltips, levelopt, "Set Level for displaying messages", NULL); menuitem = gtk_menu_item_new_with_label("DEBUG"); gtk_widget_show(menuitem); gtk_menu_append(GTK_MENU(menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(log_set_level), (gpointer) 0); menuitem = gtk_menu_item_new_with_label("INFO"); gtk_widget_show(menuitem); gtk_menu_append(GTK_MENU(menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(log_set_level), (gpointer) 1); menuitem = gtk_menu_item_new_with_label("MESSAGE"); gtk_widget_show(menuitem); gtk_menu_append(GTK_MENU(menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(log_set_level), (gpointer) 2); menuitem = gtk_menu_item_new_with_label("WARNING"); gtk_widget_show(menuitem); gtk_menu_append(GTK_MENU(menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(log_set_level), (gpointer) 3); gtk_option_menu_set_menu(GTK_OPTION_MENU(levelopt), menu); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); gtk_window_set_title(GTK_WINDOW(window), "Logging"); gtk_container_add(GTK_CONTAINER(window), frame); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(hboxtop), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hboxtop), levelopt, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), hboxtop, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(hboxtext), log_text); gtk_box_pack_end(GTK_BOX(hboxtext), vscrollbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(vbox), hboxtext); gtk_box_pack_end(GTK_BOX(vbox), button, FALSE, FALSE, 0); /* Signals */ gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(log_window_clear), NULL); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(log_window_close), NULL); log_window=window; return window;}void log_on(){ gtk_widget_show_all(log_window);}static gbooleanevent_loop_print_text_cb(gpointer text) { gtk_text_insert(GTK_TEXT(log_text), NULL, NULL, NULL, (gchar *) text, -1); g_free(text); return FALSE;}static void log_window_clear(GtkWidget * button){ gtk_text_freeze(GTK_TEXT(log_text)); gtk_text_backward_delete(GTK_TEXT(log_text), gtk_text_get_length(GTK_TEXT(log_text))); gtk_text_thaw(GTK_TEXT(log_text));}static void log_set_level(GtkWidget * item, gpointer data){ loglevel = (gint) data;}static gint log_window_close(GtkWidget * window, gpointer data){ gtk_widget_hide_all(window); return (TRUE);}voidgsms_log_func(const gchar * log_domain, GLogLevelFlags log_level, const gchar * message, gpointer user_data){ gchar *logtext = NULL; gint level = 0; switch ((int) log_level) { case G_LOG_LEVEL_DEBUG: logtext = g_strdup_printf("DEBUG %s: %s\n", log_domain, message); level = 0; break; case G_LOG_LEVEL_INFO: logtext = g_strdup_printf("INFO %s: %s\n", log_domain, message); level = 1; break; case G_LOG_LEVEL_MESSAGE: logtext = g_strdup_printf("MESSAGE %s: %s\n", log_domain, message); level = 2; break; case G_LOG_LEVEL_WARNING: logtext = g_strdup_printf("WARNING %s: %s\n", log_domain, message); level = 3; break; } /* we have to do it this way because this functions get called through callbacks from g_log and that is called from threads */ if (level >= loglevel) g_idle_add(event_loop_print_text_cb, logtext); else g_free(logtext);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -