|  | <chapter id="consoles"> | 
|  | <title>Consoles in Wine</title> | 
|  |  | 
|  | <para> | 
|  | As described in the Wine User Guide's CUI section, Wine | 
|  | manipulates three kinds of "consoles" in order to support | 
|  | properly the Win32 CUI API. | 
|  | </para> | 
|  | <para> | 
|  | The following table describes the main implementation | 
|  | differences between the three approaches. | 
|  |  | 
|  | <table> | 
|  | <title>Function consoles implementation comparison</title> | 
|  | <tgroup cols="4" align="left"> | 
|  | <thead> | 
|  | <row> | 
|  | <entry>Function</entry> | 
|  | <entry>Bare streams</entry> | 
|  | <entry>Wineconsole & user backend</entry> | 
|  | <entry>Wineconsole & curses backend</entry> | 
|  | </row> | 
|  | </thead> | 
|  | <tbody> | 
|  | <row> | 
|  | <entry> | 
|  | Console as a Win32 Object (and associated | 
|  | handles) | 
|  | </entry> | 
|  | <entry> | 
|  | No specific Win32 object is used in this case. The | 
|  | handles manipulated for the standard Win32 streams | 
|  | are in fact "bare handles" to their corresponding | 
|  | Unix streams. The mode manipulation functions | 
|  | (<function>GetConsoleMode</function> / | 
|  | <function>SetConsoleMode</function>) are not | 
|  | supported. | 
|  | </entry> | 
|  | <entry> | 
|  | Implemented in server, and a specific Winelib | 
|  | program (wineconsole) is in charge of the | 
|  | rendering and user input. The mode manipulation | 
|  | functions behave as expected. | 
|  | </entry> | 
|  | <entry> | 
|  | Implemented in server, and a specific Winelib | 
|  | program (wineconsole) is in charge of the | 
|  | rendering and user input. The mode manipulation | 
|  | functions behave as expected. | 
|  | </entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry> | 
|  | Inheritance (including handling in | 
|  | <function>CreateProcess</function> of | 
|  | <constant>CREATE_DETACHED</constant>, | 
|  | <constant>CREATE_NEW_CONSOLE</constant> flags). | 
|  | </entry> | 
|  | <entry> | 
|  | Not supported. Every process child of a process | 
|  | will inherit the Unix streams, so will also | 
|  | inherit the Win32 standard streams. | 
|  | </entry> | 
|  | <entry> | 
|  | Fully supported (each new console creation will be | 
|  | handled by the creation of a new USER32 window) | 
|  | </entry> | 
|  | <entry> | 
|  | Fully supported, except for the creation of a new | 
|  | console, which will be rendered on the same Unix | 
|  | terminal as the previous one, leading to | 
|  | unpredictable results. | 
|  | </entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry><function>ReadFile</function> / <function>WriteFile</function> operations</entry> | 
|  | <entry>Fully supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry> | 
|  | Screen-buffer manipulation (creation, deletion, resizing...) | 
|  | </entry> | 
|  | <entry>Not supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | <entry> | 
|  | Partly supported (this won't work too well as we | 
|  | don't control (so far) the size of underlying Unix | 
|  | terminal | 
|  | </entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry> | 
|  | APIs for reading/writing screen-buffer content, | 
|  | cursor position | 
|  | </entry> | 
|  | <entry>Not supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry> | 
|  | APIs for manipulating the rendering window size | 
|  | </entry> | 
|  | <entry>Not supported</entry> | 
|  | <entry>Fully supported</entry> | 
|  | <entry> | 
|  | Partly supported (this won't work too well as we | 
|  | don't control (so far) the size of underlying Unix | 
|  | terminal | 
|  | </entry> | 
|  | </row> | 
|  | <row> | 
|  | <entry> | 
|  | Signaling (in particular, Ctrl-C handling) | 
|  | </entry> | 
|  | <entry> | 
|  | Nothing is done, which means that Ctrl-C will | 
|  | generate (as usual) a <constant>SIGINT</constant> | 
|  | which will terminate the program. | 
|  | </entry> | 
|  | <entry> | 
|  | Partly supported (Ctrl-C behaves as expected, | 
|  | however the other Win32 CUI signaling isn't | 
|  | properly implemented). | 
|  | </entry> | 
|  | <entry> | 
|  | Partly supported (Ctrl-C behaves as expected, | 
|  | however the other Win32 CUI signaling isn't | 
|  | properly implemented). | 
|  | </entry> | 
|  | </row> | 
|  | </tbody> | 
|  | </tgroup> | 
|  | </table> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The Win32 objects behind a console can be created in several occasions: | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para> | 
|  | When the program is started from wineconsole, a new | 
|  | console object is created and will be used (inherited) | 
|  | by the process launched from wineconsole. | 
|  | </para> | 
|  | </listitem> | 
|  | <listitem> | 
|  | <para> | 
|  | When a program, which isn't attached to a console, calls | 
|  | <function>AllocConsole</function>, Wine then launches | 
|  | wineconsole, and attaches the current program to this | 
|  | console. In this mode, the USER32 mode is always | 
|  | selected as Wine cannot tell the current state of the | 
|  | Unix console. | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  | <para> | 
|  | Please also note, that starting a child process with the | 
|  | <constant>CREATE_NEW_CONSOLE</constant> flag, will end-up | 
|  | calling <function>AllocConsole</function> in the child | 
|  | process, hence creating a wineconsole with the USER32 backend. | 
|  | </para> | 
|  | </chapter> | 
|  |  | 
|  | <!-- Keep this comment at the end of the file | 
|  | Local variables: | 
|  | mode: sgml | 
|  | sgml-parent-document:("wine-devel.sgml" "set" "book" "part" "chapter" "") | 
|  | End: | 
|  | --> |