tazweb annotate src/tazweb.c @ rev 201

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