diff options
author | mutantturkey <crazycal00@gmail.com> | 2010-05-26 16:19:53 -0400 |
---|---|---|
committer | mutantturkey <crazycal00@gmail.com> | 2010-05-26 16:19:53 -0400 |
commit | 354177863e3759fbb0b0d0436621769be4c8cf5d (patch) | |
tree | 2f6178cac6f8f5d99e3a64602940b4d1dfdd3b97 | |
parent | 9676def23168a122c8f7ceb4dac5730a42456a68 (diff) |
search function added. CTRL+F to bring up. ALT + ENTER to reverse search. ESCAPE to hide
-rw-r--r-- | sb.c | 575 |
1 files changed, 300 insertions, 275 deletions
@@ -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; +} |