]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Brought documentation up-to-date.
[videolink.git] / webdvd.cpp
index cf71bb61843abc64a455ed3db46fd045a036ad16..5eca6c87eafe5a43d865241cff4e83df9b6df3e8 100644 (file)
 #include <nsIInterfaceRequestorUtils.h>
 #include <nsIURI.h> // required before nsILink.h
 #include <nsILink.h>
+#include <nsIPrefBranch.h>
+#include <nsIPrefService.h>
 #include <nsIPresContext.h>
 #include <nsIPresShell.h>
+#include <nsIServiceManagerUtils.h>
 #include <nsIWebBrowser.h>
 #include <nsString.h>
 
@@ -244,6 +247,45 @@ namespace
     void WebDvdWindow::on_net_state_change(const char * uri,
                                           gint flags, guint status)
     {
+#       ifdef DEBUG_ON_NET_STATE_CHANGE
+       std::cout << "WebDvdWindow::on_net_state_change(";
+       if (uri)
+           std::cout << '"' << uri << '"';
+       else
+           std::cout << "NULL";
+       std::cout << ", ";
+       {
+           gint flags_left = flags;
+           static const struct {
+               gint value;
+               const char * name;
+           } flag_names[] = {
+               { GTK_MOZ_EMBED_FLAG_START, "STATE_START" },
+               { GTK_MOZ_EMBED_FLAG_REDIRECTING, "STATE_REDIRECTING" },
+               { GTK_MOZ_EMBED_FLAG_TRANSFERRING, "STATE_TRANSFERRING" },
+               { GTK_MOZ_EMBED_FLAG_NEGOTIATING, "STATE_NEGOTIATING" },
+               { GTK_MOZ_EMBED_FLAG_STOP, "STATE_STOP" },
+               { GTK_MOZ_EMBED_FLAG_IS_REQUEST, "STATE_IS_REQUEST" },
+               { GTK_MOZ_EMBED_FLAG_IS_DOCUMENT, "STATE_IS_DOCUMENT" },
+               { GTK_MOZ_EMBED_FLAG_IS_NETWORK, "STATE_IS_NETWORK" },
+               { GTK_MOZ_EMBED_FLAG_IS_WINDOW, "STATE_IS_WINDOW" }
+           };
+           for (int i = 0; i != sizeof(flag_names)/sizeof(flag_names[0]); ++i)
+           {
+               if (flags & flag_names[i].value)
+               {
+                   std::cout << flag_names[i].name;
+                   flags_left -= flag_names[i].value;
+                   if (flags_left)
+                       std::cout << " | ";
+               }
+           }
+           if (flags_left)
+               std::cout << "0x" << std::setbase(16) << flags_left;
+       }
+       std::cout << ", " << "0x" << std::setbase(16) << status << ")\n";
+#       endif // DEBUG_ON_NET_STATE_CHANGE
+
        if (flags & GTK_MOZ_EMBED_FLAG_IS_REQUEST)
        {
            if (flags & GTK_MOZ_EMBED_FLAG_START)
@@ -936,6 +978,30 @@ namespace
                   " [--preview] menu-url [output-dir]\n");
     }
     
+    void set_browser_preferences()
+    {
+       // Disable IE-compatibility kluge that causes backgrounds to
+       // sometimes/usually be missing from snapshots.  This is only
+       // effective from Mozilla 1.8 onward.
+#      if MOZ_VERSION_MAJOR > 1                                 \
+           || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8)
+       nsCOMPtr<nsIPrefService> pref_service;
+       static const nsCID pref_service_cid = NS_PREFSERVICE_CID;
+       check(CallGetService<nsIPrefService>(pref_service_cid,
+                                            getter_AddRefs(pref_service)));
+       nsCOMPtr<nsIPrefBranch> pref_branch;
+       check(pref_service->GetDefaultBranch("layout",
+                                            getter_AddRefs(pref_branch)));
+       check(pref_branch->SetBoolPref(
+                 "fire_onload_after_image_background_loads",
+                 true));
+#      endif
+
+       // TODO: Set display resolution?  Unfortunately Mozilla doesn't
+       // support non-square pixels (and neither do fontconfig or Xft
+       // anyway).
+    }
+
 } // namespace
 
 int main(int argc, char ** argv)
@@ -1052,7 +1118,8 @@ int main(int argc, char ** argv)
            output_dir = argv[argi + 1];
 
        // Initialise Mozilla
-       BrowserWidget::init();
+       BrowserWidget::Initialiser browser_init;
+       set_browser_preferences();
 
        // Run the browser/converter
        WebDvdWindow window(frame_params, menu_url, output_dir);