std::vector<title> titles;
};
+ void generate_dvd(const dvd_contents & contents,
+ const std::string & output_dir);
+
class webdvd_window : public Gtk::Window
{
public:
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_;
pending_window_update_ = false;
}
- if (pending_req_count_ == 0 && !pending_window_update_)
+ if (!browser_is_busy())
{
try
{
// 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;
}
page_queue_.pop();
if (page_queue_.empty())
{
- generate_dvd();
+ generate_dvd(contents_, output_dir_);
return false;
}
else
// 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;
}
}
- void webdvd_window::generate_dvd()
+ void generate_dvd(const dvd_contents & contents,
+ const std::string & output_dir)
{
temp_file temp("webdvd-dvdauthor-");
temp.close();
" <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)
{
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 <<
// 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();
// 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 <<
" <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
{
const char * argv[] = {
"dvdauthor",
- "-o", output_dir_.c_str(),
+ "-o", output_dir.c_str(),
"-x", temp.get_name().c_str(),
0
};
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;
+
+ // 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)
check(pref_service->GetDefaultBranch("layout",
getter_AddRefs(pref_branch)));
check(pref_branch->SetBoolPref(
true));
# endif
- // TODO: Set display resolution? Unfortunately Mozilla doesn't
- // support non-square pixels (and neither do fontconfig or Xft
- // anyway).
+ // Set display resolution. With standard-definition video we
+ // will be fitting ~600 pixels across a screen typically
+ // ranging from 10 to 25 inches wide, for a resolution of
+ // 24-60 dpi. I therefore declare the average horizontal
+ // resolution to be 40 dpi. The vertical resolution will be
+ // slightly higher (PAL/SECAM) or lower (NTSC), but
+ // unfortunately Mozilla doesn't support non-square pixels
+ // (and neither do fontconfig or Xft anyway).
+ check(pref_service->GetDefaultBranch("browser.display",
+ getter_AddRefs(pref_branch)));
+ check(pref_branch->SetIntPref("screen_resolution", 40));
}
} // namespace