Just thought of sharing a variation of gtkEmbed:
===========================================================
#include <gtk/gtk.h>
#include "nsIURI.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsEmbedAPI.h"
#include "nsIBaseWindow.h"
#include "nsCWebBrowser.h"
#include "nsIWebNavigation.h"
#include "nsIServiceManager.h"
#include "nsIWebBrowserChrome.h"
#include "nsIEventQueueService.h"
#include "nsIURIContentListener.h"
#if 0
CC -DHAVE_CPP_MODERN_SPECIALIZE_TEMPLATE_SYNTAX -
DHAVE_CPP_ACCESS_CHANGING_USING -D_TIME_H \
-o embed -I/usr/local/include -I/usr/local/lib/glib/include -
I$MOZ_DIST/include -mt \
embed.cxx $MOZ_DIST/lib/libembed_base_s.a
$MOZ_DIST/lib/libxpfelocation_s.a \
-lxpcom -lnspr4 -lgtk -lgdk -lglib
#endif
/*######################################################################
*/
struct UCL : public nsIURIContentListener
{
GtkWidget* entry;
NS_DECL_ISUPPORTS
NS_DECL_NSIURICONTENTLISTENER
UCL(GtkWidget* e) { NS_INIT_ISUPPORTS(); entry = e; } virtual ~UCL()
{}
};
#define IMP(func) NS_IMETHODIMP func { return
NS_ERROR_NOT_IMPLEMENTED; }
NS_IMPL_ISUPPORTS1(UCL, nsIURIContentListener)
IMP(UCL::SetLoadCookie(nsISupports*))
IMP(UCL::GetLoadCookie(nsISupports**))
IMP(UCL::SetParentContentListener(nsIURIContentListener*))
IMP(UCL::GetParentContentListener(nsIURIContentListener**))
IMP(UCL::GetProtocolHandler(nsIURI*, nsIProtocolHandler**))
IMP(UCL::IsPreferred(const char *, nsURILoadCommand, const char *, char
**, PRBool*))
IMP(UCL::CanHandleContent(const char *, nsURILoadCommand, const char *,
char **, PRBool*))
IMP(UCL::DoContent(const char *, nsURILoadCommand, const char *,
nsIChannel*, nsIStreamListener**, PRBool*))
NS_IMETHODIMP UCL::OnStartURIOpen(nsIURI* aURI, const char *target,
PRBool* abort)
{
NS_ENSURE_ARG_POINTER(abort);
NS_ENSURE_ARG_POINTER(aURI);
char *url = nsnull;
nsresult rv = aURI->GetSpec(&url);
if (NS_FAILED(rv)) return rv;
gtk_entry_set_text(GTK_ENTRY(entry), url);
*abort = FALSE;
return NS_OK;
}
/*######################################################################
*/
static gint delete_cb(GtkWidget* widget, GdkEvent* event,
nsIWebBrowser* browser)
{
printf("Releasing browser ...");
NS_RELEASE(browser); gtk_main_quit();
printf("done.\n");
return FALSE;
}
static void resize_cb(GtkWidget* widget, GtkAllocation* size,
nsIWebBrowser* browser)
{
nsCOMPtr<nsIBaseWindow> win = do_QueryInterface(browser);
win->SetPositionAndSize(0, 0, size->width, size->height, PR_TRUE);
printf("resize_cb %d,%d ...\n", size->width, size->height);
}
static void memory_cb(GtkButton *button, nsIWebBrowser* browser)
{
g_print("dumping memory usage:\n");
system("ps -o fname,vsz | grep embed");
}
inline int go_to(nsIWebBrowser* browser, const PRUnichar *uri)
{
nsCOMPtr<nsIWebNavigation> nav(do_QueryInterface(browser)); if (!nav)
return 1;
return !nav || NS_FAILED(nav->LoadURI(uri,
nsIWebNavigation::LOAD_FLAGS_NONE));
}
inline int go_to(nsIWebBrowser* browser, const char *uri)
{
g_print("Loading URI: %s ...\n", uri);
return go_to(browser, NS_ConvertASCIItoUCS2(uri).GetUnicode());
}
static void url_cb(GtkEditable* widget, nsIWebBrowser* browser)
{
gchar *uri = gtk_editable_get_chars(widget, 0, -1);
go_to(browser, uri); g_free(uri);
}
static void event_cb(nsIEventQueue* eventQ, gint source,
GdkInputCondition condition)
{
eventQ->ProcessPendingEvents();
}
/*######################################################################
*/
inline GtkWidget* create(nsIWebBrowser* browser, GtkWidget*& entry)
{
GtkWidget* top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget* mem = gtk_button_new_with_label("Dump Memory Usage");
GtkWidget* box = gtk_vbox_new(FALSE, 0);
GtkWidget* win = gtk_event_box_new();
GtkWidget* url = gtk_entry_new();
if (!top || !url || !box || !win || !mem) return nsnull;
entry = url;
gtk_container_add(GTK_CONTAINER(top), box);
gtk_box_pack_start(GTK_BOX(box), url, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), win, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), mem, FALSE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(url), "activate", GTK_SIGNAL_FUNC
(url_cb), browser);
gtk_signal_connect(GTK_OBJECT(mem), "clicked", GTK_SIGNAL_FUNC
(memory_cb), browser);
gtk_signal_connect(GTK_OBJECT(top), "delete_event", GTK_SIGNAL_FUNC
(delete_cb), browser);
gtk_signal_connect(GTK_OBJECT(win), "size_allocate", GTK_SIGNAL_FUNC
(resize_cb), browser);
gtk_widget_set_usize(win, 430, 430);
gtk_window_set_title(GTK_WINDOW(top), "Embedding is Fun!");
gtk_window_set_default_size(GTK_WINDOW(top), 450, 450);
gtk_container_set_border_width(GTK_CONTAINER(top), 10);
gtk_widget_show_all(top); return win;
}
inline int show(const char *uri)
{
nsCOMPtr<nsIWebBrowser> browser = do_CreateInstance
(NS_WEBBROWSER_CONTRACTID);
if (!browser) return 1;
NS_ADDREF(browser);
GtkWidget *entry, *win = create(browser, entry);
if (!win) return 1;
browser->SetParentURIContentListener(new UCL(entry));
nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(browser);
baseWindow->InitWindow(win, nsnull, 0, 0, 450, 450);
baseWindow->Create();
baseWindow->SetPositionAndSize(0, 0, 430, 430, PR_TRUE);
baseWindow->SetVisibility(PR_TRUE);
return go_to(browser, uri);
}
/*######################################################################
*/
struct Embed {
Embed() { NS_InitEmbedding(nsnull, nsnull); }
~Embed() { NS_TermEmbedding(); }
};
int main(int argc, char *argv[])
{
Embed embed;
nsID eqsID = NS_EVENTQUEUESERVICE_CID;
nsCOMPtr<nsIEventQueueService> QService = do_GetService(eqsID);
if (!QService) return -1;
nsCOMPtr<nsIEventQueue> eventQ;
QService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs
(eventQ));
if (!eventQ) return -1;
gint io = gdk_input_add(eventQ->GetEventQueueSelectFD(),
GDK_INPUT_READ, (GdkInputFunction) event_cb,
eventQ);
gtk_init(&argc, &argv);
if (show(argc > 1 ? argv[1] : "http://www.mozilla.org")) return -1;
gtk_main();
printf("Cleaning up embedding\n");
gtk_input_remove(io);
return 0;
}
Sent via Deja.com http://www.deja.com/
Before you buy.