tazweb annotate src/tazweb.c @ rev 183

Fix opening url in arg (we can have more tthan one --option --now
author Christophe Lincoln <pankso@slitaz.org>
date Tue Mar 14 04:48:34 2017 +0100 (2017-03-14)
parents 311c2e5da64d
children 639b611287cb
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@182 33 int debug = 1;
pankso@177 34
pankso@177 35 static gchar *useragent = "TazWeb (X11; SliTaz GNU/Linux; U; en_US)";
pankso@182 36 static gboolean notoolbar;
pankso@182 37 static gboolean nomenu;
pankso@182 38 static gboolean kiosk;
pankso@182 39 static gboolean raw;
pankso@178 40
pankso@182 41 static GtkWidget* create_window(WebKitWebView** newwebview);
pankso@182 42 static GtkWidget *tazweb_window, *vbox, *browser, *toolbar;
pankso@182 43 static WebKitWebView *webview;
pankso@182 44 static WebKitWebFrame *frame;
pankso@182 45 static SoupSession *session;
pankso@182 46 static SoupCookieJar *cookiejar;
pankso@182 47 static gint count = 0;
pankso@182 48 const gchar* uri;
pankso@178 49
pankso@182 50 /* Turn on/off debug mode */
pankso@177 51
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@178 168 /*
pankso@178 169 *
pankso@178 170 * Navigation functions
pankso@178 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@178 177 system("/usr/lib/tazweb/helper.sh edit_bookmarks");
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@182 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@178 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@178 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@178 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@178 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@178 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@178 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@178 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@178 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@177 412 /* User agent */
pankso@177 413 settings = webkit_web_view_get_settings (webview);
pankso@177 414 g_object_set(G_OBJECT(settings), "user-agent", useragent, NULL);
pankso@177 415
pankso@177 416 /* Connect WebKit events */
pankso@177 417 g_signal_connect(webview, "notify::title",
pankso@177 418 G_CALLBACK(notify_title_cb), window);
pankso@177 419 g_signal_connect(webview, "notify::progress",
pankso@177 420 G_CALLBACK(notify_progress_cb), window);
pankso@177 421 g_signal_connect(webview, "notify::load-status",
pankso@177 422 G_CALLBACK(notify_load_status_cb), urientry);
pankso@177 423 g_signal_connect(webview, "web-view-ready",
pankso@177 424 G_CALLBACK(webview_ready_cb), window);
pankso@177 425 g_signal_connect(webview, "close-web-view",
pankso@177 426 G_CALLBACK(close_webview_cb), window);
pankso@178 427
pankso@177 428 /* Impossible to open in new window or download in kiosk mode */
pankso@177 429 if (! kiosk) {
pankso@177 430 g_signal_connect(webview, "download-requested",
pankso@177 431 G_CALLBACK(download_requested_cb), NULL);
pankso@177 432 g_signal_connect(webview, "create-web-view",
pankso@177 433 G_CALLBACK(create_web_view_cb), window);
pankso@177 434 }
pankso@177 435
pankso@182 436 if (! nomenu) {
pankso@182 437 /* Connect WebKit contextual menu items */
pankso@182 438 g_object_connect(G_OBJECT(webview), "signal::populate-popup",
pankso@182 439 G_CALLBACK(populate_menu_cb), webview, NULL);
pankso@182 440 }
pankso@177 441 return browser;
pankso@177 442 }
pankso@177 443
pankso@177 444 static GtkWidget*
pankso@177 445 create_toolbar(GtkWidget* urientry, GtkWidget* search, WebKitWebView* webview)
pankso@177 446 {
pankso@177 447 GtkToolItem* item;
pankso@178 448
pankso@177 449 toolbar = gtk_toolbar_new();
pankso@177 450 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
pankso@177 451 GTK_ORIENTATION_HORIZONTAL);
pankso@177 452 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),
pankso@177 453 GTK_TOOLBAR_BOTH_HORIZ);
pankso@177 454
pankso@177 455 /* The back button */
pankso@178 456 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
pankso@178 457 g_signal_connect(G_OBJECT(item), "clicked",
pankso@177 458 G_CALLBACK(go_back_cb), webview);
pankso@178 459 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 460
pankso@178 461 /* The forward button */
pankso@178 462 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
pankso@178 463 g_signal_connect(G_OBJECT(item), "clicked",
pankso@177 464 G_CALLBACK(go_forward_cb), webview);
pankso@178 465 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 466
pankso@177 467 /* URL entry */
pankso@177 468 item = gtk_tool_item_new();
pankso@177 469 gtk_tool_item_set_expand(item, TRUE);
pankso@177 470 gtk_container_add(GTK_CONTAINER(item), urientry);
pankso@177 471 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 472 g_signal_connect(G_OBJECT(urientry), "activate",
pankso@177 473 G_CALLBACK(uri_entry_cb), webview);
pankso@178 474
pankso@177 475 /* Separator */
pankso@177 476 item = gtk_separator_tool_item_new();
pankso@178 477 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@178 478
pankso@177 479 /* Search entry */
pankso@177 480 item = gtk_tool_item_new();
pankso@178 481 gtk_tool_item_set_expand(item, FALSE);
pankso@178 482 gtk_widget_set_size_request(GTK_WIDGET(item), 200, 0);
pankso@177 483 gtk_container_add(GTK_CONTAINER(item), search);
pankso@177 484 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@177 485 gtk_entry_set_icon_from_stock(GTK_ENTRY(search),
pankso@177 486 GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FIND);
pankso@177 487 g_signal_connect(GTK_ENTRY(search), "icon-press",
pankso@177 488 G_CALLBACK(search_icon_press_cb), webview);
pankso@177 489 g_signal_connect(G_OBJECT(search), "activate",
pankso@177 490 G_CALLBACK(search_entry_cb), webview);
pankso@182 491
pankso@182 492 /* Home button */
pankso@182 493 item = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
pankso@182 494 g_signal_connect(G_OBJECT(item), "clicked",
pankso@182 495 G_CALLBACK(go_home_cb), webview);
pankso@182 496 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@178 497
pankso@177 498 /* Bookmark button */
pankso@177 499 item = gtk_tool_button_new_from_stock(GTK_STOCK_PROPERTIES);
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@182 546 void
pankso@182 547 help(void)
pankso@182 548 {
pankso@182 549 printf("\nTazWeb - Light and fast web browser using Webkit engine\n\n\
pankso@182 550 Usage: tazweb [--options] [value] url\n\
pankso@182 551 \n\
pankso@182 552 Options:\n\
pankso@182 553 -h --help\n\
pankso@182 554 -p --private\n\
pankso@182 555 -u --useragent [ua]\n\
pankso@182 556 -k --kiosk\n\
pankso@182 557 -r --raw\n\
pankso@182 558 --notoolbar\n\
pankso@182 559 --nomenu\n\n");
pankso@182 560 printf ("Bookmarks: %s\n\n", BOOKMARKS);
pankso@182 561 return;
pankso@182 562 }
pankso@182 563
pankso@177 564 int
pankso@183 565 main(int argc, char *argv[])
pankso@177 566 {
pankso@177 567 textdomain (GETTEXT_PACKAGE);
pankso@182 568 int c;
pankso@182 569
pankso@182 570 /* Cmdline parsing with getopt_long to handle --option or -o */
pankso@182 571 while (1) {
pankso@182 572 static struct option long_options[] =
pankso@182 573 {
pankso@182 574 /* Set flag */
pankso@182 575 { "notoolbar", no_argument, &notoolbar, 1 },
pankso@182 576 { "nomenu", no_argument, &nomenu, 1 },
pankso@183 577 //{ "width", required_argument, &width, 'width' },
pankso@182 578 /* No flag */
pankso@182 579 { "help", no_argument, 0, 'h' },
pankso@182 580 { "private", no_argument, 0, 'p' },
pankso@182 581 { "useragent", required_argument, 0, 'u' },
pankso@182 582 { "kiosk", no_argument, 0, 'k' },
pankso@182 583 { "raw", no_argument, 0, 'r' },
pankso@182 584 { 0, 0, 0, 0}
pankso@182 585 };
pankso@182 586
pankso@182 587 int index = 0;
pankso@182 588 c = getopt_long (argc, argv, "hpu:kr", long_options, &index);
pankso@182 589
pankso@182 590 /* Detect the end of the options */
pankso@182 591 if (c == -1)
pankso@182 592 break;
pankso@178 593
pankso@182 594 switch (c) {
pankso@182 595 case 0:
pankso@182 596 /* Options with flag */
pankso@182 597 if (debug) {
pankso@182 598 printf ("Option: %s", long_options[index].name);
pankso@182 599 if (optarg)
pankso@182 600 printf (" with arg: %s", optarg);
pankso@182 601 printf ("\n");
pankso@182 602 }
pankso@182 603 break;
pankso@182 604
pankso@182 605 case 'h':
pankso@182 606 help();
pankso@182 607 return 0;
pankso@182 608
pankso@182 609 case 'p':
pankso@182 610 private++;
pankso@182 611 break;
pankso@182 612
pankso@182 613 case 'u':
pankso@182 614 if (debug)
pankso@182 615 printf ("User agent option: %s\n", optarg);
pankso@182 616 useragent = optarg;
pankso@182 617 break;
pankso@182 618
pankso@182 619 case 'k':
pankso@182 620 kiosk++;
pankso@182 621 break;
pankso@182 622
pankso@182 623 case 'r':
pankso@182 624 notoolbar++;
pankso@182 625 nomenu++;
pankso@182 626 break;
pankso@182 627
pankso@182 628 case 'w':
pankso@183 629 //width = optarg;
pankso@182 630 break;
pankso@182 631
pankso@182 632 case '?':
pankso@182 633 help();
pankso@182 634 return 0;
pankso@177 635 }
pankso@177 636 }
pankso@182 637
pankso@182 638 argc -= optind;
pankso@182 639 argv += optind;
pankso@183 640
pankso@178 641
pankso@177 642 /* Initialize GTK */
pankso@177 643 gtk_init(NULL, NULL);
pankso@178 644
pankso@177 645 /* Get a default bookmarks.txt if missing */
pankso@177 646 if (! g_file_test(BMTXT, G_FILE_TEST_EXISTS)) {
pankso@177 647 system("install -m 0700 -d $HOME/.config/tazweb");
pankso@177 648 system("install -m 0600 /usr/share/tazweb/bookmarks.txt \
pankso@177 649 $HOME/.config/tazweb/bookmarks.txt");
pankso@178 650 }
pankso@177 651
pankso@183 652 /* Load the start page or the url in argument */
pankso@183 653 uri =(char*)(argc == 1 ? argv[0] : WEBHOME);
pankso@183 654 if (argv[0])
pankso@177 655 check_requested_uri();
pankso@178 656
pankso@182 657 tazweb_window = create_window(&webview);
pankso@182 658 gtk_widget_show_all(tazweb_window);
pankso@177 659
pankso@178 660 /* Handle cookies */
pankso@182 661 if (! private) {
pankso@178 662 session = webkit_get_default_session();
pankso@178 663 snprintf(COOKIES, sizeof COOKIES, "%s", COOKIES);
pankso@178 664 cookies_setup();
pankso@178 665 }
pankso@178 666
pankso@177 667 /* Fullscreen for Kiosk mode */
pankso@177 668 if (kiosk)
pankso@182 669 gtk_window_fullscreen(GTK_WINDOW(tazweb_window));
pankso@178 670
pankso@177 671 webkit_web_view_load_uri(webview, uri);
pankso@177 672 gtk_widget_grab_focus(GTK_WIDGET(webview));
pankso@177 673 gtk_main();
pankso@178 674
pankso@177 675 return 0;
pankso@177 676 }