aboutsummaryrefslogtreecommitdiffstats
path: root/trace-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-dialog.c')
-rw-r--r--trace-dialog.c277
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
35static GtkWidget *statusbar;
36static GtkWidget *statuspix;
37static GString *statusstr;
38
39static GtkWidget *parent_window;
40
41void 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 */
77void trace_dialog_register_window(GtkWidget *window)
78{
79 parent_window = window;
80}
81
82void 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
113static void
114status_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
156static gboolean
157do_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
179static gboolean
180button_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
188GtkWidget *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
212void 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
226void 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
260gchar *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}