]> git.decadent.org.uk Git - videolink.git/blobdiff - browser_widget.cpp
Release versions 1.2.11 and 1.2.11-1
[videolink.git] / browser_widget.cpp
index 7d640e5cfd358cfa6836a5b1335ec8a3c8e4e5b9..cff4a7dab2b52f8fb9362d0f74bc701036497686 100644 (file)
@@ -1,11 +1,24 @@
-// 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 "videolink.hpp"
+#include "wchar_t_short.h"
 #include <gtkmozembed_internal.h>
+#if MOZ_VERSION_GE(1,9,0)
+#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()))
@@ -119,15 +132,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 +158,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 +184,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 +210,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 +237,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 +264,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 +290,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 +316,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 +343,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 +380,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 +407,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 +434,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 +531,40 @@ Glib::ObjectBase * browser_widget::wrap_new(GObject * gobject)
 
 browser_widget::initialiser::initialiser()
 {
+#if MOZ_VERSION_GE(1,9,0)
+    static const GREVersionRange gre_versions = {
+#if MOZ_VERSION_EQ(1,9,0)
+       "1.9a", PR_TRUE,
+       "1.9.1", PR_FALSE
+#elif MOZ_VERSION_EQ(1,9,1)
+       "1.9.1", PR_TRUE,
+       "1.9.2", PR_FALSE
+#elif MOZ_VERSION_EQ(2,0,-1) || MOZ_VERSION_EQ(2,0,0)
+       "2.0b", PR_TRUE,
+       "2.0.1", PR_FALSE
+#elif MOZ_VERSION_EQ(2,0,1)
+       "2.0.1", PR_TRUE,
+       "2.0.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);
@@ -527,6 +573,10 @@ browser_widget::initialiser::initialiser()
 browser_widget::initialiser::~initialiser()
 {
     gtk_moz_embed_pop_startup();
+
+#if MOZ_VERSION_GE(1,9,0)
+    XPCOMGlueShutdown();
+#endif
 }
 
 namespace Glib