tazweb view src/tazweb-ng.c @ rev 199

tazweb-ng migrate cmdline parser and options from TazWeb 1.11
author Christophe Lincoln <pankso@slitaz.org>
date Fri Mar 17 00:15:00 2017 +0100 (2017-03-17)
parents b043c09b31f0
children f4e3ab22586e
line source
1 /*
2 * TazWeb is a radically simple web browser providing a single window
3 * with a single toolbar with buttons, a URL entry and search as well
4 * as a contextual menu, but no menu bar or tabs. Commented line code
5 * starts with // and comments are between * *
6 *
7 * NEXT GENERATION
8 * This is TazWeb NG (2.0) with tabs and cookies support :-)
9 *
10 * Copyright (C) 2011-2017 SliTaz GNU/Linux - BSD License
11 * See AUTHORS and LICENSE for detailed information
12 *
13 */
15 #include <stdlib.h>
16 #include <sys/queue.h>
17 #include <getopt.h>
18 #include <glib.h>
19 #include <glib/gi18n.h>
21 #include <gtk/gtk.h>
22 #include <webkit/webkit.h>
23 #include <libsoup/soup.h>
25 #define HOME g_get_home_dir()
26 #define CONFIG g_strdup_printf("%s/.config/tazweb", HOME)
27 #define BOOKMARKS g_strdup_printf("%s/bookmarks.txt", CONFIG)
28 #define COOKIES g_strdup_printf("%s/cookies.txt", CONFIG)
29 #define DOWNLOADS g_strdup_printf("%s/Downloads", HOME)
30 #define WEBHOME "file:///usr/share/webhome/index.html"
31 #define SEARCH "http://duckduckgo.com/?q=%s&t=slitaz"
32 #define GETTEXT_PACKAGE "tazweb"
34 int width = 800;
35 int height = 600;
36 int private = 0;
38 static gchar *useragent = "TazWeb (X11; SliTaz GNU/Linux; U; en_US)";
39 static gboolean notoolbar;
40 static gboolean nomenu;
41 static gboolean kiosk;
43 static GtkWidget *tazweb_window;
44 static GtkNotebook *notebook;
45 static SoupSession *session;
46 static SoupCookieJar *cookiejar;
47 const gchar* uri;
49 /* Tab structure */
50 struct tab {
51 TAILQ_ENTRY(tab) entry;
52 GtkWidget *vbox;
53 GtkWidget *label;
54 GtkWidget *urientry;
55 GtkWidget *search_entry;
56 GtkWidget *toolbar;
57 GtkWidget *browser;
58 GtkToolItem *backward;
59 GtkToolItem *forward;
60 GtkToolItem *home;
61 GtkToolItem *bookmarks;
62 GtkToolItem *ttb;
63 GtkWidget *spinner;
64 guint tab_id;
65 int focus_wv;
66 WebKitWebView *webview;
67 };
68 TAILQ_HEAD(tab_list, tab);
69 struct tab_list tabs;
71 /* Protocols */
72 void create_new_tab(char *, int);
73 void close_tab(struct tab *);
75 /* Create an icon */
76 static GdkPixbuf*
77 create_pixbuf(const gchar* image)
78 {
79 GdkPixbuf *pixbuf;
80 pixbuf = gdk_pixbuf_new_from_file(image, NULL);
81 return pixbuf;
82 }
84 /* Can be: http://hg.slitaz.org or hg.slitaz.org */
85 static void
86 check_requested_uri()
87 {
88 uri = g_strrstr(uri, "://") ? g_strdup(uri)
89 : g_strdup_printf("http://%s", uri);
90 }
92 int destroy_cb()
93 {
94 gtk_main_quit();
95 return (1);
96 }
98 int focus()
99 {
100 return (0);
101 }
103 static void
104 uri_entry_cb(GtkWidget* entry, struct tab *ttb)
105 {
106 uri = gtk_entry_get_text(GTK_ENTRY(entry));
107 g_assert(uri);
108 check_requested_uri();
109 webkit_web_view_load_uri(ttb->webview, uri);
110 gtk_widget_grab_focus(GTK_WIDGET(ttb->webview));
111 }
113 static void
114 notify_load_status_cb(WebKitWebView* webview, GParamSpec* pspec,
115 struct tab *ttb)
116 {
117 GString *string;
118 WebKitWebFrame *frame;
119 const gchar *uri, *title;
120 gdouble progress;
122 switch (webkit_web_view_get_load_status(webview)) {
124 /* Webkit is loading */
125 case WEBKIT_LOAD_COMMITTED:
126 frame = webkit_web_view_get_main_frame(webview);
127 uri = webkit_web_frame_get_uri(frame);
129 string = g_string_new("Loading");
130 progress = webkit_web_view_get_progress(webview) * 100;
131 if (progress < 100)
132 g_string_append_printf(string, " (%f%%)", progress);
134 title = g_string_free(string, FALSE);
135 gtk_label_set_text(GTK_LABEL(ttb->label), title);
137 /* Start spinner */
138 gtk_widget_show(ttb->spinner);
139 gtk_spinner_start(GTK_SPINNER(ttb->spinner));
141 /* Update URL entry */
142 if (uri)
143 gtk_entry_set_text(GTK_ENTRY(ttb->urientry), uri);
145 /* Focus */
146 ttb->focus_wv = 1;
147 if (gtk_notebook_get_current_page(notebook) == ttb->tab_id)
148 gtk_widget_grab_focus(GTK_WIDGET(ttb->webview));
149 break;
151 /* First layout with actual visible content */
152 case WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT:
153 title = webkit_web_view_get_title(webview);
154 gtk_label_set_text(GTK_LABEL(ttb->label), title);
155 break;
157 /* URL was loaded */
158 case WEBKIT_LOAD_FINISHED:
159 title = webkit_web_view_get_title(webview);
160 gtk_label_set_text(GTK_LABEL(ttb->label), title);
161 gtk_spinner_stop(GTK_SPINNER(ttb->spinner));
162 gtk_widget_hide(ttb->spinner);
163 break;
165 /* URL fail to load */
166 case WEBKIT_LOAD_FAILED:
167 gtk_label_set_text(GTK_LABEL(ttb->label), "Failed");
168 gtk_spinner_stop(GTK_SPINNER(ttb->spinner));
169 gtk_widget_hide(ttb->spinner);
170 break;
172 }
174 gtk_widget_set_sensitive(GTK_WIDGET(ttb->backward),
175 webkit_web_view_can_go_back(webview));
177 gtk_widget_set_sensitive(GTK_WIDGET(ttb->forward),
178 webkit_web_view_can_go_forward(webview));
179 }
181 /* Search entry and icon callback function */
182 static void
183 search_entry_cb(GtkWidget* search_entry, struct tab *ttb)
184 {
185 uri = g_strdup_printf(SEARCH, gtk_entry_get_text(GTK_ENTRY(search_entry)));
186 g_assert(uri);
187 webkit_web_view_load_uri(ttb->webview, uri);
188 }
190 static void
191 search_icon_cb(GtkWidget *search_entry, GtkEntryIconPosition pos,
192 GdkEvent *event, struct tab *ttb)
193 {
194 search_entry_cb(search_entry, ttb);
195 }
197 /* Navigation button functions */
198 static void
199 go_back_cb(GtkWidget *widget, struct tab *ttb)
200 {
201 webkit_web_view_go_back(ttb->webview);
202 }
204 static void
205 go_forward_cb(GtkWidget *widget, struct tab *ttb)
206 {
207 webkit_web_view_go_forward(ttb->webview);
208 }
210 static void
211 go_home_cb(GtkWidget* w, struct tab *ttb)
212 {
213 uri = WEBHOME;
214 g_assert(uri);
215 webkit_web_view_load_uri(ttb->webview, uri);
216 }
218 static void
219 go_bookmarks_cb(GtkWidget* w, struct tab *ttb)
220 {
221 system("/usr/lib/tazweb/helper.sh html_bookmarks");
222 uri = g_strdup_printf("file://%s/bookmarks.html", CONFIG);
223 g_assert(uri);
224 webkit_web_view_load_uri(ttb->webview, uri);
225 }
227 /* Setup session cookies */
228 void
229 cookies_setup(void)
230 {
231 if (cookiejar) {
232 soup_session_remove_feature(session,
233 (SoupSessionFeature*)cookiejar);
234 g_object_unref(cookiejar);
235 cookiejar = NULL;
236 }
238 cookiejar = soup_cookie_jar_text_new(COOKIES, 0);
239 soup_session_add_feature(session, (SoupSessionFeature*)cookiejar);
240 }
242 static void
243 cookies_view_cb(GtkWidget* widget, WebKitWebView* webview)
244 {
245 system("/usr/lib/tazweb/helper.sh html_cookies");
246 uri = g_strdup_printf("file://%s/cookies.html", CONFIG);
247 g_assert(uri);
248 webkit_web_view_load_uri(webview, uri);
249 }
251 static void
252 cookies_clean_cb(GtkWidget* widget, WebKitWebView* webview)
253 {
254 system("/usr/lib/tazweb/helper.sh clean_cookies");
255 }
257 /* Add items to WebKit contextual menu */
258 static void
259 populate_menu_cb(WebKitWebView *ttb, GtkMenu *menu, gpointer data)
260 {
261 GtkWidget* item;
263 /* Separator */
264 item = gtk_separator_menu_item_new();
265 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
267 //if (! kiosk) {
268 ///* Add a bookmark */
269 //item = gtk_image_menu_item_new_with_label(_("Add a bookmark"));
270 //gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
271 //gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
272 //gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
273 //g_signal_connect(item, "activate", G_CALLBACK(add_bookmark_cb), webview);
274 //}
276 ///* Printing */
277 //item = gtk_image_menu_item_new_with_label(_("Print this page"));
278 //gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
279 //gtk_image_new_from_stock(GTK_STOCK_PRINT, GTK_ICON_SIZE_MENU));
280 //gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
281 //g_signal_connect(item, "activate", G_CALLBACK(print_page_cb), webview);
283 ///* View source mode */
284 //item = gtk_image_menu_item_new_with_label(_("View source mode"));
285 //gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
286 //gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU));
287 //gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
288 //g_signal_connect(item, "activate", G_CALLBACK(view_source_cb), webview);
290 ///* Separator */
291 //item = gtk_separator_menu_item_new();
292 //gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
294 ///* TazWeb documentation */
295 //item = gtk_image_menu_item_new_with_label(_("TazWeb manual"));
296 //gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
297 //gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU));
298 //gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
299 //g_signal_connect(item, "activate", G_CALLBACK(tazweb_doc_cb), webview);
301 /* Quit TazWeb */
302 item = gtk_image_menu_item_new_with_label(_("Quit TazWeb"));
303 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
304 gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
305 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
306 g_signal_connect(item, "activate", G_CALLBACK(destroy_cb), NULL);
308 gtk_widget_show_all(GTK_WIDGET(menu));
309 }
311 /* Create a new tab callback */
312 static void
313 create_new_tab_cb()
314 {
315 create_new_tab(WEBHOME, +1);
316 }
318 /* The browser */
319 GtkWidget *
320 create_browser(struct tab *ttb)
321 {
322 GtkWidget *window;
323 WebKitWebSettings *settings;
325 window = gtk_scrolled_window_new(NULL, NULL);
326 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window),
327 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
329 ttb->webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
330 gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(ttb->webview));
332 /* Webkit settings */
333 settings = webkit_web_view_get_settings (ttb->webview);
334 g_object_set(G_OBJECT(settings), "user-agent", useragent, NULL);
336 if (private)
337 g_object_set(G_OBJECT(settings), "enable-private-browsing", TRUE);
339 /* Connect Webkit events */
340 g_signal_connect(ttb->webview, "notify::load-status",
341 G_CALLBACK(notify_load_status_cb), ttb);
343 ////////////////////////////////////////////////////////////////////
344 //g_signal_connect(ttb->webview, "create-web-view",
345 // G_CALLBACK(create_new_tab(WEBHOME, 1)), ttb);
348 /* Connect WebKit contextual menu items */
349 g_object_connect(G_OBJECT(ttb->webview), "signal::populate-popup",
350 G_CALLBACK(populate_menu_cb), ttb, NULL);
352 return (window);
353 }
355 /* Toolbar with URL and search entry */
356 GtkWidget *
357 create_toolbar(struct tab *ttb)
358 {
359 GtkWidget *toolbar = gtk_toolbar_new();
360 GtkToolItem *item;
362 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
363 GTK_ORIENTATION_HORIZONTAL);
364 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),
365 GTK_TOOLBAR_BOTH_HORIZ);
367 /* New tab button */
368 item = gtk_tool_button_new_from_stock(GTK_STOCK_ADD);
369 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
370 g_signal_connect(G_OBJECT(item), "clicked",
371 G_CALLBACK(create_new_tab_cb), FALSE);
373 /* The backward button */
374 ttb->backward = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
375 gtk_widget_set_sensitive(GTK_WIDGET(ttb->backward), FALSE);
376 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), ttb->backward, -1);
377 g_signal_connect(G_OBJECT(ttb->backward), "clicked",
378 G_CALLBACK(go_back_cb), ttb);
380 /* The forward button */
381 ttb->forward = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
382 gtk_widget_set_sensitive(GTK_WIDGET(ttb->forward), FALSE);
383 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), ttb->forward, -1);
384 g_signal_connect(G_OBJECT(ttb->forward), "clicked",
385 G_CALLBACK(go_forward_cb), ttb);
387 /* URL entry */
388 item = gtk_tool_item_new();
389 gtk_tool_item_set_expand(item, TRUE);
390 //gtk_widget_set_size_request(urientry, 0, 20);
391 ttb->urientry = gtk_entry_new();
392 gtk_container_add(GTK_CONTAINER(item), ttb->urientry);
393 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
394 g_signal_connect(G_OBJECT(ttb->urientry), "activate",
395 G_CALLBACK(uri_entry_cb), ttb);
397 /* Separator --> 4-6px */
398 item = gtk_separator_tool_item_new();
399 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
401 /* Search entry */
402 item = gtk_tool_item_new();
403 gtk_tool_item_set_expand(item, FALSE);
404 gtk_widget_set_size_request(GTK_WIDGET(item), 200, 0);
405 ttb->search_entry = gtk_entry_new();
407 gtk_entry_set_icon_from_stock(GTK_ENTRY(ttb->search_entry),
408 GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FIND);
409 gtk_container_add(GTK_CONTAINER(item), ttb->search_entry);
411 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
412 g_signal_connect(GTK_ENTRY(ttb->search_entry), "icon-press",
413 G_CALLBACK(search_icon_cb), ttb);
414 g_signal_connect(G_OBJECT(ttb->search_entry), "activate",
415 G_CALLBACK(search_entry_cb), ttb);
417 /* Home button */
418 ttb->home = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
419 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), ttb->home, -1);
420 g_signal_connect(G_OBJECT(ttb->home), "clicked",
421 G_CALLBACK(go_home_cb), ttb);
423 /* Bookmarks button */
424 ttb->bookmarks = gtk_tool_button_new_from_stock(GTK_STOCK_PROPERTIES);
425 gtk_widget_set_tooltip_text(GTK_WIDGET(item), "Bookmarks");
426 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), ttb->bookmarks, -1);
427 g_signal_connect(G_OBJECT(ttb->bookmarks), "clicked",
428 G_CALLBACK(go_bookmarks_cb), ttb);
430 return (toolbar);
431 }
433 void
434 close_tab(struct tab *ttb)
435 {
436 if (ttb == NULL)
437 return;
439 TAILQ_REMOVE(&tabs, ttb, entry);
440 if (TAILQ_EMPTY(&tabs))
441 create_new_tab(NULL, 1);
443 webkit_web_view_stop_loading(ttb->webview);
444 gtk_widget_destroy(ttb->vbox);
445 g_free(ttb);
446 }
448 gboolean
449 close_tab_cb(GtkWidget *event_box, GdkEventButton *event, struct tab *ttb)
450 {
451 close_tab(ttb);
452 return (FALSE);
453 }
455 void
456 create_new_tab(char *title, int focus)
457 {
458 struct tab *ttb;
459 int load = 1;
460 char *newuri = NULL;
461 GtkWidget *image, *hbox, *event_box;
463 ttb = g_malloc0(sizeof *ttb);
464 TAILQ_INSERT_TAIL(&tabs, ttb, entry);
466 if (title == NULL) {
467 title = "Empty";
468 load = 0;
469 }
471 ttb->vbox = gtk_vbox_new(FALSE, 0);
473 /* Tab title, spinner & close button */
474 hbox = gtk_hbox_new(FALSE, 0);
475 ttb->spinner = gtk_spinner_new();
476 ttb->label = gtk_label_new(title);
477 image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
479 event_box = gtk_event_box_new();
480 gtk_container_add(GTK_CONTAINER(event_box), image);
482 gtk_widget_set_size_request(ttb->label, 160, -1);
483 gtk_box_pack_start(GTK_BOX(hbox), ttb->spinner, FALSE, FALSE, 0);
484 gtk_box_pack_start(GTK_BOX(hbox), ttb->label, FALSE, FALSE, 0);
485 gtk_box_pack_start(GTK_BOX(hbox), event_box, FALSE, FALSE, 0);
487 /* Toolbar */
488 ttb->toolbar = create_toolbar(ttb);
489 gtk_box_pack_start(GTK_BOX(ttb->vbox), ttb->toolbar,
490 FALSE, FALSE, 0);
492 /* Browser */
493 ttb->browser = create_browser(ttb);
494 gtk_box_pack_start(GTK_BOX(ttb->vbox), ttb->browser, TRUE, TRUE, 0);
496 /* Show all widgets */
497 gtk_widget_show_all(hbox);
498 gtk_widget_show_all(ttb->vbox);
499 ttb->tab_id = gtk_notebook_append_page(notebook, ttb->vbox, hbox);
501 /* Reorderable notebook tabs */
502 gtk_notebook_set_tab_reorderable(notebook, ttb->vbox, TRUE);
504 /* Close tab event */
505 g_signal_connect(G_OBJECT(event_box), "button_press_event",
506 G_CALLBACK(close_tab_cb), ttb);
508 if (notoolbar)
509 gtk_widget_hide(ttb->toolbar);
511 if (focus) {
512 gtk_notebook_set_current_page(notebook, ttb->tab_id);
513 }
515 if (load)
516 webkit_web_view_load_uri(ttb->webview, title);
517 else
518 gtk_widget_grab_focus(GTK_WIDGET(ttb->urientry));
520 if (newuri)
521 free(newuri);
522 }
524 /* Main window */
525 GtkWidget *
526 create_window(void)
527 {
528 GtkWidget *window;
530 /* Default TazWeb window */
531 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
532 gtk_window_set_default_size(GTK_WINDOW(window), width, height);
533 gtk_window_set_icon_name(GTK_WINDOW(window), "tazweb");
534 gtk_widget_set_name(window, "TazWeb");
535 gtk_window_set_wmclass(GTK_WINDOW(window), "tazweb", "TazWeb");
536 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL);
538 return (window);
539 }
541 void
542 create_canvas(void)
543 {
544 GtkWidget *vbox;
546 vbox = gtk_vbox_new(FALSE, 0);
547 notebook = GTK_NOTEBOOK(gtk_notebook_new());
549 /* Hide tabs */
550 if (notoolbar)
551 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
553 gtk_notebook_set_scrollable(notebook, TRUE);
554 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(notebook), TRUE, TRUE, 0);
556 tazweb_window = create_window();
557 gtk_container_add(GTK_CONTAINER(tazweb_window), vbox);
558 gtk_widget_show_all(tazweb_window);
560 /* Handle cookies */
561 if (! private) {
562 session = webkit_get_default_session();
563 snprintf(COOKIES, sizeof COOKIES, "%s", COOKIES);
564 cookies_setup();
565 }
567 /* Fullscreen for Kiosk mode */
568 if (kiosk)
569 gtk_window_fullscreen(GTK_WINDOW(tazweb_window));
570 }
572 /* Cmdline Help & usage */
573 void
574 help(void)
575 {
576 printf("\nTazWeb - Light and fast web browser using Webkit engine\n\n\
577 Usage: tazweb [--options] [value] url\n\
578 \n\
579 Options:\n\
580 -h --help Print TazWeb command line help\n\
581 -p --private Disable on-disk cache, cookies, history\n\
582 -u --useragent [ua] Configure the user agent string\n\
583 -k --kiosk Fullscreen, no bookmarks and download support\n\
584 -r --raw Raw webkit window without toolbar and menu\n\
585 -s --small Small Tazweb window for tiny web applications\n\
586 --notoolbar Disable the top toolbar\n\
587 --nomenu Disable TazWeb contextual menu\n\n");
589 return;
590 }
592 int
593 main(int argc, char *argv[])
594 {
595 //textdomain (GETTEXT_PACKAGE);
596 int focus = 1;
597 int c;
599 /* Cmdline parsing with getopt_long to handle --option or -o */
600 while (1) {
601 static struct option long_options[] =
602 {
603 /* Set flag */
604 { "notoolbar", no_argument, &notoolbar, 1 },
605 { "nomenu", no_argument, &nomenu, 1 },
606 /* No flag */
607 { "help", no_argument, 0, 'h' },
608 { "private", no_argument, 0, 'p' },
609 { "useragent", required_argument, 0, 'u' },
610 { "kiosk", no_argument, 0, 'k' },
611 { "raw", no_argument, 0, 'r' },
612 { "small", no_argument, 0, 's' },
613 { 0, 0, 0, 0}
614 };
616 int index = 0;
617 c = getopt_long (argc, argv, "hpu:krs", long_options, &index);
619 /* Detect the end of the options */
620 if (c == -1)
621 break;
623 switch (c) {
624 case 0:
625 /* Options with flag */
626 break;
628 case 'h':
629 help();
630 return 0;
632 case 'p':
633 private++;
634 break;
636 case 'u':
637 useragent = optarg;
638 break;
640 case 'k':
641 kiosk++;
642 break;
644 case 'r':
645 notoolbar++;
646 nomenu++;
647 break;
649 case 's':
650 width = 640;
651 height = 480;
652 break;
654 default:
655 help();
656 return 0;
657 }
658 }
660 argc -= optind;
661 argv += optind;
663 /* FreeBSD style! */
664 TAILQ_INIT(&tabs);
666 /* Initialize GTK */
667 gtk_init(&argc, &argv);
668 create_canvas();
670 /* Open all urls in a new tab */
671 while (argc) {
672 create_new_tab(argv[0], FALSE);
673 focus = 0;
674 argc--;
675 argv++;
676 }
677 if (focus == 1)
678 create_new_tab(WEBHOME, 1);
680 gtk_main();
682 return (0);
683 }