/* * Initialization segment for the Windows Win100 emulator. * This code is discarded after it is used. * * Copyright (c) 1990, 1991 by * William S. Hall * 3665 Benton Street, #66 * Santa Clara, CA 95051 * * $Date$ * $Revision$ * $RCSfile$ * $Source$ * $State$ */ #define NOKANJI #define NOMINMAX #define NOSOUND #include #include #include #include #include #ifdef COLUMBIA #include "wktsmt.h" #else #include "smterm.h" #endif #ifdef WIN600 #include "grterm.h" #endif #ifdef COLUMBIA #include "wkt100.h" #else #include "win600.h" #endif static char *szInitKeyStr; static int Initlen; static BOOL WinIniModified = FALSE; #define INITKEYSIZE 1024 /* local function declarations */ static BOOL NEAR RegisterWindowClass(HANDLE); static void NEAR GetCurrentInstanceData(HANDLE hInstance); static void NEAR GetPrevInstanceData(HANDLE); static BOOL NEAR MakeAndShowMainWnd(HANDLE, HANDLE, int); static BOOL NEAR ReadInitialData(HANDLE hInstance); static BOOL NEAR OpenAndSetCommPort(HANDLE hInstance); static BOOL NEAR SearchKey(char *str, char *key, int len); static int NEAR GetInitData(int id, int defval); /* This routine is FAR since it is called from another segment */ BOOL FAR InitProgram(hInstance,hPrevInstance, lpszCmdLine, cmdShow) HANDLE hInstance, hPrevInstance; LPSTR lpszCmdLine; int cmdShow; { /*** GET COMMAND LINE ? ***/ hInst = hInstance; DoMessage = DoPeekMessage; /* if this is the first instance of the program ... */ if (!hPrevInstance) { GetCurrentInstanceData(hInstance); if (!RegisterWindowClass(hInstance)) return FALSE; hAccel = LoadAccelerators(hInstance, (LPSTR)szAppName); } /* A previous instance already exists so get global data from there */ else GetPrevInstanceData(hPrevInstance); if (!ReadInitialData(hInstance)) return FALSE; /* Create and show the window */ if (!MakeAndShowMainWnd(hInstance,hPrevInstance, cmdShow)) return FALSE; hWndText = MakeAndShowTermWindow(hInstance, hPrevInstance, MWnd.hWnd, &Smt, ColorTable[Initdata.TextColor], ColorTable[Initdata.BGColor], 0,0, Initdata.TermRows, Initdata.TermCols, Initdata.Wrap, Initdata.Fontface, Initdata.NFontWidth, Initdata.NFontHeight, Initdata.SFontWidth, Initdata.SFontHeight); if (hWndText == 0) PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L); #ifdef WIN600 if (!MakeAndShowGraphWindow(hInstance, hPrevInstance, MWnd.hWnd, &Grt, ColorTable[Initdata.TextColor], ColorTable[Initdata.BGColor], 0,0, 1024,800 )) PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L); #endif hWndNext = SetClipboardViewer(MWnd.hWnd); curproto.type = 'A'; if (Initdata.EWidth == 7) curproto.mask = 0x7f; else curproto.mask = 0xff; hWndActive = hWndText; SetAlphaParams(Initdata.AlphaEmulation); LocalEcho = Initdata.LocalEcho; if (Initdata.LocalMode) { LineState = LOCAL_ON; DoMessage = DoGetMessage; } else { LineState = LINE_ON + LocalEcho; DoMessage = DoPeekMessage; } if (Initdata.ReverseVideo) { InvertScreen(TRUE); MWnd.Reverse = TRUE; } cid = INT_MIN; if (!OpenAndSetCommPort(hInstance)) PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L); else { MWnd.Cursor = Initdata.Cursor ? TRUE : FALSE; MWnd.CursorType = Initdata.CursorType ? TRUE : FALSE; MWnd.BreakEnabled = Initdata.BreakEnabled ? TRUE : FALSE; MWnd.CurKeyMode = Initdata.CursorKeys ? TRUE : FALSE; MWnd.DeleteKey = Initdata.DeleteKey ? TRUE : FALSE; MWnd.AutoAnswer = Initdata.AutoAnswer ? TRUE : FALSE; MWnd.LFCR = Initdata.LFCR ? TRUE : FALSE; MWnd.ApplMode = Initdata.AltKeypad ? TRUE : FALSE; MWnd.WarningBell = Initdata.WarningBell ? TRUE : FALSE; MWnd.Wrap = Initdata.Wrap; MWnd.ControlRep = Initdata.ControlRep; if (MWnd.ControlRep) { if (curproto.atype == 52) vt52SetState(-1); else vt100SetState(-1); SendMessage(hWndActive, SMT_SETATTRIBUTE, SM_AUTOWRAP, (LONG)TRUE); } SendMessage(hWndText,SMT_SETATTRIBUTE,SM_MARGINBELL, (LONG)Initdata.MarginBell); SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SMOOTHSCROLL, (LONG)Initdata.SmoothScroll); SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SCROLLUNITS, (LONG)Initdata.ScrollUnits); /* finally, display the window and show success */ ShowWindow(MWnd.hWnd, cmdShow); UpdateWindow(MWnd.hWnd); } return TRUE; } void FAR MainWndCreate(HWND hWnd, LONG lParam) { MWnd.TextColor = Initdata.TextColor; MWnd.BGColor = Initdata.BGColor; MWnd.hBrush = CreateSolidBrush(ColorTable[Initdata.BGColor]); } static BOOL NEAR SearchKey(char *str, char *key, int len) { int i; char *startptr; startptr = str; for (i = 0; i < len; i++) { if (*str++) ; else { if (strcmp(key, startptr) == 0) return(TRUE); startptr = str; } } return (FALSE); } static BOOL NEAR ReadInitialData(HANDLE hInstance) { char szKeyStr[80]; char szDefStr[80]; HANDLE hInitKeyStr; register int i, val; HDC hIC; int cwidth, cheight; HFONT hOldFont; TEXTMETRIC tm; GetModuleFileName(hInstance, szHelpName, sizeof(szHelpName)); lstrcpy(szIniName, szHelpName); lstrcpy(szHelpName + strlen(szHelpName) - 3, "HLP"); lstrcpy(szIniName + strlen(szIniName) - 3, "INI"); hIC = CreateIC("DISPLAY", NULL, NULL, NULL); MWnd.PelSize = GetDeviceCaps(hIC,BITSPIXEL) * GetDeviceCaps(hIC,PLANES); hOldFont = SelectObject(hIC, GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hIC, &tm); cwidth = tm.tmAveCharWidth; cheight = tm.tmHeight + tm.tmExternalLeading; SelectObject(hIC, hOldFont); DeleteDC(hIC); hInitKeyStr = LocalAlloc(LPTR, INITKEYSIZE); if ((szInitKeyStr = LocalLock(hInitKeyStr)) == NULL) return FALSE; Initlen = GetPrivateProfileString(szAppName, NULL, "", szInitKeyStr, INITKEYSIZE, szIniName); /* default ports */ for (i = 0; i < MAXCOMPORTS; i++) { LoadString(hInstance,IDS_FIRSTPORT+i,(LPSTR)szKeyStr,sizeof(szKeyStr)); LoadString(hInstance,IDS_COM1 + i, (LPSTR)szDefStr, sizeof(szDefStr)); if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) { WinIniModified = TRUE; WritePrivateProfileString(szAppName,szKeyStr,szDefStr, szIniName); } GetPrivateProfileString(szAppName,szKeyStr,szDefStr, Initdata.portname[i], sizeof(Initdata.portname[i]), szIniName); } /* comm parameters */ Initdata.BaudRate = (WORD)GetInitData(IDS_BAUD, DEFBAUD); for (i = 0; i < BAUDRATETABLESIZE; i++) if (BaudRateTable[i] == Initdata.BaudRate) break; if (i == BAUDRATETABLESIZE) Initdata.BaudRate = DEFBAUD; Initdata.Parity = (BYTE)GetInitData(IDS_PARITY, DEFPARITY); Initdata.ByteSize = (BYTE)GetInitData(IDS_BYTESIZE, DEFBYTESIZE); for (i = 0; i < PARITYTABLESIZE; i++) if ((ParityTable[i].Parity == Initdata.Parity) && (ParityTable[i].ByteSize == Initdata.ByteSize)) break; if (i == PARITYTABLESIZE) { Initdata.ByteSize = DEFBYTESIZE; Initdata.Parity = DEFPARITY; } Initdata.StopBits = (BYTE)GetInitData(IDS_STOPBITS, DEFSTOP); Initdata.fParity = (BYTE)GetInitData(IDS_PARCHECK, DEFPECHECK); Initdata.XonXoff = (BYTE)GetInitData(IDS_XONXOFF, DEFXONXOFF); Initdata.XoffLim = (WORD)GetInitData(IDS_XOFFLIM, DEFXOFFLIM); for (i = 0; i < XOFFLIMSIZE; i++) if (XoffSizeTable[i] == Initdata.XoffLim) break; if (i == XOFFLIMSIZE) Initdata.XoffLim = DEFXOFFLIM; Initdata.LocalEcho = GetInitData(IDS_LOCALECHO, DEFLOCALECHO) ? 1 : 0; Initdata.Wrap = GetInitData(IDS_WRAP, DEFWRAP) ? TRUE : FALSE; Initdata.LFCR = GetInitData(IDS_AUTOLFCR, DEFLFCR) ? TRUE : FALSE; Initdata.MarginBell = GetInitData(IDS_MARGINBELL, DEFMBELL) ? TRUE : FALSE; Initdata.ControlRep = GetInitData(IDS_CONTROLREP, DEFCONTROLREP) ? TRUE : FALSE; Initdata.Cursor = GetInitData(IDS_CURSOR, DEFCURSOR) ? TRUE : FALSE; Initdata.CursorType = GetInitData(IDS_CURSORTYPE, DEFCURSORTYPE) ? TRUE : FALSE; val = COLORTABLESIZE - 1; Initdata.BGColor = GetInitData(IDS_BGCOLOR, DEFBGCOLOR) & val; Initdata.TextColor = GetInitData(IDS_TEXTCOLOR, DEFTEXTCOLOR) & val; if (MWnd.PelSize == 1) { if (Initdata.BGColor) { Initdata.BGColor = val; Initdata.TextColor = 0; } else { Initdata.TextColor = val; Initdata.BGColor = 0; } } else { if (Initdata.TextColor == Initdata.BGColor) Initdata.TextColor = (~Initdata.BGColor) & val; } Initdata.WarningBell = GetInitData(IDS_WARNINGBELL, DEFWBELL) ? TRUE : FALSE; val = GetInitData(IDS_TERMTYPE, DEFTERMTYPE); Initdata.AlphaEmulation = ((val == 52) || (val == 100)) ? val : DEFTERMTYPE; val = GetInitData(IDS_EMULATIONWIDTH, DEFEWIDTH); Initdata.EWidth = ((val == 7) || (val == 8)) ? val : DEFEWIDTH; if (Initdata.AlphaEmulation == 52) Initdata.EWidth = 7; Initdata.ReverseVideo = GetInitData(IDS_REVERSEVIDEO, DEFVIDEO) ? TRUE : FALSE; Initdata.SmoothScroll = GetInitData(IDS_SMOOTHSCROLL, DEFSCROLL) ? TRUE : FALSE; val = GetInitData(IDS_SCROLLUNITS, DEFSCROLLUNITS); Initdata.ScrollUnits = ((val >= 0) && (val <= MAXSCROLLUNITS)) ? val : DEFSCROLLUNITS; Initdata.LocalMode = GetInitData(IDS_LOCALMODE, DEFLOCALMODE) ? TRUE : FALSE; Initdata.AltKeypad = GetInitData(IDS_ALTKEYPAD, DEFALTKEYPAD) ? TRUE : FALSE; Initdata.CursorKeys = GetInitData(IDS_CURSORKEYS, DEFCURSORKEYS) ? TRUE : FALSE; Initdata.BreakEnabled = GetInitData(IDS_BREAKKEYENABLED, DEFBREAKENABLED) ? TRUE : FALSE; Initdata.DeleteKey = GetInitData(IDS_DELETEKEY, DEFDELETEKEY) ? TRUE : FALSE; Initdata.AutoAnswer = GetInitData(IDS_AUTOANSWER, DEFAUTOANSWER) ? TRUE : FALSE; val = GetInitData(IDS_ROWS, DEFROWS); Initdata.TermRows = ((val >= 2) && (val <= MAXROWS)) ? val : DEFROWS; val = GetInitData(IDS_COLS, DEFCOLS); Initdata.TermCols = val > 80 ? 132 : 80; LoadString(hInstance, IDS_FONTFACE, (LPSTR)szKeyStr,sizeof(szKeyStr)); LoadString(hInstance, IDS_DEFAULTFONT, szDefStr, sizeof(szDefStr)); if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) { WinIniModified = TRUE; WritePrivateProfileString(szAppName, szKeyStr, szDefStr, szIniName); } GetPrivateProfileString(szAppName, szKeyStr, szDefStr, Initdata.Fontface, sizeof(Initdata.Fontface), szIniName); Initdata.NFontWidth = GetInitData(IDS_NORMALWIDTH, cwidth); if (Initdata.NFontWidth == 0) Initdata.NFontWidth = cwidth; Initdata.NFontHeight = GetInitData(IDS_NORMALHEIGHT, cheight); if (Initdata.NFontHeight == 0) Initdata.NFontHeight = cheight; Initdata.SFontWidth = GetInitData(IDS_SMALLWIDTH, cwidth); if (Initdata.SFontWidth == 0) Initdata.SFontWidth = cwidth; Initdata.SFontHeight = GetInitData(IDS_SMALLHEIGHT, cheight); if (Initdata.SFontHeight == 0) Initdata.SFontHeight = cheight; LocalUnlock(hInitKeyStr); LocalFree(hInitKeyStr); if (WinIniModified) BroadcastWinIniChange(); return TRUE; } static int NEAR GetInitData(int id, int defval) { char szKeyStr[80]; char buf[40]; LoadString(hInst, id, szKeyStr,sizeof(szKeyStr)); if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) { WinIniModified = TRUE; WritePrivateProfileString(szAppName,szKeyStr, itoa(defval, buf, 10), szIniName); } return GetPrivateProfileInt(szAppName, szKeyStr, defval, szIniName); } static BOOL NEAR OpenAndSetCommPort(HANDLE hInstance) { int i, reply; char szMessage[80]; char szBigMsg[160]; for (i = 0; i < MAXCOMPORTS; i++) { if ((cid = OpenComm(Initdata.portname[i], DEFRXQUE, DEFTXQUE)) < 0) { LoadString(hInstance,cid,szBigMsg,sizeof(szMessage)); LoadString(hInstance,IDS_TRYANOTHER,szMessage,sizeof(szMessage)); strcat(szBigMsg, szMessage); reply = MessageBox(MWnd.hWnd,(LPSTR)szBigMsg, (LPSTR)Initdata.portname[i], MB_ICONQUESTION | MB_YESNO); if (reply == IDNO) return FALSE; } else break; } if (i == MAXCOMPORTS) { // LoadString(hInstance, IDS_NOCOM, szMessage, sizeof(szMessage)); ShowMessage(MWnd.hWnd, IDS_NOCOM, MB_ICONEXCLAMATION | MB_OK); return FALSE; } LoadString(hInstance, IDS_TITLE, szMessage, sizeof(szMessage)); strcat(szMessage, Initdata.portname[i]); SetWindowText(MWnd.hWnd, szMessage); if ((reply = GetCommState(cid, (DCB FAR *)&CommData)) >= 0) { CommData.BaudRate = Initdata.BaudRate; CommData.ByteSize = Initdata.ByteSize; CommData.Parity = Initdata.Parity; CommData.StopBits = (BYTE)(Initdata.StopBits == 2 ? TWOSTOPBITS : ONESTOPBIT); CommData.fParity = (BYTE)(Initdata.fParity ? 1 : 0); CommData.fPeChar = CommData.fParity; CommData.PeChar = DEFPECHAR; CommData.fOutX = CommData.fInX = (BYTE)(Initdata.XonXoff ? TRUE : FALSE); CommData.XonChar = DEFXONCHAR; CommData.XoffChar = DEFXOFFCHAR; CommData.XonLim = DEFXONLIM; CommData.XoffLim = DEFRXQUE - Initdata.XoffLim; CommData.fBinary = TRUE; CommData.fDtrDisable = FALSE; CommData.fNull = TRUE; if ((reply = SetCommState((DCB FAR *)&CommData)) >= 0) return TRUE; } ShowMessage(MWnd.hWnd, reply, MB_OK | MB_ICONEXCLAMATION); CloseCommPort(MWnd.hWnd, &cid); return FALSE; } static void NEAR GetCurrentInstanceData(HANDLE hInstance) { LoadString(hInstance, IDS_ICON, (LPSTR)szIcon, sizeof(szIcon)); } /* If this not the first instance, we can retrieve static data from a previous invocation of the program */ static void NEAR GetPrevInstanceData(HANDLE hPrevInstance) { GetInstanceData(hPrevInstance, (PSTR)szAppName, sizeof(szAppName)); GetInstanceData(hPrevInstance, (PSTR)szIcon, sizeof(szIcon)); GetInstanceData(hPrevInstance, (PSTR)&hAccel, sizeof(hAccel)); } /* Every window must belong to a class. We register ours here */ static BOOL NEAR RegisterWindowClass(HANDLE hInstance) { PWNDCLASS pWndClass; HANDLE hTemp; /* Load the name string from resources */ LoadString(hInstance, IDS_APPNAME,(LPSTR)szAppName,sizeof(szAppName)); /* allocate space for the WNDCLASS structure and lock it down */ hTemp = LocalAlloc(LPTR,sizeof(WNDCLASS)); pWndClass = (PWNDCLASS)LocalLock(hTemp); /* fill the structure */ pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW); /* standard cursor */ pWndClass->hIcon = NULL; /* no icon */ pWndClass->lpszMenuName = (LPSTR)szAppName; pWndClass->lpszClassName = (LPSTR)szAppName; /* our class name */ pWndClass->hbrBackground = (HBRUSH)NULL; pWndClass->hInstance = hInstance; /* instance handle */ pWndClass->style = CS_VREDRAW | CS_HREDRAW; /* standard redraw values */ pWndClass->lpfnWndProc = MainWndProc; /* pointer to our window proc */ pWndClass->cbClsExtra = 0; pWndClass->cbWndExtra = sizeof(pMWND); /* register the class. if fail, abort */ if (!RegisterClass((LPWNDCLASS)pWndClass)) return FALSE; /* free the memory used */ LocalUnlock(hTemp); LocalFree(hTemp); /* show success */ return TRUE; } /* Create the window, making sure that its position and size are suitable for the display. */ static BOOL NEAR MakeAndShowMainWnd(HANDLE hInstance, HANDLE hPrevInstance, int cmdShow) { char szTitle[50]; DWORD style = WS_HSCROLL | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN; int x, y, cx, cy; int cwidth, cheight; LoadString(hInstance, IDS_TITLE,(LPSTR)szTitle,sizeof(szTitle)); if (hPrevInstance) x = CW_USEDEFAULT; else x = 0; y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); if (Initdata.TermCols == MAXCOLUMNS) { cwidth = Initdata.SFontWidth; cheight = Initdata.SFontHeight; } else { cwidth = Initdata.NFontWidth; cheight = Initdata.NFontHeight; } cx = Initdata.TermCols * cwidth + 2 * GetSystemMetrics(SM_CXFRAME); cx = min(GetSystemMetrics(SM_CXSCREEN), cx); cy = Initdata.TermRows * cheight + 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYHSCROLL); cy = min(GetSystemMetrics(SM_CYSCREEN) - y, cy); if (MWnd.hWnd = CreateWindow((LPSTR)szAppName, (LPSTR)szTitle, style, x, y, cx, cy, (HWND)NULL, (HMENU)NULL, (HANDLE)hInstance, (LPSTR)NULL)) return TRUE; return FALSE; }