windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/dcutil3.c

515 lines
17 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#define NOLSTRING TRUE /* jtf win3 mod */
#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "video.h"
/*---------------------------------------------------------------------------*/
/* offCursor() - Turn off terminal emulation cursor. [scf] */
/*---------------------------------------------------------------------------*/
VOID offCursor ()
{
if (activTerm)
{
cursorOn--;
if (cursorOn == 0)
{
if (cursBlinkOn)
toggleCursor(&cursorRect);
}
else
if(cursorOn < 0)
cursorOn = 0;
}
}
/*---------------------------------------------------------------------------*/
/* onCursor() - Turn on the terminal emulation cursor. [scf] */
/*---------------------------------------------------------------------------*/
VOID onCursor ()
{
if (activTerm)
{
cursorOn++;
if (cursorOn == 1)
{
cursorTick = 1;
rectCursor (&cursorRect);
cursBlinkOn = FALSE;
toggleCursor (&cursorRect);
}
else
if (cursorOn > 1)
cursorOn = 1;
}
}
/*---------------------------------------------------------------------------*/
/* rectCursor() - Set the terminal cursor rectangle. [scf] */
/*---------------------------------------------------------------------------*/
VOID rectCursor(RECT *theRect)
{
if(activCursor > 0)
{
if(statusLine)
theRect->top = statusRect.top + (STATUSRECTBORDER / 2);
else
theRect->top = (savTopLine - curTopLine + curLin) * chrHeight;
theRect->bottom = theRect->top + chrHeight;
if(trmParams.termCursor != ITMBLKCURSOR)
theRect->top += ((3 * chrHeight) / 4);
else
theRect->top++; /* jtf terminal changed to make cursor smaller */
if(statusLine || (attrib[curLin][LATTRIB] == LNORMAL))
{
theRect->left = (curCol - curLeftCol) * chrWidth;
theRect->right = theRect->left + chrWidth;
}
else
{
theRect->left = curCol * chrWidth * 2 - curLeftCol * chrWidth;
theRect->right = theRect->left + chrWidth * 2;
}
}
}
/*---------------------------------------------------------------------------*/
/* toggleCursor() - Toggle the terminal emulation cursor visible or not */
/*---------------------------------------------------------------------------*/
VOID toggleCursor(RECT *theRect)
{
RECT clientRect;
if(activCursor > 0)
{
getPort();
cursBlinkOn = !cursBlinkOn;
/* mbbx 1.04: for lack of a better method... */
if(theRect->top == statusRect.top + (STATUSRECTBORDER / 2))
clipRect(&statusRect);
else
clipRect(&hTE.viewRect);
InvertRect(thePort, theRect);
releasePort();
}
}
/*---------------------------------------------------------------------------*/
/* hideTermCursor */
/*---------------------------------------------------------------------------*/
VOID hideTermCursor ()
{
if (activCursor == 1)
offCursor ();
activCursor--;
}
/*---------------------------------------------------------------------------*/
/* showTermCursor */
/*---------------------------------------------------------------------------*/
VOID showTermCursor ()
{
activCursor++;
if (activCursor == 1)
onCursor ();
}
/*---------------------------------------------------------------------------*/
/* stripBlanks() - Purge unecessary CHFILL's for text file. [scf] */
/*---------------------------------------------------------------------------*/
VOID stripBlanks (LPBYTE ptr, DWORD *len)
{
register INT src;
register INT dst;
INT deltaLen;
ptr[*len] = 0; /* Terminate for 'C' */
for (src = (INT) *len; src > 0; src = dst - 1)
{
while ( (src > 0) && (ptr[src] != CR) ) /* jtf 3.11 fixed segmentation error */
src--;
dst = src - 1;
while ((dst > 0) && (ptr[dst] == CHFILL) ) /* jtf 3.11 fixed segmentation error */
dst--;
dst++;
deltaLen = src - dst;
lmovmem (&ptr[src], &ptr[dst], (DWORD) (*len - src));
*len -= (DWORD) deltaLen;
}
ptr[*len] = 0;
}
/*---------------------------------------------------------------------------*/
/* loadTermFont() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID loadTermFont(LOGFONT *logFont)
{
HFONT hOldFont;
TEXTMETRIC fontMetrics;
INT ndx;
hOldFont = hTE.hFont;
if((hTE.hFont = CreateFontIndirect(logFont)) != hOldFont)
{
getPort();
SelectObject(thePort, hTE.hFont);
GetTextMetrics(thePort, &fontMetrics);
releasePort();
stdChrHeight = chrHeight = fontMetrics.tmHeight;
stdChrWidth = chrWidth = fontMetrics.tmMaxCharWidth;
for(ndx = 0; ndx < 256; ndx += 1)
vidCharWidths[ndx] = chrWidth;
if(hOldFont != NULL)
{
DeleteObject(hOldFont);
clearFontCache();
resetEmul();
if(!IsIconic(hItWnd)) /* rjs bugs 015 */
sizeTerm(0L);
}
}
}
/*---------------------------------------------------------------------------*/
/* nextFontSize() - [mbb] */
/*---------------------------------------------------------------------------*/
INT APIENTRY nextFontSize(const LOGFONT *lpLogFont, const TEXTMETRIC *lpTextMetrics,
DWORD FontType, LPARAM lpParam)
{
LPSTR lpData = (LPSTR)lpParam;
INT ndx, ndx2;
if(*lpData != 0)
{
if (FontType & RASTER_FONTTYPE)
{
for(ndx = 1; ndx <= 5; ndx += 1)
{
if((ndx2 = lpLogFont->lfHeight * ndx) > *lpData)
break;
lpData[ndx2] = (char)lpLogFont->lfHeight;
if(lpLogFont->lfQuality == PROOF_QUALITY) /* no scaling... */
break;
}
}
else /* vector font... */
lsetmem(lpData+1, lpLogFont->lfHeight, *lpData);
}
else if(lpLogFont->lfHeight == lpData[1])
{
lmovmem(lpLogFont, lpData, sizeof(LOGFONT));
return(FALSE);
}
return(TRUE); /* continue... */
}
/*---------------------------------------------------------------------------*/
/* listFontSizes() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID listFontSizes(BYTE *faceName, BYTE *sizeList, INT maxSize)
{
memset(sizeList+1, 0, *sizeList = (BYTE)maxSize);
getPort();
EnumFonts(thePort, faceName, nextFontSize, (LPARAM) sizeList);
releasePort();
}
/*---------------------------------------------------------------------------*/
/* buildTermFont() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID buildTermFont() /* mbbx 2.00: font selection... */
{
BYTE sizeList[64];
LOGFONT logFont;
if((hTE.hFont != NULL) && (trmParams.fontSize > 0))
{
strcpy(sizeList, trmParams.fontFace);
AnsiUpper((LPSTR)sizeList);
if(!strcmp(sizeList, "SYSTEM"))
LoadString(hInst, STR_INI_FONTFACE, trmParams.fontFace, LF_FACESIZE);
listFontSizes(trmParams.fontFace, sizeList, 64-1);
if((logFont.lfHeight = (sizeList[trmParams.fontSize] * 256)) != 0)
{
getPort();
EnumFonts(thePort, trmParams.fontFace, nextFontSize, (LPARAM) &logFont);
releasePort();
}
}
else
logFont.lfHeight = 0;
if(LOBYTE(logFont.lfHeight) == 0)
{
logFont.lfEscapement = 0;
logFont.lfOrientation = 0;
logFont.lfWeight = 0; /* rjs bugs 017 -> 0 to 200 */
logFont.lfItalic = FALSE;
logFont.lfUnderline = FALSE;
logFont.lfStrikeOut = FALSE;
logFont.lfCharSet = ANSI_CHARSET;
logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logFont.lfQuality = DEFAULT_QUALITY;
logFont.lfPitchAndFamily = FF_DONTCARE;
strcpy(logFont.lfFaceName, trmParams.fontFace);
}
logFont.lfHeight = trmParams.fontSize;
logFont.lfWidth = 0;
loadTermFont(&logFont);
}
/*---------------------------------------------------------------------------*/
/* clearFontCache() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID clearFontCache() /* mbbx 1.10 ... */
{
INT ndx;
for(ndx = 0; ndx < VID_MAXFONTCACHE; ndx += 1)
{
if(vidFontCache[ndx].hFont != NULL)
{
DeleteObject(vidFontCache[ndx].hFont);
vidFontCache[ndx].hFont = NULL;
vidFontCache[ndx].flags = 0;
}
}
}
/*---------------------------------------------------------------------------*/
/* calcDefaultAttrib() - [jtf] */
/*---------------------------------------------------------------------------*/
VOID calcDefaultAttrib() /* mbbx 1.03 ... */
{
INT ndx;
for(ndx = 3; ndx < 32; ndx += 1) /* skip NORMAL, BOLD, REVERSE */
{
if((ndx == ABLINK) || (ndx == AUNDERLINE) || (ndx == APROTECT))
continue;
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = 0;
vidAttr[ndx].text[VID_GREEN] = 0;
vidAttr[ndx].text[VID_BLUE] = 0;
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = 0;
vidAttr[ndx].bkgd[VID_GREEN] = 0;
vidAttr[ndx].bkgd[VID_BLUE] = 0;
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags &= (VID_CALCTEXT | VID_CALCBKGD | VID_CALCATTR);
if(ndx & ABOLD)
{
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = min(vidAttr[ndx].text[VID_RED] + vidAttr[ABOLD].text[VID_RED], 255);
vidAttr[ndx].text[VID_GREEN] = min(vidAttr[ndx].text[VID_GREEN] + vidAttr[ABOLD].text[VID_GREEN], 255);
vidAttr[ndx].text[VID_BLUE] = min(vidAttr[ndx].text[VID_BLUE] + vidAttr[ABOLD].text[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = min(vidAttr[ndx].bkgd[VID_RED] + vidAttr[ABOLD].bkgd[VID_RED], 255);
vidAttr[ndx].bkgd[VID_GREEN] = min(vidAttr[ndx].bkgd[VID_GREEN] + vidAttr[ABOLD].bkgd[VID_GREEN], 255);
vidAttr[ndx].bkgd[VID_BLUE] = min(vidAttr[ndx].bkgd[VID_BLUE] + vidAttr[ABOLD].bkgd[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags |= (vidAttr[ABOLD].flags & VID_MASK);
}
if(ndx & AREVERSE)
{
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = min(vidAttr[ndx].text[VID_RED] + vidAttr[AREVERSE].text[VID_RED], 255);
vidAttr[ndx].text[VID_GREEN] = min(vidAttr[ndx].text[VID_GREEN] + vidAttr[AREVERSE].text[VID_GREEN], 255);
vidAttr[ndx].text[VID_BLUE] = min(vidAttr[ndx].text[VID_BLUE] + vidAttr[AREVERSE].text[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = min(vidAttr[ndx].bkgd[VID_RED] + vidAttr[AREVERSE].bkgd[VID_RED], 255);
vidAttr[ndx].bkgd[VID_GREEN] = min(vidAttr[ndx].bkgd[VID_GREEN] + vidAttr[AREVERSE].bkgd[VID_GREEN], 255);
vidAttr[ndx].bkgd[VID_BLUE] = min(vidAttr[ndx].bkgd[VID_BLUE] + vidAttr[AREVERSE].bkgd[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags |= (vidAttr[AREVERSE].flags & VID_MASK);
}
if(ndx & ABLINK)
{
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = min(vidAttr[ndx].text[VID_RED] + vidAttr[ABLINK].text[VID_RED], 255);
vidAttr[ndx].text[VID_GREEN] = min(vidAttr[ndx].text[VID_GREEN] + vidAttr[ABLINK].text[VID_GREEN], 255);
vidAttr[ndx].text[VID_BLUE] = min(vidAttr[ndx].text[VID_BLUE] + vidAttr[ABLINK].text[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = min(vidAttr[ndx].bkgd[VID_RED] + vidAttr[ABLINK].bkgd[VID_RED], 255);
vidAttr[ndx].bkgd[VID_GREEN] = min(vidAttr[ndx].bkgd[VID_GREEN] + vidAttr[ABLINK].bkgd[VID_GREEN], 255);
vidAttr[ndx].bkgd[VID_BLUE] = min(vidAttr[ndx].bkgd[VID_BLUE] + vidAttr[ABLINK].bkgd[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags |= (vidAttr[ABLINK].flags & VID_MASK);
}
if(ndx & AUNDERLINE)
{
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = min(vidAttr[ndx].text[VID_RED] + vidAttr[AUNDERLINE].text[VID_RED], 255);
vidAttr[ndx].text[VID_GREEN] = min(vidAttr[ndx].text[VID_GREEN] + vidAttr[AUNDERLINE].text[VID_GREEN], 255);
vidAttr[ndx].text[VID_BLUE] = min(vidAttr[ndx].text[VID_BLUE] + vidAttr[AUNDERLINE].text[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = min(vidAttr[ndx].bkgd[VID_RED] + vidAttr[AUNDERLINE].bkgd[VID_RED], 255);
vidAttr[ndx].bkgd[VID_GREEN] = min(vidAttr[ndx].bkgd[VID_GREEN] + vidAttr[AUNDERLINE].bkgd[VID_GREEN], 255);
vidAttr[ndx].bkgd[VID_BLUE] = min(vidAttr[ndx].bkgd[VID_BLUE] + vidAttr[AUNDERLINE].bkgd[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags |= (vidAttr[AUNDERLINE].flags & VID_MASK);
}
if(ndx & APROTECT)
{
if(vidAttr[ndx].flags & VID_CALCTEXT)
{
vidAttr[ndx].text[VID_RED] = min(vidAttr[ndx].text[VID_RED] + vidAttr[APROTECT].text[VID_RED], 255);
vidAttr[ndx].text[VID_GREEN] = min(vidAttr[ndx].text[VID_GREEN] + vidAttr[APROTECT].text[VID_GREEN], 255);
vidAttr[ndx].text[VID_BLUE] = min(vidAttr[ndx].text[VID_BLUE] + vidAttr[APROTECT].text[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCBKGD)
{
vidAttr[ndx].bkgd[VID_RED] = min(vidAttr[ndx].bkgd[VID_RED] + vidAttr[APROTECT].bkgd[VID_RED], 255);
vidAttr[ndx].bkgd[VID_GREEN] = min(vidAttr[ndx].bkgd[VID_GREEN] + vidAttr[APROTECT].bkgd[VID_GREEN], 255);
vidAttr[ndx].bkgd[VID_BLUE] = min(vidAttr[ndx].bkgd[VID_BLUE] + vidAttr[APROTECT].bkgd[VID_BLUE], 255);
}
if(vidAttr[ndx].flags & VID_CALCATTR)
vidAttr[ndx].flags |= (vidAttr[APROTECT].flags & VID_MASK);
}
}
}
/*---------------------------------------------------------------------------*/
/* setDefaultAttrib() - [jtf] */
/*---------------------------------------------------------------------------*/
VOID setDefaultAttrib(BOOL bLoad)
{
BYTE szSection[MINRESSTR], szKeyWord[MINRESSTR], szDefault[MINRESSTR];
BYTE work[16];
#ifdef ORGCODE
INT text[3], bkgd[3];
#else
DWORD text[3], bkgd[3]; // -sdj 10/8/91 bug#3279
#endif
INT ndx;
clearFontCache();
LoadString(hInst, STR_INI_COLORS, szSection, MINRESSTR);
LoadString(hInst, STR_INI_WINDOWTEXT, szKeyWord, MINRESSTR);
LoadString(hInst, STR_INI_TEXTCOLOR, szDefault, MINRESSTR);
GetProfileString(szSection, szKeyWord, szDefault, work, 16-1);
sscanf(work, "%d %d %d", text+0, text+1, text+2);
LoadString(hInst, STR_INI_WINDOW, szKeyWord, MINRESSTR);
LoadString(hInst, STR_INI_BKGDCOLOR, szDefault, MINRESSTR);
GetProfileString(szSection, szKeyWord, szDefault, work, 16-1);
sscanf(work, "%d %d %d", bkgd+0, bkgd+1, bkgd+2);
for(ndx = 0; ndx < 32; ndx += 1)
{
// -sdj 10/8/91 bug#3279 remove the hardcoded color stuff, new crt libs are in
vidAttr[ndx].text[VID_RED] = (BYTE)text[VID_RED];
vidAttr[ndx].text[VID_GREEN] = (BYTE)text[VID_GREEN];
vidAttr[ndx].text[VID_BLUE] = (BYTE)text[VID_BLUE];
vidAttr[ndx].bkgd[VID_RED] = (BYTE)bkgd[VID_RED];
vidAttr[ndx].bkgd[VID_GREEN] = (BYTE)bkgd[VID_GREEN];
vidAttr[ndx].bkgd[VID_BLUE] = (BYTE)bkgd[VID_BLUE];
vidAttr[ndx].flags = VID_CALCATTR | VID_CALCBKGD | VID_CALCTEXT;
}
vidAttr[ANORMAL].flags = 0;
vidAttr[ABOLD].flags = VID_BOLD;
vidAttr[AREVERSE].flags = VID_REVERSE;
vidAttr[ABLINK].flags = VID_BOLD;
vidAttr[AUNDERLINE].flags = VID_UNDERLINE;
vidAttr[APROTECT].flags = VID_REVERSE;
calcDefaultAttrib();
}