+ enum video_format
+ {
+ video_format_none,
+ video_format_mpeg2_ps,
+ video_format_vob_list
+ };
+
+ video_format video_format_from_uri(const std::string & uri)
+ {
+ // FIXME: This is a bit of a hack. Perhaps we could decide
+ // later based on the MIME type determined by Mozilla?
+ static struct {
+ const char * extension;
+ video_format format;
+ } const mapping[] = {
+ {".vob", video_format_mpeg2_ps},
+ {".mpeg", video_format_mpeg2_ps},
+ {".mpeg2", video_format_mpeg2_ps},
+ {".voblist", video_format_vob_list}
+ };
+ for (std::size_t i = 0;
+ i != sizeof(mapping) / sizeof(mapping[0]);
+ ++i)
+ {
+ std::size_t ext_len = std::strlen(mapping[i].extension);
+ if (uri.size() > ext_len
+ && uri.compare(uri.size() - ext_len, ext_len,
+ mapping[i].extension) == 0)
+ return mapping[i].format;
+ }
+ return video_format_none;
+ }
+
+
+ class base_window : public Gtk::Window
+ {
+ public:
+ base_window(const video::frame_params & frame_params);
+
+ protected:
+ video::frame_params frame_params_;
+ browser_widget browser_widget_;
+
+ private:
+ bool on_idle();
+ virtual void do_late_initialisation() = 0;
+ };
+
+ base_window::base_window(const video::frame_params & frame_params)
+ : frame_params_(frame_params)
+ {
+ set_size_request(frame_params_.width, frame_params_.height);
+ set_resizable(false);
+
+ add(browser_widget_);
+ browser_widget_.show();
+
+ Glib::signal_idle().connect(SigC::slot(*this, &base_window::on_idle));
+ }
+
+ bool base_window::on_idle()
+ {
+ do_late_initialisation();
+ return false; // don't call again thankyou
+ }
+
+ class preview_window : public base_window
+ {
+ public:
+ preview_window(const video::frame_params & frame_params,
+ const std::string & main_page_uri);
+
+ private:
+ virtual void do_late_initialisation();
+
+ std::string main_page_uri_;
+ };
+
+ preview_window::preview_window(const video::frame_params & frame_params,
+ const std::string & main_page_uri)
+ : base_window(frame_params),
+ main_page_uri_(main_page_uri)
+ {
+ }
+
+ void preview_window::do_late_initialisation()
+ {
+ browser_widget_.load_uri(main_page_uri_);
+ }
+
+ class conversion_window : public base_window