aboutsummaryrefslogtreecommitdiff
path: root/sb.c
diff options
context:
space:
mode:
authormutantturkey <crazycal00@gmail.com>2010-04-21 11:22:21 -0400
committermutantturkey <crazycal00@gmail.com>2010-04-21 11:22:21 -0400
commit6aef420359de54cdb290a8b15faaf8f1fe69af8b (patch)
treee89fcf4eec023aa3bbd8330e22e5d98dfcd42282 /sb.c
README
Diffstat (limited to 'sb.c')
-rw-r--r--sb.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/sb.c b/sb.c
new file mode 100644
index 0000000..ae34b25
--- /dev/null
+++ b/sb.c
@@ -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;
+}