]> git.decadent.org.uk Git - videolink.git/blobdiff - browser_widget.cpp
Updated copyright year.
[videolink.git] / browser_widget.cpp
index 7d640e5cfd358cfa6836a5b1335ec8a3c8e4e5b9..3b7a2d442709ccd34fa37048c0cc33ae4f18e4c5 100644 (file)
@@ -1,11 +1,21 @@
-// Copyright 2005 Ben Hutchings <ben@decadent.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 <gtkmozembed_internal.h>
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+#include <gtkmozembed_glue.cpp>
+#endif
+
+#include "xpcom_support.hpp"
+
+using xpcom_support::check;
 
 browser_widget::browser_widget()
        : Gtk::Bin(GTK_BIN(gtk_moz_embed_new()))
@@ -119,15 +129,15 @@ namespace
 {
     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(...)
            {
@@ -145,15 +155,15 @@ namespace
 
     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(...)
            {
@@ -171,15 +181,15 @@ namespace
 
     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(...)
            {
@@ -197,15 +207,15 @@ namespace
 
     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(...)
            {
@@ -224,15 +234,15 @@ namespace
     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(...)
            {
@@ -251,15 +261,15 @@ namespace
     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(...)
            {
@@ -277,15 +287,15 @@ namespace
 
     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(...)
            {
@@ -303,15 +313,15 @@ namespace
 
     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(...)
            {
@@ -330,17 +340,17 @@ namespace
     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;
@@ -367,15 +377,15 @@ namespace
     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(...)
            {
@@ -394,15 +404,15 @@ namespace
     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(...)
            {
@@ -421,15 +431,15 @@ namespace
     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(...)
            {
@@ -518,7 +528,27 @@ Glib::ObjectBase * browser_widget::wrap_new(GObject * gobject)
 
 browser_widget::initialiser::initialiser()
 {
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+    static const GREVersionRange gre_versions = {
+       "1.9a", PR_TRUE,
+       "1.9.*", PR_TRUE
+    };
+    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);
@@ -527,6 +557,10 @@ browser_widget::initialiser::initialiser()
 browser_widget::initialiser::~initialiser()
 {
     gtk_moz_embed_pop_startup();
+
+#if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
+    XPCOMGlueShutdown();
+#endif
 }
 
 namespace Glib