diff options
author | mutantturkey <crazycal00@gmail.com> | 2010-04-21 11:22:21 -0400 |
---|---|---|
committer | mutantturkey <crazycal00@gmail.com> | 2010-04-21 11:22:21 -0400 |
commit | 6aef420359de54cdb290a8b15faaf8f1fe69af8b (patch) | |
tree | e89fcf4eec023aa3bbd8330e22e5d98dfcd42282 |
README
-rw-r--r-- | README | 43 | ||||
-rw-r--r-- | sb.c | 194 |
2 files changed, 237 insertions, 0 deletions
@@ -0,0 +1,43 @@ +Todo: + +[pretty much done, not sure though] keybinding (more support) +more callbacks: NEED ONE FOR NEW WINDOW +configuration settings via args +cookie handling/saving +append HTTP:// to beginning of uri +history? +tabbing structures +window structures + + +sb + +Simple Browser based on webkit. + +I mostly wrote this as an, alternative to more complex browsers like surf, uzbl, and inferno, xxxterm stuff like that. + +I think minimalism is just as important as maintaining a large feature set. features doesn't mean it sucks, what matters is how the features are implemented. + +If they are well written, well implemented, well thought out, bloat will never be present. + + +(Aside the Ideological BS... i am just making this to work how i want it to.) + + +Options: + +nothing yet + + +Bugs: + +Thousands + + + +Code: + +Written Poorly + + +Swing me some electronic mail MutantTurkey@gmail.com @@ -0,0 +1,194 @@ +// 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 <gtk/gtk.h> +#include <webkit/webkit.h> +#include <gdk/gdkkeysyms.h> +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; +} |