tazweb annotate src/main.c @ rev 81

Make new webview definitly work! We can now open new window from menu. By the way, removed loader (buggy with new webviw) and bloated... remove colors (use gtk theme)
author Christophe Lincoln <pankso@slitaz.org>
date Mon Apr 25 01:17:19 2011 +0200 (2011-04-25)
parents 32ceefc08f61
children 5b1045c7842b
rev   line source
pankso@2 1 /*
paul@42 2 * TazWeb is a radically simple web browser providing a single window
pankso@61 3 * with a single toolbar with buttons, an URL entry and search as well
pankso@74 4 * as a contextual menu, but no menu bar or tabs. Commented line code
pankso@74 5 * starts with // and comments are between * *
pankso@44 6 *
pankso@75 7 * Copyright(C) 2011 SliTaz GNU/Linux - BSD License
pankso@61 8 * See AUTHORS and LICENSE for detailed information
pankso@61 9 *
pankso@2 10 */
pankso@2 11
pankso@2 12 #include <gtk/gtk.h>
pankso@2 13 #include <webkit/webkit.h>
pankso@2 14
pankso@75 15 #define CONFIG g_strdup_printf("%s/.config/tazweb", g_get_home_dir())
pankso@68 16 #define START "file:///usr/share/webhome/index.html"
pankso@61 17
pankso@76 18 /* Needs AppleWebKit/531.2+ to handle all sites ? */
pankso@76 19 static gchar *useragent = "TazWeb (X11; SliTaz GNU/Linux; U; en_US)";
pankso@76 20
pankso@81 21 static GtkWidget* create_window(WebKitWebView** newwebview);
pankso@81 22 static GtkWidget *mainwindow, *vbox, *browser, *toolbar;
pankso@74 23 static GtkWidget *urientry, *search;
pankso@74 24 static WebKitWebView* webview;
pankso@55 25 static WebKitWebFrame* frame;
pankso@79 26 static gint count = 0;
pankso@52 27 const gchar* uri;
pankso@50 28
pankso@50 29 /* Create an icon */
pankso@50 30 static GdkPixbuf*
pankso@75 31 create_pixbuf(const gchar* image)
pankso@50 32 {
pankso@50 33 GdkPixbuf *pixbuf;
pankso@75 34 pixbuf = gdk_pixbuf_new_from_file(image, NULL);
pankso@50 35 return pixbuf;
pankso@50 36 }
pankso@50 37
pankso@65 38 /* Can be: http://hg.slitaz.org or hg.slitaz.org */
pankso@65 39 static void
pankso@75 40 check_requested_uri()
pankso@65 41 {
pankso@75 42 uri = g_strrstr(uri, "://") ? g_strdup(uri)
pankso@75 43 : g_strdup_printf("http://%s", uri);
pankso@65 44 }
pankso@65 45
pankso@80 46 /* Update title */
pankso@63 47 static void
pankso@80 48 update_title(GtkWindow* window, WebKitWebView* webview)
pankso@63 49 {
pankso@81 50 GString *string;
pankso@81 51 gdouble progress;
pankso@81 52 gchar *title;
pankso@81 53
pankso@81 54 string = g_string_new(webkit_web_view_get_title(webview));
pankso@81 55 progress = webkit_web_view_get_progress(webview) * 100;
pankso@81 56 if (progress < 100)
pankso@81 57 g_string_append_printf(string, " [ %f%% ] ", progress);
pankso@81 58
pankso@81 59 title = g_string_free(string, FALSE);
pankso@80 60 gtk_window_set_title(window, title);
pankso@75 61 g_free(title);
pankso@2 62 }
pankso@2 63
pankso@63 64 /* Get the page title */
pankso@2 65 static void
pankso@80 66 notify_title_cb(WebKitWebView* webview, GParamSpec* pspec, GtkWidget* window)
pankso@2 67 {
pankso@80 68 update_title(GTK_WINDOW(window), webview);
pankso@2 69 }
pankso@2 70
pankso@2 71 /* Request progress in window title */
pankso@2 72 static void
pankso@80 73 notify_progress_cb(WebKitWebView* webview, GParamSpec* pspec, GtkWidget* window)
pankso@2 74 {
pankso@80 75 update_title(GTK_WINDOW(window), webview);
pankso@2 76 }
pankso@2 77
pankso@63 78 /* Notify loader and url entry */
pankso@2 79 static void
pankso@75 80 notify_load_status_cb(WebKitWebView* webview, GParamSpec* pspec, gpointer data)
pankso@33 81 {
pankso@81 82 if (webkit_web_view_get_load_status(webview) == WEBKIT_LOAD_COMMITTED) {
pankso@81 83 frame = webkit_web_view_get_main_frame(webview);
pankso@81 84 uri = webkit_web_frame_get_uri(frame);
pankso@51 85 if (uri)
pankso@75 86 gtk_entry_set_text(GTK_ENTRY(urientry), uri);
pankso@81 87 }
pankso@33 88 }
pankso@33 89
pankso@79 90 /* Destroy the window */
pankso@33 91 static void
pankso@75 92 destroy_cb(GtkWidget* widget, GtkWindow* window)
pankso@2 93 {
pankso@79 94 if (g_atomic_int_dec_and_test(&count))
pankso@79 95 gtk_main_quit();
pankso@2 96 }
pankso@2 97
pankso@57 98 /* Show page source */
pankso@55 99 static void
pankso@75 100 view_source_cb()
pankso@55 101 {
pankso@55 102 gboolean source;
pankso@55 103
pankso@75 104 frame = webkit_web_view_get_main_frame(webview);
pankso@75 105 uri = webkit_web_frame_get_uri(frame);
pankso@75 106 source = webkit_web_view_get_view_source_mode(webview);
pankso@55 107
pankso@74 108 webkit_web_view_set_view_source_mode(webview, !source);
pankso@81 109 webkit_web_view_reload(webview);
pankso@57 110 }
pankso@55 111
pankso@52 112 /* URL entry callback function */
pankso@14 113 static void
pankso@75 114 uri_entry_cb(GtkWidget* entry, gpointer data)
pankso@14 115 {
pankso@75 116 uri = gtk_entry_get_text(GTK_ENTRY(entry));
pankso@75 117 g_assert(uri);
pankso@75 118 check_requested_uri();
pankso@75 119 webkit_web_view_load_uri(webview, uri);
pankso@14 120 }
pankso@14 121
pankso@52 122 /* Search entry callback function */
pankso@35 123 static void
pankso@75 124 search_entry_cb(GtkWidget* entry, gpointer data)
pankso@35 125 {
pankso@75 126 uri = g_strdup_printf("http://www.google.com/search?q=%s",
pankso@75 127 gtk_entry_get_text(GTK_ENTRY(entry)));
pankso@75 128 g_assert(uri);
pankso@75 129 webkit_web_view_load_uri(webview, uri);
pankso@52 130 }
pankso@52 131
pankso@52 132 /* Home button callback function */
pankso@52 133 static void
pankso@75 134 go_home_cb(GtkWidget* widget, gpointer data)
pankso@52 135 {
pankso@75 136 uri = g_strdup_printf("file://%s/home.html", CONFIG);
pankso@75 137 g_assert(uri);
pankso@75 138 webkit_web_view_load_uri(webview, uri);
pankso@35 139 }
pankso@35 140
pankso@69 141 /* Navigation button function */
pankso@69 142 static void
pankso@75 143 go_back_cb(GtkWidget* widget, gpointer data)
pankso@69 144 {
pankso@75 145 webkit_web_view_go_back(webview);
pankso@69 146 }
pankso@69 147
pankso@69 148 static void
pankso@75 149 go_forward_cb(GtkWidget* widget, gpointer data)
pankso@69 150 {
pankso@75 151 webkit_web_view_go_forward(webview);
pankso@69 152 }
pankso@69 153
pankso@52 154 /* Fullscreen and unfullscreen callback function */
pankso@44 155 static void
pankso@75 156 fullscreen_cb(GtkWindow* window, gpointer data)
pankso@22 157 {
pankso@51 158 GdkWindowState state;
pankso@75 159 state = gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(mainwindow)));
pankso@22 160
pankso@75 161 if(state & GDK_WINDOW_STATE_FULLSCREEN)
pankso@75 162 gtk_window_unfullscreen(GTK_WINDOW(mainwindow));
pankso@51 163 else
pankso@75 164 gtk_window_fullscreen(GTK_WINDOW(mainwindow));
pankso@22 165 }
pankso@22 166
pankso@52 167 /* TazWeb doc callback function */
pankso@14 168 static void
pankso@75 169 tazweb_doc_cb(GtkWidget* widget, gpointer data)
pankso@14 170 {
pankso@52 171 uri = ("file:///usr/share/doc/tazweb/tazweb.html");
pankso@75 172 g_assert(uri);
pankso@75 173 webkit_web_view_load_uri(webview, uri);
pankso@14 174 }
pankso@14 175
pankso@44 176 /* Download function */
pankso@44 177 static gboolean
pankso@75 178 download_requested_cb(WebKitWebView *webview, WebKitDownload *download,
pankso@51 179 gpointer user_data)
pankso@44 180 {
pankso@75 181 uri = webkit_download_get_uri(download);
pankso@66 182 const gchar* buffer;
pankso@75 183 asprintf(&buffer,
pankso@81 184 "xterm -T 'Download' -geom 72x10+0-24 -e \
pankso@81 185 'cd $HOME/Downloads && wget -c %s; sleep 2' &", uri);
pankso@75 186 system(buffer);
pankso@44 187 }
pankso@44 188
paul@72 189 /* Zoom out and in callback function */
pankso@60 190 static void
pankso@75 191 zoom_out_cb(GtkWidget *mainwindow)
pankso@60 192 {
pankso@75 193 webkit_web_view_zoom_out(webview);
pankso@60 194 }
pankso@60 195
pankso@60 196 static void
pankso@75 197 zoom_in_cb(GtkWidget *mainwindow)
pankso@60 198 {
pankso@75 199 webkit_web_view_zoom_in(webview);
pankso@60 200 }
pankso@60 201
pankso@79 202 /* New webview clallbacks */
pankso@79 203 static WebKitWebView*
pankso@79 204 create_web_view_cb(WebKitWebView* webview, WebKitWebFrame* web_frame,
pankso@79 205 GtkWidget* window)
pankso@79 206 {
pankso@79 207 WebKitWebView *newview;
pankso@79 208 create_window(&newview);
pankso@79 209 return newview;
pankso@79 210 }
pankso@79 211
pankso@79 212 static gboolean
pankso@79 213 webview_ready_cb(WebKitWebView* webview, GtkWidget* window)
pankso@79 214 {
pankso@79 215 gtk_widget_grab_focus(GTK_WIDGET(webview));
pankso@79 216 gtk_widget_show_all(window);
pankso@79 217 return FALSE;
pankso@79 218 }
pankso@79 219
pankso@79 220 static gboolean
pankso@79 221 close_webview_cb(WebKitWebView* webview, GtkWidget* window)
pankso@79 222 {
pankso@79 223 gtk_widget_destroy(window);
pankso@79 224 return TRUE;
pankso@79 225 }
pankso@79 226
pankso@57 227 /* Add items to WebKit contextual menu */
pankso@57 228 static void
pankso@75 229 populate_menu_cb(WebKitWebView *webview, GtkMenu *menu, gpointer data)
pankso@57 230 {
pankso@66 231 GtkWidget* item;
pankso@57 232
pankso@65 233 /* Separator */
pankso@75 234 item = gtk_separator_menu_item_new();
pankso@75 235 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@59 236
pankso@60 237 /* Zoom in */
pankso@75 238 item = gtk_image_menu_item_new_with_label("Zoom in");
pankso@75 239 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@75 240 gtk_image_new_from_stock(GTK_STOCK_ZOOM_IN, GTK_ICON_SIZE_MENU));
pankso@75 241 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@75 242 g_signal_connect(item, "activate", G_CALLBACK(zoom_in_cb), NULL);
pankso@60 243
pankso@60 244 /* Zoom out */
pankso@75 245 item = gtk_image_menu_item_new_with_label("Zoom out");
pankso@75 246 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@75 247 gtk_image_new_from_stock(GTK_STOCK_ZOOM_OUT, GTK_ICON_SIZE_MENU));
pankso@75 248 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@75 249 g_signal_connect(item, "activate", G_CALLBACK(zoom_out_cb), NULL);
pankso@60 250
pankso@65 251 /* Separator */
pankso@75 252 item = gtk_separator_menu_item_new();
pankso@75 253 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@60 254
pankso@59 255 /* TazWeb documentation */
pankso@75 256 item = gtk_image_menu_item_new_with_label("TazWeb manual");
pankso@75 257 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@75 258 gtk_image_new_from_stock(GTK_STOCK_INFO, GTK_ICON_SIZE_MENU));
pankso@75 259 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@75 260 g_signal_connect(item, "activate", G_CALLBACK(tazweb_doc_cb), NULL);
pankso@59 261
pankso@57 262 /* View source mode */
pankso@75 263 item = gtk_image_menu_item_new_with_label("View source mode");
pankso@75 264 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
pankso@75 265 gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU));
pankso@75 266 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
pankso@75 267 g_signal_connect(item, "activate", G_CALLBACK(view_source_cb), NULL);
pankso@57 268
pankso@75 269 gtk_widget_show_all(GTK_WIDGET(menu));
pankso@57 270 }
pankso@57 271
pankso@74 272 /* Scrolled window for the webview */
pankso@2 273 static GtkWidget*
pankso@79 274 create_browser(GtkWidget* window)
pankso@2 275 {
pankso@76 276 WebKitWebSettings *settings;
pankso@76 277
pankso@76 278 browser = gtk_scrolled_window_new(NULL, NULL);
pankso@76 279 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(browser),
pankso@51 280 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
pankso@2 281
pankso@76 282 gtk_container_add(GTK_CONTAINER(browser), GTK_WIDGET(webview));
pankso@76 283
pankso@76 284 /* User agent */
pankso@76 285 settings = webkit_web_view_get_settings (webview);
pankso@76 286 g_object_set (G_OBJECT (settings), "user-agent", useragent, NULL);
pankso@2 287
pankso@74 288 /* Connect WebKit events */
pankso@75 289 g_signal_connect(webview, "notify::title",
pankso@80 290 G_CALLBACK(notify_title_cb), window);
pankso@75 291 g_signal_connect(webview, "notify::progress",
pankso@80 292 G_CALLBACK(notify_progress_cb), window);
pankso@75 293 g_signal_connect(webview, "notify::load-status",
pankso@80 294 G_CALLBACK(notify_load_status_cb), window);
pankso@75 295 g_signal_connect(webview, "download-requested",
pankso@75 296 G_CALLBACK(download_requested_cb), NULL);
pankso@75 297 g_signal_connect(webview, "create-web-view",
pankso@79 298 G_CALLBACK(create_web_view_cb), window);
pankso@79 299 g_signal_connect(webview, "web-view-ready",
pankso@79 300 G_CALLBACK(webview_ready_cb), window);
pankso@79 301 g_signal_connect(webview, "close-web-view",
pankso@79 302 G_CALLBACK(close_webview_cb), window);
pankso@2 303
pankso@57 304 /* Connect WebKit contextual menu items */
pankso@75 305 g_object_connect(G_OBJECT(webview), "signal::populate-popup",
pankso@75 306 G_CALLBACK(populate_menu_cb), webview, NULL);
pankso@57 307
pankso@76 308 return browser;
pankso@2 309 }
pankso@2 310
pankso@63 311 static GtkWidget*
pankso@81 312 create_toolbar(GtkWidget* urientry, GtkWidget* search, WebKitWebView* webview)
pankso@14 313 {
pankso@51 314 GtkToolItem* item;
pankso@74 315
pankso@75 316 toolbar = gtk_toolbar_new();
pankso@75 317 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
pankso@51 318 GTK_ORIENTATION_HORIZONTAL);
pankso@75 319 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),
pankso@51 320 GTK_TOOLBAR_BOTH_HORIZ);
pankso@14 321
pankso@69 322 /* The back button */
pankso@75 323 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
pankso@75 324 g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(go_back_cb), NULL);
pankso@75 325 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@69 326
pankso@69 327 /* The forward button */
pankso@75 328 item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
pankso@75 329 g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(go_forward_cb), NULL);
pankso@75 330 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@69 331
pankso@70 332 /* Home button */
pankso@75 333 item = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
pankso@75 334 g_signal_connect(G_OBJECT(item), "clicked",
pankso@75 335 G_CALLBACK(go_home_cb), NULL);
pankso@75 336 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@70 337
pankso@57 338 /* URL entry */
pankso@75 339 item = gtk_tool_item_new();
pankso@75 340 gtk_tool_item_set_expand(item, TRUE);
pankso@81 341 gtk_widget_set_size_request(urientry, 0, 20);
pankso@75 342 gtk_container_add(GTK_CONTAINER(item), urientry);
pankso@75 343 g_signal_connect(G_OBJECT(urientry), "activate",
pankso@75 344 G_CALLBACK(uri_entry_cb), NULL);
pankso@75 345 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@54 346
pankso@54 347 /* Separator */
pankso@81 348 item = gtk_separator_tool_item_new();
pankso@81 349 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@52 350
pankso@57 351 /* Search entry */
pankso@75 352 item = gtk_tool_item_new();
pankso@75 353 gtk_widget_set_size_request(search, 150, 20);
pankso@75 354 gtk_container_add(GTK_CONTAINER(item), search);
pankso@75 355 g_signal_connect(G_OBJECT(search), "activate",
pankso@75 356 G_CALLBACK(search_entry_cb), NULL);
pankso@75 357 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@35 358
pankso@51 359 /* The Fullscreen button */
pankso@75 360 item = gtk_tool_button_new_from_stock(GTK_STOCK_FULLSCREEN);
pankso@75 361 g_signal_connect(G_OBJECT(item), "clicked",
pankso@75 362 G_CALLBACK(fullscreen_cb), NULL);
pankso@75 363 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
pankso@51 364
pankso@51 365 return toolbar;
pankso@14 366 }
pankso@14 367
pankso@58 368 /* Main window */
pankso@2 369 static GtkWidget*
pankso@79 370 create_window(WebKitWebView** newwebview)
pankso@2 371 {
pankso@81 372 GtkWidget* window;
pankso@79 373 g_atomic_int_inc(&count);
pankso@63 374
pankso@81 375 /* Default TazWeb window */
pankso@81 376 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
pankso@75 377 gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
pankso@75 378 gtk_window_set_icon(GTK_WINDOW(window),
pankso@75 379 create_pixbuf("/usr/share/pixmaps/tazweb.png"));
pankso@75 380 gtk_widget_set_name(window, "TazWeb");
pankso@75 381 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL);
pankso@63 382
pankso@81 383 /* Webview and widgets */
pankso@81 384 webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
pankso@81 385 urientry = gtk_entry_new();
pankso@81 386 search = gtk_entry_new();
pankso@81 387 vbox = gtk_vbox_new(FALSE, 0);
pankso@81 388
pankso@64 389 /* Pack box and container */
pankso@81 390 gtk_box_pack_start(GTK_BOX(vbox),
pankso@81 391 create_browser(window), TRUE, TRUE, 0);
pankso@81 392 gtk_box_pack_start(GTK_BOX(vbox),
pankso@81 393 create_toolbar(urientry, search, webview), FALSE, FALSE, 0);
pankso@75 394 gtk_container_add(GTK_CONTAINER(window), vbox);
pankso@81 395
pankso@79 396 if (newwebview)
pankso@79 397 *newwebview = webview;
pankso@79 398
pankso@68 399 return window;
pankso@2 400 }
pankso@2 401
pankso@2 402 int
pankso@75 403 main(int argc, char* argv[])
pankso@2 404 {
pankso@81 405 gtk_init(NULL, NULL);
pankso@75 406 if (!g_thread_supported())
pankso@75 407 g_thread_init(NULL);
pankso@2 408
pankso@64 409 /* Get a default home.html if missing */
pankso@75 410 if (! g_file_test(CONFIG, G_FILE_TEST_EXISTS))
pankso@75 411 system("cp -r /usr/share/tazweb $HOME/.config/tazweb");
pankso@64 412
pankso@64 413 /* Load the start page file or the url in argument */
pankso@75 414 uri =(char*)(argc > 1 ? argv[1] : START);
pankso@65 415 if (argv[1])
pankso@75 416 check_requested_uri();
pankso@68 417
pankso@79 418 mainwindow = create_window(&webview);
pankso@81 419
pankso@75 420 gtk_widget_show_all(mainwindow);
pankso@75 421 webkit_web_view_load_uri(webview, uri);
pankso@75 422 gtk_widget_grab_focus(GTK_WIDGET(webview));
pankso@75 423 gtk_main();
pankso@74 424
pankso@51 425 return 0;
pankso@2 426 }