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