X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=webdvd.cpp;h=e80996874157ce339063dd7a5fd5ab30b42aaa4f;hb=a80fac0c4fed899cd5f7503cf4080c30f611e341;hp=31ad122776a154586a14ea9baf4e7642331dcd5a;hpb=86602dfc3c0f036cc061277b70607e2631b50229;p=videolink.git diff --git a/webdvd.cpp b/webdvd.cpp index 31ad122..e809968 100644 --- a/webdvd.cpp +++ b/webdvd.cpp @@ -202,6 +202,9 @@ namespace std::vector titles; }; + void generate_dvd(const dvd_contents & contents, + const std::string & output_dir); + class webdvd_window : public Gtk::Window { public: @@ -215,12 +218,15 @@ namespace dvd_contents::pgc_ref add_title(const std::string & uri); void load_next_page(); void on_net_state_change(const char * uri, gint flags, guint status); + bool browser_is_busy() const + { + return pending_window_update_ || pending_req_count_; + } bool process_page(); void save_screenshot(); void process_links(nsIPresShell * pres_shell, nsIPresContext * pres_context, nsIDOMWindow * dom_window); - void generate_dvd(); video::frame_params frame_params_; std::string output_dir_; @@ -407,7 +413,7 @@ namespace pending_window_update_ = false; } - if (pending_req_count_ == 0 && !pending_window_update_) + if (!browser_is_busy()) { try { @@ -455,7 +461,7 @@ namespace // Might need to wait a while for things to load or more // likely for a re-layout. - if (pending_req_count_ > 0) + if (browser_is_busy()) return true; } @@ -477,7 +483,7 @@ namespace page_queue_.pop(); if (page_queue_.empty()) { - generate_dvd(); + generate_dvd(contents_, output_dir_); return false; } else @@ -714,7 +720,7 @@ namespace // We may have to exit and wait for image loading // to complete, at which point we will be called // again. - if (pending_req_count_ > 0) + if (browser_is_busy()) { state->link_changing = true; page_state_ = state; @@ -794,7 +800,8 @@ namespace } } - void webdvd_window::generate_dvd() + void generate_dvd(const dvd_contents & contents, + const std::string & output_dir) { temp_file temp("webdvd-dvdauthor-"); temp.close(); @@ -822,10 +829,10 @@ namespace " <menus>\n"; for (std::size_t menu_num = 0; - menu_num != contents_.menus.size(); + menu_num != contents.menus.size(); ++menu_num) { - dvd_contents::menu & menu = contents_.menus[menu_num]; + const dvd_contents::menu & menu = contents.menus[menu_num]; if (menu_num == 0) { @@ -871,7 +878,7 @@ namespace menu_incr != 0; menu_incr /= 2) { - if (menu_num + menu_incr < contents_.menus.size() + if (menu_num + menu_incr < contents.menus.size() && (menu_num & (menu_incr * 2 - 1)) == 0) { file << @@ -904,7 +911,7 @@ namespace // first button. const std::vector<dvd_contents::pgc_ref> & dest_menu_entries = - contents_.menus[dest_menu_num].entries; + contents.menus[dest_menu_num].entries; dvd_contents::pgc_ref this_pgc( dvd_contents::menu_pgc, menu_num); std::size_t dest_button_num = dest_menu_entries.size(); @@ -942,7 +949,7 @@ namespace // jumping to titles a whole lot simpler (but limits us to 99 // titles). for (std::size_t title_num = 0; - title_num != contents_.titles.size(); + title_num != contents.titles.size(); ++title_num) { file << @@ -958,7 +965,7 @@ namespace " <pgc>\n" // Record calling location. " <pre> g12 = g1; </pre>\n" - << contents_.titles[title_num].vob_list << + << contents.titles[title_num].vob_list << // If the menu location has not been changed during // the title, set the location to be the following // button in the menu. In any case, return to some @@ -978,7 +985,7 @@ namespace { const char * argv[] = { "dvdauthor", - "-o", output_dir_.c_str(), + "-o", output_dir.c_str(), "-x", temp.get_name().c_str(), 0 };