tazweb annotate src/tazweb.c @ rev 192

helper.sh: add bookmarks handler
author Christophe Lincoln <pankso@slitaz.org>
date Thu Mar 16 00:20:44 2017 +0100 (2017-03-16)
parents 6a5a94a11ff7
children b043c09b31f0
rev   line source
pankso@177 1 /*
pankso@177 2 * TazWeb is a radically simple web browser providing a single window
paul@181 3 * with a single toolbar with buttons, a URL entry and search as well
pankso@177 4 * as a contextual menu, but no menu bar or tabs. Commented line code
pankso@177 5 * starts with // and comments are between * *
pankso@177 6 *
pankso@178 7 * Copyright (C) 2011-2017 SliTaz GNU/Linux - BSD License
pankso@177 8 * See AUTHORS and LICENSE for detailed information
pankso@178 9 *
pankso@177 10 */
pankso@177 11
pankso@182 12 #include <getopt.h>
pankso@177 13 #include <glib.h>
pankso@177 14 #include <glib/gi18n.h>
pankso@177 15
pankso@177 16 #include <gtk/gtk.h>
pankso@177 17 #include <webkit/webkit.h>
pankso@182 18 #include <libsoup/soup.h>
pankso@177 19
pankso@182 20 #define HOME g_get_home_dir()
pankso@182 21 #define CONFIG g_strdup_printf("%s/.config/tazweb", HOME)
pankso@182 22 #define BMTXT g_strdup_printf("%s/bookmarks.txt", CONFIG)
pankso@182 23 #define BOOKMARKS g_strdup_printf("%s/bookmarks.txt", CONFIG)
pankso@182 24 #define COOKIES g_strdup_printf("%s/cookies.txt", CONFIG)
pankso@182 25 #define DOWNLOADS g_strdup_printf("%s/Downloads", HOME)
pankso@182 26 #define WEBHOME "file:///usr/share/webhome/index.html"
pankso@182 27 #define SEARCH "http://duckduckgo.com/?q=%s&t=slitaz"
pankso@182 28 #define GETTEXT_PACKAGE "tazweb"
pankso@182 29
pankso@182 30 int width = 800;
pankso@182 31 int height = 600;
pankso@182 32 int private = 0;
pankso@177 33
pankso@177 34 static gchar *useragent = "TazWeb (X11; SliTaz GNU/Linux; U; en_US)";
pankso@182 35 static gboolean notoolbar;
pankso@182 36 static gboolean nomenu;
pankso@182 37 static gboolean kiosk;
pankso@178 38
pankso@182 39 static GtkWidget* create_window(WebKitWebView** newwebview);
pankso@182 40 static GtkWidget *tazweb_window, *vbox, *browser, *toolbar;
pankso@182 41 static WebKitWebView *webview;
pankso@182 42 static WebKitWebFrame *frame;
pankso@182 43 static SoupSession *session;
pankso@182 44 static SoupCookieJar *cookiejar;
pankso@182 45 static gint count = 0;
pankso@182 46 const gchar* uri;
pankso@178 47
pankso@177 48 /* Create an icon */
pankso@177 49 static GdkPixbuf*
pankso@177 50 create_pixbuf(const gchar* image)
pankso@177 51 {
pankso@177 52 GdkPixbuf *pixbuf;
pankso@177 53 pixbuf = gdk_pixbuf_new_from_file(image, NULL);
pankso@177 54 return pixbuf;
pankso@177 55 }
pankso@177 56
pankso@177 57 /* Can be: http://hg.slitaz.org or hg.slitaz.org */
pankso@177 58 static void
pankso@177 59 check_requested_uri()
pankso@177 60 {
pankso@177 61 uri = g_strrstr(uri, "://") ? g_strdup(uri)
pankso@177 62 : g_strdup_printf("http://%s", uri);
pankso@177 63 }
pankso@177 64
pankso@177 65 /* Update title */
pankso@177 66 static void
pankso@177 67 update_title(GtkWindow* window, WebKitWebView* webview)
pankso@177 68 {
pankso@177 69 GString *string;
pankso@177 70 gdouble progress;
pankso@177 71 gchar *title;
pankso@178 72
pankso@177 73 string = g_string_new(webkit_web_view_get_title(webview));
pankso@177 74 progress = webkit_web_view_get_progress(webview) * 100;
pankso@177 75 if (progress < 100)
pankso@177 76 g_string_append_printf(string, " [ %f%% ] ", progress);
pankso@178 77
pankso@177 78 title = g_string_free(string, FALSE);
pankso@177 79 gtk_window_set_title(window, title);
pankso@177 80 g_free(title);
pankso@177 81 }
pankso@177 82
pankso@177 83 /* Get the page title */
pankso@177 84 static void
pankso@177 85 notify_title_cb(WebKitWebView* webview, GParamSpec* pspec, GtkWidget* window)
pankso@177 86 {
pankso@177 87 update_title(GTK_WINDOW(window), webview);
pankso@177 88 }
pankso@177 89
pankso@177 90 /* Request progress in window title */
pankso@177 91 static void
pankso@177 92 notify_progress_cb(WebKitWebView* webview, GParamSpec* pspec, GtkWidget* window)
pankso@177 93 {
pankso@177 94 update_title(GTK_WINDOW(window), webview);
pankso@177 95 }
pankso@177 96
pankso@177 97 /* Notify url entry */
pankso@177 98 static void
pankso@177 99 notify_load_status_cb(WebKitWebView* webview, GParamSpec* pspec, GtkWidget* urientry)
pankso@177 100 {
pankso@177 101 if (webkit_web_view_get_load_status(webview) == WEBKIT_LOAD_COMMITTED) {
pankso@177 102 frame = webkit_web_view_get_main_frame(webview);
pankso@177 103 uri = webkit_web_frame_get_uri(frame);
pankso@177 104 if (uri)
pankso@177 105 gtk_entry_set_text(GTK_ENTRY(urientry), uri);
pankso@177 106 }
pankso@177 107 }
pankso@177 108
pankso@177 109 /* Destroy the window */
pankso@177 110 static void
pankso@177 111 destroy_cb(GtkWidget* widget, GtkWindow* window)
pankso@177 112 {
pankso@177 113 if (g_atomic_int_dec_and_test(&count))
pankso@177 114 gtk_main_quit();
pankso@177 115 }
pankso@177 116
pankso@177 117 /* Show page source */
pankso@177 118 static void
pankso@177 119 view_source_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@177 120 {
pankso@177 121 gboolean source;
pankso@178 122
pankso@177 123 frame = webkit_web_view_get_main_frame(webview);
pankso@177 124 uri = webkit_web_frame_get_uri(frame);
pankso@177 125 source = webkit_web_view_get_view_source_mode(webview);
pankso@178 126
pankso@177 127 webkit_web_view_set_view_source_mode(webview, !source);
pankso@177 128 webkit_web_view_reload(webview);
pankso@177 129 }
pankso@177 130
pankso@177 131 /* URL entry callback function */
pankso@177 132 static void
pankso@177 133 uri_entry_cb(GtkWidget* urientry, WebKitWebView* webview)
pankso@177 134 {
pankso@177 135 uri = gtk_entry_get_text(GTK_ENTRY(urientry));
pankso@177 136 g_assert(uri);
pankso@177 137 check_requested_uri();
pankso@177 138 webkit_web_view_load_uri(webview, uri);
pankso@177 139 }
pankso@177 140
pankso@177 141 /* Search entry and icon callback function */
pankso@177 142 static void
pankso@177 143 search_web(GtkWidget* search, WebKitWebView* webview)
pankso@177 144 {
pankso@177 145 uri = g_strdup_printf(SEARCH, gtk_entry_get_text(GTK_ENTRY(search)));
pankso@177 146 g_assert(uri);
pankso@177 147 webkit_web_view_load_uri(webview, uri);
pankso@177 148 }
pankso@177 149
pankso@177 150 static void
pankso@177 151 search_entry_cb(GtkWidget* search, WebKitWebView* webview)
pankso@177 152 {
pankso@177 153 search_web(search, webview);
pankso@177 154 }
pankso@177 155
pankso@177 156 static void
pankso@177 157 search_icon_press_cb(GtkWidget *search, GtkEntryIconPosition pos,
pankso@177 158 GdkEvent *event, WebKitWebView* webview)
pankso@177 159 {
pankso@178 160 search_web(search, webview);
pankso@177 161 }
pankso@177 162
pankso@184 163 /*
pankso@184 164 *
pankso@178 165 * Navigation functions
pankso@184 166 *
pankso@178 167 */
pankso@178 168
pankso@178 169 static void
pankso@178 170 bookmarks_edit_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@178 171 {
pankso@192 172 system("/usr/lib/tazweb/helper.sh bookmarks_handler &");
pankso@178 173 }
pankso@178 174
pankso@177 175 static void
pankso@177 176 go_bookmarks_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@177 177 {
pankso@178 178 system("/usr/lib/tazweb/helper.sh html_bookmarks");
pankso@182 179 uri = g_strdup_printf("file://%s/bookmarks.html", CONFIG);
pankso@177 180 g_assert(uri);
pankso@177 181 webkit_web_view_load_uri(webview, uri);
pankso@177 182 }
pankso@177 183
pankso@177 184 static void
pankso@177 185 go_home_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@177 186 {
pankso@177 187 uri = WEBHOME;
pankso@177 188 g_assert(uri);
pankso@177 189 webkit_web_view_load_uri(webview, uri);
pankso@177 190 }
pankso@177 191
pankso@177 192 static void
pankso@177 193 go_back_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@177 194 {
pankso@178 195 webkit_web_view_go_back(webview);
pankso@177 196 }
pankso@177 197
pankso@177 198 static void
pankso@177 199 go_forward_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@177 200 {
pankso@178 201 webkit_web_view_go_forward(webview);
pankso@177 202 }
pankso@177 203
pankso@182 204 /* Documentation callback */
pankso@177 205 static void
pankso@177 206 tazweb_doc_cb(GtkWidget* widget, WebKitWebView *webview)
pankso@177 207 {
pankso@177 208 uri = ("file:///usr/share/doc/tazweb/tazweb.html");
pankso@177 209 g_assert(uri);
pankso@177 210 webkit_web_view_load_uri(webview, uri);
pankso@177 211 }
pankso@177 212
pankso@182 213 /* Download callback */
pankso@177 214 static gboolean
pankso@177 215 download_requested_cb(WebKitWebView *webview, WebKitDownload *download,
pankso@177 216 gpointer user_data)
pankso@177 217 {
pankso@177 218 const gchar* buffer;
pankso@177 219 uri = webkit_download_get_uri(download);
pankso@182 220 asprintf(&buffer, "xterm -T 'TazWeb Download' -geom 72x12+0-24 -e \
pankso@184 221 'mkdir -p %s && wget -P %s -c %s; sleep 2' &",
pankso@182 222 DOWNLOADS, DOWNLOADS, uri);
pankso@177 223 system(buffer);
pankso@177 224 }
pankso@177 225
pankso@177 226 /* Printing callback function */
pankso@177 227 static void
pankso@177 228 print_page_cb (GtkWidget *widget, gpointer data)
pankso@177 229 {
pankso@178 230 webkit_web_frame_print (webkit_web_view_get_main_frame (
pankso@178 231 WEBKIT_WEB_VIEW (webview)));
pankso@177 232 }
pankso@177 233
pankso@177 234 /* New webview callbacks */
pankso@177 235 static WebKitWebView*
pankso@177 236 create_web_view_cb(WebKitWebView* webview, WebKitWebFrame* web_frame,
pankso@177 237 GtkWidget* window)
pankso@177 238 {
pankso@177 239 WebKitWebView *newview;
pankso@177 240 create_window(&newview);
pankso@177 241 return newview;
pankso@177 242 }
pankso@177 243
pankso@177 244 static gboolean
pankso@177 245 webview_ready_cb(WebKitWebView* webview, GtkWidget* window)
pankso@177 246 {
pankso@177 247 gtk_widget_grab_focus(GTK_WIDGET(webview));
pankso@177 248 gtk_widget_show_all(window);
pankso@177 249 return FALSE;
pankso@177 250 }
pankso@177 251
pankso@177 252 static gboolean
pankso@177 253 close_webview_cb(WebKitWebView* webview, GtkWidget* window)
pankso@177 254 {
pankso@177 255 gtk_widget_destroy(window);
pankso@177 256 return TRUE;
pankso@177 257 }
pankso@177 258
pankso@177 259 /* Add a bookmark */
pankso@178 260 void
pankso@178 261 add_bookmark_cb(GtkWidget *widget, gpointer data)
pankso@177 262 {
pankso@177 263 const gchar* title;
pankso@177 264 const gchar* buffer;
pankso@178 265
pankso@177 266 title = webkit_web_view_get_title(WEBKIT_WEB_VIEW (webview));
pankso@177 267 uri = webkit_web_view_get_uri(WEBKIT_WEB_VIEW (webview));
pankso@178 268
pankso@182 269 asprintf(&buffer, "echo '%s|%s' >> %s", title, uri, BOOKMARKS);
pankso@177 270 system(buffer);
pankso@177 271 }
pankso@177 272
pankso@178 273 /* Setup session cookies */
pankso@178 274 void
pankso@178 275 cookies_setup(void)
pankso@178 276 {
pankso@178 277 if (cookiejar) {
pankso@178 278 soup_session_remove_feature(session,
pankso@178 279 (SoupSessionFeature*)cookiejar);
pankso@178 280 g_object_unref(cookiejar);
pankso@178 281 cookiejar = NULL;
pankso@178 282 }
pankso@178 283
pankso@178 284 cookiejar = soup_cookie_jar_text_new(COOKIES, 0);
pankso@178 285 soup_session_add_feature(session, (SoupSessionFeature*)cookiejar);
pankso@178 286 }
pankso@178 287
pankso@178 288 static void
pankso@178 289 cookies_view_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@178 290 {
pankso@178 291 system("/usr/lib/tazweb/helper.sh html_cookies");
pankso@178 292 uri = g_strdup_printf("file://%s/cookies.html", CONFIG);
pankso@178 293 g_assert(uri);
pankso@178 294 webkit_web_view_load_uri(webview, uri);
pankso@178 295 }
pankso@178 296
pankso@178 297 static void
pankso@178 298 cookies_clean_cb(GtkWidget* widget, WebKitWebView* webview)
pankso@178 299 {
pankso@178 300 system("/usr/lib/tazweb/helper.sh clean_cookies");
pankso@178 301 }
pankso@178 302
pankso@177 303 /* Add items to WebKit contextual menu */
pankso@177 304 static void
pankso@177 305 populate_menu_cb(WebKitWebView *webview, GtkMenu *menu, gpointer data)
pankso@177 306 {
pankso@177 307 GtkWidget* item;
pankso@177 308
pankso@177 309 /* Separator */
pankso@177 310 item = gtk_separator_menu_item_new();
pankso@177 311 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@184 312
pankso@178 313 /* Bookmark */
pankso@178 314 item = gtk_image_menu_item_new_with_label(_("Bookmarks"));
pankso@178 315 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@178 316 gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU));
pankso@178 317 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@178 318 g_signal_connect(item, "activate", G_CALLBACK(go_bookmarks_cb), webview);
pankso@184 319
pankso@177 320 if (! kiosk) {
pankso@177 321 /* Add a bookmark */
pankso@177 322 item = gtk_image_menu_item_new_with_label(_("Add a bookmark"));
pankso@177 323 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@177 324 gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
pankso@177 325 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 326 g_signal_connect(item, "activate", G_CALLBACK(add_bookmark_cb), webview);
pankso@184 327
pankso@178 328 /* Edit bookmarks */
pankso@178 329 item = gtk_image_menu_item_new_with_label(_("Edit bookmarks"));
pankso@178 330 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@178 331 gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU));
pankso@178 332 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@178 333 g_signal_connect(item, "activate", G_CALLBACK(bookmarks_edit_cb), webview);
pankso@184 334
pankso@178 335 /* Separator */
pankso@178 336 item = gtk_separator_menu_item_new();
pankso@178 337 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 338 }
pankso@184 339
pankso@177 340 /* Printing */
pankso@177 341 item = gtk_image_menu_item_new_with_label(_("Print this page"));
pankso@177 342 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@177 343 gtk_image_new_from_stock(GTK_STOCK_PRINT, GTK_ICON_SIZE_MENU));
pankso@177 344 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 345 g_signal_connect(item, "activate", G_CALLBACK(print_page_cb), webview);
pankso@177 346
pankso@177 347 /* View source mode */
pankso@177 348 item = gtk_image_menu_item_new_with_label(_("View source mode"));
pankso@177 349 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@177 350 gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU));
pankso@177 351 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 352 g_signal_connect(item, "activate", G_CALLBACK(view_source_cb), webview);
pankso@184 353
pankso@178 354 /* Separator */
pankso@178 355 item = gtk_separator_menu_item_new();
pankso@178 356 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 357
pankso@178 358 /* Cookies */
pankso@182 359 if (! private) {
pankso@178 360 item = gtk_image_menu_item_new_with_label(_("View cookies"));
pankso@178 361 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@178 362 gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU));
pankso@178 363 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@178 364 g_signal_connect(item, "activate", G_CALLBACK(cookies_view_cb), webview);
pankso@184 365
pankso@178 366 item = gtk_image_menu_item_new_with_label(_("Clean all cookies"));
pankso@178 367 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@178 368 gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
pankso@178 369 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@178 370 g_signal_connect(item, "activate", G_CALLBACK(cookies_clean_cb), webview);
pankso@184 371
pankso@178 372 /* Separator */
pankso@178 373 item = gtk_separator_menu_item_new();
pankso@178 374 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@178 375 }
pankso@178 376
pankso@177 377 /* TazWeb documentation */
pankso@177 378 item = gtk_image_menu_item_new_with_label(_("TazWeb manual"));
pankso@177 379 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@177 380 gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU));
pankso@177 381 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 382 g_signal_connect(item, "activate", G_CALLBACK(tazweb_doc_cb), webview);
pankso@178 383
pankso@177 384 /* Quit TazWeb */
pankso@177 385 item = gtk_image_menu_item_new_with_label(_("Quit TazWeb"));
pankso@177 386 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@177 387 gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
pankso@177 388 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@177 389 g_signal_connect(item, "activate", G_CALLBACK(destroy_cb), webview);
pankso@178 390
pankso@177 391 gtk_widget_show_all(GTK_WIDGET(menu));
pankso@177 392 }
pankso@177 393
pankso@177 394 /* Scrolled window for the webview */
pankso@177 395 static GtkWidget*
pankso@177 396 create_browser(GtkWidget* window, GtkWidget* urientry, GtkWidget* search,
pankso@177 397 WebKitWebView* webview)
pankso@177 398 {
pankso@177 399 WebKitWebSettings *settings;
pankso@178 400
pankso@177 401 browser = gtk_scrolled_window_new(NULL, NULL);
pankso@177 402 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(browser),
pankso@177 403 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
pankso@177 404
pankso@177 405 gtk_container_add(GTK_CONTAINER(browser), GTK_WIDGET(webview));
pankso@177 406
pankso@189 407 /* Webkit settings */
pankso@177 408 settings = webkit_web_view_get_settings (webview);
pankso@177 409 g_object_set(G_OBJECT(settings), "user-agent", useragent, NULL);
pankso@189 410
pankso@189 411 if (private)
pankso@189 412 g_object_set(G_OBJECT(settings), "enable-private-browsing", TRUE);
pankso@189 413
pankso@189 414 /* Connect Webkit events */
pankso@177 415 g_signal_connect(webview, "notify::title",
pankso@177 416 G_CALLBACK(notify_title_cb), window);
pankso@177 417 g_signal_connect(webview, "notify::progress",
pankso@177 418 G_CALLBACK(notify_progress_cb), window);
pankso@177 419 g_signal_connect(webview, "notify::load-status",
pankso@177 420 G_CALLBACK(notify_load_status_cb), urientry);
pankso@177 421 g_signal_connect(webview, "web-view-ready",
pankso@177 422 G_CALLBACK(webview_ready_cb), window);
pankso@177 423 g_signal_connect(webview, "close-web-view",
pankso@177 424 G_CALLBACK(close_webview_cb), window);
pankso@178 425
pankso@177 426 /* Impossible to open in new window or download in kiosk mode */
pankso@177 427 if (! kiosk) {
pankso@177 428 g_signal_connect(webview, "download-requested",
pankso@177 429 G_CALLBACK(download_requested_cb), NULL);
pankso@177 430 g_signal_connect(webview, "create-web-view",
pankso@177 431 G_CALLBACK(create_web_view_cb), window);
pankso@177 432 }
pankso@177 433
pankso@182 434 if (! nomenu) {
pankso@182 435 /* Connect WebKit contextual menu items */
pankso@182 436 g_object_connect(G_OBJECT(webview), "signal::populate-popup",
pankso@182 437 G_CALLBACK(populate_menu_cb), webview, NULL);
pankso@182 438 }
pankso@177 439 return browser;
pankso@177 440 }
pankso@177 441
pankso@177 442 static GtkWidget*
pankso@177 443 create_toolbar(GtkWidget* urientry, GtkWidget* search, WebKitWebView* webview)
pankso@177 444 {
pankso@177 445 GtkToolItem* item;
pankso@178 446
pankso@177 447 toolbar = gtk_toolbar_new();
pankso@177 448 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
pankso@177 449 GTK_ORIENTATION_HORIZONTAL);
pankso@177 450 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),
pankso@177 451 GTK_TOOLBAR_BOTH_HORIZ);
pankso@177 452
pankso@177 453 /* The back button */
pankso@178 454 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
pankso@178 455 g_signal_connect(G_OBJECT(item), "clicked",
pankso@177 456 G_CALLBACK(go_back_cb), webview);
pankso@178 457 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 458
pankso@178 459 /* The forward button */
pankso@178 460 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
pankso@178 461 g_signal_connect(G_OBJECT(item), "clicked",
pankso@177 462 G_CALLBACK(go_forward_cb), webview);
pankso@178 463 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 464
pankso@177 465 /* URL entry */
pankso@177 466 item = gtk_tool_item_new();
pankso@177 467 gtk_tool_item_set_expand(item, TRUE);
pankso@177 468 gtk_container_add(GTK_CONTAINER(item), urientry);
pankso@177 469 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 470 g_signal_connect(G_OBJECT(urientry), "activate",
pankso@177 471 G_CALLBACK(uri_entry_cb), webview);
pankso@178 472
pankso@177 473 /* Separator */
pankso@177 474 item = gtk_separator_tool_item_new();
pankso@178 475 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@178 476
pankso@177 477 /* Search entry */
pankso@177 478 item = gtk_tool_item_new();
pankso@178 479 gtk_tool_item_set_expand(item, FALSE);
pankso@178 480 gtk_widget_set_size_request(GTK_WIDGET(item), 200, 0);
pankso@177 481 gtk_container_add(GTK_CONTAINER(item), search);
pankso@177 482 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 483 gtk_entry_set_icon_from_stock(GTK_ENTRY(search),
pankso@177 484 GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FIND);
pankso@177 485 g_signal_connect(GTK_ENTRY(search), "icon-press",
pankso@177 486 G_CALLBACK(search_icon_press_cb), webview);
pankso@177 487 g_signal_connect(G_OBJECT(search), "activate",
pankso@177 488 G_CALLBACK(search_entry_cb), webview);
pankso@184 489
pankso@182 490 /* Home button */
pankso@182 491 item = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
pankso@192 492 gtk_widget_set_tooltip_text(GTK_WIDGET(item), "Home page");
pankso@182 493 g_signal_connect(G_OBJECT(item), "clicked",
pankso@182 494 G_CALLBACK(go_home_cb), webview);
pankso@182 495 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@178 496
pankso@177 497 /* Bookmark button */
pankso@177 498 item = gtk_tool_button_new_from_stock(GTK_STOCK_PROPERTIES);
pankso@192 499 gtk_widget_set_tooltip_text(GTK_WIDGET(item), "Bookmarks");
pankso@177 500 g_signal_connect(G_OBJECT(item), "clicked",
pankso@177 501 G_CALLBACK(go_bookmarks_cb), webview);
pankso@177 502 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 503
pankso@177 504 return toolbar;
pankso@177 505 }
pankso@177 506
pankso@177 507 /* Main window */
pankso@177 508 static GtkWidget*
pankso@177 509 create_window(WebKitWebView** newwebview)
pankso@177 510 {
pankso@177 511 GtkWidget *window;
pankso@177 512 GtkWidget *urientry;
pankso@177 513 GtkWidget *search;
pankso@178 514
pankso@177 515 g_atomic_int_inc(&count);
pankso@177 516
pankso@177 517 /* Default TazWeb window */
pankso@177 518 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
pankso@182 519 gtk_window_set_default_size(GTK_WINDOW(window), width, height);
pankso@177 520 gtk_window_set_icon_name(GTK_WINDOW(window), "tazweb");
pankso@177 521 gtk_widget_set_name(window, "TazWeb");
pankso@177 522 gtk_window_set_wmclass(GTK_WINDOW(window), "tazweb", "TazWeb");
pankso@177 523 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL);
pankso@177 524
pankso@177 525 /* Webview and widgets */
pankso@177 526 webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
pankso@177 527 urientry = gtk_entry_new();
pankso@177 528 search = gtk_entry_new();
pankso@177 529 vbox = gtk_vbox_new(FALSE, 0);
pankso@178 530
pankso@177 531 /* Pack box and container */
pankso@177 532 if (! notoolbar)
pankso@177 533 gtk_box_pack_start(GTK_BOX(vbox),
pankso@177 534 create_toolbar(urientry, search, webview), FALSE, FALSE, 0);
pankso@177 535 gtk_box_pack_start(GTK_BOX(vbox),
pankso@177 536 create_browser(window, urientry, search, webview), TRUE, TRUE, 0);
pankso@178 537
pankso@177 538 gtk_container_add(GTK_CONTAINER(window), vbox);
pankso@178 539
pankso@177 540 if (newwebview)
pankso@177 541 *newwebview = webview;
pankso@178 542
pankso@178 543 return window;
pankso@177 544 }
pankso@177 545
pankso@184 546 /* Cmdline Help & usage */
pankso@182 547 void
pankso@182 548 help(void)
pankso@182 549 {
pankso@182 550 printf("\nTazWeb - Light and fast web browser using Webkit engine\n\n\
pankso@182 551 Usage: tazweb [--options] [value] url\n\
pankso@182 552 \n\
pankso@182 553 Options:\n\
pankso@186 554 -h --help Print TazWeb command line help\n\
pankso@189 555 -p --private Disable on-disk cache, cookies, history\n\
pankso@186 556 -u --useragent [ua] Configure the user agent string\n\
pankso@186 557 -k --kiosk Fullscreen, no bookmarks and download support\n\
pankso@186 558 -r --raw Raw webkit window without toolbar and menu\n\
pankso@186 559 -s --small Small Tazweb window for tiny web applications\n\
pankso@186 560 --notoolbar Disable the top toolbar\n\
pankso@186 561 --nomenu Disable TazWeb contextual menu\n\n");
pankso@186 562
pankso@182 563 return;
pankso@182 564 }
pankso@182 565
pankso@177 566 int
pankso@183 567 main(int argc, char *argv[])
pankso@177 568 {
pankso@177 569 textdomain (GETTEXT_PACKAGE);
pankso@182 570 int c;
pankso@184 571
pankso@182 572 /* Cmdline parsing with getopt_long to handle --option or -o */
pankso@182 573 while (1) {
pankso@182 574 static struct option long_options[] =
pankso@182 575 {
pankso@182 576 /* Set flag */
pankso@184 577 { "notoolbar", no_argument, &notoolbar, 1 },
pankso@184 578 { "nomenu", no_argument, &nomenu, 1 },
pankso@182 579 /* No flag */
pankso@184 580 { "help", no_argument, 0, 'h' },
pankso@184 581 { "private", no_argument, 0, 'p' },
pankso@184 582 { "useragent", required_argument, 0, 'u' },
pankso@184 583 { "kiosk", no_argument, 0, 'k' },
pankso@184 584 { "raw", no_argument, 0, 'r' },
pankso@184 585 { "small", no_argument, 0, 's' },
pankso@182 586 { 0, 0, 0, 0}
pankso@182 587 };
pankso@184 588
pankso@182 589 int index = 0;
pankso@184 590 c = getopt_long (argc, argv, "hpu:krs", long_options, &index);
pankso@184 591
pankso@182 592 /* Detect the end of the options */
pankso@182 593 if (c == -1)
pankso@182 594 break;
pankso@178 595
pankso@182 596 switch (c) {
pankso@182 597 case 0:
pankso@182 598 /* Options with flag */
pankso@182 599 break;
pankso@184 600
pankso@182 601 case 'h':
pankso@182 602 help();
pankso@182 603 return 0;
pankso@184 604
pankso@182 605 case 'p':
pankso@182 606 private++;
pankso@182 607 break;
pankso@184 608
pankso@182 609 case 'u':
pankso@182 610 useragent = optarg;
pankso@182 611 break;
pankso@184 612
pankso@182 613 case 'k':
pankso@182 614 kiosk++;
pankso@182 615 break;
pankso@184 616
pankso@182 617 case 'r':
pankso@182 618 notoolbar++;
pankso@182 619 nomenu++;
pankso@182 620 break;
pankso@184 621
pankso@184 622 case 's':
pankso@184 623 width = 640;
pankso@184 624 height = 480;
pankso@182 625 break;
pankso@184 626
pankso@189 627 default:
pankso@182 628 help();
pankso@182 629 return 0;
pankso@177 630 }
pankso@177 631 }
pankso@184 632
pankso@182 633 argc -= optind;
pankso@182 634 argv += optind;
pankso@184 635
pankso@178 636
pankso@177 637 /* Initialize GTK */
pankso@177 638 gtk_init(NULL, NULL);
pankso@178 639
pankso@177 640 /* Get a default bookmarks.txt if missing */
pankso@177 641 if (! g_file_test(BMTXT, G_FILE_TEST_EXISTS)) {
pankso@177 642 system("install -m 0700 -d $HOME/.config/tazweb");
pankso@177 643 system("install -m 0600 /usr/share/tazweb/bookmarks.txt \
pankso@177 644 $HOME/.config/tazweb/bookmarks.txt");
pankso@178 645 }
pankso@177 646
pankso@183 647 /* Load the start page or the url in argument */
pankso@183 648 uri =(char*)(argc == 1 ? argv[0] : WEBHOME);
pankso@183 649 if (argv[0])
pankso@177 650 check_requested_uri();
pankso@178 651
pankso@182 652 tazweb_window = create_window(&webview);
pankso@182 653 gtk_widget_show_all(tazweb_window);
pankso@184 654
pankso@178 655 /* Handle cookies */
pankso@182 656 if (! private) {
pankso@178 657 session = webkit_get_default_session();
pankso@178 658 snprintf(COOKIES, sizeof COOKIES, "%s", COOKIES);
pankso@178 659 cookies_setup();
pankso@178 660 }
pankso@184 661
pankso@177 662 /* Fullscreen for Kiosk mode */
pankso@177 663 if (kiosk)
pankso@182 664 gtk_window_fullscreen(GTK_WINDOW(tazweb_window));
pankso@178 665
pankso@177 666 webkit_web_view_load_uri(webview, uri);
pankso@177 667 gtk_widget_grab_focus(GTK_WIDGET(webview));
pankso@177 668 gtk_main();
pankso@178 669
pankso@177 670 return 0;
pankso@177 671 }