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.

Reply via email to