diff options
author | mutantturkey <crazycal00@gmail.com> | 2010-05-06 13:04:12 -0400 |
---|---|---|
committer | mutantturkey <crazycal00@gmail.com> | 2010-05-06 13:04:12 -0400 |
commit | 4cfa162eaa5ed89a3671d640e656e286ccd17f89 (patch) | |
tree | 727abc17b8368c7f884b50870691ca9e74656276 | |
parent | 949618f667f1a928697805894addf8608696aa14 (diff) |
major code rework, almost everything is got rewritten, seg faults =[
-rw-r--r-- | sb.c | 164 |
1 files changed, 83 insertions, 81 deletions
@@ -5,37 +5,35 @@ #include <gtk/gtk.h> #include <webkit/webkit.h> #include <gdk/gdkkeysyms.h> -typedef struct tab { - GtkWidget *scroll; - gchar *main_title; - gint load_progress; - guint status_context_id; - WebKitWebView *view; - WebKitWebSettings *settings; -} tab; - -typedef struct window { - GtkWidget *win; - GtkWidget *bar; - GtkWidget *search; - GtkWidget *vbox; - GtkWidget *notebook; - GtkWidget *status; -} window; - +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 void activate_uri_entry_cb(GtkWidget* entry, tab *t); +static void update_title(const gchar* title, gchar* linkhover); +static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data); +static void title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar* title, gpointer data); +static void progress_change_cb (WebKitWebView* page, gint progress, gpointer data); +static void load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data); +static void destroy_cb (GtkWidget* widget, gpointer data); +static void go_cb(gboolean b); +static void new_tab(); +static void config(); +gboolean key_press_cb(GtkWidget *widget, GdkEventKey *event); static void activate_uri_entry_cb (GtkWidget* entry, tab *t) { - 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)); + const gchar* uri = gtk_entry_get_text (GTK_ENTRY (w.bar)); + webkit_web_view_open (t->view, uri); + gtk_widget_grab_focus(GTK_WIDGET(t->view)); } -static void update_title (const gchar* title, gchar* linkhover, window *w) { +static void update_title (const gchar* title, gchar* linkhover) { if (linkhover) title = g_strdup(linkhover); - gtk_window_set_title(GTK_WINDOW(*w->win), title); + gtk_window_set_title(GTK_WINDOW(w.win), title); g_free(linkhover); } @@ -56,99 +54,103 @@ static void progress_change_cb (WebKitWebView* page, gint progress, gpointer dat 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); + gtk_entry_set_text (GTK_ENTRY (w.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 go_cb (gboolean b) { + gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(w.notebook)); + struct tab *t; + t = get_tab(NULL, page); + if (b) { webkit_web_view_go_forward(t->view); } + else { webkit_web_view_go_back(t->view); } } -tab *t new_tab () { +static void new_tab() { /*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_AUTOMATIC, GTK_POLICY_AUTOMATIC); - sb.view = WEBKIT_WEB_VIEW (webkit_web_view_new ()); - gtk_container_add(GTK_CONTAINER(sb.scroll), GTK_WIDGET(sb.view)); + + 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 (sb.view), "title-changed", G_CALLBACK (title_change_cb), t->view); - g_signal_connect (G_OBJECT (sb.view), "load-progress-changed", G_CALLBACK (progress_change_cb), t->view); - g_signal_connect (G_OBJECT (sb.view), "load-committed", G_CALLBACK (load_commit_cb), t->view); - g_signal_connect (G_OBJECT (sb.view), "hovering-over-link", G_CALLBACK (link_hover_cb), t->view); + g_signal_connect (G_OBJECT (t->view), "title-changed", G_CALLBACK (title_change_cb), t->view); + 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); /*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 t; + 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); } -window *w new_window(void) { - +static void config() { + term_data_id = g_quark_from_static_string("mt"); /*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); + w.vbox = gtk_vbox_new(FALSE, 0); /*entry bar*/ - w->bar = gtk_entry_new (); - gtk_entry_set_has_frame(GTK_ENTRY(w->bar), FALSE); + 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); + 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); + w.notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX(w.vbox), w.notebook, FALSE, FALSE, 0); /* status bar*/ - w->status = gtk_statusbar_new(); - gtk_box_pack_start(GTK_BOX(w->vbox), w->status, FALSE, FALSE, 0); + 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); + 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); + gtk_container_add (GTK_CONTAINER (w.win), w.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; - -}; + //gtk_widget_grab_focus (GTK_WIDGET (w.view)); + new_tab(); + gtk_widget_show_all (w.win); +} 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; } + if (gdk_keyval_to_lower(event->keyval) == GDK_f) { gtk_widget_grab_focus(GTK_WIDGET(w.bar)); return TRUE; } + if (gdk_keyval_to_lower(event->keyval) == GDK_l) { gtk_widget_grab_focus(GTK_WIDGET(w.bar)); return TRUE; } + if (gdk_keyval_to_lower(event->keyval) == GDK_j) { go_cb(FALSE); return TRUE; } + if (gdk_keyval_to_lower(event->keyval) == GDK_k) { go_cb(TRUE); return TRUE; } + //if (gdk_keyval_to_lower(event->keyval) == GDK_bracketright) { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->view) + .05)); return TRUE; } + //if (gdk_keyval_to_lower(event->keyval) == GDK_bracketleft) { webkit_web_view_set_zoom_level(t->view, (webkit_web_view_get_zoom_level(t->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; } + if (gtk_widget_has_focus(w.bar) && gdk_keyval_to_lower(event->keyval) == GDK_Escape) { gtk_widget_grab_focus(GTK_WIDGET(w.notebook)); return TRUE; } return FALSE; } @@ -156,8 +158,8 @@ if (event->state == GDK_CONTROL_MASK) { int main (int argc, char* argv[]) { gtk_init (&argc, &argv); - struct window *w; - w = new_window(); + + config(); //gchar* w->starting_uri = (gchar*) (argc > 1 ? argv[1] : "http://www.google.com/"); gtk_main(); |