]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Disabled scroll bars (though this doesn't seem to work in every case).
[videolink.git] / webdvd.cpp
index 58c849a7b69e09e77e56b06208513d5e9743ff98..5b3cd9b998b65375f1139d58ad9fa0e1d92f269a 100644 (file)
@@ -2,6 +2,7 @@
 // See the file "COPYING" for licence details.
 
 #include <cassert>
+#include <cstring>
 #include <exception>
 #include <fstream>
 #include <iomanip>
@@ -13,7 +14,6 @@
 #include <string>
 
 #include <stdlib.h>
-#include <unistd.h>
 
 #include <boost/shared_ptr.hpp>
 
@@ -29,6 +29,7 @@
 #include <nsIContent.h>
 #include <nsIDocShell.h>
 #include <nsIDOMAbstractView.h>
+#include <nsIDOMBarProp.h>
 #include <nsIDOMDocumentEvent.h>
 #include <nsIDOMDocumentView.h>
 #include <nsIDOMElement.h>
@@ -170,6 +171,7 @@ namespace
        std::vector<std::string> video_paths_;
        bool pending_window_update_;
        int pending_req_count_;
+       bool have_tweaked_page_;
        std::auto_ptr<temp_file> background_temp_;
        struct page_state;
        std::auto_ptr<page_state> page_state_;
@@ -184,7 +186,8 @@ namespace
              output_dir_(output_dir),
              stylesheet_(load_css("file://" WEBDVD_LIB_DIR "/webdvd.css")),
              pending_window_update_(false),
-             pending_req_count_(0)
+             pending_req_count_(0),
+             have_tweaked_page_(false)
     {
        set_size_request(frame_params_.width, frame_params_.height);
        set_resizable(false);
@@ -215,11 +218,9 @@ namespace
                                                  video_paths_.size() + 1)))
            .second)
        {
-           // FIXME: Should accept some slightly different URI prefixes
-           // (e.g. file://localhost/) and decode any URI-escaped
-           // characters in the path.
-           assert(uri.compare(0, 8, "file:///") == 0);
-           video_paths_.push_back(uri.substr(7));
+           Glib::ustring hostname;
+           video_paths_.push_back(Glib::filename_from_uri(uri, hostname));
+           // FIXME: Should check the hostname
        }
     }
 
@@ -233,7 +234,6 @@ namespace
        resource_map_[uri].second = ++page_count;
        page_links_.resize(page_count);
 
-       pending_window_update_ = true;
        browser_widget_.load_uri(uri);
     }
 
@@ -252,8 +252,15 @@ namespace
            }
        }
            
-       if (flags & GTK_MOZ_EMBED_FLAG_STOP
-           && flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW)
+       if (flags & GTK_MOZ_EMBED_FLAG_IS_DOCUMENT
+           && flags & GTK_MOZ_EMBED_FLAG_START)
+       {
+           pending_window_update_ = true;
+           have_tweaked_page_ = false;
+       }
+
+       if (flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW
+           && flags & GTK_MOZ_EMBED_FLAG_STOP)
        {
            // Check whether the load was successful, ignoring this
            // pseudo-error.
@@ -296,22 +303,32 @@ namespace
        nsCOMPtr<nsIDOMWindow> dom_window;
        check(browser->GetContentDOMWindow(getter_AddRefs(dom_window)));
 
-       if (output_dir_.empty())
+       // If we haven't done so already, apply the stylesheet and
+       // disable scrollbars.
+       if (!have_tweaked_page_)
        {
-           // In preview mode, just apply the stylesheet and let the
-           // user select links.
            apply_style_sheet(stylesheet_, pres_shell);
+
+           // This actually only needs to be done once.
+           nsCOMPtr<nsIDOMBarProp> dom_bar_prop;
+           check(dom_window->GetScrollbars(getter_AddRefs(dom_bar_prop)));
+           check(dom_bar_prop->SetVisible(false));
+
+           have_tweaked_page_ = true;
+
+           // Might need to wait a while for things to load or more
+           // likely for a re-layout.
+           if (pending_req_count_ > 0)
+               return true;
        }
-       else
+
+       // All further work should only be done if we're not in preview mode.
+       if (!output_dir_.empty())
        {
-           // If we haven't already started work on this page, apply
-           // the stylesheet and save a screenshot of its normal
-           // appearance.
+           // If we haven't already started work on this page, save a
+           // screenshot of its normal appearance.
            if (!page_state_.get())
-           {
-               apply_style_sheet(stylesheet_, pres_shell);
                save_screenshot();
-           }
 
            // Start or continue processing links.
            process_links(pres_shell, pres_context, dom_window);
@@ -905,8 +922,10 @@ int main(int argc, char ** argv)
     {
        video::frame_params frame_params = video::pal_params;
        bool preview_mode = false;
+       std::string menu_url;
+       std::string output_dir;
 
-       // Do initial argument parsing.  We have to do this before
+       // Do initial option parsing.  We have to do this before
        // letting Gtk parse the arguments since we may need to spawn
        // Xvfb first.
        int argi = 1;
@@ -958,7 +977,7 @@ int main(int argc, char ** argv)
        // Initialise Gtk
        Gtk::Main kit(argc, argv);
 
-       // Complete argument parsing with Gtk's options out of the way.
+       // Complete option parsing with Gtk's options out of the way.
        argi = 1;
        while (argi != argc)
        {
@@ -986,18 +1005,35 @@ int main(int argc, char ** argv)
                break;
            }
        }
-       if (argc - argi != (preview_mode ? 1 : 2))
+
+       // Look for a starting URL or filename and (except in preview
+       // mode) an output directory after the options.
+        if (argc - argi != (preview_mode ? 1 : 2))
        {
            print_usage(std::cerr, argv[0]);
            return EXIT_FAILURE;
        }
+       if (std::strstr(argv[argi], "://"))
+       {
+           // It appears to be an absolute URL, so use it as-is.
+           menu_url = argv[argi];
+       }
+       else
+       {
+           // Assume it's a filename.  Resolve it to an absolute URL.
+           std::string path(argv[argi]);
+           if (!Glib::path_is_absolute(path))
+               path = Glib::build_filename(Glib::get_current_dir(), path);
+           menu_url = Glib::filename_to_uri(path);             
+       }
+       if (!preview_mode)
+           output_dir = argv[argi + 1];
 
        // Initialise Mozilla
        BrowserWidget::init();
 
-       WebDvdWindow window(frame_params,
-                           argv[argi],
-                           preview_mode ? "" : argv[argi + 1]);
+       // Run the browser/converter
+       WebDvdWindow window(frame_params, menu_url, output_dir);
        Gtk::Main::run(window);
     }
     catch (std::exception & e)