tazweb annotate src/main.c @ rev 64

Clean-up main() and rename draw_loader since it's standard functions not a callback
author Christophe Lincoln <pankso@slitaz.org>
date Fri Apr 22 08:57:59 2011 +0200 (2011-04-22)
parents 8389defee9b9
children 0b5ed969f4f2
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@61 4 * as a contextual menu, but no menu bar or tabs.
pankso@44 5 *
pankso@63 6 * Copyright (C) 2011 SliTaz GNU/Linux - BSD License
pankso@61 7 * See AUTHORS and LICENSE for detailed information
pankso@61 8 *
pankso@2 9 */
pankso@2 10
pankso@2 11 #include <gtk/gtk.h>
pankso@2 12 #include <webkit/webkit.h>
pankso@2 13
pankso@61 14 #define CONFIG g_strdup_printf ("%s/.config/tazweb", g_get_home_dir ())
pankso@61 15
pankso@63 16 /* Loader color - #d66018 #7b705c */
pankso@63 17 static gchar *loader_color = "#351a0a";
pankso@63 18
pankso@63 19 static GtkWidget *main_window, *scrolled, *loader, *toolbar;
pankso@61 20 static GtkWidget *uri_entry, *search_entry;
pankso@2 21 static WebKitWebView* web_view;
pankso@55 22 static WebKitWebFrame* frame;
pankso@2 23 static gdouble load_progress;
pankso@2 24 static guint status_context_id;
pankso@57 25 static gchar* main_title;
pankso@63 26 static gchar *title;
pankso@63 27 static gint progress;
pankso@52 28 const gchar* uri;
pankso@50 29
pankso@50 30 /* Create an icon */
pankso@50 31 static GdkPixbuf*
pankso@50 32 create_pixbuf (const gchar * image)
pankso@50 33 {
pankso@50 34 GdkPixbuf *pixbuf;
pankso@50 35 pixbuf = gdk_pixbuf_new_from_file (image, NULL);
pankso@50 36 return pixbuf;
pankso@50 37 }
pankso@50 38
pankso@63 39 /* Loader area */
pankso@2 40 static void
pankso@64 41 draw_loader ()
pankso@2 42 {
pankso@63 43 GdkGC *gc = gdk_gc_new (loader->window);
pankso@63 44 GdkColor fg;
pankso@63 45
pankso@63 46 uri = webkit_web_view_get_uri (web_view);
pankso@63 47 const gint width = progress * loader->allocation.width / 100;
pankso@63 48
pankso@63 49 gdk_color_parse (loader_color, &fg);
pankso@63 50 gdk_gc_set_rgb_fg_color (gc, &fg);
pankso@63 51 gdk_draw_rectangle (loader->window,
pankso@63 52 loader->style->bg_gc [GTK_WIDGET_STATE (loader)],
pankso@63 53 TRUE, 0, 0, loader->allocation.width, loader->allocation.height);
pankso@63 54 gdk_draw_rectangle (loader->window, gc, TRUE, 0, 0, width,
pankso@63 55 loader->allocation.height);
pankso@63 56 g_object_unref (gc);
pankso@63 57 }
pankso@63 58
pankso@64 59 /* Loader progress */
pankso@64 60 static gboolean
pankso@64 61 expose_loader_cb (GtkWidget *area, GdkEventExpose *event, gpointer data)
pankso@64 62 {
pankso@64 63 draw_loader();
pankso@64 64 return TRUE;
pankso@64 65 }
pankso@64 66
pankso@63 67 /* Update title and loader */
pankso@63 68 static void
pankso@63 69 update ()
pankso@63 70 {
pankso@63 71 title = g_strdup (main_title);
pankso@63 72 if (! main_title)
pankso@63 73 title = g_strdup_printf ("Unknow - TazWeb", main_title);
pankso@64 74 draw_loader ();
pankso@63 75 gtk_window_set_title (GTK_WINDOW (main_window), title);
pankso@51 76 g_free (title);
pankso@2 77 }
pankso@2 78
pankso@63 79 /* Get the page title */
pankso@2 80 static void
pankso@64 81 notify_title_cb (WebKitWebView* web_view, GParamSpec* pspec, gpointer data)
pankso@2 82 {
pankso@63 83 main_title = g_strdup (webkit_web_view_get_title (web_view));
pankso@63 84 update ();
pankso@2 85 }
pankso@2 86
pankso@2 87 /* Request progress in window title */
pankso@2 88 static void
pankso@2 89 notify_progress_cb (WebKitWebView* web_view, GParamSpec* pspec, gpointer data)
pankso@2 90 {
pankso@63 91 progress = webkit_web_view_get_progress (web_view) * 100;
pankso@63 92 update ();
pankso@2 93 }
pankso@2 94
pankso@63 95 /* Notify loader and url entry */
pankso@2 96 static void
pankso@34 97 notify_load_status_cb (WebKitWebView* web_view, GParamSpec* pspec, gpointer data)
pankso@33 98 {
pankso@63 99 switch (webkit_web_view_get_load_status (web_view))
pankso@63 100 {
pankso@63 101 case WEBKIT_LOAD_COMMITTED:
pankso@63 102 break;
pankso@63 103 case WEBKIT_LOAD_FINISHED:
pankso@63 104 progress = 0;
pankso@63 105 update ();
pankso@63 106 break;
pankso@63 107 }
pankso@63 108 frame = webkit_web_view_get_main_frame (web_view);
pankso@63 109 uri = webkit_web_frame_get_uri (frame);
pankso@51 110 if (uri)
pankso@51 111 gtk_entry_set_text (GTK_ENTRY (uri_entry), uri);
pankso@33 112 }
pankso@33 113
pankso@33 114 static void
pankso@2 115 destroy_cb (GtkWidget* widget, gpointer data)
pankso@2 116 {
pankso@51 117 gtk_main_quit ();
pankso@2 118 }
pankso@2 119
pankso@57 120 /* Show page source */
pankso@55 121 static void
pankso@55 122 view_source_cb ()
pankso@55 123 {
pankso@55 124 gboolean source;
pankso@55 125
pankso@55 126 frame = webkit_web_view_get_main_frame (web_view);
pankso@55 127 uri = webkit_web_frame_get_uri (frame);
pankso@55 128 source = webkit_web_view_get_view_source_mode (web_view);
pankso@55 129
pankso@55 130 webkit_web_view_set_view_source_mode(web_view, !source);
pankso@55 131 webkit_web_view_load_uri (web_view, uri);
pankso@57 132 }
pankso@55 133
pankso@52 134 /* URL entry callback function */
pankso@14 135 static void
pankso@58 136 uri_entry_cb (GtkWidget* entry, gpointer data)
pankso@14 137 {
pankso@52 138 uri = gtk_entry_get_text (GTK_ENTRY (entry));
pankso@51 139 g_assert (uri);
pankso@51 140 webkit_web_view_load_uri (web_view, uri);
pankso@14 141 }
pankso@14 142
pankso@52 143 /* Search entry callback function */
pankso@35 144 static void
pankso@58 145 search_entry_cb (GtkWidget* entry, gpointer data)
pankso@35 146 {
pankso@52 147 uri = g_strdup_printf ("http://www.google.com/search?q=%s",
pankso@52 148 gtk_entry_get_text (GTK_ENTRY (entry)));
pankso@52 149 g_assert (uri);
pankso@52 150 webkit_web_view_load_uri (web_view, uri);
pankso@52 151 }
pankso@52 152
pankso@52 153 /* Home button callback function */
pankso@52 154 static void
pankso@52 155 go_home_cb (GtkWidget* widget, gpointer data)
pankso@52 156 {
pankso@61 157 uri = g_strdup_printf ("file://%s/home.html", CONFIG);
pankso@51 158 g_assert (uri);
pankso@51 159 webkit_web_view_load_uri (web_view, uri);
pankso@35 160 }
pankso@35 161
pankso@52 162 /* Fullscreen and unfullscreen callback function */
pankso@44 163 static void
pankso@22 164 fullscreen_cb (GtkWindow* window, gpointer data)
pankso@22 165 {
pankso@51 166 GdkWindowState state;
pankso@51 167 state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (main_window)));
pankso@22 168
pankso@51 169 if (state & GDK_WINDOW_STATE_FULLSCREEN)
pankso@51 170 gtk_window_unfullscreen (GTK_WINDOW (main_window));
pankso@51 171 else
pankso@51 172 gtk_window_fullscreen (GTK_WINDOW (main_window));
pankso@22 173 }
pankso@22 174
pankso@52 175 /* TazWeb doc callback function */
pankso@14 176 static void
pankso@21 177 tazweb_doc_cb (GtkWidget* widget, gpointer data)
pankso@14 178 {
pankso@52 179 uri = ("file:///usr/share/doc/tazweb/tazweb.html");
pankso@51 180 g_assert (uri);
pankso@51 181 webkit_web_view_load_uri (web_view, uri);
pankso@14 182 }
pankso@14 183
pankso@44 184 /* Download function */
pankso@44 185 static gboolean
pankso@44 186 download_requested_cb (WebKitWebView *web_view, WebKitDownload *download,
pankso@51 187 gpointer user_data)
pankso@44 188 {
pankso@52 189 uri = webkit_download_get_uri (download);
pankso@63 190 const gchar *buffer;
pankso@51 191 asprintf (&buffer, "tazbox dl-out %s", uri);
pankso@51 192 system (buffer);
pankso@44 193 }
pankso@44 194
pankso@60 195 /* Zoom ou and in callback function */
pankso@60 196 static void
pankso@60 197 zoom_out_cb (GtkWidget *main_window)
pankso@60 198 {
pankso@60 199 webkit_web_view_zoom_out (web_view);
pankso@60 200 }
pankso@60 201
pankso@60 202 static void
pankso@60 203 zoom_in_cb (GtkWidget *main_window)
pankso@60 204 {
pankso@60 205 webkit_web_view_zoom_in (web_view);
pankso@60 206 }
pankso@60 207
pankso@57 208 /* Add items to WebKit contextual menu */
pankso@57 209 static void
pankso@57 210 populate_menu_cb (WebKitWebView *web_view, GtkMenu *menu, gpointer data)
pankso@57 211 {
pankso@57 212 GtkWidget *item;
pankso@57 213
pankso@57 214 /* separator */
pankso@57 215 item = gtk_separator_menu_item_new ();
pankso@57 216 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@59 217
pankso@60 218 /* Zoom in */
pankso@60 219 item = gtk_image_menu_item_new_with_label ("Zoom in");
pankso@60 220 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
pankso@60 221 gtk_image_new_from_stock (GTK_STOCK_ZOOM_IN, GTK_ICON_SIZE_MENU));
pankso@60 222 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@60 223 g_signal_connect (item, "activate", G_CALLBACK (zoom_in_cb), NULL);
pankso@60 224
pankso@60 225 /* Zoom out */
pankso@60 226 item = gtk_image_menu_item_new_with_label ("Zoom out");
pankso@60 227 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
pankso@60 228 gtk_image_new_from_stock (GTK_STOCK_ZOOM_OUT, GTK_ICON_SIZE_MENU));
pankso@60 229 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@60 230 g_signal_connect (item, "activate", G_CALLBACK (zoom_out_cb), NULL);
pankso@60 231
pankso@60 232 /* separator */
pankso@60 233 item = gtk_separator_menu_item_new ();
pankso@60 234 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@60 235
pankso@59 236 /* TazWeb documentation */
pankso@59 237 item = gtk_image_menu_item_new_with_label ("TazWeb manual");
pankso@59 238 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
pankso@59 239 gtk_image_new_from_stock (GTK_STOCK_INFO, GTK_ICON_SIZE_MENU));
pankso@59 240 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@59 241 g_signal_connect (item, "activate", G_CALLBACK (tazweb_doc_cb), NULL);
pankso@59 242
pankso@57 243 /* View source mode */
pankso@59 244 item = gtk_image_menu_item_new_with_label ("View source mode");
pankso@57 245 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
pankso@57 246 gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU));
pankso@57 247 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
pankso@57 248 g_signal_connect (item, "activate", G_CALLBACK (view_source_cb), NULL);
pankso@57 249
pankso@57 250 gtk_widget_show_all (GTK_WIDGET (menu));
pankso@57 251 }
pankso@57 252
pankso@58 253 /* Scrolled window for the web_view */
pankso@2 254 static GtkWidget*
pankso@2 255 create_browser ()
pankso@2 256 {
pankso@58 257 scrolled = gtk_scrolled_window_new (NULL, NULL);
pankso@58 258 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
pankso@51 259 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
pankso@2 260
pankso@51 261 web_view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
pankso@58 262 gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (web_view));
pankso@2 263
pankso@57 264 /* Connect events */
pankso@51 265 g_signal_connect (web_view, "notify::title",
pankso@51 266 G_CALLBACK (notify_title_cb), web_view);
pankso@51 267 g_signal_connect (web_view, "notify::progress",
pankso@51 268 G_CALLBACK (notify_progress_cb), web_view);
pankso@51 269 g_signal_connect (web_view, "notify::load-status",
pankso@51 270 G_CALLBACK (notify_load_status_cb), web_view);
pankso@51 271 g_signal_connect (web_view, "download-requested",
pankso@51 272 G_CALLBACK (download_requested_cb), NULL);
pankso@2 273
pankso@57 274 /* Connect WebKit contextual menu items */
pankso@57 275 g_object_connect (G_OBJECT (web_view), "signal::populate-popup",
pankso@57 276 G_CALLBACK (populate_menu_cb), web_view, NULL);
pankso@57 277
pankso@58 278 return scrolled;
pankso@2 279 }
pankso@2 280
pankso@63 281 /* Loader area */
pankso@63 282 static GtkWidget*
pankso@63 283 create_loader ()
pankso@63 284 {
pankso@63 285 loader = gtk_drawing_area_new ();
pankso@63 286 gtk_widget_set_size_request (loader, 0, 1);
pankso@63 287 g_signal_connect (G_OBJECT (loader), "expose_event",
pankso@63 288 G_CALLBACK (expose_loader_cb), NULL);
pankso@63 289
pankso@63 290 return loader;
pankso@63 291 }
pankso@63 292
pankso@14 293 static GtkWidget*
pankso@14 294 create_toolbar ()
pankso@14 295 {
pankso@51 296 GtkToolItem* item;
pankso@14 297
pankso@58 298 toolbar = gtk_toolbar_new ();
pankso@63 299 gtk_widget_set_size_request (toolbar, 0, 33);
pankso@51 300 gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar),
pankso@51 301 GTK_ORIENTATION_HORIZONTAL);
pankso@51 302 gtk_toolbar_set_style (GTK_TOOLBAR (toolbar),
pankso@51 303 GTK_TOOLBAR_BOTH_HORIZ);
pankso@14 304
pankso@57 305 /* Home button */
pankso@51 306 item = gtk_tool_button_new_from_stock (GTK_STOCK_HOME);
pankso@51 307 g_signal_connect (G_OBJECT (item), "clicked",
pankso@51 308 G_CALLBACK (go_home_cb), NULL);
pankso@51 309 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
pankso@35 310
pankso@57 311 /* URL entry */
pankso@51 312 item = gtk_tool_item_new ();
pankso@51 313 gtk_tool_item_set_expand (item, TRUE);
pankso@51 314 uri_entry = gtk_entry_new ();
pankso@51 315 gtk_container_add (GTK_CONTAINER (item), uri_entry);
pankso@51 316 g_signal_connect (G_OBJECT (uri_entry), "activate",
pankso@58 317 G_CALLBACK (uri_entry_cb), NULL);
pankso@51 318 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
pankso@54 319
pankso@54 320 /* Separator */
pankso@57 321 item = gtk_separator_tool_item_new ();
pankso@57 322 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
pankso@52 323
pankso@57 324 /* Search entry */
pankso@52 325 item = gtk_tool_item_new ();
pankso@52 326 search_entry = gtk_entry_new ();
pankso@52 327 gtk_container_add (GTK_CONTAINER (item), search_entry);
pankso@52 328 g_signal_connect (G_OBJECT (search_entry), "activate",
pankso@58 329 G_CALLBACK (search_entry_cb), NULL);
pankso@52 330 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
pankso@35 331
pankso@51 332 /* The Fullscreen button */
pankso@51 333 item = gtk_tool_button_new_from_stock (GTK_STOCK_FULLSCREEN);
pankso@51 334 g_signal_connect (G_OBJECT (item), "clicked",
pankso@51 335 G_CALLBACK (fullscreen_cb), NULL);
pankso@51 336 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
pankso@51 337
pankso@51 338 return toolbar;
pankso@14 339 }
pankso@14 340
pankso@58 341 /* Main window */
pankso@2 342 static GtkWidget*
pankso@2 343 create_window ()
pankso@2 344 {
pankso@51 345 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
pankso@58 346 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
pankso@63 347
pankso@58 348 /* Default TazWeb window size ratio to 3/4 --> 720, 540*/
pankso@51 349 gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
pankso@51 350 gtk_window_set_icon (GTK_WINDOW (window),
pankso@51 351 create_pixbuf ("/usr/share/pixmaps/tazweb.png"));
pankso@51 352 gtk_widget_set_name (window, "TazWeb");
pankso@51 353 g_signal_connect (window, "destroy", G_CALLBACK (destroy_cb), NULL);
pankso@63 354
pankso@64 355 /* Pack box and container */
pankso@63 356 gtk_box_pack_start (GTK_BOX (vbox), create_browser (), TRUE, TRUE, 0);
pankso@63 357 gtk_container_add (GTK_CONTAINER (vbox), create_loader());
pankso@63 358 gtk_box_set_child_packing (GTK_BOX (vbox), loader,
pankso@63 359 FALSE, FALSE, 0, GTK_PACK_START);
pankso@63 360 gtk_box_pack_start (GTK_BOX (vbox), create_toolbar (), FALSE, FALSE, 0);
pankso@58 361 gtk_container_add (GTK_CONTAINER (window), vbox);
pankso@2 362
pankso@58 363 main_window = window;
pankso@58 364 gtk_widget_show_all (main_window);
pankso@2 365 }
pankso@2 366
pankso@2 367 int
pankso@2 368 main (int argc, char* argv[])
pankso@2 369 {
pankso@51 370 gtk_init (&argc, &argv);
pankso@51 371 if (!g_thread_supported ())
pankso@51 372 g_thread_init (NULL);
pankso@2 373
pankso@64 374 /* Get a default home.html if missing */
pankso@64 375 if (! g_file_test (CONFIG, G_FILE_TEST_EXISTS))
pankso@64 376 system ("cp -r /usr/share/tazweb $HOME/.config/tazweb");
pankso@64 377
pankso@64 378 /* Load the start page file or the url in argument */
pankso@52 379 uri = (gchar*) (argc > 1 ? argv[1] :
pankso@51 380 "file:///usr/share/webhome/index.html");
pankso@55 381
pankso@64 382 create_window ();
pankso@51 383 webkit_web_view_load_uri (web_view, uri);
pankso@51 384 gtk_widget_grab_focus (GTK_WIDGET (web_view));
pankso@64 385 gtk_main ();
pankso@58 386
pankso@51 387 return 0;
pankso@2 388 }