648
|
1 /*
|
|
2 * Geeqie
|
|
3 * Copyright (C) 2008 The Geeqie Team
|
|
4 *
|
|
5 * Authors: Vladimir Nadvornik / Laurent Monin
|
|
6 *
|
|
7 * This software is released under the GNU General Public License (GNU GPL).
|
|
8 * Please read the included file COPYING for more information.
|
|
9 * This software comes with no warranty of any kind, use at your own risk!
|
|
10 */
|
|
11
|
|
12 #include "main.h"
|
|
13 #include "window.h"
|
|
14
|
|
15 #include "pixbuf_util.h"
|
|
16 #include "ui_fileops.h"
|
|
17 #include "ui_help.h"
|
|
18
|
|
19 GtkWidget *window_new(GtkWindowType type, const gchar *name, const gchar *icon,
|
|
20 const gchar *icon_file, const gchar *subtitle)
|
|
21 {
|
|
22 gchar *title;
|
|
23 GtkWidget *window;
|
|
24
|
|
25 window = gtk_window_new(type);
|
|
26 if (!window) return NULL;
|
|
27
|
|
28 if (subtitle)
|
|
29 {
|
|
30 title = g_strdup_printf("%s - %s", subtitle, GQ_APPNAME);
|
|
31 }
|
|
32 else
|
|
33 {
|
|
34 title = g_strdup_printf("%s", GQ_APPNAME);
|
|
35 }
|
|
36
|
|
37 gtk_window_set_title(GTK_WINDOW(window), title);
|
|
38 g_free(title);
|
|
39
|
|
40 window_set_icon(window, icon, icon_file);
|
|
41 gtk_window_set_role(GTK_WINDOW(window), name);
|
|
42 gtk_window_set_wmclass(GTK_WINDOW(window), name, GQ_WMCLASS);
|
|
43
|
|
44 return window;
|
|
45 }
|
|
46
|
|
47 void window_set_icon(GtkWidget *window, const gchar *icon, const gchar *file)
|
|
48 {
|
|
49 if (!icon && !file) icon = PIXBUF_INLINE_ICON;
|
|
50
|
|
51 if (icon)
|
|
52 {
|
|
53 GdkPixbuf *pixbuf;
|
|
54
|
|
55 pixbuf = pixbuf_inline(icon);
|
|
56 if (pixbuf)
|
|
57 {
|
|
58 gtk_window_set_icon(GTK_WINDOW(window), pixbuf);
|
|
59 g_object_unref(pixbuf);
|
|
60 }
|
|
61 }
|
|
62 else
|
|
63 {
|
|
64 gtk_window_set_icon_from_file(GTK_WINDOW(window), file, NULL);
|
|
65 }
|
|
66 }
|
|
67
|
|
68 gint window_maximized(GtkWidget *window)
|
|
69 {
|
|
70 GdkWindowState state;
|
|
71
|
|
72 if (!window || !window->window) return FALSE;
|
|
73
|
|
74 state = gdk_window_get_state(window->window);
|
|
75 return (state & GDK_WINDOW_STATE_MAXIMIZED);
|
|
76 }
|
|
77
|
|
78 /*
|
|
79 *-----------------------------------------------------------------------------
|
|
80 * Open browser with the help Documentation
|
|
81 *-----------------------------------------------------------------------------
|
|
82 */
|
|
83
|
|
84 static gchar *command_result(const gchar *binary, const gchar *command)
|
|
85 {
|
|
86 gchar *result = NULL;
|
|
87 FILE *f;
|
|
88 char buf[2048];
|
|
89 int l;
|
|
90
|
|
91 if (!binary) return NULL;
|
|
92 if (!file_in_path(binary)) return NULL;
|
|
93
|
|
94 if (!command) return g_strdup(binary);
|
|
95 if (command[0] == '!') return g_strdup(command + 1);
|
|
96
|
|
97 f = popen(command, "r");
|
|
98 if (!f) return NULL;
|
|
99
|
|
100 while ((l = fread(buf, sizeof(char), sizeof(buf), f)) > 0)
|
|
101 {
|
|
102 if (!result)
|
|
103 {
|
|
104 int n = 0;
|
|
105
|
|
106 while (n < l && buf[n] != '\n' && buf[n] != '\r') n++;
|
|
107 if (n > 0) result = g_strndup(buf, n);
|
|
108 }
|
|
109 }
|
|
110
|
|
111 pclose(f);
|
|
112
|
|
113 return result;
|
|
114 }
|
|
115
|
|
116 static void help_browser_command(const gchar *command, const gchar *path)
|
|
117 {
|
|
118 gchar *result;
|
|
119 gchar *buf;
|
|
120 gchar *begin;
|
|
121 gchar *end;
|
|
122
|
|
123 if (!command || !path) return;
|
|
124
|
|
125 DEBUG_1("Help command pre \"%s\", \"%s\"", command, path);
|
|
126
|
|
127 buf = g_strdup(command);
|
|
128 begin = strstr(buf, "%s");
|
|
129 if (begin)
|
|
130 {
|
|
131 *begin = '\0';
|
|
132 end = begin + 2;
|
|
133 begin = buf;
|
|
134
|
|
135 result = g_strdup_printf("%s%s%s &", begin, path, end);
|
|
136 }
|
|
137 else
|
|
138 {
|
|
139 result = g_strdup_printf("%s \"%s\" &", command, path);
|
|
140 }
|
|
141 g_free(buf);
|
|
142
|
|
143 DEBUG_1("Help command post [%s]", result);
|
|
144
|
|
145 system(result);
|
|
146
|
|
147 g_free(result);
|
|
148 }
|
|
149
|
|
150 /*
|
|
151 * each set of 2 strings is one browser:
|
|
152 * the 1st is the binary to look for in the path
|
|
153 * the 2nd has 3 capabilities:
|
|
154 * NULL exec binary with html file path as command line
|
|
155 * string exec string and use results for command line
|
|
156 * !string use text following ! as command line, replacing optional %s with html file path
|
|
157 */
|
|
158 static gchar *html_browsers[] =
|
|
159 {
|
|
160 /* Redhat has a nifty htmlview script to start the user's preferred browser */
|
|
161 "htmlview", NULL,
|
|
162 /* GNOME 2 */
|
|
163 "gconftool-2", "gconftool-2 -g /desktop/gnome/url-handlers/http/command",
|
|
164 /* KDE */
|
|
165 "kfmclient", "!kfmclient exec \"%s\"",
|
|
166 /* use fallbacks */
|
|
167 "firefox", NULL,
|
|
168 "mozilla", NULL,
|
|
169 "konqueror", NULL,
|
|
170 "netscape", NULL,
|
|
171 NULL, NULL
|
|
172 };
|
|
173
|
|
174 static void help_browser_run(void)
|
|
175 {
|
|
176 gchar *result = NULL;
|
|
177 gint i;
|
|
178
|
|
179 i = 0;
|
|
180 while (!result && html_browsers[i])
|
|
181 {
|
|
182 result = command_result(html_browsers[i], html_browsers[i+1]);
|
|
183 i += 2;
|
|
184 }
|
|
185
|
|
186 if (!result)
|
|
187 {
|
|
188 printf("Unable to detect an installed browser.\n");
|
|
189 return;
|
|
190 }
|
|
191
|
|
192 help_browser_command(result, GQ_HTMLDIR "/index.html");
|
|
193
|
|
194 g_free(result);
|
|
195 }
|
|
196
|
|
197 /*
|
|
198 *-----------------------------------------------------------------------------
|
|
199 * help window
|
|
200 *-----------------------------------------------------------------------------
|
|
201 */
|
|
202
|
|
203 static GtkWidget *help_window = NULL;
|
|
204
|
|
205 static void help_window_destroy_cb(GtkWidget *window, gpointer data)
|
|
206 {
|
|
207 help_window = NULL;
|
|
208 }
|
|
209
|
|
210 void help_window_show(const gchar *key)
|
|
211 {
|
|
212 if (key && strcmp(key, "html_contents") == 0)
|
|
213 {
|
|
214 help_browser_run();
|
|
215 return;
|
|
216 }
|
|
217
|
|
218 if (help_window)
|
|
219 {
|
|
220 gtk_window_present(GTK_WINDOW(help_window));
|
|
221 if (key) help_window_set_key(help_window, key);
|
|
222 return;
|
|
223 }
|
|
224
|
|
225 help_window = help_window_new(_("Help"), GQ_WMCLASS, "help",
|
|
226 GQ_HELPDIR "/README", key);
|
|
227
|
|
228 g_signal_connect(G_OBJECT(help_window), "destroy",
|
|
229 G_CALLBACK(help_window_destroy_cb), NULL);
|
|
230 }
|
|
231
|