Remove sqlite3 build dep.
[gmpc.git] / src / Tools / bug-information.c
blob5f36aebc4d16880c9cd9ccf007016efd71a00a83
1 /* Gnome Music Player Client (GMPC)
2 * Copyright (C) 2004-2012 Qball Cow <qball@gmpclient.org>
3 * Project homepage: http://gmpclient.org/
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
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.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <gtk/gtk.h>
21 #include <config.h>
22 #include <main.h>
23 #include <bug-information.h>
24 #ifdef HAVE_UNIQUE
25 #include <unique/uniqueversion.h>
26 #endif
27 #include "revision.h"
29 static void bug_information_generate_message(GtkTextBuffer * buffer)
31 int i;
32 gchar *temp;
33 GtkTextIter iter;
34 GtkTextTag *bold_tag, *larger_tag;
35 GtkTextTagTable *table;
37 /* get buffer's tag table */
38 table = gtk_text_buffer_get_tag_table(buffer);
39 /* Create bold tag */
40 bold_tag = gtk_text_tag_new("bold");
41 g_object_set(G_OBJECT(bold_tag), "weight", PANGO_WEIGHT_BOLD, NULL);
42 /* add bold_tag to tag table */
43 gtk_text_tag_table_add(table, bold_tag);
45 /* Create bold tag */
46 larger_tag = gtk_text_tag_new("larger");
47 g_object_set(G_OBJECT(larger_tag), "scale", PANGO_SCALE_X_LARGE, NULL);
48 /* add larger_tag to tag table */
49 gtk_text_tag_table_add(table, larger_tag);
51 /* Get the start */
52 gtk_text_buffer_get_start_iter(buffer, &iter);
54 /* insert program name */
55 gtk_text_buffer_insert_with_tags(buffer, &iter, "Gnome Music Player Client\n", -1, bold_tag, larger_tag, NULL);
56 /* insert copyright */
57 gtk_text_buffer_insert_with_tags(buffer, &iter, GMPC_COPYRIGHT "\n\n", -1, bold_tag, NULL);
59 /* insert tagline */
60 gtk_text_buffer_insert_with_tags(buffer, &iter, "Tagline:\t", -1, bold_tag, NULL);
61 gtk_text_buffer_insert(buffer, &iter, GMPC_TAGLINE "\n", -1);
63 /* insert version */
64 gtk_text_buffer_insert_with_tags(buffer, &iter, "Version:\t", -1, bold_tag, NULL);
65 temp = g_strdup_printf("%i.%i.%i\n", GMPC_MAJOR_VERSION, GMPC_MINOR_VERSION, GMPC_MICRO_VERSION);
66 gtk_text_buffer_insert(buffer, &iter, temp, -1);
67 g_free(temp);
69 /* insert revision */
70 gtk_text_buffer_insert_with_tags(buffer, &iter, "Revision:\t", -1, bold_tag, NULL);
71 temp = g_strdup_printf("%s\n", revision);
72 gtk_text_buffer_insert(buffer, &iter, temp, -1);
73 g_free(temp);
75 /** support libs */
76 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nSupport libraries:\n", -1, bold_tag, larger_tag, NULL);
78 /* libmpd */
79 gtk_text_buffer_insert_with_tags(buffer, &iter, "Libmpd:\t", -1, bold_tag, NULL);
80 temp = g_strdup_printf("%i.%i.%i\n", LIBMPD_MAJOR_VERSION, LIBMPD_MINOR_VERSION, LIBMPD_MICRO_VERSION);
81 gtk_text_buffer_insert(buffer, &iter, temp, -1);
82 g_free(temp);
84 /* gtk+-2.0 */
85 gtk_text_buffer_insert_with_tags(buffer, &iter, "Compile time Gtk+-2.0:\t", -1, bold_tag, NULL);
86 temp = g_strdup_printf("%i.%i.%i\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
87 gtk_text_buffer_insert(buffer, &iter, temp, -1);
88 g_free(temp);
90 gtk_text_buffer_insert_with_tags(buffer, &iter, "Runtime Gtk+-2.0:\t", -1, bold_tag, NULL);
91 temp = g_strdup_printf("%i.%i.%i\n", gtk_major_version, gtk_minor_version, gtk_micro_version);
92 gtk_text_buffer_insert(buffer, &iter, temp, -1);
93 g_free(temp);
95 /* glib-2.0 */
96 gtk_text_buffer_insert_with_tags(buffer, &iter, "Glib-2.0:\t", -1, bold_tag, NULL);
97 temp = g_strdup_printf("%i.%i.%i\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
98 gtk_text_buffer_insert(buffer, &iter, temp, -1);
99 g_free(temp);
101 #ifdef HAVE_UNIQUE
102 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nLibunique:\t", -1, bold_tag, NULL);
103 temp = g_strdup_printf("%s\n", UNIQUE_VERSION_S);
104 gtk_text_buffer_insert(buffer, &iter, temp, -1);
105 g_free(temp);
106 #endif
107 /* platform */
108 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nPlatform:\t", -1, bold_tag, NULL);
109 #ifdef WIN32
110 gtk_text_buffer_insert(buffer, &iter, "Windows\n", -1);
111 gtk_text_buffer_insert_with_tags(buffer, &iter, "Windows version:\t", -1, bold_tag, NULL);
112 temp = g_strdup_printf("%i\n", g_win32_get_windows_version());
113 gtk_text_buffer_insert(buffer, &iter, temp, -1);
114 g_free(temp);
115 #else
116 #ifdef OSX
117 gtk_text_buffer_insert(buffer, &iter, "Mac OsX\n", -1);
118 #else
119 gtk_text_buffer_insert(buffer, &iter, "*nix\n", -1);
120 #endif
121 #endif
123 /** compile flags*/
124 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nCompile flags:\n", -1, bold_tag, larger_tag, NULL);
126 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nNLS Support:\t", -1, bold_tag, NULL);
127 #ifdef ENABLE_NLS
128 gtk_text_buffer_insert(buffer, &iter, "Enabled", -1);
129 #else
130 gtk_text_buffer_insert(buffer, &iter, "Disabled", -1);
131 #endif
133 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nMultimedia Keys:\t", -1, bold_tag, NULL);
134 #ifdef ENABLE_MMKEYS
135 gtk_text_buffer_insert(buffer, &iter, "Enabled", -1);
136 #else
137 gtk_text_buffer_insert(buffer, &iter, "Disabled", -1);
138 #endif
140 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nAppIndicator Support:\t", -1, bold_tag, NULL);
141 #ifdef HAVE_APP_INDICATOR
142 gtk_text_buffer_insert(buffer, &iter, "Enabled", -1);
143 #else
144 gtk_text_buffer_insert(buffer, &iter, "Disabled", -1);
145 #endif
147 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nLibspiff support:\t", -1, bold_tag, NULL);
148 #ifdef SPIFF
149 gtk_text_buffer_insert(buffer, &iter, "Enabled", -1);
150 #else
151 gtk_text_buffer_insert(buffer, &iter, "Disabled", -1);
152 #endif
154 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nLibunique support:\t", -1, bold_tag, NULL);
155 #ifdef HAVE_UNIQUE
156 gtk_text_buffer_insert(buffer, &iter, "Enabled", -1);
157 #else
158 gtk_text_buffer_insert(buffer, &iter, "Disabled", -1);
159 #endif
161 /** Plugins */
162 if (num_plugins > 0)
164 gtk_text_buffer_insert_with_tags(buffer, &iter, "\n\nExternal Plugins:\n", -1, bold_tag, larger_tag, NULL);
165 for (i = 0; i < num_plugins; i++)
167 if (!gmpc_plugin_is_internal(plugins[i]))
169 const gchar *name = gmpc_plugin_get_name(plugins[i]);
170 const int *version = gmpc_plugin_get_version(plugins[i]);
171 if(gmpc_plugin_get_enabled(plugins[i])) {
172 gtk_text_buffer_insert(buffer, &iter, "☑ ", -1);
173 }else {
174 gtk_text_buffer_insert(buffer, &iter, "☐ ", -1);
176 gtk_text_buffer_insert_with_tags(buffer, &iter, name, -1, bold_tag, NULL);
177 temp = g_strdup_printf("\t%i.%i.%i\n", version[0], version[1], version[2]);
178 gtk_text_buffer_insert(buffer, &iter, temp, -1);
179 g_free(temp);
184 if (mpd_check_connected(connection))
186 gchar **handlers;
187 /** Plugins */
188 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nMusic Player Daemon:\n", -1, bold_tag, larger_tag, NULL);
190 /* Version */
191 gtk_text_buffer_insert_with_tags(buffer, &iter, "Version:\t", -1, bold_tag, NULL);
192 temp = mpd_server_get_version(connection);
193 gtk_text_buffer_insert(buffer, &iter, temp, -1);
194 g_free(temp);
196 /* total songs */
197 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nSongs:\t", -1, bold_tag, NULL);
198 temp = g_strdup_printf("%i", mpd_stats_get_total_songs(connection));
199 gtk_text_buffer_insert(buffer, &iter, temp, -1);
200 g_free(temp);
202 /* hostname */
203 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nHostname:\t", -1, bold_tag, NULL);
204 temp = connection_get_hostname();
205 gtk_text_buffer_insert(buffer, &iter, temp, -1);
206 /* handlers */
207 gtk_text_buffer_insert_with_tags(buffer, &iter, "\nUrl handlers:\t", -1, bold_tag, NULL);
208 handlers = mpd_server_get_url_handlers(connection);
209 if (handlers)
211 temp = g_strjoinv(",", handlers);
212 g_strfreev(handlers);
213 handlers = NULL;
214 } else
215 temp = g_strdup("N/A");
216 gtk_text_buffer_insert(buffer, &iter, temp, -1);
217 g_free(temp);
223 * Shows window with usefull information for a bug report.
226 void bug_information_window_new(GtkWidget * window)
228 GtkWidget *dialog;
229 GtkTextBuffer *buffer;
230 GtkWidget *scrolled_window, *text_view;
231 PangoTabArray *tab_array;
233 /* Basic dialog with a close button */
234 dialog = gtk_dialog_new_with_buttons(_("Bug information"),
235 (window) ? (GtkWindow *) playlist3_get_window() : NULL,
236 GTK_DIALOG_DESTROY_WITH_PARENT ,
237 GTK_STOCK_CLOSE, GTK_RESPONSE_YES, NULL);
239 /* Set default window size */
240 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 800);
241 /* The buffer that holds the "report" */
242 buffer = gtk_text_buffer_new(NULL);
244 bug_information_generate_message(buffer);
246 /* View to show the textbuffer */
247 text_view = gtk_text_view_new();
248 /* setup textview */
249 /* set tabarray */
250 tab_array = pango_tab_array_new_with_positions(1, TRUE, PANGO_TAB_LEFT, 500);
251 gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(text_view), TRUE);
252 gtk_text_view_set_tabs(GTK_TEXT_VIEW(text_view), tab_array);
253 pango_tab_array_free(tab_array);
255 /* not editable */
256 gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE);
257 /* set margins */
258 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_view), 12);
259 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text_view), 12);
261 /* Add the text buffer */
262 gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view), buffer);
264 /* scrolled window, this allows the text view to scroll */
265 scrolled_window = gtk_scrolled_window_new(NULL, NULL);
266 /* setup scrolled window */
267 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_ETCHED_IN);
268 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
269 /* add text view to scrolled_window */
270 gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
271 /* add scrolled_window to dialog */
272 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(dialog)), scrolled_window, TRUE, TRUE, 0);
274 /* Add dialogs response handler */
275 g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL);
276 /* show dialog */
277 gtk_widget_show_all(dialog);
278 if (window == NULL)
280 gtk_dialog_run(GTK_DIALOG(dialog));
286 * print text to information for a bug report.
288 void bug_information_file_new(FILE *fp)
290 GtkTextBuffer *buffer;
291 GtkTextIter start, end;
292 gchar *output;
293 /* The buffer that holds the "report" */
294 buffer = gtk_text_buffer_new(NULL);
296 bug_information_generate_message(buffer);
298 gtk_text_buffer_get_start_iter(buffer, &start);
299 gtk_text_buffer_get_end_iter(buffer, &end);
300 output = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
301 if(output)
303 fprintf(fp, "%s\n", output);
304 g_free(output);
306 g_object_unref(buffer);