]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Implemented preview mode. Updated documentation accordingly.
[videolink.git] / webdvd.cpp
index b1c7fe88f70fc662ed1f37b4b9dd385faecfee0d..113198c6a27ecdf4aae4db906ed6bcb8734be907 100644 (file)
@@ -275,22 +275,33 @@ namespace
                check(browser->GetContentDOMWindow(
                          getter_AddRefs(dom_window)));
 
-               if (!link_state_.get())
+               if (output_dir_.empty())
                {
                    apply_style_sheet(stylesheet_, pres_shell);
-                   save_screenshot();
                }
-               process_links(pres_shell, pres_context, dom_window);
-               if (!link_state_.get())
+               else
                {
-                   page_queue_.pop();
-                   if (page_queue_.empty())
+                   if (!link_state_.get())
+                   {
+                       apply_style_sheet(stylesheet_, pres_shell);
+                       save_screenshot();
+                   }
+
+                   process_links(pres_shell, pres_context, dom_window);
+
+                   if (!link_state_.get())
                    {
-                       generate_dvd();
-                       Gtk::Main::quit();
+                       page_queue_.pop();
+                       if (page_queue_.empty())
+                       {
+                           generate_dvd();
+                           Gtk::Main::quit();
+                       }
+                       else
+                       {
+                           load_next_page();
+                       }
                    }
-                   else
-                       load_next_page();
                }
            }
            catch (std::exception & e)
@@ -863,7 +874,7 @@ namespace
     {
        stream << "Usage: " << command_name
               << (" [gtk-options] [--video-std std-name]"
-                  " front-page-url output-dir\n");
+                  " [--preview] menu-url [output-dir]\n");
     }
     
 } // namespace
@@ -872,22 +883,30 @@ int main(int argc, char ** argv)
 {
     try
     {
-       // Do initial argument parsing.  We have to do this before
-       // letting Gtk parse the arguments since we need to spawn Xvfb
-       // first and that's currently dependent on the frame
-       // parameters (though we could just make it large enough for
-       // any frame) and also an unnecessary expense in some cases.
        video::frame_params frame_params = video::pal_params;
-       for (int argi = 1; argi != argc; ++argi)
+       bool preview_mode = false;
+
+       // Do initial argument parsing.  We have to do this before
+       // letting Gtk parse the arguments since we may need to spawn
+       // Xvfb first.
+       int argi = 1;
+       while (argi != argc)
        {
            if (std::strcmp(argv[argi], "--") == 0)
+           {
                break;
-           if (std::strcmp(argv[argi], "--help") == 0)
+           }
+           else if (std::strcmp(argv[argi], "--help") == 0)
            {
                print_usage(std::cout, argv[0]);
                return EXIT_SUCCESS;
            }
-           if (std::strcmp(argv[argi], "--video-std") == 0)
+           else if (std::strcmp(argv[argi], "--preview") == 0)
+           {
+               preview_mode = true;
+               argi += 1;
+           }
+           else if (std::strcmp(argv[argi], "--video-std") == 0)
            {
                if (argi + 1 == argc)
                {
@@ -896,32 +915,45 @@ int main(int argc, char ** argv)
                    return EXIT_FAILURE;
                }
                frame_params = lookup_frame_params(argv[argi + 1]);
-               break;
+               argi += 2;
+           }
+           else
+           {
+               argi += 1;
            }
        }
-       
-       // Spawn Xvfb and set env variables so that Xlib will use it
-       // Use 8 bits each for RGB components, which should translate into
-       // "enough" bits for YUV components.
-       FrameBuffer fb(frame_params.width, frame_params.height, 3 * 8);
-       setenv("XAUTHORITY", fb.get_x_authority().c_str(), true);
-       setenv("DISPLAY", fb.get_x_display().c_str(), true);
+
+       std::auto_ptr<FrameBuffer> fb;
+       if (!preview_mode)
+       {
+           // Spawn Xvfb and set env variables so that Xlib will use it
+           // Use 8 bits each for RGB components, which should translate into
+           // "enough" bits for YUV components.
+           fb.reset(new FrameBuffer(frame_params.width, frame_params.height,
+                                    3 * 8));
+           setenv("XAUTHORITY", fb->get_x_authority().c_str(), true);
+           setenv("DISPLAY", fb->get_x_display().c_str(), true);
+       }
 
        // Initialise Gtk
        Gtk::Main kit(argc, argv);
 
        // Complete argument parsing with Gtk's options out of the way.
-       int argi = 1;
+       argi = 1;
        while (argi != argc)
        {
-           if (std::strcmp(argv[argi], "--video-std") == 0)
+           if (std::strcmp(argv[argi], "--") == 0)
            {
-               argi += 2;
+               argi += 1;
+               break;
            }
-           else if (std::strcmp(argv[argi], "--") == 0)
+           else if (std::strcmp(argv[argi], "--preview") == 0)
            {
                argi += 1;
-               break;
+           }
+           else if (std::strcmp(argv[argi], "--video-std") == 0)
+           {
+               argi += 2;
            }
            else if (argv[argi][0] == '-')
            {
@@ -930,9 +962,11 @@ int main(int argc, char ** argv)
                return EXIT_FAILURE;
            }
            else
+           {
                break;
+           }
        }
-       if (argi != argc - 2)
+       if (argc - argi != (preview_mode ? 1 : 2))
        {
            print_usage(std::cerr, argv[0]);
            return EXIT_FAILURE;
@@ -941,7 +975,9 @@ int main(int argc, char ** argv)
        // Initialise Mozilla
        BrowserWidget::init();
 
-       WebDvdWindow window(frame_params, argv[argi], argv[argi + 1]);
+       WebDvdWindow window(frame_params,
+                           argv[argi],
+                           preview_mode ? "" : argv[argi + 1]);
        Gtk::Main::run(window);
     }
     catch (std::exception & e)