summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/host/src/nt_hosts.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/softpc.new/host/src/nt_hosts.c')
-rw-r--r--private/mvdm/softpc.new/host/src/nt_hosts.c343
1 files changed, 343 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/host/src/nt_hosts.c b/private/mvdm/softpc.new/host/src/nt_hosts.c
new file mode 100644
index 000000000..bbf99e7a5
--- /dev/null
+++ b/private/mvdm/softpc.new/host/src/nt_hosts.c
@@ -0,0 +1,343 @@
+/***************************************************************************
+ * *
+ * PROGRAM : HOST_UIS.c *
+ * *
+ * PURPOSE : Host UI code *
+ * *
+ ****************************************************************************/
+
+
+#include <windows.h>
+#include "conapi.h"
+#include "insignia.h"
+#include "host_def.h"
+
+#include "xt.h"
+#include "gvi.h"
+#include "gmi.h"
+#include <stdio.h>
+#include "trace.h"
+#include "debug.h"
+#include "host_rrr.h"
+
+#include "nt_graph.h"
+#include "nt_event.h"
+#include "nt_uis.h"
+#include "nt_reset.h"
+
+#ifdef HUNTER
+#include "nt_hunt.h"
+#endif /*HUNTER*/
+
+/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::: Global variables */
+
+HANDLE InstHandle;
+
+
+CONSOLE_CURSOR_INFO StartupCursor;
+
+/*:::::::::::::::::::::::::::::::::::::::: Fast graphics associated defines */
+
+BYTE Red[] = { 0, 0, 0, 0, 128, 128, 128, 192, 128, 0, 0,
+ 0, 255, 255, 255, 255 };
+
+BYTE Green[]={ 0, 0, 128, 128, 0, 0, 128, 192, 128, 0, 255,
+ 255, 0, 0, 255, 255 };
+
+BYTE Blue[] ={ 0, 128, 0, 128, 0, 128, 0, 192, 128, 255, 0,
+ 255, 0, 255, 0, 255 };
+
+/*:::::::::::::::::::::::::::::::::::::::::::::::::::::: External functions */
+
+LONG nt_process_event(HWND hWnd, WORD message, LONG wParam, LONG lParam);
+
+/*::::::::::::::::::::::::::::::::::::::::::::: Internal function protocols */
+
+BOOL SoftInit(void);
+WORD HeartBeat(HWND hWnd, WORD msg, int nIDEvent, DWORD dwTime);
+
+PSTR String(WORD StrResID);
+void InitScreenDesc(void);
+
+#ifdef HUNTER
+void HunterMenuMake(void);
+#endif /* HUNTER */
+
+HANDLE SCS_hStdIn=0;
+HANDLE SCS_hStdOut=0;
+HANDLE SCS_hStdErr=0;
+
+/****************************************************************************
+ * *
+ * FUNCTION : init_host_uis() *
+ * *
+ * PURPOSE : Creates the main app. window, calls an initialization *
+ * functions *
+ * *
+ ****************************************************************************/
+
+int init_host_uis()
+{
+ InitScreenDesc();
+
+ if(CreateDisplayPalette())
+ {
+ SelectPalette(sc.DispDC,sc.ColPalette,0);/* Select foreground palette */
+ }
+
+ return(1);
+}
+
+/****************************************************************************
+ * *
+ * FUNCTION : SetupConsoleMode() *
+ * *
+ * PURPOSE : Setup console mode and get handles *
+ * *
+ ****************************************************************************/
+
+void SetupConsoleMode(void)
+{
+ DWORD mode;
+
+ /*::::::::::::::::::::::::::::::::::::::::::: Set console input mode */
+
+ if(!GetConsoleMode(sc.InputHandle, &sc.OrgInConsoleMode))
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+ mode = sc.OrgInConsoleMode &
+ ~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
+ if (!host_stream_io_enabled)
+ mode |= (ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
+
+ /*.............................................. Set new console mode */
+
+ if(!SetConsoleMode(sc.InputHandle,mode))
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(), __FILE__,__LINE__);
+ /*::::::::::::::::::::::::::::::::::::::::::: Set console output mode */
+
+ if(!GetConsoleMode(sc.OutputHandle, &sc.OrgOutConsoleMode))
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+
+ /*.............................................. Set new console mode */
+
+ if(!stdoutRedirected && !host_stream_io_enabled)
+ {
+ mode = sc.OrgOutConsoleMode &
+ ~(ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_PROCESSED_OUTPUT);
+
+ if(!SetConsoleMode(sc.OutputHandle,mode))
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(), __FILE__,__LINE__);
+ }
+
+ if(!GetConsoleCursorInfo(sc.OutputHandle, &StartupCursor))
+ {
+ assert1(NO, "NTVDM:can't get initial cursor size. Err %d", GetLastError());
+ /* add own defaults */
+ StartupCursor.dwSize = 20;
+ StartupCursor.bVisible = TRUE;
+ }
+ if(!GetConsoleScreenBufferInfo(sc.OutputHandle, &sc.ConsoleBuffInfo))
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(), __FILE__,__LINE__);
+
+}
+
+
+/****************************************************************************
+ * *
+ * FUNCTION : InitScreenDesc *
+ * *
+ * PURPOSE : Initialise screen description structure *
+ * *
+ ****************************************************************************/
+
+void InitScreenDesc(void)
+{
+SECURITY_ATTRIBUTES sa;
+
+ /*::::::::::::::::::::::::::::::::::::::::::: Get console output handle */
+
+ if((sc.OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+ //
+ // Save this handle as the active handle until a new one is
+ // selected.
+ //
+
+ sc.ActiveOutputBufferHandle = sc.OutputHandle;
+ sc.ScreenBufHandle = (HANDLE)0;
+
+ /*:::::::::::::::::::::::::::::::::::::::::::: Get console input handle */
+
+ if((sc.InputHandle = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE)
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+
+ /*:::::::::::::::::::::::::::::: check out if stdin has been redirected */
+
+ if(GetFileType(sc.InputHandle) != FILE_TYPE_CHAR)
+ {
+ sa.nLength = sizeof (SECURITY_ATTRIBUTES);
+ sa.lpSecurityDescriptor = NULL;
+ sa.bInheritHandle = TRUE;
+ sc.InputHandle = CreateFile("CONIN$",GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ &sa,OPEN_EXISTING, 0, NULL);
+
+ if(sc.InputHandle == (HANDLE)-1)
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+ else{
+ SetStdHandle (STD_INPUT_HANDLE,sc.InputHandle);
+ }
+ }
+
+ /*:::::::::::::::::::::::::::: check out if stdout has been redirected */
+
+ if(GetFileType(sc.OutputHandle) != FILE_TYPE_CHAR)
+ {
+ stdoutRedirected = TRUE;
+ sa.nLength = sizeof (SECURITY_ATTRIBUTES);
+ sa.lpSecurityDescriptor = NULL;
+ sa.bInheritHandle = TRUE;
+ sc.OutputHandle = CreateFile("CONOUT$",GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ &sa,OPEN_EXISTING, 0, NULL);
+
+ if(sc.OutputHandle == (HANDLE)-1)
+ DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+ else {
+ SetStdHandle (STD_OUTPUT_HANDLE,sc.OutputHandle);
+ SetStdHandle (STD_ERROR_HANDLE,sc.OutputHandle);
+ }
+ }
+
+ // Keep SCS in sync with these handles for starting non-dos binaries
+ SCS_hStdIn = sc.InputHandle;
+ SCS_hStdOut = sc.OutputHandle;
+ SCS_hStdErr = sc.OutputHandle;
+
+ /*:::::::::::::::::::::::::::::::::::::::::::::::::: Setup console mode */
+
+ SetupConsoleMode();
+
+#ifdef HUNTER
+ HunterMenuMake();
+#endif /*HUNTER*/
+
+ /*::::::::::::::::::::::::::: Tell console to post us a closedown event */
+
+ // we only want notification for DOS NTVDM runnig on an existing console
+ if (!VDMForWOW && !DosSessionId)
+ SetLastConsoleEventActive();
+ sc.StaticPalette = TRUE;
+ sc.FontsAreOpen = FALSE;
+}
+/****************************************************************************
+ * *
+ * FUNCTION : BOOL CreateDisplayPalette(void) *
+ * *
+ * PURPOSE : Create logical palette *
+ * Assumes Colour monitor supporting 16 colours *
+ * *
+ ****************************************************************************/
+
+BOOL CreateDisplayPalette(void)
+{
+ register int i;
+ register PALETTEENTRY *PalEntry;
+ NPLOGPALETTE LogPalette; /* Pointer to logical palette */
+
+ /*::::::: Allocate memory for a logical palette with PALETTESIZE entries */
+
+ LogPalette = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED,
+ (sizeof(LOGPALETTE) +
+ (sizeof(PALETTEENTRY) * PALETTESIZE)));
+
+ /*:::::::::::::::::::::::::::::::::::::::::::::::: Allocation failed !! */
+
+ if(!LogPalette) return(FALSE); /* Function failed, no memory */
+
+ /*::: Set the size and version fields of the logical palette structure. */
+
+ LogPalette->palVersion = 0x300;
+ LogPalette->palNumEntries = PALETTESIZE;
+
+ /*::::::::::::::::::: Fill in intensities for all palette entry colors */
+
+ for(i=0,PalEntry=LogPalette->palPalEntry; i < PALETTESIZE;i++,PalEntry++)
+ {
+ if(i < sizeof(Red)/sizeof(BYTE))
+ {
+ PalEntry->peRed = Red[i]; PalEntry->peGreen = Green[i];
+ PalEntry->peBlue = Blue[i];
+ }
+ else
+ {
+ PalEntry->peRed = PalEntry->peGreen = PalEntry->peBlue = 0;
+ }
+
+ PalEntry->peFlags = sc.StaticPalette ? 0 : PC_RESERVED;
+ }
+
+ /*:::::::: Create a logical color palette from the LOGPALETTE structure */
+
+ sc.ColPalette = CreatePalette((LPLOGPALETTE) LogPalette);
+ LocalFree((HANDLE)LogPalette);
+
+ return(sc.ColPalette ? TRUE : FALSE);
+}
+
+
+/*============================================================================
+Function to display a menu option on the Console system menu. This is used for
+the control of Trapper.
+============================================================================*/
+
+#ifdef HUNTER
+void HunterMenuMake(void)
+{
+HMENU hTest,hTrapperPopup,hMainPopup,hErrorPopup;
+static BOOL bTrapperMenuFlag=FALSE;
+
+if(!bTrapperMenuFlag)
+ {
+ /*========================================================================
+ The Menus have been drawn once already. Need to delete these and reappend
+ them to the Console menu for the new output buffer. Isn't Console just such
+ a bore?
+ ========================================================================*/
+
+ DestroyMenu(hTrapperPopup);
+ DestroyMenu(hMainPopup);
+ DestroyMenu(hErrorPopup);
+ }
+
+hTrapperPopup = CreateMenu();
+hMainPopup = CreateMenu();
+hErrorPopup = CreateMenu();
+
+AppendMenu(hMainPopup,MF_STRING,IDM_MFAST,"&Fast forward");
+AppendMenu(hMainPopup,MF_STRING,IDM_MNEXT,"&Next screen");
+AppendMenu(hMainPopup,MF_STRING,IDM_MPREV,"&Prev screen");
+AppendMenu(hMainPopup,MF_STRING,IDM_MSHOW,"&Show screen");
+AppendMenu(hMainPopup,MF_STRING,IDM_MCONT,"&Continue");
+AppendMenu(hMainPopup,MF_STRING,IDM_MABOR,"&Abort");
+
+AppendMenu(hErrorPopup,MF_STRING,IDM_EFLIP,"&Flip screen");
+AppendMenu(hErrorPopup,MF_STRING,IDM_ENEXT,"&Next error");
+AppendMenu(hErrorPopup,MF_STRING,IDM_EPREV,"&Prev error");
+AppendMenu(hErrorPopup,MF_STRING,IDM_EALL,"&All errors");
+AppendMenu(hErrorPopup,MF_STRING,IDM_ECLEA,"&Clear errors");
+
+AppendMenu(hTrapperPopup,MF_POPUP,hMainPopup,"&Main");
+AppendMenu(hTrapperPopup,MF_POPUP,hErrorPopup,"&Error");
+
+/* if graphics mode, then use sc.ScreenBuffer */
+
+/* hTest = ConsoleMenuControl(sc.ScreenBuffer,IDM_TRAPPER,IDM_ECLEA); */
+
+/* else text mode, then use sc.OutputHandle */
+hTest = ConsoleMenuControl(sc.OutputHandle,IDM_TRAPPER,IDM_ECLEA);
+
+AppendMenu(hTest,MF_POPUP,hTrapperPopup,"&Trapper");
+bTrapperMenuFlag=TRUE; /* draw the trapper menu just once */
+}
+#endif /* HUNTER */