// Simple browser my attempt at an even less-sucking browser than surf. //original code is from alot of places, gtkforums.com, gtkwebkit.org provided //alot of nice API examples :), and of course, surf (though i was careful not to steal any code because of the damned MIT/X license) //uzbl also helped inspire me. along with a previous surf fork named inferno. #include #include #include struct tab { GtkWidget *scroll; gchar *main_title; gint load_progress; guint status_context_id; WebKitWebView *view; WebKitWebSettings *settings; }; struct window { GtkWidget *win; GtkWidget *bar; GtkWidget *search; GtkWidget *vbox; GtkWidget *notebook; GtkWidget *status; }; static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) { const gchar* uri = gtk_entry_get_text (GTK_ENTRY (sb.bar)); webkit_web_view_open (sb.view, uri); gtk_widget_grab_focus(GTK_WIDGET(sb.view)); } static void update_title (const gchar* title, gchar* linkhover) { if (linkhover) title = g_strdup(linkhover); gtk_window_set_title(GTK_WINDOW(sb.win), title); g_free(linkhover); } static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) { /* gchar *linkhover; if (link) update_title(NULL, link); */ } static void title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar* title, gpointer data) { update_title (title, NULL); } static void progress_change_cb (WebKitWebView* page, gint progress, gpointer data) { /*nothing needed yet*/ } static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) { const gchar* uri = webkit_web_frame_get_uri(frame); if (uri) gtk_entry_set_text (GTK_ENTRY (sb.bar), uri); } static void destroy_cb (GtkWidget* widget, gpointer data) { gtk_main_quit (); } static void go_back_cb (GtkWidget* widget, gpointer data) { webkit_web_view_go_back (sb.view); } static void go_forward_cb (GtkWidget* widget, gpointer data) { webkit_web_view_go_forward (sb.view); } static void new_tab () { /*seperate function so it will be easier to setup the webkit crap*/ sb.scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sb.scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); sb.view = WEBKIT_WEB_VIEW (webkit_web_view_new ()); gtk_container_add(GTK_CONTAINER(sb.scroll), GTK_WIDGET(sb.view)); /*callbacks*/ g_signal_connect (G_OBJECT (sb.view), "title-changed", G_CALLBACK (title_change_cb), sb.view); g_signal_connect (G_OBJECT (sb.view), "load-progress-changed", G_CALLBACK (progress_change_cb), sb.view); g_signal_connect (G_OBJECT (sb.view), "load-committed", G_CALLBACK (load_commit_cb), sb.view); g_signal_connect (G_OBJECT (sb.view), "hovering-over-link", G_CALLBACK (link_hover_cb), sb.view); /*settings*/ sb.settings = webkit_web_settings_new (); g_object_set (G_OBJECT(sb.settings), "enable-java-applet", FALSE, NULL); g_object_set (G_OBJECT(sb.settings), "print-backgrounds", FALSE, NULL); webkit_web_view_set_settings (WEBKIT_WEB_VIEW(sb.view), sb.settings); return; } gpointer * new_window(void) { /*sb is orginized with a vbox. much the simplest way to orginize things*/ struct window *w; w = g_new0(window, struct); w->vbox = gtk_vbox_new(FALSE, 0); /*entry bar*/ w->bar = gtk_entry_new (); gtk_entry_set_has_frame(GTK_ENTRY(w->bar), FALSE); g_signal_connect (G_OBJECT (w->bar), "activate", G_CALLBACK (activate_uri_entry_cb), NULL); gtk_box_pack_start (GTK_BOX (w->vbox), w->bar, FALSE, FALSE, 0); /*notebook*/ w->notebook = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(w->vbox), w->notebook, FALSE, FALSE, 0); /* search bar*/ /* status bar*/ w->status = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(w->vbox), w->status, FALSE, FALSE, 0); /* browser setup*/ //gtk_box_pack_start (GTK_BOX (sb.vbox), GTK_WIDGET(sb.scroll), TRUE, TRUE, 0); /*window initialization & callbacks*/ w->win = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (w->win), "destroy", G_CALLBACK (destroy_cb), NULL); g_signal_connect(w->win, "key-press-event", G_CALLBACK(key_press_cb), NULL); gtk_container_add (GTK_CONTAINER (w->win), sb.vbox); gtk_window_set_default_size(GTK_WINDOW(w->win), 800, 800); /*open argument, or default page*/ webkit_web_view_open (sb.view, uri); gtk_widget_grab_focus (GTK_WIDGET (sb.view)); gtk_widget_show_all (sb.win); return w; }; gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event) { if (event->state == GDK_CONTROL_MASK) { if (gdk_keyval_to_lower(event->keyval) == GDK_f) { gtk_widget_grab_focus(GTK_WIDGET(sb.bar)); return TRUE; } if (gdk_keyval_to_lower(event->keyval) == GDK_l) { gtk_widget_grab_focus(GTK_WIDGET(sb.bar)); return TRUE; } if (gdk_keyval_to_lower(event->keyval) == GDK_j) { go_back_cb(NULL, NULL); return TRUE; } if (gdk_keyval_to_lower(event->keyval) == GDK_k) { go_forward_cb(NULL, NULL); return TRUE; } if (gdk_keyval_to_lower(event->keyval) == GDK_bracketright) { webkit_web_view_set_zoom_level(sb.view, (webkit_web_view_get_zoom_level(sb.view) + .05)); return TRUE; } if (gdk_keyval_to_lower(event->keyval) == GDK_bracketleft) { webkit_web_view_set_zoom_level(sb.view, (webkit_web_view_get_zoom_level(sb.view) - .05)); return TRUE; } else { return FALSE; } } if (gtk_widget_has_focus(sb.bar) && gdk_keyval_to_lower(event->keyval) == GDK_Escape) { gtk_widget_grab_focus(GTK_WIDGET(sb.view)); return TRUE; } return FALSE; } int main (int argc, char* argv[]) { gtk_init (&argc, &argv);\ struct window *w; (window *) w = new_window(); //gchar* w->starting_uri = (gchar*) (argc > 1 ? argv[1] : "http://www.google.com/"); gtk_main (); return 0; }