/* * Smart terminal init module * * Copyright (c) 1990, 1991 by * William S. Hall * 3665 Benton Street #66 * Santa Clara, CA 95051 * */ #define NOCOMM #define NOKANJI #define NOSOUND #define NOATOM #include #include #include #ifdef COLUMBIA #include "wktsmt.h" #else #include "smterm.h" #endif static char szSmartTermClass[50]; static int winnum = 0; /* register terminal emulator window */ BOOL NEAR RegisterTermWindow(HANDLE hInstance) { WNDCLASS WndClass; memset((char *)&WndClass, 0, sizeof(WndClass)); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); /* standard cursor */ WndClass.hIcon = NULL; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = (LPSTR)szSmartTermClass; WndClass.hbrBackground = (HBRUSH)NULL; WndClass.hInstance = hInstance; WndClass.style = CS_VREDRAW | CS_HREDRAW; WndClass.lpfnWndProc = SmartTermWndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = sizeof(PSMT); return RegisterClass((LPWNDCLASS)&WndClass); } /* create terminal emulation window */ HWND NEAR MakeAndShowTermWindow(HANDLE hInstance, HANDLE hPrevInstance, HWND hPar, PSMT pSmt, DWORD tcolor, DWORD bgcolor, short x, short y, short rows, short cols, BOOL wrap, char *fontface, short nwidth, short nheight, short swidth, short sheight ) { GetClassName(hPar, szSmartTermClass, sizeof(szSmartTermClass)); strcat(szSmartTermClass, "_SmartTerm"); if (!hPrevInstance) if (!RegisterTermWindow(hInstance)) return FALSE; pSmt->hMain = hPar; pSmt->TextColor = tcolor; pSmt->BGColor = bgcolor; pSmt->MaxCols = cols; pSmt->MaxLines = rows; pSmt->Wrap = wrap; strcpy(pSmt->lfnt.lfFaceName, fontface); pSmt->NFontWidth = nwidth; pSmt->NFontHeight = nheight; pSmt->SFontWidth = swidth; pSmt->SFontHeight = sheight; pSmt->vrect.left = x; pSmt->vrect.top = y; pSmt->rect.left = pSmt->srect.left = 0; pSmt->rect.top = pSmt->srect.top = 0; if (!(pSmt->hStatic = CreateWindow("STATIC", (LPSTR)NULL, WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, pSmt->vrect.left, pSmt->vrect.top, 0,0, hPar, winnum++, (HANDLE)hInstance, (LPSTR)NULL))) return FALSE; pSmt->hWnd = CreateWindow(szSmartTermClass, (LPSTR)NULL, WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS, pSmt->rect.left, pSmt->rect.top, 0,0, pSmt->hStatic, winnum++, (HANDLE)hInstance, (LPSTR)pSmt); if (pSmt->hWnd && pSmt->pVidBuffer) return (pSmt->hWnd); return 0; } void SmartTermWndCreate(HWND hWnd, LONG lParam) { LPCREATESTRUCT pCS; PSMT pSmt; register int i,j; pCS = (LPCREATESTRUCT)lParam; pSmt = (PSMT)LOWORD(pCS->lpCreateParams); SetWindowWord(hWnd,0,(WORD)pSmt); pSmt->hFont = SetFontData(pSmt); pSmt->hbr = CreateSolidBrush(pSmt->BGColor); pSmt->srect.right = pSmt->rect.right = pSmt->CharWidth * pSmt->MaxCols; pSmt->srect.bottom = pSmt->rect.bottom = pSmt->CharHeight * pSmt->MaxLines; pSmt->BufSize = MAXTEXTBUFFERS * pSmt->MaxLines * MAXCOLUMNS; pSmt->pVidBuffer = (WORD *)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, pSmt->BufSize * sizeof(WORD)); if (pSmt->pVidBuffer) { pSmt->MaxTextLines = MAXTEXTBUFFERS * pSmt->MaxLines; for (i = 0; i < pSmt->MaxTextLines; i++) { pSmt->lines[i] = (pSmt->pVidBuffer + i * MAXCOLUMNS); for (j = 0; j < MAXCOLUMNS; j++) *(pSmt->lines[i] + j) = SP; } pSmt->MaxScrollBack = pSmt->MaxTextLines - pSmt->MaxLines; pSmt->TopScroll = pSmt->TopOrgLine = 0; pSmt->BottomScroll = pSmt->BottomOrgLine = pSmt->MaxLines - 1; pSmt->CurLine = 0; pSmt->CurLineOffset = 0; pSmt->Pos.x = pSmt->Pos.y = 0; for (i = 0; i < MAXCOLUMNS; i++) { if ((i > 0) && ((i % 8) == 0)) pSmt->TabStops[i] = 'T'; else pSmt->TabStops[i] = SP; } } }