tazweb annotate src/tazweb.c @ rev 178

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