From 351549fe7176757f5bc376aa4dab6f09b7c5c22f Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 11 Oct 2008 17:40:49 +0000 Subject: [PATCH] Preparing support for different HTML viewers --- src/callbacks.c | 88 ++------------------------ src/ghtml-gtkmozembed.c | 135 +++++++++++++++++++++++++++++++++++----- src/ghtml.h | 6 +- 3 files changed, 132 insertions(+), 97 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 97ca270..f5378cc 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -403,9 +403,9 @@ void on_view_location(GtkMozEmbed * view, gpointer data) i++; gtk_combo_box_append_text(GTK_COMBO_BOX(surfer->tb_path), url); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), - gtk_moz_embed_can_go_back(view)); + ghtml_can_go_back(GTK_WIDGET(view))); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), - gtk_moz_embed_can_go_forward(view)); + ghtml_can_go_forward(GTK_WIDGET(view))); } @@ -414,9 +414,9 @@ void on_view_net_start(GtkMozEmbed * view, gpointer data) Surfer * surfer = data; gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), - gtk_moz_embed_can_go_back(view)); + ghtml_can_go_back(GTK_WIDGET(view))); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), - gtk_moz_embed_can_go_forward(view)); + ghtml_can_go_forward(GTK_WIDGET(view))); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_refresh), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), TRUE); } @@ -427,9 +427,9 @@ void on_view_net_stop(GtkMozEmbed * view, gpointer data) Surfer * surfer = data; gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_back), - gtk_moz_embed_can_go_back(view)); + ghtml_can_go_back(GTK_WIDGET(view))); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_forward), - gtk_moz_embed_can_go_forward(view)); + ghtml_can_go_forward(GTK_WIDGET(view))); gtk_widget_set_sensitive(GTK_WIDGET(surfer->tb_stop), FALSE); if(surfer->statusbar_id) gtk_statusbar_remove(GTK_STATUSBAR(surfer->statusbar), @@ -443,82 +443,6 @@ void on_view_net_stop(GtkMozEmbed * view, gpointer data) } -/* on_view_new_window */ -static void _on_popup_destroy_browser(GtkMozEmbed * view, gpointer data); -static void _on_popup_resize(GtkMozEmbed * view, gint width, gint height, - gpointer data); -static void _on_popup_title(GtkMozEmbed * view, gpointer data); -void on_view_new_window(GtkMozEmbed * view, GtkMozEmbed ** ret, guint mask, - gpointer data) -{ - Surfer * surfer = data; - GtkWidget * window; - GtkWidget * vbox; - GtkWidget * newview; - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); - gtk_window_set_title(GTK_WINDOW(window), SURFER_DEFAULT_TITLE); - if((mask & GTK_MOZ_EMBED_FLAG_WINDOWRESIZEON) - != GTK_MOZ_EMBED_FLAG_WINDOWRESIZEON) - gtk_window_set_resizable(GTK_WINDOW(window), FALSE); - if((mask & GTK_MOZ_EMBED_FLAG_MODAL) - == GTK_MOZ_EMBED_FLAG_MODAL) - gtk_window_set_transient_for(GTK_WINDOW(window), - GTK_WINDOW(surfer->window)); - vbox = gtk_vbox_new(FALSE, 0); - if((mask & GTK_MOZ_EMBED_FLAG_MENUBARON) - == GTK_MOZ_EMBED_FLAG_MENUBARON) - { - /* FIXME implement */ - } - newview = gtk_moz_embed_new(); - g_signal_connect(G_OBJECT(newview), "destroy_browser", G_CALLBACK( - _on_popup_destroy_browser), window); - g_signal_connect(G_OBJECT(surfer->view), "size_to", G_CALLBACK( - _on_popup_resize), window); - g_signal_connect(G_OBJECT(newview), "title", G_CALLBACK( - _on_popup_title), window); - /* FIXME other settings and callbacks */ - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(newview), TRUE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(window), vbox); - gtk_widget_show_all(window); - *ret = GTK_MOZ_EMBED(newview); -} - -static void _on_popup_destroy_browser(GtkMozEmbed * view, gpointer data) -{ - GtkWidget * window = data; - - gtk_widget_destroy(window); -} - -static void _on_popup_resize(GtkMozEmbed * view, gint width, gint height, - gpointer data) -{ - GtkWindow * window = data; - - gtk_window_resize(window, width, height); -} - -static void _on_popup_title(GtkMozEmbed * view, gpointer data) -{ - GtkWindow * window = data; - char const * title; - char buf[256]; - - title = ghtml_get_title(GTK_WIDGET(view)); - if(title == NULL || title[0] == '\0') - gtk_window_set_title(window, SURFER_DEFAULT_TITLE); - else - { - snprintf(buf, sizeof(buf), "%s - %s", SURFER_DEFAULT_TITLE, - title); - gtk_window_set_title(window, buf); - } -} - - void on_view_progress(GtkMozEmbed * view, gint cur, gint max, gpointer data) { Surfer * surfer = data; diff --git a/src/ghtml-gtkmozembed.c b/src/ghtml-gtkmozembed.c index 4098515..b772224 100644 --- a/src/ghtml-gtkmozembed.c +++ b/src/ghtml-gtkmozembed.c @@ -19,14 +19,104 @@ #include #include #include "callbacks.h" -#include "surfer.h" #include "ghtml.h" +/* prototypes */ +/* private */ +/* callbacks */ +static void _on_new_window(GtkMozEmbed * view, GtkMozEmbed ** ret, guint mask, + gpointer data); +static void _on_popup_destroy_browser(GtkMozEmbed * view, gpointer data); +static void _on_popup_resize(GtkMozEmbed * view, gint width, gint height, + gpointer data); +static void _on_popup_title(GtkMozEmbed * view, gpointer data); + + +/* functions */ +/* private */ +/* callbacks */ +static void _on_new_window(GtkMozEmbed * view, GtkMozEmbed ** ret, guint mask, + gpointer data) +{ + Surfer * surfer = data; + GtkWidget * window; + GtkWidget * vbox; + GtkWidget * newview; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); + gtk_window_set_title(GTK_WINDOW(window), SURFER_DEFAULT_TITLE); + if((mask & GTK_MOZ_EMBED_FLAG_WINDOWRESIZEON) + != GTK_MOZ_EMBED_FLAG_WINDOWRESIZEON) + gtk_window_set_resizable(GTK_WINDOW(window), FALSE); + if((mask & GTK_MOZ_EMBED_FLAG_MODAL) + == GTK_MOZ_EMBED_FLAG_MODAL) + gtk_window_set_transient_for(GTK_WINDOW(window), + GTK_WINDOW(surfer->window)); + vbox = gtk_vbox_new(FALSE, 0); + if((mask & GTK_MOZ_EMBED_FLAG_MENUBARON) + == GTK_MOZ_EMBED_FLAG_MENUBARON) + { + /* FIXME implement */ + } + newview = gtk_moz_embed_new(); + /* XXX handle more callbacks? */ + g_signal_connect(G_OBJECT(newview), "destroy_browser", G_CALLBACK( + _on_popup_destroy_browser), window); + g_signal_connect(G_OBJECT(newview), "size_to", G_CALLBACK( + _on_popup_resize), window); + g_signal_connect(G_OBJECT(newview), "title", G_CALLBACK( + _on_popup_title), window); + /* FIXME other settings and callbacks */ + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(newview), TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(window), vbox); + gtk_widget_show_all(window); + *ret = GTK_MOZ_EMBED(newview); +} + + +static void _on_popup_destroy_browser(GtkMozEmbed * view, gpointer data) +{ + GtkWidget * window = data; + + gtk_widget_destroy(window); +} + + +static void _on_popup_resize(GtkMozEmbed * view, gint width, gint height, + gpointer data) +{ + GtkWindow * window = data; + + /* FIXME probably should resize the widget itself instead */ + gtk_window_resize(window, width, height); +} + + +static void _on_popup_title(GtkMozEmbed * view, gpointer data) +{ + GtkWindow * window = data; + char const * title; + char buf[256]; + + title = ghtml_get_title(GTK_WIDGET(view)); + if(title == NULL || title[0] == '\0') + gtk_window_set_title(window, SURFER_DEFAULT_TITLE); + else + { + snprintf(buf, sizeof(buf), "%s - %s", SURFER_DEFAULT_TITLE, + title); + gtk_window_set_title(window, buf); + } +} + + +/* public */ /* ghtml_new */ static char const * _new_get_prefs_directory(void); -GtkWidget * ghtml_new(void * data) +GtkWidget * ghtml_new(Surfer * surfer) { static int init = 0; GtkWidget * ghtml; @@ -42,41 +132,58 @@ GtkWidget * ghtml_new(void * data) ghtml = gtk_moz_embed_new(); /* FIXME handle callbacks in a common way */ g_signal_connect(G_OBJECT(ghtml), "link_message", G_CALLBACK( - on_view_link_message), data); + on_view_link_message), surfer); g_signal_connect(G_OBJECT(ghtml), "location", G_CALLBACK( - on_view_location), data); + on_view_location), surfer); g_signal_connect(G_OBJECT(ghtml), "net_start", G_CALLBACK( - on_view_net_start), data); + on_view_net_start), surfer); g_signal_connect(G_OBJECT(ghtml), "net_stop", G_CALLBACK( - on_view_net_stop), data); + on_view_net_stop), surfer); g_signal_connect(G_OBJECT(ghtml), "new_window", G_CALLBACK( - on_view_new_window), data); + _on_new_window), surfer); g_signal_connect(G_OBJECT(ghtml), "progress", G_CALLBACK( - on_view_progress), data); + on_view_progress), surfer); g_signal_connect(G_OBJECT(ghtml), "size_to", G_CALLBACK(on_view_resize), - data); + surfer); g_signal_connect(G_OBJECT(ghtml), "title", G_CALLBACK(on_view_title), - data); + surfer); return ghtml; } static char const * _new_get_prefs_directory(void) { - static char buf[256] = ""; - static int buf_size = sizeof(buf); - char * home; + static char * home = NULL; + static char buf[256]; + const int buf_size = sizeof(buf); - if(buf[0] != '\0') + if(home != NULL) return buf; if((home = getenv("HOME")) == NULL) return NULL; if(snprintf(buf, sizeof(buf), "%s/%s", home, ".surfer") >= buf_size) + { + home = NULL; /* XXX will then work once it fits... */ return NULL; + } return buf; } /* accessors */ +/* ghtml_can_go_back */ +gboolean ghtml_can_go_back(GtkWidget * ghtml) +{ + return gtk_moz_embed_can_go_back(GTK_MOZ_EMBED(ghtml)); +} + + +/* ghtml_can_go_forward */ +gboolean ghtml_can_go_forward(GtkWidget * ghtml) +{ + return gtk_moz_embed_can_go_forward(GTK_MOZ_EMBED(ghtml)); +} + + /* ghtml_get_link_message */ char const * ghtml_get_link_message(GtkWidget * ghtml) { diff --git a/src/ghtml.h b/src/ghtml.h index 1f19542..824ee0a 100644 --- a/src/ghtml.h +++ b/src/ghtml.h @@ -19,6 +19,7 @@ # define SURFER_GHTML_H # include +# include "surfer.h" /* GHTML */ @@ -26,10 +27,13 @@ #if 0 /* FIXME pass the callback data another way */ GtkWidget * ghtml_new(void); #else -GtkWidget * ghtml_new(void * data); +GtkWidget * ghtml_new(Surfer * surfer); #endif /* accessors */ +gboolean ghtml_can_go_back(GtkWidget * ghtml); +gboolean ghtml_can_go_forward(GtkWidget * ghtml); + char const * ghtml_get_link_message(GtkWidget * ghtml); char const * ghtml_get_location(GtkWidget * ghtml); char const * ghtml_get_title(GtkWidget * ghtml);