[Spice-devel] [PATCH 1/3] client: --help should not need platform initialization
Arnon Gilboa
agilboa at redhat.com
Thu Jan 27 04:49:08 PST 2011
Ack, although see comments below
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).
> ---
> client/application.cpp | 90 +++++++++++++++++++++++++++++++-----------------
> client/application.h | 5 ++-
> 2 files changed, 62 insertions(+), 33 deletions(-)
>
> diff --git a/client/application.cpp b/client/application.cpp
> index d1aef1a..95633f8 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,37 +412,37 @@ 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;
> }
> + memset(_keyboard_state, 0, sizeof(_keyboard_state));
> }
>
> 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
> @@ -2181,13 +2173,12 @@ void Application::register_channels()
> #endif
> }
>
> -bool Application::process_cmd_line(int argc, char** argv)
> +bool Application::process_cmd_line(int argc, char** argv, bool &full_screen)
> {
> std::string host = "";
> int sport = -1;
> int port = -1;
> bool auto_display_res = false;
> - bool full_screen = false;
> std::string password;
> DisplaySetting display_setting;
>
> @@ -2217,11 +2208,12 @@ bool Application::process_cmd_line(int argc, char** argv)
> #endif
> };
>
> + full_screen = false;
> +
> #ifdef USE_GUI
> if (argc == 1) {
> _gui_mode = GUI_MODE_FULL;
> register_channels();
> - _main_screen->show(true, NULL);
> return true;
> }
> #endif // USE_GUI
> @@ -2439,11 +2431,6 @@ bool Application::process_cmd_line(int argc, char** argv)
> _client.set_auto_display_res(auto_display_res);
> _client.set_display_setting(display_setting);
>
> - if (full_screen) {
> - enter_full_screen();
> - } else {
> - _main_screen->show(true, NULL);
> - }
> return true;
> }
>
> @@ -2545,26 +2532,65 @@ void Application::init_globals()
> #ifdef WIN32
> gdi_canvas_init();
> #endif
> +}
>
> +/* seperated from init_globals to allow --help to work
> + * faster and not require X on linux. */
> +void Application::init_platform_globals()
> +{
> Platform::init();
> RedWindow::init();
> }
>
> -void Application::cleanup_globals()
>
init_second_half() may be renamed to init_remainder() :)
> +void Application::init_second_half()
> +{
> + Platform::set_process_loop(*this);
> + init_monitors();
> + 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;
> + bool full_screen;
>
> init_globals();
> LOG_INFO("starting %s", version_str);
> std::auto_ptr<Application> app(new Application());
> AutoAbort auto_abort(*app.get());
> - if (app->process_cmd_line(argc, argv)) {
> + if (app->process_cmd_line(argc, argv, full_screen)) {
> + init_platform_globals();
> + app->init_second_half();
> + if (full_screen) {
> + app->enter_full_screen();
> + } else {
> + app->_main_screen->show(true, NULL);
> + }
> ret = app->run();
> + cleanup_platform_globals();
>
add call to cleanup_globals(); or remove this empty function
> } else {
> ret = app->_exit_code;
> }
> diff --git a/client/application.h b/client/application.h
> index f9bbd53..74696f9 100644
> --- a/client/application.h
> +++ b/client/application.h
> @@ -290,7 +290,7 @@ private:
> bool set_disabled_display_effects(CmdLineParser& parser, char *val, const char* arg0,
> DisplaySetting& disp_setting);
> void on_cmd_line_invalid_arg(const char* arg0, const char* what, const char* val);
> - bool process_cmd_line(int argc, char** argv);
> + bool process_cmd_line(int argc, char** argv, bool& full_screen);
> void register_channels();
> void abort();
> void init_menu();
> @@ -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;
>
More information about the Spice-devel
mailing list