-// Copyright 2005 Ben Hutchings <ben@decadentplace.org.uk>.
+// Copyright 2005-8 Ben Hutchings <ben@decadent.org.uk>.
// See the file "COPYING" for licence details.
#include "browser_widget.hpp"
#include <cassert>
+#include <cstring>
+#include <limits.h>
+
+#include "wchar_t_short.h"
#include <gtkmozembed_internal.h>
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+#include <gtkmozembed_glue.cpp>
+#endif
+#include "wchar_t_default.h"
+
+#include "xpcom_support.hpp"
+
+using xpcom_support::check;
browser_widget::browser_widget()
: Gtk::Bin(GTK_BIN(gtk_moz_embed_new()))
{
void browser_widget_signal_link_message_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_js_status_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_location_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_title_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_progress_callback(
GtkMozEmbed * self, gint p0, gint p1, void * data)
{
- typedef SigC::Slot2<void, gint, gint> SlotType;
+ typedef sigc::slot<void, gint, gint> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(p0, p1, slot);
+ (*static_cast<SlotType*>(slot))(p0, p1);
}
catch(...)
{
void browser_widget_signal_net_state_callback(
GtkMozEmbed * self, const char * p0, gint p1, guint p2, void * data)
{
- typedef SigC::Slot3<void, const char *, gint, guint> SlotType;
+ typedef sigc::slot<void, const char *, gint, guint> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(p0, p1, p2, slot);
+ (*static_cast<SlotType*>(slot))(p0, p1, p2);
}
catch(...)
{
void browser_widget_signal_net_start_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_net_stop_callback(GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
void browser_widget_signal_new_window_callback(
GtkMozEmbed * self, GtkMozEmbed ** p0, guint p1, void * data)
{
- typedef SigC::Slot1<browser_widget *, guint> SlotType;
+ typedef sigc::slot<browser_widget *, guint> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
{
if (browser_widget * result =
- (*(SlotType::Proxy)(slot->proxy_))(p1, slot))
+ (*static_cast<SlotType*>(slot))(p1))
{
*p0 = result->gobj();
return;
void browser_widget_signal_visibility_callback(
GtkMozEmbed * self, gboolean p0, void * data)
{
- typedef SigC::Slot1<void, bool> SlotType;
+ typedef sigc::slot<void, bool> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(p0, slot);
+ (*static_cast<SlotType*>(slot))(p0);
}
catch(...)
{
void browser_widget_signal_destroy_browser_callback(
GtkMozEmbed * self, void * data)
{
- typedef SigC::Slot0<void> SlotType;
+ typedef sigc::slot<void> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- (*(SlotType::Proxy)(slot->proxy_))(slot);
+ (*static_cast<SlotType*>(slot))();
}
catch(...)
{
gint browser_widget_signal_open_uri_callback(
GtkMozEmbed * self, const char * p0, void * data)
{
- typedef SigC::Slot1<bool, const char *> SlotType;
+ typedef sigc::slot<bool, const char *> SlotType;
if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
{
try
{
- if (SigC::SlotNode * const slot =
+ if (sigc::slot_base * const slot =
Glib::SignalProxyNormal::data_to_slot(data))
- return (*(SlotType::Proxy)(slot->proxy_))(p0, slot);
+ return (*static_cast<SlotType*>(slot))(p0);
}
catch(...)
{
browser_widget::initialiser::initialiser()
{
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+ static const GREVersionRange gre_versions = {
+#if MOZ_VERSION_MICRO == 0
+ "1.9a", PR_TRUE,
+ "1.9.1", PR_FALSE
+#elif MOZ_VERSION_MICRO == 1
+ "1.9.1", PR_TRUE,
+ "1.9.2", PR_FALSE
+#else
+#error "version is unsupported, but you could try continuing the pattern above"
+#endif
+ };
+ char path[PATH_MAX];
+ check(GRE_GetGREPathWithProperties(&gre_versions, 1, 0, 0,
+ path, sizeof(path)));
+
+ check(XPCOMGlueStartup(path));
+ check(GTKEmbedGlueStartup());
+ check(GTKEmbedGlueStartupInternal());
+
+ char * last_slash = std::strrchr(path, '/');
+ if (last_slash != path)
+ *last_slash = '\0';
+ gtk_moz_embed_set_path(path);
+#else
gtk_moz_embed_set_comp_path(MOZ_LIB_DIR);
+#endif
+
gtk_moz_embed_push_startup();
wrap_register(gtk_moz_embed_get_type(), wrap_new);
browser_widget::initialiser::~initialiser()
{
gtk_moz_embed_pop_startup();
+
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+ XPCOMGlueShutdown();
+#endif
}
namespace Glib