[Spice-devel] [RFC] client: --help should not need X
Alon Levy
alevy at redhat.com
Wed Jan 26 01:10:04 PST 2011
On Wed, Jan 26, 2011 at 01:55:33AM +0200, Alon Levy wrote:
> separate initialization into before command line parsing and after,
> call later only if command line parsing succeeds (in particular, it
> "fails" if --help is given).
>
> Not tested on windows.
self NACK, I have an actually working patch but will test it on windows first.
> ---
> client/application.cpp | 75 ++++++++++++++++++++++++++++++++---------------
> client/application.h | 3 ++
> 2 files changed, 54 insertions(+), 24 deletions(-)
>
> diff --git a/client/application.cpp b/client/application.cpp
> index d1aef1a..eff0495 100644
> --- a/client/application.cpp
> +++ b/client/application.cpp
> @@ -362,14 +362,6 @@ Application::Application()
> #endif
> {
> DBG(0, "");
> - Platform::set_process_loop(*this);
> - init_monitors();
> - memset(_keyboard_state, 0, sizeof(_keyboard_state));
> - init_menu();
> - _main_screen = get_screen(0);
> -
> - Platform::set_event_listener(this);
> - Platform::set_display_mode_listner(this);
>
> _commands_map["toggle-fullscreen"] = APP_CMD_TOGGLE_FULL_SCREEN;
> _commands_map["release-cursor"] = APP_CMD_RELEASE_CAPTURE;
> @@ -420,15 +412,6 @@ Application::Application()
> _sticky_info.key = REDKEY_INVALID;
> _sticky_info.timer.reset(new StickyKeyTimer());
>
> -#ifdef USE_GUI
> - _gui.reset(new GUI(*this, DISCONNECTED));
> - _gui_timer.reset(new GUITimer(*_gui.get()));
> - activate_interval_timer(*_gui_timer, 1000 / 30);
> -#ifdef GUI_DEMO
> - _gui_test_timer.reset(new TestTimer(*this));
> - activate_interval_timer(*_gui_test_timer, 1000 * 30);
> -#endif
> -#endif // USE_GUI
> for (int i = SPICE_CHANNEL_MAIN; i < SPICE_END_CHANNEL; i++) {
> _peer_con_opt[i] = RedPeer::ConnectionOptions::CON_OP_BOTH;
> }
> @@ -437,20 +420,28 @@ Application::Application()
> Application::~Application()
> {
> #ifdef USE_GUI
> - deactivate_interval_timer(*_gui_timer);
> + if (*_gui_timer != NULL) {
> + deactivate_interval_timer(*_gui_timer);
> + }
> #ifdef GUI_DEMO
> - deactivate_interval_timer(*_gui_test_timer);
> + if (*_gui_test_timer != NULL) {
> + deactivate_interval_timer(*_gui_test_timer);
> + }
> #endif
> destroyed_gui_barriers();
> - _gui->set_screen(NULL);
> + if (_gui.get() != NULL) {
> + _gui->set_screen(NULL);
> + }
> #endif // USE_GUI
>
> if (_info_layer->screen()) {
> _main_screen->detach_layer(*_info_layer);
> }
>
> - _main_screen->unref();
> - destroy_monitors();
> + if (_main_screen != NULL) {
> + _main_screen->unref();
> + destroy_monitors();
> + }
> #ifdef USE_SMARTCARD
> delete _smartcard_options;
> #endif
> @@ -2221,7 +2212,6 @@ bool Application::process_cmd_line(int argc, char** argv)
> if (argc == 1) {
> _gui_mode = GUI_MODE_FULL;
> register_channels();
> - _main_screen->show(true, NULL);
> return true;
> }
> #endif // USE_GUI
> @@ -2545,16 +2535,48 @@ void Application::init_globals()
> #ifdef WIN32
> gdi_canvas_init();
> #endif
> +}
>
> +/* seperated from init_globals to allow --help to work
> + * without an X display, and without opening window when run
> + * from console on windows. */
> +void Application::init_platform_globals()
> +{
> Platform::init();
> RedWindow::init();
> }
>
> -void Application::cleanup_globals()
> +void Application::init_second_half()
> +{
> + Platform::set_process_loop(*this);
> + init_monitors();
> + memset(_keyboard_state, 0, sizeof(_keyboard_state));
> + init_menu();
> + _main_screen = get_screen(0);
> +
> + Platform::set_event_listener(this);
> + Platform::set_display_mode_listner(this);
> +
> +#ifdef USE_GUI
> + _gui.reset(new GUI(*this, DISCONNECTED));
> + _gui_timer.reset(new GUITimer(*_gui.get()));
> + activate_interval_timer(*_gui_timer, 1000 / 30);
> +#ifdef GUI_DEMO
> + _gui_test_timer.reset(new TestTimer(*this));
> + activate_interval_timer(*_gui_test_timer, 1000 * 30);
> +#endif
> +#endif // USE_GUI
> +}
> +
> +void Application::cleanup_platform_globals()
> {
> RedWindow::cleanup();
> }
>
> +void Application::cleanup_globals()
> +{
> +}
> +
> int Application::main(int argc, char** argv, const char* version_str)
> {
> int ret;
> @@ -2564,6 +2586,11 @@ int Application::main(int argc, char** argv, const char* version_str)
> std::auto_ptr<Application> app(new Application());
> AutoAbort auto_abort(*app.get());
> if (app->process_cmd_line(argc, argv)) {
> + init_platform_globals();
> + app->init_second_half();
> + if (app->_gui_mode == GUI_MODE_FULL) {
> + app->_main_screen->show(true, NULL);
> + }
> ret = app->run();
> } else {
> ret = app->_exit_code;
> diff --git a/client/application.h b/client/application.h
> index f9bbd53..de72454 100644
> --- a/client/application.h
> +++ b/client/application.h
> @@ -343,7 +343,10 @@ private:
>
> static void init_logger();
> static void init_globals();
> + static void init_platform_globals();
> + static void cleanup_platform_globals();
> static void cleanup_globals();
> + void init_second_half();
>
> friend class DisconnectedEvent;
> friend class ConnectionErrorEvent;
> --
> 1.7.3.5
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list