diff options
Diffstat (limited to 'sb.c')
-rw-r--r-- | sb.c | 226 |
1 files changed, 133 insertions, 93 deletions
@@ -13,12 +13,27 @@ #include <webkit/webkit.h> #include <glib/gstdio.h> -typedef struct tab { GtkWidget *scroll; GtkWidget *label; gchar *main_title; gint load_progress; guint status_context_id; WebKitWebView *view; } tab; -static struct { WebKitWebSettings *webkitsettings; 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); - - +typedef struct tab { + GtkWidget *scroll; + GtkWidget *label; + gchar *main_title; + gchar *url_entry; + gint load_progress; + guint status_context_id; + WebKitWebView *view; + } tab; + +static struct { + WebKitWebSettings *webkitsettings; + gboolean hide; + 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); #define DEFAULT_DOWNLOAD "xterm -bg black -fg white -e wget -P " #define DEFAULT_SEARCH "http://www.google.com/search?q=" #define DEFAULT_FONT "san-serif" @@ -33,9 +48,10 @@ 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, tab *t); +//static void load_error(WebKitWebView *v, WebKitWebFrame *f, gchar *uri, gpointer web_error, user_data); static void load_uri(gchar *uri); static void go_cb(gboolean b); -static void tab_new(); +static void tab_new(gboolean b); static void tab_zoom(gboolean b); static void tab_close(); static void tab_and_go(); @@ -59,29 +75,40 @@ static void search(GtkEntry *entry, gboolean b) { 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); } } + + 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)); +if(w.hide) { gtk_widget_hide(w.bar); } +w.hide = FALSE; } + 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)) == 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)))); focus_view();} 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(DEFAULT_DOWNLOAD, g_get_home_dir(), "/ ", g_strdup(c), NULL); @@ -89,48 +116,48 @@ 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) { gchar *tabtitle; - if (gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)) == gtk_notebook_page_num(GTK_NOTEBOOK(w.notebook), t->scroll)) { gtk_window_set_title(GTK_WINDOW(w.win), title); } - if(strlen(title) < DEFAULT_TAB_LENGTH ) { tabtitle = g_strdup(title); } else { tabtitle = g_strndup(title, DEFAULT_TAB_LENGTH); strcat(tabtitle, "..."); } gtk_label_set_label(GTK_LABEL(t->label), tabtitle); - } + static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, tab *t) { const gchar* uri = webkit_web_frame_get_uri(frame); + if (gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)) == gtk_notebook_page_num(GTK_NOTEBOOK(w.notebook), t->scroll)) { gtk_entry_set_text (GTK_ENTRY (w.bar), uri); } - - FILE *history = fopen(g_strconcat(g_get_home_dir(), DEFAULT_HISTORY_FILE, NULL), "a+"); fprintf(history, "%s \n", uri); fclose(history); } + static void tab_and_go() { - + gchar *returned; g_spawn_command_line_sync("sh -c 'sort ~"DEFAULT_HISTORY_FILE" | dmenu -l 15 -xs -c'", &returned, NULL, NULL, NULL); -if(strcmp(returned, "") == 0) { focus_view(); } else { tab_new(); load_uri(returned); } - +if(strcmp(returned, "") == 0) { focus_view(); } else { tab_new(FALSE); load_uri(returned); } g_free(returned); - } + + static void load_uri(gchar *uri) { gchar *u; //Barrowed from surf, no point creating another method, this seems to work well @@ -140,60 +167,85 @@ u = g_strrstr(uri, "://") ? g_strdup(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)); } + 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 grab_bar( ) { + if(!gtk_widget_get_visible(w.bar)) { + gtk_widget_grab_focus(GTK_WIDGET(w.bar)); + gtk_widget_show(w.bar); + w.hide = TRUE; +} +} + + 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_widget_hide(w.search); -if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE);} -} + 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_widget_hide(w.search); + if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook)) == 1) { } else { 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; } + 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); } -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; + tab_new(TRUE); + 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))); + + struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook))); -if(webkit_web_view_get_view_source_mode(t->view)) { 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); + if(webkit_web_view_get_view_source_mode(t->view)) { + 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() { + + +static void tab_new(gboolean b) { tab *t; t = g_new0(tab, 1); @@ -213,10 +265,14 @@ if (index == 0) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), FALSE); } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w.notebook), TRUE); } +g_object_set(G_OBJECT(w.webkitsettings), "enable-page-cache", TRUE, NULL); +g_object_set(G_OBJECT(w.webkitsettings), "enable-java-applet", FALSE, NULL); +g_object_set(G_OBJECT(w.webkitsettings), "user-stylesheet-uri", "file:///home/calvin/.surf/style.css", NULL); //webkit_web_view_set_settings (WEBKIT_WEB_VIEW(t->view), w.webkitsettings); gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, ""); -gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(t->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); +gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(t->scroll), GTK_POLICY_NEVER, GTK_POLICY_NEVER); +webkit_web_view_set_zoom_level(t->view, .80); /*callbacks*/ g_signal_connect (G_OBJECT (t->view), "title-changed", G_CALLBACK (title_change_cb), t); @@ -230,10 +286,11 @@ g_object_set_qdata_full(G_OBJECT(gtk_notebook_get_nth_page((GtkNotebook*)w.noteb gtk_widget_show_all(w.win); gtk_widget_hide(w.search); -gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), index); +if (!b) { gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), index); } gtk_widget_grab_focus(w.bar); } + static void history_command() { gchar *returned; g_spawn_command_line_sync("sh -c 'sort ~" DEFAULT_HISTORY_FILE " | dmenu -l 15 -xs -c'", &returned, NULL, NULL, NULL); @@ -241,6 +298,7 @@ if(strcmp(returned, "") == 0) { focus_view(); } else { load_uri(returned); } g_free(returned); } + static void tab_focus(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) { gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, ""); @@ -259,6 +317,8 @@ static void focus_view() { struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook))); gtk_widget_grab_focus(GTK_WIDGET(t->view)); } + + static void window_setup() { term_data_id = g_quark_from_static_string("s"); @@ -281,34 +341,11 @@ 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_icon_name("gtk-network"); gtk_window_set_default_size(GTK_WINDOW(w.win), 800, 800); -/* -char property[256], setting[256]; -FILE *webkitrc; -webkitrc = fopen(g_strconcat(g_get_home_dir(), "/.webkitrc", NULL), "r"); w.webkitsettings = webkit_web_settings_new(); -while (!feof(webkitrc)) { - if (fscanf(webkitrc, "%s %s", property, setting) != 2) break; - - -if(strcmp(setting, "FALSE") == 0) { - g_object_set(G_OBJECT(w.webkitsettings), property, FALSE, NULL); - break; -} -if(strcmp(setting, "TRUE") == 0) { -g_object_set(G_OBJECT(w.webkitsettings), property, TRUE, NULL); -break; -} - -if(atoi(setting) == 0) - { g_object_set(G_OBJECT(w.webkitsettings), property, setting, NULL); break; } -else { g_object_set(G_OBJECT(w.webkitsettings), property, atoi(setting), NULL); break; } -} -*/ -tab_new(); +tab_new(FALSE); g_signal_connect (G_OBJECT (w.search), "activate", G_CALLBACK (search), GINT_TO_POINTER(1)); 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); @@ -322,29 +359,31 @@ 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 ) { -switch(g) { - case GDK_l: gtk_widget_grab_focus(GTK_WIDGET(w.bar)); return TRUE; break; - case GDK_f: show_search(TRUE); return TRUE; break; - case GDK_g: tab_and_go(); return TRUE; break; - case GDK_j: go_cb(FALSE); return TRUE; break; - case GDK_k: go_cb(TRUE); return TRUE; break; - case GDK_o: history_command(); return TRUE; break; - case GDK_h: toggle(); focus_view(); return TRUE; break; - case GDK_Page_Up: tab_switch(FALSE); return TRUE; break; - case GDK_Page_Down: tab_switch(TRUE); return TRUE; break; - case GDK_t: tab_new(); gtk_widget_grab_focus(w.bar); return TRUE; break; - case GDK_w: tab_close(); focus_view(); return TRUE; break; - case GDK_bracketright: tab_zoom(TRUE); return TRUE; break; - case GDK_bracketleft: tab_zoom(FALSE); return TRUE; break; - case GDK_r: reload(); return TRUE; break; - case GDK_s: tab_view_source(); return TRUE; break; - case GDK_Return: load_uri(g_strconcat(DEFAULT_SEARCH, gtk_entry_get_text(GTK_ENTRY(w.bar)), NULL)); return TRUE; break; - default: return FALSE; break; -} + switch(g) { + case GDK_l: grab_bar(); return TRUE; break; + case GDK_f: show_search(TRUE); return TRUE; break; + case GDK_g: tab_and_go(); return TRUE; break; + case GDK_a: go_cb(FALSE); return TRUE; break; + case GDK_b: go_cb(TRUE); return TRUE; break; + case GDK_o: history_command(); return TRUE; break; + case GDK_h: toggle(); focus_view(); return TRUE; break; + case GDK_Page_Up: tab_switch(FALSE); return TRUE; break; + case GDK_Page_Down: tab_switch(TRUE); return TRUE; break; + case GDK_t: tab_new(FALSE); gtk_widget_grab_focus(w.bar); return TRUE; break; + case GDK_w: tab_close(); return TRUE; break; + case GDK_bracketright: tab_zoom(TRUE); return TRUE; break; + case GDK_bracketleft: tab_zoom(FALSE); return TRUE; break; + case GDK_r: reload(); return TRUE; break; + case GDK_s: tab_view_source(); return TRUE; break; + case GDK_Return: load_uri(g_strconcat(DEFAULT_SEARCH, gtk_entry_get_text(GTK_ENTRY(w.bar)), NULL)); return TRUE; break; + default: return FALSE; break; + } + } if (gtk_widget_has_focus(w.bar) && g == GDK_Escape) { gtk_widget_grab_focus(GTK_WIDGET(w.notebook)); return TRUE; } @@ -355,6 +394,7 @@ if (gtk_widget_has_focus(w.search)) { return FALSE; } + int main (int argc, char* argv[]) { gtk_init (&argc, &argv); |