[Spice-devel] [PATCH 3/3] client/windows: don't allocate console unless required

Arnon Gilboa agilboa at redhat.com
Thu Jan 27 04:51:44 PST 2011


ack

Alon Levy wrote:
> ---
>  client/windows/platform.cpp |   36 +++++++++++++++++++++++++++---------
>  1 files changed, 27 insertions(+), 9 deletions(-)
>
> diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp
> index c41c39a..f57413d 100644
> --- a/client/windows/platform.cpp
> +++ b/client/windows/platform.cpp
> @@ -1121,6 +1121,7 @@ void Platform::on_clipboard_release()
>  }
>  
>  static bool has_console = false;
> +static BOOL parent_console;
>  
>  static void create_console()
>  {
> @@ -1132,27 +1133,44 @@ static void create_console()
>          return;
>      }
>  
> -    AllocConsole();
> +    parent_console = AttachConsole(-1 /* parent */);
> +
> +    if (!parent_console) {
> +        AllocConsole();
> +    }
> +
>      HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
>      int hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
> -    FILE * fp = _fdopen(hConHandle, "w");
> -    *stdout = *fp;
> +    FILE * fp;
> +    /* _open_osfhandle can fail, for instance this will fail:
> +        start /wait spicec.exe --help | more
> +       however this actually works:
> +        cmd /c spicec --help | more
> +       */
> +    if (hConHandle != -1) {
> +        fp = _fdopen(hConHandle, "w");
> +        *stdout = *fp;
> +    }
>  
>      h = GetStdHandle(STD_INPUT_HANDLE);
>      hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
> -    fp = _fdopen(hConHandle, "r");
> -    *stdin = *fp;
> +    if (hConHandle != -1) {
> +        fp = _fdopen(hConHandle, "r");
> +        *stdin = *fp;
> +    }
>  
>      h = GetStdHandle(STD_ERROR_HANDLE);
>      hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
> -    fp = _fdopen(hConHandle, "w");
> -    *stderr = *fp;
> +    if (hConHandle != -1) {
> +        fp = _fdopen(hConHandle, "w");
> +        *stderr = *fp;
> +    }
>  
>      has_console = true;
>  
>      HWND consol_window = GetConsoleWindow();
>  
> -    if (consol_window) {
> +    if (consol_window && !parent_console) {
>          SetForegroundWindow(consol_window);
>      }
>  }
> @@ -1161,7 +1179,7 @@ class ConsoleWait {
>  public:
>      ~ConsoleWait()
>      {
> -        if (has_console) {
> +        if (has_console && !parent_console) {
>              Platform::term_printf("\n\nPress any key to exit...");
>              _getch();
>          }
>   



More information about the Spice-devel mailing list