2
Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Lesser General Public
6
License as published by the Free Software Foundation; either
7
version 2.1 of the License, or (at your option) any later version.
9
See the file COPYING for the full license text.
29
static void stock_items_init(void)
31
static GtkStockItem items[] =
34
{ STOCK_LOCK_SECURE },
35
{ STOCK_LOCK_BROKEN },
40
{ STOCK_BOOKMARK, "Bookmark", 0, 0, NULL },
41
{ STOCK_BOOKMARK_NEW, "New Bookmark", 0, 0, NULL },
42
{ STOCK_BOOKMARKS, "_Bookmarks", 0, 0, NULL },
43
{ STOCK_DOWNLOADS, "_Downloads", 0, 0, NULL },
44
{ STOCK_CONSOLE, "_Console", 0, 0, NULL },
45
{ STOCK_EXTENSIONS, "_Extensions", 0, 0, NULL },
46
{ STOCK_FORM_FILL, "_Form Fill", 0, 0, NULL },
47
{ STOCK_HISTORY, "History", 0, 0, NULL },
48
{ STOCK_HOMEPAGE, "Homepage", 0, 0, NULL },
49
{ STOCK_LOCATION, "Location Entry", 0, 0, NULL },
50
{ STOCK_NEWSFEED, "Newsfeed", 0, 0, NULL },
51
{ STOCK_PLUGINS, "_Plugins", 0, 0, NULL },
52
{ STOCK_POPUPS_BLOCKED, "Blocked Popups", 0, 0, NULL },
53
{ STOCK_SOURCE_VIEW, "View Source", 0, 0, NULL },
54
{ STOCK_TAB_CLOSE, "C_lose Tab", 0, 0, NULL },
55
{ STOCK_TAB_NEW, "New _Tab", 0, 0, NULL },
56
{ STOCK_WINDOW_CLOSE, "_Close Window", 0, 0, NULL },
57
{ STOCK_WINDOW_NEW, "New _Window", 0, 0, NULL },
58
#if !GTK_CHECK_VERSION(2, 10, 0)
59
{ GTK_STOCK_SELECT_ALL, "Select _All", 0, 0, (gchar*)"gtk20" },
62
GtkIconFactory* factory = gtk_icon_factory_new();
64
for(i = 0; i < (guint)G_N_ELEMENTS(items); i++)
66
GtkIconSource* iconSource = gtk_icon_source_new();
67
gtk_icon_source_set_icon_name(iconSource, items[i].stock_id);
68
GtkIconSet* iconSet = gtk_icon_set_new();
69
gtk_icon_set_add_source(iconSet, iconSource);
70
gtk_icon_source_free(iconSource);
71
gtk_icon_factory_add(factory, items[i].stock_id, iconSet);
72
gtk_icon_set_unref(iconSet);
74
gtk_stock_add_static(items, G_N_ELEMENTS(items));
75
gtk_icon_factory_add_default(factory);
76
g_object_unref(factory);
81
int main(int argc, char** argv)
83
g_set_application_name(PACKAGE_NAME);
87
gboolean version = FALSE;
88
GOptionEntry entries[] =
90
{ "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "An unused value", "N" },
91
{ "version", 'v', 0, G_OPTION_ARG_NONE, &version, "Display program version", NULL }
95
if(!gtk_init_with_args(&argc, &argv, "[URI]", entries, NULL/*GETTEXT_PACKAGE*/, &error))
103
g_print(PACKAGE_STRING " - Copyright (c) 2007 Christian Dywan\n\n"
104
"GTK+2: " GTK_VER "\n"
105
"WebKit: " WEBKIT_VER "\n"
106
"Libsexy: " LIBSEXY_VER "\n"
107
"libXML2: " LIBXML_VER "\n"
110
"Debugging: " SOKOKE_DEBUG_ "\n"
112
"Please report comments, suggestions and bugs to:\n"
113
"\t" PACKAGE_BUGREPORT "\n"
114
"Check for new versions at:\n"
115
"\thttp://software.twotoasts.de\n");
119
// Load configuration files
120
GString* errorMessages = g_string_new(NULL);
121
// TODO: What about default config in a global config folder?
122
gchar* configPath = g_build_filename(g_get_user_config_dir(), PACKAGE_NAME, NULL);
123
g_mkdir_with_parents(configPath, 0755);
124
gchar* configFile = g_build_filename(configPath, "config", NULL);
126
config = config_new();
127
if(!config_from_file(config, configFile, &error))
129
if(error->code != G_FILE_ERROR_NOENT)
130
g_string_append_printf(errorMessages
131
, "Configuration was not loaded. %s\n", error->message);
135
configFile = g_build_filename(configPath, "accels", NULL);
136
gtk_accel_map_load(configFile);
138
configFile = g_build_filename(configPath, "search", NULL);
140
searchEngines = search_engines_new();
141
if(!search_engines_from_file(&searchEngines, configFile, &error))
143
// FIXME: We may have a "file empty" error, how do we recognize that?
144
/*if(error->code != G_FILE_ERROR_NOENT)
145
g_string_append_printf(errorMessages
146
, "Notice: No search engines loaded. %s\n", error->message);*/
150
configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
151
bookmarks = xbel_folder_new();
153
if(!xbel_folder_from_file(bookmarks, configFile, &error))
155
if(error->code != G_FILE_ERROR_NOENT)
156
g_string_append_printf(errorMessages
157
, "Bookmarks couldn't be loaded. %s\n", error->message);
161
XbelItem* _session = xbel_folder_new();
162
if(config->startup == CONFIG_STARTUP_SESSION)
164
configFile = g_build_filename(configPath, "session.xbel", NULL);
166
if(!xbel_folder_from_file(_session, configFile, &error))
168
if(error->code != G_FILE_ERROR_NOENT)
169
g_string_append_printf(errorMessages
170
, "Session couldn't be loaded. %s\n", error->message);
175
configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
176
tabtrash = xbel_folder_new();
178
if(!xbel_folder_from_file(tabtrash, configFile, &error))
180
if(error->code != G_FILE_ERROR_NOENT)
181
g_string_append_printf(errorMessages
182
, "Tabtrash couldn't be loaded. %s\n", error->message);
188
if(errorMessages->len)
190
GtkWidget* dialog = gtk_message_dialog_new(NULL
191
, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE
192
, "The following errors occured.");
193
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), FALSE);
194
gtk_window_set_title(GTK_WINDOW(dialog), g_get_application_name());
195
// FIXME: Use custom program icon
196
gtk_window_set_icon_name(GTK_WINDOW(dialog), "web-browser");
197
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog)
198
, "%s", errorMessages->str);
199
gtk_dialog_add_buttons(GTK_DIALOG(dialog)
200
, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL
201
, "_Ignore", GTK_RESPONSE_ACCEPT
203
if(gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT)
206
search_engines_free(searchEngines);
207
xbel_item_free(bookmarks);
208
xbel_item_free(_session);
209
g_string_free(errorMessages, TRUE);
212
gtk_widget_destroy(dialog);
213
/* FIXME: Since we will overwrite files that could not be loaded
214
, would we want to make backups? */
216
g_string_free(errorMessages, TRUE);
218
if(xbel_folder_is_empty(_session))
220
XbelItem* item = xbel_bookmark_new();
221
if(config->startup == CONFIG_STARTUP_HOMEPAGE)
222
xbel_bookmark_set_href(item, config->homepage);
224
xbel_bookmark_set_href(item, "about:blank");
225
xbel_folder_append_item(_session, item);
229
accel_group = gtk_accel_group_new();
233
// TODO: Handle any number of separate uris from argv
234
// Open as many tabs as we have uris, seperated by pipes
235
gchar* uri = argc > 1 ? strtok(g_strdup(argv[1]), "|") : NULL;
238
XbelItem* item = xbel_bookmark_new();
239
gchar* uriReady = magic_uri(uri, FALSE);
240
xbel_bookmark_set_href(item, uriReady);
242
xbel_folder_append_item(_session, item);
243
uri = strtok(NULL, "|");
247
session = xbel_folder_new();
248
CBrowser* browser = NULL;
249
guint n = xbel_folder_get_n_items(_session);
251
for(i = 0; i < n; i++)
253
XbelItem* item = xbel_folder_get_nth_item(_session, i);
254
browser = browser_new(browser);
255
webView_open(browser->webView, xbel_bookmark_get_href(item));
257
xbel_item_free(_session);
261
// Save configuration files
262
configPath = g_build_filename(g_get_user_config_dir(), PACKAGE_NAME, NULL);
263
g_mkdir_with_parents(configPath, 0755);
264
configFile = g_build_filename(configPath, "search", NULL);
266
if(!search_engines_to_file(searchEngines, configFile, &error))
268
g_warning("Search engines couldn't be saved. %s", error->message);
271
search_engines_free(searchEngines);
273
configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
275
if(!xbel_folder_to_file(bookmarks, configFile, &error))
277
g_warning("Bookmarks couldn't be saved. %s", error->message);
280
xbel_item_free(bookmarks);
282
configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
284
if(!xbel_folder_to_file(tabtrash, configFile, &error))
286
g_warning("Tabtrash couldn't be saved. %s", error->message);
289
xbel_item_free(tabtrash);
291
if(config->startup == CONFIG_STARTUP_SESSION)
293
configFile = g_build_filename(configPath, "session.xbel", NULL);
295
if(!xbel_folder_to_file(session, configFile, &error))
297
g_warning("Session couldn't be saved. %s", error->message);
302
xbel_item_free(session);
303
configFile = g_build_filename(configPath, "config", NULL);
305
if(!config_to_file(config, configFile, &error))
307
g_warning("Configuration couldn't be saved. %s", error->message);
312
configFile = g_build_filename(configPath, "accels", NULL);
313
gtk_accel_map_save(configFile);