~tuxator/midori/speeddial-refresh

« back to all changes in this revision

Viewing changes to src/main.c

  • Committer: Christian Dywan
  • Date: 2007-12-16 22:20:24 UTC
  • Revision ID: git-v1:3bbd273a4f9e85a1d8380cb0924c875683fa3ad1
Tags: v0.0.14
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
 
3
 
 
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.
 
8
 
 
9
 See the file COPYING for the full license text.
 
10
*/
 
11
 
 
12
#include "main.h"
 
13
 
 
14
#include "browser.h"
 
15
#include "global.h"
 
16
#include "helpers.h"
 
17
#include "sokoke.h"
 
18
#include "search.h"
 
19
#include "webView.h"
 
20
#include "xbel.h"
 
21
 
 
22
#include <string.h>
 
23
#include <gtk/gtk.h>
 
24
 
 
25
#include "config.h"
 
26
 
 
27
// -- stock icons
 
28
 
 
29
static void stock_items_init(void)
 
30
{
 
31
    static GtkStockItem items[] =
 
32
    {
 
33
        { STOCK_LOCK_OPEN },
 
34
        { STOCK_LOCK_SECURE },
 
35
        { STOCK_LOCK_BROKEN },
 
36
        { STOCK_SCRIPT },
 
37
        { STOCK_THEME },
 
38
        { STOCK_USER_TRASH },
 
39
 
 
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" },
 
60
        #endif
 
61
    };
 
62
    GtkIconFactory* factory = gtk_icon_factory_new();
 
63
    guint i;
 
64
    for(i = 0; i < (guint)G_N_ELEMENTS(items); i++)
 
65
    {
 
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);
 
73
    }
 
74
    gtk_stock_add_static(items, G_N_ELEMENTS(items));
 
75
    gtk_icon_factory_add_default(factory);
 
76
    g_object_unref(factory);
 
77
}
 
78
 
 
79
// -- main function
 
80
 
 
81
int main(int argc, char** argv)
 
82
{
 
83
    g_set_application_name(PACKAGE_NAME);
 
84
 
 
85
    // Parse cli options
 
86
    gint repeats = 2;
 
87
    gboolean version = FALSE;
 
88
    GOptionEntry entries[] =
 
89
    {
 
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 }
 
92
    };
 
93
 
 
94
    GError* error = NULL;
 
95
    if(!gtk_init_with_args(&argc, &argv, "[URI]", entries, NULL/*GETTEXT_PACKAGE*/, &error))
 
96
    {
 
97
        g_error_free(error);
 
98
        return 1;
 
99
    }
 
100
 
 
101
    if(version)
 
102
    {
 
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"
 
108
         "GetText:    N/A\n"
 
109
         "\n"
 
110
         "Debugging:  " SOKOKE_DEBUG_ "\n"
 
111
         "\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");
 
116
        return 0;
 
117
    }
 
118
 
 
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);
 
125
    error = NULL;
 
126
    config = config_new();
 
127
    if(!config_from_file(config, configFile, &error))
 
128
    {
 
129
        if(error->code != G_FILE_ERROR_NOENT)
 
130
            g_string_append_printf(errorMessages
 
131
             , "Configuration was not loaded. %s\n", error->message);
 
132
        g_error_free(error);
 
133
    }
 
134
    g_free(configFile);
 
135
    configFile = g_build_filename(configPath, "accels", NULL);
 
136
    gtk_accel_map_load(configFile);
 
137
    g_free(configFile);
 
138
    configFile = g_build_filename(configPath, "search", NULL);
 
139
    error = NULL;
 
140
    searchEngines = search_engines_new();
 
141
    if(!search_engines_from_file(&searchEngines, configFile, &error))
 
142
    {
 
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);*/
 
147
        g_error_free(error);
 
148
    }
 
149
    g_free(configFile);
 
150
    configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
 
151
    bookmarks = xbel_folder_new();
 
152
    error = NULL;
 
153
    if(!xbel_folder_from_file(bookmarks, configFile, &error))
 
154
    {
 
155
        if(error->code != G_FILE_ERROR_NOENT)
 
156
            g_string_append_printf(errorMessages
 
157
             , "Bookmarks couldn't be loaded. %s\n", error->message);
 
158
        g_error_free(error);
 
159
    }
 
160
    g_free(configFile);
 
161
    XbelItem* _session = xbel_folder_new();
 
162
    if(config->startup == CONFIG_STARTUP_SESSION)
 
163
    {
 
164
        configFile = g_build_filename(configPath, "session.xbel", NULL);
 
165
        error = NULL;
 
166
        if(!xbel_folder_from_file(_session, configFile, &error))
 
167
        {
 
168
            if(error->code != G_FILE_ERROR_NOENT)
 
169
                g_string_append_printf(errorMessages
 
170
                 , "Session couldn't be loaded. %s\n", error->message);
 
171
            g_error_free(error);
 
172
        }
 
173
        g_free(configFile);
 
174
    }
 
175
    configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
 
176
    tabtrash = xbel_folder_new();
 
177
    error = NULL;
 
178
    if(!xbel_folder_from_file(tabtrash, configFile, &error))
 
179
    {
 
180
        if(error->code != G_FILE_ERROR_NOENT)
 
181
            g_string_append_printf(errorMessages
 
182
             , "Tabtrash couldn't be loaded. %s\n", error->message);
 
183
        g_error_free(error);
 
184
    }
 
185
    g_free(configFile);
 
186
 
 
187
    // In case of errors
 
188
    if(errorMessages->len)
 
189
    {
 
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
 
202
         , NULL);
 
203
        if(gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT)
 
204
        {
 
205
            config_free(config);
 
206
            search_engines_free(searchEngines);
 
207
            xbel_item_free(bookmarks);
 
208
            xbel_item_free(_session);
 
209
            g_string_free(errorMessages, TRUE);
 
210
            return 0;
 
211
        }
 
212
        gtk_widget_destroy(dialog);
 
213
        /* FIXME: Since we will overwrite files that could not be loaded
 
214
                  , would we want to make backups? */
 
215
    }
 
216
    g_string_free(errorMessages, TRUE);
 
217
 
 
218
    if(xbel_folder_is_empty(_session))
 
219
    {
 
220
        XbelItem* item = xbel_bookmark_new();
 
221
        if(config->startup == CONFIG_STARTUP_HOMEPAGE)
 
222
            xbel_bookmark_set_href(item, config->homepage);
 
223
        else
 
224
            xbel_bookmark_set_href(item, "about:blank");
 
225
        xbel_folder_append_item(_session, item);
 
226
    }
 
227
    g_free(configPath);
 
228
 
 
229
    accel_group = gtk_accel_group_new();
 
230
    stock_items_init();
 
231
    browsers = NULL;
 
232
 
 
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;
 
236
    while(uri != NULL)
 
237
    {
 
238
        XbelItem* item = xbel_bookmark_new();
 
239
        gchar* uriReady = magic_uri(uri, FALSE);
 
240
        xbel_bookmark_set_href(item, uriReady);
 
241
        g_free(uriReady);
 
242
        xbel_folder_append_item(_session, item);
 
243
        uri = strtok(NULL, "|");
 
244
    }
 
245
    g_free(uri);
 
246
 
 
247
    session = xbel_folder_new();
 
248
    CBrowser* browser = NULL;
 
249
    guint n = xbel_folder_get_n_items(_session);
 
250
    guint i;
 
251
    for(i = 0; i < n; i++)
 
252
    {
 
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));
 
256
    }
 
257
    xbel_item_free(_session);
 
258
 
 
259
    gtk_main();
 
260
 
 
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);
 
265
    error = NULL;
 
266
    if(!search_engines_to_file(searchEngines, configFile, &error))
 
267
    {
 
268
        g_warning("Search engines couldn't be saved. %s", error->message);
 
269
        g_error_free(error);
 
270
    }
 
271
    search_engines_free(searchEngines);
 
272
    g_free(configFile);
 
273
    configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
 
274
    error = NULL;
 
275
    if(!xbel_folder_to_file(bookmarks, configFile, &error))
 
276
    {
 
277
        g_warning("Bookmarks couldn't be saved. %s", error->message);
 
278
        g_error_free(error);
 
279
    }
 
280
    xbel_item_free(bookmarks);
 
281
    g_free(configFile);
 
282
    configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
 
283
    error = NULL;
 
284
    if(!xbel_folder_to_file(tabtrash, configFile, &error))
 
285
    {
 
286
        g_warning("Tabtrash couldn't be saved. %s", error->message);
 
287
        g_error_free(error);
 
288
    }
 
289
    xbel_item_free(tabtrash);
 
290
    g_free(configFile);
 
291
    if(config->startup == CONFIG_STARTUP_SESSION)
 
292
    {
 
293
        configFile = g_build_filename(configPath, "session.xbel", NULL);
 
294
        error = NULL;
 
295
        if(!xbel_folder_to_file(session, configFile, &error))
 
296
        {
 
297
            g_warning("Session couldn't be saved. %s", error->message);
 
298
            g_error_free(error);
 
299
        }
 
300
        g_free(configFile);
 
301
    }
 
302
    xbel_item_free(session);
 
303
    configFile = g_build_filename(configPath, "config", NULL);
 
304
    error = NULL;
 
305
    if(!config_to_file(config, configFile, &error))
 
306
    {
 
307
        g_warning("Configuration couldn't be saved. %s", error->message);
 
308
        g_error_free(error);
 
309
    }
 
310
    config_free(config);
 
311
    g_free(configFile);
 
312
    configFile = g_build_filename(configPath, "accels", NULL);
 
313
    gtk_accel_map_save(configFile);
 
314
    g_free(configFile);
 
315
    g_free(configPath);
 
316
    return 0;
 
317
}