X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=webdvd.cpp;h=cf71bb61843abc64a455ed3db46fd045a036ad16;hb=5ea39fc96beb4f56198cfb975a6a37bbd61d10ed;hp=6fb547ff510c0431bfddba9adfdc5272b0f60598;hpb=083fe0658d0b592061ec1332706fa852c4cf13e8;p=videolink.git diff --git a/webdvd.cpp b/webdvd.cpp index 6fb547f..cf71bb6 100644 --- a/webdvd.cpp +++ b/webdvd.cpp @@ -14,7 +14,6 @@ #include #include -#include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -171,6 +171,7 @@ namespace std::vector video_paths_; bool pending_window_update_; int pending_req_count_; + bool have_tweaked_page_; std::auto_ptr background_temp_; struct page_state; std::auto_ptr page_state_; @@ -185,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); @@ -217,8 +219,12 @@ namespace .second) { Glib::ustring hostname; - video_paths_.push_back(Glib::filename_from_uri(uri, hostname)); + std::string filename(Glib::filename_from_uri(uri, hostname)); // FIXME: Should check the hostname + if (!Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR)) + throw std::runtime_error( + filename + " is missing or not a regular file"); + video_paths_.push_back(filename); } } @@ -232,7 +238,6 @@ namespace resource_map_[uri].second = ++page_count; page_links_.resize(page_count); - pending_window_update_ = true; browser_widget_.load_uri(uri); } @@ -251,8 +256,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. @@ -295,22 +307,32 @@ namespace nsCOMPtr 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 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); @@ -480,8 +502,11 @@ namespace check(uri->GetPath(path)); // FIXME: This is a bit of a hack. Perhaps we could decide // later based on the MIME type determined by Mozilla? - if (path.Length() > 4 - && std::strcmp(path.EndReading() - 4, ".vob") == 0) + if ((path.Length() > 4 + && std::strcmp(path.EndReading() - 4, ".vob") == 0) + || (path.Length() > 8 + && std::strcmp(path.EndReading() - 8, ".voblist") + == 0)) { PRBool is_file; check(uri->SchemeIs("file", &is_file)); @@ -788,10 +813,25 @@ namespace " \n" " \n" // Record calling page/menu. - "
 g12 = g1; 
\n" + "
 g12 = g1; 
\n"; + + // Write a reference to a linked VOB file, or the contents + // of a linked VOB list file. + const std::string & video_path = video_paths_[video_num - 1]; + if (video_path.compare(video_path.size() - 4, 4, ".vob") == 0) + { // FIXME: Should XML-escape the path - " \n" + file << " \n"; + } + else + { + assert(video_path.compare(video_path.size() - 8, 8, + ".voblist") == 0); + // TODO: Validate the file contents; + file << Glib::file_get_contents(video_path); + } + + file << // If page/menu location has not been changed during the // video, change the location to be the following // link/button when returning to it. In any case,