aboutsummaryrefslogtreecommitdiff
path: root/sb.c
diff options
context:
space:
mode:
Diffstat (limited to 'sb.c')
-rw-r--r--sb.c575
1 files changed, 300 insertions, 275 deletions
diff --git a/sb.c b/sb.c
index 4362b42..f8687fa 100644
--- a/sb.c
+++ b/sb.c
@@ -1,277 +1,302 @@
- // 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>
- #include <unistd.h>
- #include <stdlib.h>
- #include <glib.h>
- #include <glib/gstdio.h>
- typedef struct tab { GtkWidget *scroll; GtkWidget *label; gchar *main_title; gint load_progress; guint status_context_id; WebKitWebView *view; WebKitWebSettings *settings; } tab;
- static struct { GtkWidget *win; GtkWidget *bar; GtkWidget *search; GtkWidget *vbox; GtkWidget *notebook; GtkWidget *status; } w;
- #define get_tab(x, page_idx ) (struct tab*)g_object_get_qdata(G_OBJECT( gtk_notebook_get_nth_page( (GtkNotebook*)w.notebook, page_idx ) ), term_data_id);
- static GQuark term_data_id = 0;
- static char *defaultdownload = "xterm -bg black -fg white -e wget -P ";
- static char *defaultsearchengine = "http://www.google.com/search?q=";
- static void activate_uri_entry_cb(GtkWidget* entry, gpointer data);
- static void link_hover(WebKitWebView* page, const gchar* title, const gchar* link, gpointer data);
- static void title_change_cb(WebKitWebView *v, WebKitWebFrame *f, const char *title, tab *t);
- static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
- static void load_uri(gchar *uri);
- static void go_cb(gboolean b);
- static void tab_new();
- static void tab_zoom(gboolean b);
- static void tab_close();
- static void tab_focus(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data);
- static void download(WebKitWebView *web_view, GObject *download, gpointer user_data);
- static void config();
- static void reload();
- static void toggle();
- static void tab_view_source();
- WebKitWebView * tab_new_requested(WebKitWebView *v, WebKitWebFrame *f);
- static void tab_switch(gboolean b);
- gboolean key_press_cb(GtkWidget *widget, GdkEventKey *event);
-
- static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) {
-
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- load_uri(g_strdup(gtk_entry_get_text (GTK_ENTRY (w.bar))));
- gtk_widget_grab_focus(GTK_WIDGET(t->view));
- }
-
- static void reload() {
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- webkit_web_view_reload(t->view);
-
- }
- static void tab_close() {
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- gtk_notebook_remove_page(GTK_NOTEBOOK(w.notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- g_free(t);
-
- if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE); gtk_widget_grab_focus(gtk_notebook_get_nth_page(GTK_NOTEBOOK(w.notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)))); }
- if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 0) { gtk_main_quit(); }
- }
- static void download(WebKitWebView *web_view, GObject *d, gpointer user_data) {
- const gchar *c = webkit_download_get_uri(WEBKIT_DOWNLOAD(d));
- gchar *command = g_strconcat(defaultdownload, g_get_home_dir(), "/ ", g_strdup(c), NULL);
- puts(command);
- g_spawn_command_line_async(command, NULL);
- g_free(command);
- }
- static void link_hover (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {
- if(link != NULL) { gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, link); }
- else { gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, ""); }
-
- }
-
- static void title_change_cb(WebKitWebView *v, WebKitWebFrame *f, const char *title, tab *t) {
- gtk_window_set_title(GTK_WINDOW(w.win), title);
- gtk_label_set_label(GTK_LABEL(t->label), title);
- }
-
- static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
- const gchar* uri = webkit_web_frame_get_uri(frame);
- //gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook));
- gtk_entry_set_text (GTK_ENTRY (w.bar), uri);
-
- FILE *history = fopen(g_strconcat(g_get_home_dir(), "/.history", NULL), "a+");
- fprintf(history, "%s \n", uri);
- fclose(history);
- }
-
- static void load_uri(gchar *uri) {
- gchar *u;
- //Barrowed from surf, no point creating another method, this seems to work well
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- u = g_strrstr(uri, "://") ? g_strdup(uri)
- : g_strdup_printf("http://%s", uri);
- webkit_web_view_load_uri(t->view, u);
- g_free(u);
- };
- static void tab_zoom (gboolean b) {
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- if (b) { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->view) + .05)); }
- else { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->view) - .05)); }
- }
- static void go_cb (gboolean b) {
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- if (b) { webkit_web_view_go_forward(t->view); }
- else { webkit_web_view_go_back(t->view); }
- }
-
- static void toggle() {
- if(gtk_widget_get_visible(w.bar)) {
- gtk_widget_hide(w.bar);
- gtk_widget_hide(w.status);
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE);
- } else {
- gtk_widget_show_all(w.vbox);
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE);
- }
- }
-
- static void tab_switch(gboolean b) {
-
- gint(current) = gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook));
-
- if(b) {
- if (current == gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) -1 ) { current = 0; }
- else { current = current + 1;}
- } else{
- if (current == 0) {
- current = gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) - 1; }
- else {current = current -1; }
- }
-
- gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), current);
-
- }
- WebKitWebView * tab_new_requested(WebKitWebView *v, WebKitWebFrame *f) {
- tab_new();
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- return t->view;
-
- }
- static void tab_view_source() {
- struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
- gboolean(b) = webkit_web_view_get_view_source_mode(t->view);
- if(b) { webkit_web_view_set_view_source_mode(t->view, FALSE); }
- else { webkit_web_view_set_view_source_mode(t->view, TRUE); }
- webkit_web_view_reload(t->view);
-
- }
- static void tab_new() {
- tab *t;
- t = g_new0(tab, 1);
- t->scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(t->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- t->view = WEBKIT_WEB_VIEW(webkit_web_view_new ());
- gtk_container_add(GTK_CONTAINER(t->scroll), GTK_WIDGET(t->view));
-
- t->label = gtk_label_new("new tab");
- int index = gtk_notebook_append_page(GTK_NOTEBOOK(w.notebook), t->scroll, t->label);
- gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(w.notebook), t->scroll, TRUE);
-
- if ( gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { }
- if (index == 0) {
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE);
- } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE); }
-
-
- /*callbacks*/
- g_signal_connect (G_OBJECT (t->view), "title-changed", G_CALLBACK (title_change_cb), t);
- g_signal_connect (G_OBJECT (t->view), "load-committed", G_CALLBACK (load_commit_cb), t->view);
- g_signal_connect (G_OBJECT (t->view), "hovering-over-link", G_CALLBACK (link_hover), t->view);
- g_signal_connect (G_OBJECT (t->view), "download-requested", G_CALLBACK (download), t->view);
- g_signal_connect (G_OBJECT (t->view), "create-web-view", G_CALLBACK (tab_new_requested), NULL);
- /*settings*/
-
- g_object_set_qdata_full(G_OBJECT(gtk_notebook_get_nth_page((GtkNotebook*)w.notebook, index)), term_data_id, t, NULL);
-
- t->settings = webkit_web_settings_new ();
- g_object_set (G_OBJECT(t->settings), "enable-java-applet", FALSE, NULL);
- g_object_set (G_OBJECT(t->settings), "print-backgrounds", FALSE, NULL);
- webkit_web_view_set_settings (WEBKIT_WEB_VIEW(t->view), t->settings);
- gtk_widget_show_all(w.win);
- gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), index);
- //gtk_widget_grab_focus(w.bar);
- //gchar *url;
- //g_spawn_command_line_sync("sh -c 'sort /home/calvin/.history | dmenu -l 15'", &url, NULL, NULL, NULL);
- //load_uri(url);
- }
-
- static void tab_focus(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) {
- struct tab *t = get_tab(NULL, page_num);
- const char *title = webkit_web_view_get_title(t->view);
- const char *url = webkit_web_view_get_uri(t->view);
-
- if (title == NULL && url == NULL) {
- title = "sb";
- url = "";
- }
- gtk_window_set_title(GTK_WINDOW(w.win), title);
- gtk_entry_set_text(GTK_ENTRY(w.bar), url);
- }
-
- static void config() {
+// 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>
+#include <unistd.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+typedef struct tab { GtkWidget *scroll; GtkWidget *label; gchar *main_title; gint load_progress; guint status_context_id; WebKitWebView *view; WebKitWebSettings *settings; } tab;
+static struct { GtkWidget *win; GtkWidget *bar; GtkWidget *search; GtkWidget *vbox; GtkWidget *notebook; GtkWidget *status; } w;
+
+#define get_tab(x, page_idx ) (struct tab*)g_object_get_qdata(G_OBJECT( gtk_notebook_get_nth_page( (GtkNotebook*)w.notebook, page_idx ) ), term_data_id);
+static GQuark term_data_id = 0;
+static char *defaultdownload = "xterm -bg black -fg white -e wget -P ";
+static char *defaultsearchengine = "http://www.google.com/search?q=";
+static void activate_uri_entry_cb(GtkWidget* entry, gpointer data);
+static void link_hover(WebKitWebView* page, const gchar* title, const gchar* link, gpointer data);
+static void title_change_cb(WebKitWebView *v, WebKitWebFrame *f, const char *title, tab *t);
+static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
+static void load_uri(gchar *uri);
+static void go_cb(gboolean b);
+static void tab_new();
+static void tab_zoom(gboolean b);
+static void tab_close();
+static void tab_focus(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data);
+static void download(WebKitWebView *web_view, GObject *download, gpointer user_data);
+static void config();
+static void reload();
+static void search(GtkEntry *entry, gboolean b);
+static void toggle();
+static void show_search(gboolean b);
+static void tab_view_source();
+WebKitWebView * tab_new_requested(WebKitWebView *v, WebKitWebFrame *f);
+static void tab_switch(gboolean b);
+gboolean key_press_cb(GtkWidget *widget, GdkEventKey *event);
+
+
+static void search(GtkEntry *entry, gboolean b) {
+ struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+ //gtk_widget_grab_focus(GTK_WIDGET(t->view));
- term_data_id = g_quark_from_static_string("sb");
-
- //FILE *history = fopen("/home/calvin/.history", "a+");
-
- //fscanf(history, "%s %s\n", a, b);
-
- //fclose(history);
- //printf("%s %s \n", a, b);
- w.vbox = gtk_vbox_new(FALSE, 0);
- w.notebook = gtk_notebook_new();
- w.bar = gtk_entry_new ();
-
- gtk_entry_set_has_frame(GTK_ENTRY(w.bar), FALSE);
- gtk_notebook_set_scrollable(GTK_NOTEBOOK(w.notebook), TRUE);
- w.status = gtk_statusbar_new();
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(w.status), FALSE);
- gtk_notebook_set_show_border(GTK_NOTEBOOK(w.notebook), FALSE);
-
- gtk_box_pack_start(GTK_BOX (w.vbox), w.bar, FALSE, FALSE, 1);
- gtk_box_pack_start(GTK_BOX(w.vbox), w.notebook, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(w.vbox), w.status, FALSE, FALSE, 0);
-
-
- w.win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(w.win), 800, 800);
-
- tab_new();
-
- g_signal_connect (G_OBJECT (w.bar), "activate", G_CALLBACK (activate_uri_entry_cb), NULL);
- g_signal_connect (G_OBJECT(w.notebook), "switch-page", G_CALLBACK(tab_focus), NULL);
- g_signal_connect (G_OBJECT (w.win), "destroy", G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect(w.win, "key-press-event", G_CALLBACK(key_press_cb), NULL);
- gtk_container_add (GTK_CONTAINER (w.win), w.vbox);
-
-
- gtk_widget_show_all (w.win);
- gtk_widget_grab_focus(w.bar);
- }
-
- gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event) {
- guint(g) = event->keyval;
+ webkit_web_view_search_text(t->view, gtk_entry_get_text(GTK_ENTRY(w.search)), FALSE, b, TRUE);
+}
+static void show_search(gboolean b) {
+ if(b) { gtk_widget_show(w.search); gtk_widget_grab_focus(w.search); } else { gtk_widget_hide(w.search); }
- if ( (event->state & GDK_CONTROL_MASK)== GDK_CONTROL_MASK) {
- if(g == GDK_l) {gtk_widget_grab_focus(GTK_WIDGET(w.bar)); return TRUE; }
- if (g == GDK_j) { go_cb(FALSE); return TRUE; }
- if (g == GDK_k) { go_cb(TRUE); return TRUE; }
- if (g == GDK_h) { toggle(); }
- if (g == GDK_Page_Up) { tab_switch(FALSE); }
- if (g == GDK_Page_Down) { tab_switch(TRUE); }
- if (g == GDK_t) { tab_new(); return TRUE; }
- if (g == GDK_w) { tab_close(); return TRUE; }
- if (g == GDK_bracketright) { tab_zoom(TRUE); return TRUE; }
- if (g == GDK_bracketleft) { tab_zoom(FALSE); return TRUE; }
- if (g == GDK_r) { reload(); return TRUE; }
- if (g == GDK_s) { tab_view_source(); }
- if (g == GDK_Return) { load_uri(g_strconcat(defaultsearchengine, gtk_entry_get_text(GTK_ENTRY(w.bar)), NULL)); return TRUE; }
- else { return FALSE; }
-
- }
- if (gtk_widget_has_focus(w.bar) && g == GDK_Escape) { gtk_widget_grab_focus(GTK_WIDGET(w.notebook)); return TRUE; }
-
- return FALSE;
- }
-
- int main (int argc, char* argv[]) {
- gtk_init (&argc, &argv);
-
- config();
- if (argc == 2) {
- load_uri(argv[1]);
- }
-
-
- gtk_main();
-
- return 0;
- }
+}
+static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) {
+
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+load_uri(g_strdup(gtk_entry_get_text (GTK_ENTRY (w.bar))));
+gtk_widget_grab_focus(GTK_WIDGET(t->view));
+}
+
+static void reload() {
+ struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+ webkit_web_view_reload(t->view);
+}
+static void tab_close() {
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+gtk_notebook_remove_page(GTK_NOTEBOOK(w.notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+g_free(t);
+
+if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE); gtk_widget_grab_focus(gtk_notebook_get_nth_page(GTK_NOTEBOOK(w.notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)))); }
+if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 0) { gtk_main_quit(); }
+}
+static void download(WebKitWebView *web_view, GObject *d, gpointer user_data) {
+const gchar *c = webkit_download_get_uri(WEBKIT_DOWNLOAD(d));
+gchar *command = g_strconcat(defaultdownload, g_get_home_dir(), "/ ", g_strdup(c), NULL);
+puts(command);
+g_spawn_command_line_async(command, NULL);
+g_free(command);
+}
+static void link_hover (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {
+if(link != NULL) { gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, link); }
+else { gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, ""); }
+
+}
+
+static void title_change_cb(WebKitWebView *v, WebKitWebFrame *f, const char *title, tab *t) {
+gtk_window_set_title(GTK_WINDOW(w.win), title);
+gtk_label_set_label(GTK_LABEL(t->label), title);
+}
+
+static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
+const gchar* uri = webkit_web_frame_get_uri(frame);
+//gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook));
+gtk_entry_set_text (GTK_ENTRY (w.bar), uri);
+
+FILE *history = fopen(g_strconcat(g_get_home_dir(), "/.history", NULL), "a+");
+fprintf(history, "%s \n", uri);
+fclose(history);
+}
+
+static void load_uri(gchar *uri) {
+gchar *u;
+//Barrowed from surf, no point creating another method, this seems to work well
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+u = g_strrstr(uri, "://") ? g_strdup(uri)
+: g_strdup_printf("http://%s", uri);
+webkit_web_view_load_uri(t->view, u);
+g_free(u);
+};
+static void tab_zoom (gboolean b) {
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+if (b) { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->view) + .05)); }
+else { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->view) - .05)); }
+}
+static void go_cb (gboolean b) {
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+if (b) { webkit_web_view_go_forward(t->view); }
+else { webkit_web_view_go_back(t->view); }
+}
+
+static void toggle() {
+if(gtk_widget_get_visible(w.bar)) {
+gtk_widget_hide(w.bar);
+gtk_widget_hide(w.status);
+gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE);
+} else {
+gtk_widget_show_all(w.vbox);
+gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE);
+}
+}
+
+static void tab_switch(gboolean b) {
+
+gint(current) = gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook));
+
+if(b) {
+if (current == gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) -1 ) { current = 0; }
+else { current = current + 1;}
+} else{
+if (current == 0) {
+current = gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) - 1; }
+else {current = current -1; }
+}
+
+gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), current);
+
+}
+WebKitWebView * tab_new_requested(WebKitWebView *v, WebKitWebFrame *f) {
+tab_new();
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+return t->view;
+
+}
+static void tab_view_source() {
+struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)));
+gboolean(b) = webkit_web_view_get_view_source_mode(t->view);
+if(b) { webkit_web_view_set_view_source_mode(t->view, FALSE); }
+else { webkit_web_view_set_view_source_mode(t->view, TRUE); }
+webkit_web_view_reload(t->view);
+
+}
+static void tab_new() {
+tab *t;
+t = g_new0(tab, 1);
+t->scroll = gtk_scrolled_window_new(NULL, NULL);
+t->view = WEBKIT_WEB_VIEW(webkit_web_view_new ());
+t->label = gtk_label_new("new tab");
+
+gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(t->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+gtk_container_add(GTK_CONTAINER(t->scroll), GTK_WIDGET(t->view));
+
+int index = gtk_notebook_append_page(GTK_NOTEBOOK(w.notebook), t->scroll, t->label);
+gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(w.notebook), t->scroll, TRUE);
+
+if ( gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { }
+if (index == 0) {
+gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE);
+} else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE); }
+
+
+/*callbacks*/
+g_signal_connect (G_OBJECT (t->view), "title-changed", G_CALLBACK (title_change_cb), t);
+g_signal_connect (G_OBJECT (t->view), "load-committed", G_CALLBACK (load_commit_cb), t->view);
+g_signal_connect (G_OBJECT (t->view), "hovering-over-link", G_CALLBACK (link_hover), t->view);
+g_signal_connect (G_OBJECT (t->view), "download-requested", G_CALLBACK (download), t->view);
+g_signal_connect (G_OBJECT (t->view), "create-web-view", G_CALLBACK (tab_new_requested), NULL);
+/*settings*/
+
+g_object_set_qdata_full(G_OBJECT(gtk_notebook_get_nth_page((GtkNotebook*)w.notebook, index)), term_data_id, t, NULL);
+
+t->settings = webkit_web_settings_new ();
+g_object_set (G_OBJECT(t->settings), "enable-java-applet", FALSE, NULL);
+g_object_set (G_OBJECT(t->settings), "print-backgrounds", FALSE, NULL);
+webkit_web_view_set_settings (WEBKIT_WEB_VIEW(t->view), t->settings);
+
+gtk_widget_show_all(w.win);
+
+gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), index);
+//gtk_widget_grab_focus(w.bar);
+//gchar *url;
+//g_spawn_command_line_sync("sh -c 'sort /home/calvin/.history | dmenu -l 15'", &url, NULL, NULL, NULL);
+//load_uri(url);
+}
+
+static void tab_focus(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) {
+struct tab *t = get_tab(NULL, page_num);
+const char *title = webkit_web_view_get_title(t->view);
+const char *url = webkit_web_view_get_uri(t->view);
+
+if (title == NULL && url == NULL) {
+title = "sb";
+url = "";
+}
+gtk_window_set_title(GTK_WINDOW(w.win), title);
+gtk_entry_set_text(GTK_ENTRY(w.bar), url);
+}
+
+static void config() {
+
+term_data_id = g_quark_from_static_string("sb");
+
+//FILE *history = fopen("/home/calvin/.history", "a+");
+
+//fscanf(history, "%s %s\n", a, b);
+
+//fclose(history);
+//printf("%s %s \n", a, b);
+w.vbox = gtk_vbox_new(FALSE, 0);
+w.notebook = gtk_notebook_new();
+w.bar = gtk_entry_new ();
+w.search = gtk_entry_new();
+
+gtk_entry_set_has_frame(GTK_ENTRY(w.bar), FALSE);
+gtk_notebook_set_scrollable(GTK_NOTEBOOK(w.notebook), TRUE);
+w.status = gtk_statusbar_new();
+gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(w.status), FALSE);
+gtk_notebook_set_show_border(GTK_NOTEBOOK(w.notebook), FALSE);
+
+gtk_box_pack_start(GTK_BOX (w.vbox), w.bar, FALSE, FALSE, 1);
+gtk_box_pack_start(GTK_BOX(w.vbox), w.notebook, TRUE, TRUE, 0);
+gtk_box_pack_start(GTK_BOX(w.vbox), w.search, FALSE, FALSE, 1);
+gtk_box_pack_start(GTK_BOX(w.vbox), w.status, FALSE, FALSE, 0);
+
+
+w.win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+gtk_window_set_default_size(GTK_WINDOW(w.win), 800, 800);
+
+tab_new();
+gint *b = 1;
+g_signal_connect (G_OBJECT (w.search), "activate", G_CALLBACK (search), GINT_TO_POINTER(b));
+g_signal_connect (G_OBJECT (w.bar), "activate", G_CALLBACK (activate_uri_entry_cb), NULL);
+g_signal_connect (G_OBJECT(w.notebook), "switch-page", G_CALLBACK(tab_focus), NULL);
+g_signal_connect (G_OBJECT (w.win), "destroy", G_CALLBACK (gtk_main_quit), NULL);
+g_signal_connect(w.win, "key-press-event", G_CALLBACK(key_press_cb), NULL);
+gtk_container_add (GTK_CONTAINER (w.win), w.vbox);
+
+
+gtk_widget_show_all (w.win);
+gtk_widget_hide(w.search);
+gtk_widget_grab_focus(w.bar);
+}
+
+gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event) {
+guint(g) = event->keyval;
+
+if ( (event->state & GDK_CONTROL_MASK)== GDK_CONTROL_MASK) {
+if(g == GDK_l) {gtk_widget_grab_focus(GTK_WIDGET(w.bar)); return TRUE; }
+if(g == GDK_f) { show_search(TRUE); return TRUE; }
+if (g == GDK_j) { go_cb(FALSE); return TRUE; }
+if (g == GDK_k) { go_cb(TRUE); return TRUE; }
+if (g == GDK_h) { toggle(); }
+if (g == GDK_Page_Up) { tab_switch(FALSE); }
+if (g == GDK_Page_Down) { tab_switch(TRUE); }
+if (g == GDK_t) { tab_new(); return TRUE; }
+if (g == GDK_w) { tab_close(); return TRUE; }
+if (g == GDK_bracketright) { tab_zoom(TRUE); return TRUE; }
+if (g == GDK_bracketleft) { tab_zoom(FALSE); return TRUE; }
+if (g == GDK_r) { reload(); return TRUE; }
+if (g == GDK_s) { tab_view_source(); }
+if (g == GDK_Return) { load_uri(g_strconcat(defaultsearchengine, gtk_entry_get_text(GTK_ENTRY(w.bar)), NULL)); return TRUE; } else { return FALSE; }
+}
+
+if (gtk_widget_has_focus(w.bar) && g == GDK_Escape) { gtk_widget_grab_focus(GTK_WIDGET(w.notebook)); return TRUE; }
+if (gtk_widget_has_focus(w.search)) {
+ if (g == GDK_Escape) { show_search(FALSE); return TRUE; }
+ if ((g == GDK_Return) && (event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK) { search(NULL, FALSE); }
+}
+return FALSE;
+}
+
+int main (int argc, char* argv[]) {
+gtk_init (&argc, &argv);
+
+config();
+if (argc == 2) {
+load_uri(argv[1]);
+}
+
+
+gtk_main();
+
+return 0;
+}