Jacek Caban : conhost: Add initial main loop implementation.
Alexandre Julliard
julliard at winehq.org
Fri Aug 21 16:43:26 CDT 2020
Module: wine
Branch: master
Commit: e24ba09f8f35b146de178e492c8071d1923bfa88
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e24ba09f8f35b146de178e492c8071d1923bfa88
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 20 23:49:46 2020 +0200
conhost: Add initial main loop implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/conhost/conhost.c | 131 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 125 insertions(+), 6 deletions(-)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index 706cb5e983..27283e415b 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -16,18 +16,137 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ntstatus.h>
+#define WIN32_NO_STATUS
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <winternl.h>
+
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(conhost);
-int __cdecl wmain(int argc, WCHAR *argv[])
+struct console
{
- int i;
+ HANDLE server; /* console server handle */
+};
+
+static int main_loop( struct console *console, HANDLE signal )
+{
+ HANDLE signal_event = NULL;
+ HANDLE wait_handles[2];
+ unsigned int wait_cnt = 0;
+ unsigned short signal_id;
+ IO_STATUS_BLOCK signal_io;
+ NTSTATUS status;
+ DWORD res;
+
+ if (signal)
+ {
+ if (!(signal_event = CreateEventW( NULL, TRUE, FALSE, NULL ))) return 1;
+ status = NtReadFile( signal, signal_event, NULL, NULL, &signal_io, &signal_id,
+ sizeof(signal_id), NULL, NULL );
+ if (status && status != STATUS_PENDING) return 1;
+ }
- WINE_FIXME("stub:");
- for (i = 0; i < argc; i++)
- WINE_FIXME(" %s", wine_dbgstr_w(argv[i]));
- WINE_FIXME("\n");
+ wait_handles[wait_cnt++] = console->server;
+ if (signal) wait_handles[wait_cnt++] = signal_event;
+
+ for (;;)
+ {
+ res = WaitForMultipleObjects( wait_cnt, wait_handles, FALSE, INFINITE );
+
+ switch (res)
+ {
+ case WAIT_OBJECT_0:
+ FIXME( "console ioctls not yet implemented\n" );
+ return 1;
+
+ case WAIT_OBJECT_0 + 1:
+ if (signal_io.Status || signal_io.Information != sizeof(signal_id))
+ {
+ TRACE( "signaled quit\n" );
+ return 0;
+ }
+ FIXME( "unimplemented signal %x\n", signal_id );
+ status = NtReadFile( signal, signal_event, NULL, NULL, &signal_io, &signal_id,
+ sizeof(signal_id), NULL, NULL );
+ if (status && status != STATUS_PENDING) return 1;
+ break;
+
+ default:
+ TRACE( "wait failed, quit\n");
+ return 0;
+ }
+ }
return 0;
}
+
+int __cdecl wmain(int argc, WCHAR *argv[])
+{
+ int headless = 0, i, width = 80, height = 150;
+ HANDLE signal = NULL;
+ WCHAR *end;
+
+ static struct console console;
+
+ for (i = 0; i < argc; i++) TRACE("%s ", wine_dbgstr_w(argv[i]));
+ TRACE("\n");
+
+ for (i = 1; i < argc; i++)
+ {
+ if (!wcscmp( argv[i], L"--headless"))
+ {
+ headless = 1;
+ continue;
+ }
+ if (!wcscmp( argv[i], L"--width" ))
+ {
+ if (++i == argc) return 1;
+ width = wcstol( argv[i], &end, 0 );
+ if (!width || width > 0xffff || *end) return 1;
+ continue;
+ }
+ if (!wcscmp( argv[i], L"--height" ))
+ {
+ if (++i == argc) return 1;
+ height = wcstol( argv[i], &end, 0 );
+ if (!height || height > 0xffff || *end) return 1;
+ continue;
+ }
+ if (!wcscmp( argv[i], L"--signal" ))
+ {
+ if (++i == argc) return 1;
+ signal = ULongToHandle( wcstol( argv[i], &end, 0 ));
+ if (*end) return 1;
+ continue;
+ }
+ if (!wcscmp( argv[i], L"--server" ))
+ {
+ if (++i == argc) return 1;
+ console.server = ULongToHandle( wcstol( argv[i], &end, 0 ));
+ if (*end) return 1;
+ continue;
+ }
+ FIXME( "unknown option %s\n", debugstr_w(argv[i]) );
+ return 1;
+ }
+
+ if (!headless)
+ {
+ FIXME( "windowed mode not supported\n" );
+ return 0;
+ }
+
+ if (!console.server)
+ {
+ ERR( "no server handle\n" );
+ return 1;
+ }
+
+ return main_loop( &console, signal );
+}
More information about the wine-cvs
mailing list