1 /**********************************************************************
2 *
3 * This file is part of Cardpeek, the smart card reader utility.
4 *
5 * Copyright 2009-2013 by Alain Pannetrat <L1L1@gmx.com>
6 *
7 * Cardpeek is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * Cardpeek is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with Cardpeek. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22 #include "ui.h"
23 #include "gui_core.h"
24 #include "gui_logview.h"
25 #include "misc.h"
26 #include <string.h>
27
28 /*********************************************************/
29 /* THE INFAMOUS UGLY GLOBALS *****************************/
30 /*********************************************************/
31
32 GtkTextBuffer* LOG_BUFFER=NULL;
33 GtkWidget* LOG_WINDOW=NULL;
34 GtkStatusbar *STATUS_BAR=NULL;
35 guint STATUS_BAR_CONTEXT_ID=0;
36 #ifdef CUSTOM_GTK_LOG
37 guint CUSTOM_LOG_FUNCTION = 0;
38 #endif
39
40 /*********************************************************/
41 /* LOG FUNCTIONS AND UI CALLBACKS ************************/
42 /*********************************************************/
43
gui_logview_function(int log_level,const char * str)44 static void gui_logview_function(int log_level, const char* str)
45 {
46 GtkTextIter iter;
47 GtkAdjustment* adj;
48 const char* tag;
49 char status_bar_text[160];
50
51 if (!LOG_BUFFER)
52 return;
53
54 switch (log_level) {
55 case LOG_INFO: tag = "green_text";
56 break;
57 case LOG_DEBUG: tag = "black_text";
58 break;
59 case LOG_WARNING: tag = "purple_text";
60 break;
61 case LOG_ERROR:
62 default:
63 tag = "red_text";
64 }
65
66 gtk_text_buffer_get_iter_at_offset (LOG_BUFFER,&iter,-1);
67 gtk_text_buffer_insert_with_tags_by_name(LOG_BUFFER,&iter,str,-1,tag,NULL);
68 if (LOG_WINDOW)
69 {
70 adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(LOG_WINDOW));
71 gtk_adjustment_set_value(adj,gtk_adjustment_get_upper(adj));
72 gtk_adjustment_value_changed(adj);
73 }
74 if (STATUS_BAR)
75 {
76 strncpy(status_bar_text,str,160);
77 status_bar_text[159]=0;
78
79 if (status_bar_text[strlen(status_bar_text)-1]<' ')
80 status_bar_text[strlen(status_bar_text)-1]=0;
81
82 gtk_statusbar_pop (STATUS_BAR, STATUS_BAR_CONTEXT_ID);
83 gtk_statusbar_push (STATUS_BAR, STATUS_BAR_CONTEXT_ID,status_bar_text);
84 }
85 ui_update();
86 }
87
88 #ifdef CUSTOM_GTK_LOG
custom_log_function(const char * domain,GLogLevelFlags log_level,const gchar * message,gpointer user_data)89 static void custom_log_function(const char *domain,
90 GLogLevelFlags log_level,
91 const gchar *message,
92 gpointer user_data)
93 {
94 switch (log_level) {
95 case G_LOG_LEVEL_ERROR:
96 log_printf(LOG_ERROR,"%s",message);
97 break;
98 case G_LOG_LEVEL_CRITICAL:
99 log_printf(LOG_ERROR,"(*critical*) %s",message);
100 break;
101 case G_LOG_LEVEL_WARNING:
102 log_printf(LOG_WARNING,"%s",message);
103 break;
104 case G_LOG_LEVEL_MESSAGE:
105 log_printf(LOG_INFO,"(*message*) %s",message);
106 break;
107 case G_LOG_LEVEL_INFO:
108 log_printf(LOG_INFO,"%s",message);
109 break;
110 default:
111 log_printf(LOG_DEBUG,"%s",message);
112 }
113 }
114 #endif
gui_logview_create_window(void)115 GtkWidget *gui_logview_create_window(void)
116 {
117 GtkWidget *view;
118 PangoFontDescription *font_desc;
119
120 view = gtk_text_view_new ();
121
122 LOG_BUFFER = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
123
124 gtk_text_view_set_editable(GTK_TEXT_VIEW (view),FALSE);
125
126 gtk_text_buffer_create_tag(LOG_BUFFER,"black_text",
127 "foreground","black",
128 NULL);
129
130 gtk_text_buffer_create_tag(LOG_BUFFER,"green_text",
131 "foreground","dark green",
132 NULL);
133
134 gtk_text_buffer_create_tag(LOG_BUFFER,"purple_text",
135 "foreground","purple",
136 NULL);
137
138 gtk_text_buffer_create_tag(LOG_BUFFER,"red_text",
139 "foreground","dark red",
140 NULL);
141
142 font_desc = pango_font_description_from_string ("Monospace");
143 gtk_widget_override_font (view, font_desc);
144 pango_font_description_free (font_desc);
145
146 LOG_WINDOW = GTK_WIDGET(gtk_scrolled_window_new (NULL, NULL));
147 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (LOG_WINDOW),
148 GTK_POLICY_AUTOMATIC,
149 GTK_POLICY_AUTOMATIC);
150
151 gtk_container_add (GTK_CONTAINER (LOG_WINDOW), view);
152
153 log_set_function(gui_logview_function);
154
155 #ifdef CUSTOM_GTK_LOG
156 CUSTOM_LOG_FUNCTION = g_log_set_handler(NULL,
157 G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
158 custom_log_function,
159 NULL);
160 #endif
161
162 return GTK_WIDGET(LOG_WINDOW);
163 }
164
gui_logview_create_status_bar(void)165 GtkWidget *gui_logview_create_status_bar(void)
166 {
167 GtkWidget* status = gtk_statusbar_new ();
168 STATUS_BAR = GTK_STATUSBAR(status);
169 STATUS_BAR_CONTEXT_ID = gtk_statusbar_get_context_id(STATUS_BAR,"main");
170 return status;
171 }
172
gui_logview_cleanup(void)173 void gui_logview_cleanup(void)
174 {
175 LOG_BUFFER = NULL;
176 #ifdef CUSTOM_GTK_LOG
177 g_log_remove_handler(NULL,CUSTOM_LOG_FUNCTION);
178 #endif
179 log_set_function(NULL);
180 LOG_WINDOW=NULL;
181 STATUS_BAR=NULL;
182 }
183