aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormutantturkey <crazycal00@gmail.com>2010-05-09 10:26:45 -0400
committermutantturkey <crazycal00@gmail.com>2010-05-09 10:26:45 -0400
commit2a919c45462d7d9dbae3f858e2b9d189886046a6 (patch)
treef8629786082eebb74feb9ea24de54f2d368d652e
parent9768110a1d9b1b19ed5a6c866b0e9583640068e2 (diff)
tab_switch with Page UP/DOWN works now, will go to first on last, last on first, also does regular handling
-rw-r--r--sb.c106
1 files changed, 59 insertions, 47 deletions
diff --git a/sb.c b/sb.c
index 45dece3..8b40710 100644
--- a/sb.c
+++ b/sb.c
@@ -1,5 +1,5 @@
// Simple browser my attempt at an even less-sucking browser than surf.
-//original code is from alot of places, gtkforums.com, gtkwebkit.org provided
+//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>
@@ -16,7 +16,7 @@ static GQuark term_data_id = 0;
static char *defaultdownload = "xterm -e wget ";
static char *defaultsearchengine = "http://www.google.com/search?q=";
static void activate_uri_entry_cb(GtkWidget* entry, gpointer data);
-static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, 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 progress_change_cb (WebKitWebView* page, gint progress, gpointer data);
static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
@@ -30,6 +30,7 @@ static void download(WebKitWebView *web_view, GObject *download, gpointer user_d
static void config();
static void reload();
static void toggle();
+static void tab_switch(gboolean b);
gboolean key_press_cb(GtkWidget *widget, GdkEventKey *event);
static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) {
@@ -42,16 +43,16 @@ static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) {
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_strdup(c), NULL);
@@ -59,7 +60,7 @@ static void download(WebKitWebView *web_view, GObject *d, gpointer user_data) {
g_spawn_command_line_async(command, NULL);
g_free(command);
}
-static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {
+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, ""); }
@@ -90,8 +91,6 @@ static void load_uri(gchar *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)); }
@@ -110,42 +109,60 @@ 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);
+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));
+gint(total) = gtk_notebook_get_n_pages(GTK_NOTEBOOK(w.notebook));
+
+if(b) {
+ if (current == total -1 ) { current = 0; }
+ else { current = current + 1;}
+} else{
+ if (current == 0) { current = total -1; }
+ else {current = current -1; }
+}
+
+gtk_notebook_set_current_page(GTK_NOTEBOOK(w.notebook), current);
+
}
+
+
static void tab_new() {
/*seperate function so it will be easier to setup the webkit crap*/
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_NEVER, GTK_POLICY_NEVER);
//gtk_widget_set_style(
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-progress-changed", G_CALLBACK (progress_change_cb), t->view);
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_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);
/*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);
@@ -155,42 +172,38 @@ static void tab_new() {
gtk_widget_grab_focus(w.bar);
}
-
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");
- /*sb is orginized with a vbox. much the simplest way to orginize things*/
-
+
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);
- /* status bar*/
w.status = gtk_statusbar_new();
gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(w.status), FALSE);
-
+
gtk_box_pack_start(GTK_BOX (w.vbox), w.bar, FALSE, FALSE, 0);
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);
@@ -198,25 +211,25 @@ static void config() {
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);
+ 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_show_all (w.win);
gtk_widget_grab_focus(w.bar);
}
-gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event) {
+gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event) {
guint(g) = event->keyval;
-
+
if (event->state == 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_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) { gtk_notebook_prev_page(GTK_NOTEBOOK(w.notebook)); }
- if (g == GDK_Page_Down) { gtk_notebook_next_page(GTK_NOTEBOOK(w.notebook)); }
+ 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; }
@@ -224,23 +237,22 @@ if (event->state == GDK_CONTROL_MASK) {
if (g == GDK_r) { reload(); return TRUE; }
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;