| <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: | |
| --> |