]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Renamed various types to fit lower_case_with_underscores convention.
[videolink.git] / webdvd.cpp
index cf71bb61843abc64a455ed3db46fd045a036ad16..9a5dd04e8b078af7c6de36d07c2e36e3076a73e1 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>
 
-#include "browserwidget.hpp"
-#include "childiterator.hpp"
+#include "browser_widget.hpp"
+#include "child_iterator.hpp"
 #include "dvd.hpp"
-#include "framebuffer.hpp"
-#include "linkiterator.hpp"
+#include "link_iterator.hpp"
 #include "pixbufs.hpp"
-#include "stylesheets.hpp"
+#include "style_sheets.hpp"
 #include "temp_file.hpp"
 #include "video.hpp"
+#include "x_frame_buffer.hpp"
 #include "xpcom_support.hpp"
 
 using xpcom_support::check;
@@ -123,7 +126,7 @@ namespace
        result.bottom = result.top + height;
 
        // Merge bounding boxes of all child elements
-       for (ChildIterator it = ChildIterator(elem), end; it != end; ++it)
+       for (child_iterator it = child_iterator(elem), end; it != end; ++it)
        {
            nsCOMPtr<nsIDOMNode> child_node(*it);
            PRUint16 child_type;
@@ -139,10 +142,10 @@ namespace
        return result;
     }
 
-    class WebDvdWindow : public Gtk::Window
+    class webdvd_window : public Gtk::Window
     {
     public:
-       WebDvdWindow(
+       webdvd_window(
            const video::frame_params & frame_params,
            const std::string & main_page_uri,
            const std::string & output_dir);
@@ -159,14 +162,14 @@ namespace
                           nsIDOMWindow * dom_window);
        void generate_dvd();
 
-       enum ResourceType { page_resource, video_resource };
-       typedef std::pair<ResourceType, int> ResourceEntry;
+       enum resource_type { page_resource, video_resource };
+       typedef std::pair<resource_type, int> resource_entry;
        video::frame_params frame_params_;
        std::string output_dir_;
-       BrowserWidget browser_widget_;
+       browser_widget browser_widget_;
        nsCOMPtr<nsIStyleSheet> stylesheet_;
        std::queue<std::string> page_queue_;
-       std::map<std::string, ResourceEntry> resource_map_;
+       std::map<std::string, resource_entry> resource_map_;
        std::vector<std::vector<std::string> > page_links_;
        std::vector<std::string> video_paths_;
        bool pending_window_update_;
@@ -178,7 +181,7 @@ namespace
        std::vector<boost::shared_ptr<temp_file> > page_temp_files_;
     };
 
-    WebDvdWindow::WebDvdWindow(
+    webdvd_window::webdvd_window(
        const video::frame_params & frame_params,
        const std::string & main_page_uri,
        const std::string & output_dir)
@@ -195,27 +198,27 @@ namespace
        add(browser_widget_);
        browser_widget_.show();
        browser_widget_.signal_net_state().connect(
-           SigC::slot(*this, &WebDvdWindow::on_net_state_change));
+           SigC::slot(*this, &webdvd_window::on_net_state_change));
 
        add_page(main_page_uri);
        load_next_page();
     }
 
-    void WebDvdWindow::add_page(const std::string & uri)
+    void webdvd_window::add_page(const std::string & uri)
     {
        if (resource_map_.insert(
-               std::make_pair(uri, ResourceEntry(page_resource, 0)))
+               std::make_pair(uri, resource_entry(page_resource, 0)))
            .second)
        {
            page_queue_.push(uri);
        }
     }
 
-    void WebDvdWindow::add_video(const std::string & uri)
+    void webdvd_window::add_video(const std::string & uri)
     {
        if (resource_map_.insert(
-               std::make_pair(uri, ResourceEntry(video_resource,
-                                                 video_paths_.size() + 1)))
+               std::make_pair(uri, resource_entry(video_resource,
+                                                  video_paths_.size() + 1)))
            .second)
        {
            Glib::ustring hostname;
@@ -228,7 +231,7 @@ namespace
        }
     }
 
-    void WebDvdWindow::load_next_page()
+    void webdvd_window::load_next_page()
     {
        assert(!page_queue_.empty());
        const std::string & uri = page_queue_.front();
@@ -241,9 +244,48 @@ namespace
        browser_widget_.load_uri(uri);
     }
 
-    void WebDvdWindow::on_net_state_change(const char * uri,
+    void webdvd_window::on_net_state_change(const char * uri,
                                           gint flags, guint status)
     {
+#       ifdef DEBUG_ON_NET_STATE_CHANGE
+       std::cout << "webdvd_window::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)
@@ -293,7 +335,7 @@ namespace
        }
     }
 
-    bool WebDvdWindow::process_page()
+    bool webdvd_window::process_page()
     {
        assert(!page_queue_.empty());
 
@@ -357,7 +399,7 @@ namespace
        return true;
     }
 
-    void WebDvdWindow::save_screenshot()
+    void webdvd_window::save_screenshot()
     {
        Glib::RefPtr<Gdk::Window> window(get_window());
        assert(window);
@@ -373,7 +415,7 @@ namespace
            ->save(background_temp_->get_name(), "png");
     }
 
-    struct WebDvdWindow::page_state
+    struct webdvd_window::page_state
     {
        page_state(nsIDOMDocument * doc, int width, int height)
                : diff_pixbuf(Gdk::Pixbuf::create(
@@ -398,14 +440,14 @@ namespace
        temp_file links_temp;
 
        int link_num;
-       LinkIterator links_it, links_end;
+       link_iterator links_it, links_end;
 
        rectangle link_rect;
        bool link_changing;
        Glib::RefPtr<Gdk::Pixbuf> norm_pixbuf;
     };
 
-    void WebDvdWindow::process_links(nsIPresShell * pres_shell,
+    void webdvd_window::process_links(nsIPresShell * pres_shell,
                                     nsIPresContext * pres_context,
                                     nsIDOMWindow * dom_window)
     {
@@ -665,7 +707,7 @@ namespace
     void generate_page_dispatch(std::ostream &, int indent,
                                int first_page, int last_page);
 
-    void WebDvdWindow::generate_dvd()
+    void webdvd_window::generate_dvd()
     {
        temp_file temp("webdvd-dvdauthor-");
        temp.close();
@@ -776,7 +818,7 @@ namespace
                    " g1 = " << link_num * link_mult + page_num << ";";
 
                // Jump to appropriate resource.
-               const ResourceEntry & resource_loc =
+               const resource_entry & resource_loc =
                    resource_map_[page_links[link_num - 1]];
                if (resource_loc.first == page_resource)
                    file <<
@@ -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)
@@ -984,16 +1050,17 @@ int main(int argc, char ** argv)
            }
        }
 
-       std::auto_ptr<FrameBuffer> fb;
+       std::auto_ptr<x_frame_buffer> fb;
        if (!preview_mode)
        {
            // Spawn Xvfb and set env variables so that Xlib will use it
            // Use 8 bits each for RGB components, which should translate into
            // "enough" bits for YUV components.
-           fb.reset(new FrameBuffer(frame_params.width, frame_params.height,
-                                    3 * 8));
-           setenv("XAUTHORITY", fb->get_x_authority().c_str(), true);
-           setenv("DISPLAY", fb->get_x_display().c_str(), true);
+           fb.reset(new x_frame_buffer(frame_params.width,
+                                       frame_params.height,
+                                       3 * 8));
+           setenv("XAUTHORITY", fb->get_authority().c_str(), true);
+           setenv("DISPLAY", fb->get_display().c_str(), true);
        }
 
        // Initialise Gtk
@@ -1052,10 +1119,11 @@ int main(int argc, char ** argv)
            output_dir = argv[argi + 1];
 
        // Initialise Mozilla
-       BrowserWidget::init();
+       browser_widget::initialiser browser_init;
+       set_browser_preferences();
 
        // Run the browser/converter
-       WebDvdWindow window(frame_params, menu_url, output_dir);
+       webdvd_window window(frame_params, menu_url, output_dir);
        Gtk::Main::run(window);
     }
     catch (std::exception & e)