+ 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},
+ {".mpg", 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_;
+ };
+
+ 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();
+ }
+
+ class preview_window : public base_window
+ {
+ public:
+ preview_window(const video::frame_params & frame_params,
+ const std::string & main_page_uri);
+
+ private:
+ bool on_idle();
+ bool on_key_press(GdkEventKey *);
+
+ 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)
+ {
+ Glib::signal_idle().connect(
+ sigc::mem_fun(this, &preview_window::on_idle));
+ signal_key_press_event().connect(
+ sigc::mem_fun(this, &preview_window::on_key_press));
+ }
+
+ bool preview_window::on_idle()
+ {
+ browser_widget_.load_uri(main_page_uri_);
+ return false; // don't call again
+ }
+
+ bool preview_window::on_key_press(GdkEventKey * event)
+ {
+ switch (event->keyval)
+ {
+ case GDK_t: // = top menu
+ browser_widget_.load_uri(main_page_uri_);
+ return true;
+ case GDK_q: // = quit
+ Gtk::Main::quit();
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ class conversion_window : public base_window