diff options
Diffstat (limited to 'trace-dialog.c')
-rw-r--r-- | trace-dialog.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/trace-dialog.c b/trace-dialog.c new file mode 100644 index 0000000..c220a52 --- /dev/null +++ b/trace-dialog.c | |||
@@ -0,0 +1,277 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> | ||
3 | * | ||
4 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; version 2 of the License (not later!) | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | * | ||
19 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
20 | */ | ||
21 | #include <gtk/gtk.h> | ||
22 | #include <stdlib.h> | ||
23 | #include <string.h> | ||
24 | #include <stdarg.h> | ||
25 | #include <errno.h> | ||
26 | #include <ctype.h> | ||
27 | |||
28 | #include "trace-compat.h" | ||
29 | #include "trace-cmd.h" | ||
30 | #include "trace-gui.h" | ||
31 | |||
32 | #define DIALOG_WIDTH 500 | ||
33 | #define DIALOG_HEIGHT 550 | ||
34 | |||
35 | static GtkWidget *statusbar; | ||
36 | static GtkWidget *statuspix; | ||
37 | static GString *statusstr; | ||
38 | |||
39 | static GtkWidget *parent_window; | ||
40 | |||
41 | void pr_stat(char *fmt, ...) | ||
42 | { | ||
43 | GString *str; | ||
44 | va_list ap; | ||
45 | |||
46 | if (!statusstr) { | ||
47 | statusstr = g_string_new(""); | ||
48 | if (!statusstr) | ||
49 | die("Allocating status string"); | ||
50 | } | ||
51 | |||
52 | str = g_string_new(""); | ||
53 | |||
54 | va_start(ap, fmt); | ||
55 | g_string_vprintf(str, fmt, ap); | ||
56 | va_end(ap); | ||
57 | |||
58 | g_string_append_printf(statusstr, "%s\n", str->str); | ||
59 | |||
60 | if (statusbar) { | ||
61 | gtk_statusbar_push(GTK_STATUSBAR(statusbar), 1, str->str); | ||
62 | gtk_widget_show(statuspix); | ||
63 | } | ||
64 | |||
65 | g_string_free(str, TRUE); | ||
66 | } | ||
67 | |||
68 | /** | ||
69 | * trace_dialog_register_window - register window for warning dialogs | ||
70 | * @window: parent window to use for other dialogs | ||
71 | * | ||
72 | * The warning messages do not have a way to pass the window to | ||
73 | * the function, since these functions are also used by the command | ||
74 | * line interface. This allows an application to give the warning | ||
75 | * messages a window to use. | ||
76 | */ | ||
77 | void trace_dialog_register_window(GtkWidget *window) | ||
78 | { | ||
79 | parent_window = window; | ||
80 | } | ||
81 | |||
82 | void warning(char *fmt, ...) | ||
83 | { | ||
84 | GString *str; | ||
85 | va_list ap; | ||
86 | |||
87 | if (!parent_window) { | ||
88 | va_start(ap, fmt); | ||
89 | __vwarning(fmt, ap); | ||
90 | va_end(ap); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | str = g_string_new(""); | ||
95 | |||
96 | va_start(ap, fmt); | ||
97 | g_string_vprintf(str, fmt, ap); | ||
98 | va_end(ap); | ||
99 | |||
100 | g_string_append(str, "\n"); | ||
101 | |||
102 | if (errno) | ||
103 | g_string_prepend(str, strerror(errno)); | ||
104 | |||
105 | errno = 0; | ||
106 | |||
107 | trace_dialog(GTK_WINDOW(parent_window), TRACE_GUI_WARNING, | ||
108 | str->str); | ||
109 | |||
110 | g_string_free(str, TRUE); | ||
111 | } | ||
112 | |||
113 | static void | ||
114 | status_display_clicked (gpointer data) | ||
115 | { | ||
116 | GtkWidget *dialog; | ||
117 | GtkWidget *scrollwin; | ||
118 | GtkWidget *viewport; | ||
119 | GtkWidget *textview; | ||
120 | GtkTextBuffer *buffer; | ||
121 | |||
122 | dialog = gtk_dialog_new_with_buttons("Status", | ||
123 | NULL, | ||
124 | GTK_DIALOG_MODAL, | ||
125 | "OK", | ||
126 | GTK_RESPONSE_ACCEPT, | ||
127 | NULL); | ||
128 | |||
129 | scrollwin = gtk_scrolled_window_new(NULL, NULL); | ||
130 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), | ||
131 | GTK_POLICY_AUTOMATIC, | ||
132 | GTK_POLICY_AUTOMATIC); | ||
133 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0); | ||
134 | gtk_widget_show(scrollwin); | ||
135 | |||
136 | viewport = gtk_viewport_new(NULL, NULL); | ||
137 | gtk_widget_show(viewport); | ||
138 | |||
139 | gtk_container_add(GTK_CONTAINER(scrollwin), viewport); | ||
140 | |||
141 | textview = gtk_text_view_new(); | ||
142 | buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); | ||
143 | gtk_text_buffer_set_text(buffer, statusstr->str, -1); | ||
144 | |||
145 | gtk_container_add(GTK_CONTAINER(viewport), textview); | ||
146 | gtk_widget_show(textview); | ||
147 | |||
148 | gtk_widget_set_size_request(GTK_WIDGET(dialog), | ||
149 | DIALOG_WIDTH, DIALOG_HEIGHT); | ||
150 | |||
151 | gtk_dialog_run(GTK_DIALOG(dialog)); | ||
152 | |||
153 | gtk_widget_destroy(dialog); | ||
154 | } | ||
155 | |||
156 | static gboolean | ||
157 | do_status_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) | ||
158 | { | ||
159 | static GtkWidget *menu; | ||
160 | static GtkWidget *menu_status_display; | ||
161 | |||
162 | if (!menu) { | ||
163 | menu = gtk_menu_new(); | ||
164 | menu_status_display = gtk_menu_item_new_with_label("Display Status"); | ||
165 | gtk_widget_show(menu_status_display); | ||
166 | gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_status_display); | ||
167 | |||
168 | g_signal_connect_swapped (G_OBJECT (menu_status_display), "activate", | ||
169 | G_CALLBACK (status_display_clicked), | ||
170 | data); | ||
171 | } | ||
172 | |||
173 | gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, | ||
174 | gtk_get_current_event_time()); | ||
175 | |||
176 | return TRUE; | ||
177 | } | ||
178 | |||
179 | static gboolean | ||
180 | button_press_status(GtkWidget *widget, GdkEventButton *event, gpointer data) | ||
181 | { | ||
182 | if (event->button == 1) | ||
183 | return do_status_popup(widget, event, data); | ||
184 | |||
185 | return FALSE; | ||
186 | } | ||
187 | |||
188 | GtkWidget *trace_status_bar_new(void) | ||
189 | { | ||
190 | GtkWidget *eventbox; | ||
191 | |||
192 | statusbar = gtk_statusbar_new(); | ||
193 | |||
194 | statuspix = gtk_image_new_from_stock(GTK_STOCK_INFO, | ||
195 | GTK_ICON_SIZE_SMALL_TOOLBAR); | ||
196 | |||
197 | eventbox = gtk_event_box_new(); | ||
198 | gtk_container_add(GTK_CONTAINER(eventbox), statuspix); | ||
199 | gtk_widget_show(eventbox); | ||
200 | |||
201 | gtk_box_pack_end(GTK_BOX(statusbar), eventbox, FALSE, FALSE, 0); | ||
202 | |||
203 | if (statusstr) | ||
204 | gtk_widget_show(statuspix); | ||
205 | |||
206 | gtk_signal_connect(GTK_OBJECT(eventbox), "button_press_event", | ||
207 | (GtkSignalFunc) button_press_status, NULL); | ||
208 | |||
209 | return statusbar; | ||
210 | } | ||
211 | |||
212 | void trace_show_help(GtkWidget *window, const gchar *link, GError **error) | ||
213 | { | ||
214 | #if GTK_VERSION < CALC_GTK_VERSION(2,14,0) | ||
215 | trace_dialog(GTK_WINDOW(window), TRACE_GUI_WARNING, | ||
216 | "This version of GTK+ does not implement gtk_show_uri.\n" | ||
217 | "Please upgrade your GTK and recompile"); | ||
218 | #else | ||
219 | gtk_show_uri(gtk_widget_get_screen(GTK_WIDGET(window)), | ||
220 | link, | ||
221 | GDK_CURRENT_TIME, | ||
222 | error); | ||
223 | #endif | ||
224 | } | ||
225 | |||
226 | void trace_dialog(GtkWindow *parent, enum trace_dialog_type type, | ||
227 | gchar *message, ...) | ||
228 | { | ||
229 | GtkWidget *dialog; | ||
230 | GtkMessageType mtype; | ||
231 | gchar *str; | ||
232 | va_list ap; | ||
233 | |||
234 | switch (type) { | ||
235 | case TRACE_GUI_INFO: | ||
236 | mtype = GTK_MESSAGE_INFO; | ||
237 | break; | ||
238 | case TRACE_GUI_WARNING: | ||
239 | mtype = GTK_MESSAGE_WARNING; | ||
240 | break; | ||
241 | case TRACE_GUI_ERROR: | ||
242 | mtype = GTK_MESSAGE_ERROR; | ||
243 | break; | ||
244 | } | ||
245 | |||
246 | va_start(ap, message); | ||
247 | str = g_strdup_vprintf(message, ap); | ||
248 | va_end(ap); | ||
249 | |||
250 | dialog = gtk_message_dialog_new(parent, | ||
251 | GTK_DIALOG_DESTROY_WITH_PARENT, | ||
252 | mtype, | ||
253 | GTK_BUTTONS_CLOSE, | ||
254 | "%s", str); | ||
255 | g_free(str); | ||
256 | gtk_dialog_run(GTK_DIALOG(dialog)); | ||
257 | gtk_widget_destroy(dialog); | ||
258 | } | ||
259 | |||
260 | gchar *trace_get_file_dialog(const gchar *title) | ||
261 | { | ||
262 | GtkWidget *dialog; | ||
263 | gchar *filename = NULL; | ||
264 | |||
265 | dialog = gtk_file_chooser_dialog_new(title, | ||
266 | NULL, | ||
267 | GTK_FILE_CHOOSER_ACTION_OPEN, | ||
268 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | ||
269 | GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, | ||
270 | NULL); | ||
271 | if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) | ||
272 | filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | ||
273 | |||
274 | gtk_widget_destroy(dialog); | ||
275 | |||
276 | return filename; | ||
277 | } | ||