windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/wndproc.c
2020-09-26 16:20:57 +08:00

641 lines
19 KiB
C

/*===========================================================================*/
/* 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 "task.h"
#include "video.h"
#include "printfil.h"
extern BOOL bZoomFlag; /* itutil2.c - zoomTerm() [mbb] */
VOID NEAR PASCAL FreeList(HANDLE *hList)
{
GlobalUnlock(*hList);
GlobalFree(*hList);
}
/*---------------------------------------------------------------------------*/
/* DC_WndProc() [mbb] */
/*---------------------------------------------------------------------------*/
HWND dlgGetFocus() /* mbbx 2.01.85 ... */
{
HWND hWnd;
if(((hWnd = GetActiveWindow()) == NULL) || !IsChild(hItWnd, hWnd)) /* mbbx 2.01.179 (2.01.150) ... */
hWnd = hItWnd;
hWnd = GetActiveWindow(); /* jtf gold 044 */
if (hWnd == NULL) testMsg("BAD WINDOW",NULL,NULL);
return(hWnd);
}
VOID selectTopWindow() /* mbbx 1.03 ... */
{
HWND hTopWnd;
if(((hTopWnd = GetTopWindow(hItWnd)) == NULL) || (hTopWnd == hdbmyControls))
hTopWnd = hItWnd;
if (hTopWnd != NULL) /* jtfterm */
SetFocus(hTopWnd);
}
LRESULT APIENTRY DC_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT DC_WndProc = 0L;
// sdj: was unref local - HWND hTopWnd;
PAINTSTRUCT ps;
BYTE work[STR255]; /* jtf 3.15 */
// sdj: was unref local - RECT clipRect;
// sdj: was unref local - HDC tempDC;
INT testFlag; /* jtf 3.23 */
RECT hItWndRectToSave; // sdj: added this to save wndsize
char tmpstr[10];
BYTE str[MINRESSTR];
DEBOUT("DC_WndProc: msg[%lx] GOT IT\n",message);
switch(message)
{
case WM_WININICHANGE: /* jtf 3.21 */
setDefaultAttrib(TRUE);
InvalidateRect(hTermWnd, NULL, TRUE);
InvalidateRect(hdbmyControls, NULL, TRUE);
UpdateWindow(hTermWnd);
UpdateWindow(hdbmyControls);
break;
/* changed all wParam == hSomething to wParam == (WPARAM) hSomething -sdj*/
case WM_SETCURSOR: /* jtf 3.20 allow hour glass to stay hour */
if (scrapSeq && (wParam == (WPARAM)hTermWnd) && (LOWORD(lParam) == HTCLIENT) ) /* jtf 3.30 */
{
SetCursor(LoadCursor(NULL, IDC_WAIT));
return (TRUE);
}
if ( ( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDMORE) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDTIMER) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK1) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK2) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK3) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK4) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK5) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK6) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK7) ) ||
( wParam == (WPARAM)GetDlgItem(hdbmyControls, IDFK8) ) )
{
SetCursor(LoadCursor(hInst, (LPSTR) "hand"));
return(TRUE);
}
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_SIZE:
if(wParam != SIZEICONIC)
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
if ((wParam != SIZEICONIC) && (hdbmyControls != NULL) && (!IsIconic(hItWnd)) )/* rjs bugs 015 -> add wParam == SIZEICONIC */
{
sizeFkeys(lParam);
if ((hTermWnd != NULL) && (!IsIconic(hItWnd)) )
sizeTerm(0L);
if(IsWindowVisible(hdbmyControls))
UpdateWindow(hdbmyControls);
}
break;
case WM_SETFOCUS:
case WM_KILLFOCUS: /* rjs bugs 011 */
if (hTermWnd != NULL) /* jtf 3.30 */
UpdateWindow(hTermWnd); /* jtf 3.30 */
//sdj: the status line does not get updates when you come back
//sdj: to terminal focus.
if (hdbmyControls != NULL)
{
if(IsWindowVisible(hdbmyControls))
{
InvalidateRect(hdbmyControls, NULL, FALSE);
UpdateWindow(hdbmyControls);
}
}
if(message == WM_SETFOCUS) /* rjs bugs 011 */
{
showTermCursor(); /* rjs bugs 011 */
selectTopWindow(); /* mbbx 1.03 */
}
else /* rjs bugs 011 */
hideTermCursor(); /* rjs bugs 011 */
break;
/* jtfterm case WM_ERASEBKGND:
GetClipBox((HDC) wParam, (LPRECT) &clipRect);
eraseColorRect((HDC) wParam, (LPRECT) &clipRect, ANORMAL);
DC_WndProc = 1L;
break; */
case WM_ERASEBKGND: /* jtf 3.17 */
if(IsIconic(hWnd))
return DefWindowProc(hWnd,WM_ICONERASEBKGND,wParam,lParam);
else
{
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
}
case WM_QUERYDRAGICON: /* jtf 3.17 */
return (LRESULT)icon.hIcon;
case WM_PAINT:
if(IsIconic(hWnd))
{
BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);
myDrawIcon(ps.hdc, !ps.fErase);
EndPaint(hWnd, (LPPAINTSTRUCT) &ps);
break;
}
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_CLOSE:
case WM_QUERYENDSESSION:
testFlag = 0;
/* Added 02/22/91 for win 3.1 common print dialog w-dougw */
if(hDevNames)
FreeList(&hDevNames);
if(hDevMode)
FreeList(&hDevMode);
if (mdmOnLine)
{
LoadString(hInst, STRERRHANGUP, (LPSTR) work, STR255-1); /* jtf 3.15 */
testFlag = MessageBox(GetActiveWindow(), (LPSTR) work, (LPSTR) szAppName, MB_YESNOCANCEL);
}
if (testFlag==IDCANCEL)
break;
if (testFlag==IDYES)
hangUpPhone();
WinHelp(hTermWnd,(LPSTR) work, (WORD) HELP_QUIT,0L);
if (prtFlag)
PrintFileComm(!prtFlag); /* jtf 3.15 */
//sdj: lets get the current window x,y,width,height and save it into
//sdj: the registry so that next time we load the settings user wants
//sdj: only save the values into registry if the api succeeds
if(GetWindowRect(hWnd,&hItWndRectToSave))
{
WindowXPosition = (int)hItWndRectToSave.left;
WindowYPosition = (int)hItWndRectToSave.top;
WindowWidth = ((int)hItWndRectToSave.right - WindowXPosition);
WindowHeight = ((int)hItWndRectToSave.bottom - WindowYPosition);
sprintf(tmpstr,"%d",WindowXPosition);
LoadString(hInst, STR_INI_XPOSITION, (LPSTR) str, MINRESSTR);
WriteProfileString((LPSTR) szAppName_private, (LPSTR) str, (LPSTR) tmpstr);
sprintf(tmpstr,"%d",WindowYPosition);
LoadString(hInst, STR_INI_YPOSITION, (LPSTR) str, MINRESSTR);
WriteProfileString((LPSTR) szAppName_private, (LPSTR) str, (LPSTR) tmpstr);
sprintf(tmpstr,"%d",WindowWidth);
LoadString(hInst, STR_INI_WIDTH, (LPSTR) str, MINRESSTR);
WriteProfileString((LPSTR) szAppName_private, (LPSTR) str, (LPSTR) tmpstr);
sprintf(tmpstr,"%d",WindowHeight);
LoadString(hInst, STR_INI_HEIGHT, (LPSTR) str, MINRESSTR);
WriteProfileString((LPSTR) szAppName_private, (LPSTR) str, (LPSTR) tmpstr);
}
if(doneFlag = termCloseAll()) /* mbbx 1.01... */
{
return(TRUE); /* jtf 3.33 */
/* DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam); jtf 3.33, 3.28 and 3.26 */
}
break;
case WM_QUERYOPEN:
flashIcon(FALSE, FALSE);
DC_WndProc = 1L;
break;
case WM_ENDSESSION:
doneFlag = wParam;
break;
case WM_NCLBUTTONDBLCLK:
if((wParam == HTCAPTION) && childZoomStatus(0x0001, 0))
{
ShowWindow(GetTopWindow(hItWnd), SW_RESTORE);
break;
}
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_KEYDOWN: /* mbbx 1.04: keymap ... */
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
if (wParam == VK_F10) /* jtf 3.21 */
{
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
}
termKeyProc(hWnd, message, wParam, lParam);
break;
case WM_COMMAND:
doCommand(hWnd, wParam, lParam);
break;
case WM_INITMENUPOPUP:
initMenuPopup(LOWORD(lParam));
break;
default:
DC_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
// idleProcess(); -sdj CAUSES RECURSION AND GDI/USER DEATH
break;
}
DEBOUT("DC_WndProc: msg[%lx] PRCESSED\n",message);
return(DC_WndProc);
}
/*---------------------------------------------------------------------------*/
/* TF_WndProc() [mbb] */
/*---------------------------------------------------------------------------*/
VOID termKeyProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam) /* mbbx 1.04: keymap ... */
{
STRING termStr[STR255];
POINT point; /* porting macro change (JAP) */
if(keyMapTranslate(&wParam, &lParam, termStr))
{
if(!(lParam & (1L << 31)))
fKeyStrBuffer(termStr+1, *termStr); /* termStr -> fKeyStr */
return;
}
if(keyMapSysKey(hWnd, message, &wParam, lParam)) // sdj: AltGr
return;
if((hWnd == hTermWnd) && !(lParam & (1L << 31)))
{
switch(classifyKey((UINT)wParam))
{
case LONGBREAK:
modemSendBreak(30);
break;
case SHORTBREAK:
modemSendBreak(2);
break;
case TERMINALFKEY:
if(keyPadSequence() && (*keyPadString > 0)) /* mbbx 1.04 ... */
fKeyStrBuffer(keyPadString+1, *keyPadString); /* keyPadString -> fKeyStr */
else
sysBeep();
break;
case SCROLLKEY:
switch(wParam)
{
case VK_HOME:
case VK_END:
/* rjs bugs 009 - add if statement from vk_prior case */
if(keyMapState & VKS_CTRL)
{
nScrollPos.y = ((wParam == VK_HOME) ? 0 : nScrollRange.y);
updateTermScrollBars(TRUE);
}
else
{
nScrollPos.x = ((wParam == VK_HOME) ? 0 : nScrollRange.x);
updateTermScrollBars(TRUE);
}
break;
case VK_PRIOR:
case VK_NEXT:
pageScroll((wParam == VK_PRIOR) ? SB_PAGEUP : SB_PAGEDOWN);
break;
case VK_UP:
case VK_DOWN:
case VK_RIGHT:
case VK_LEFT:
offCursor();
longToPoint(hTE.selStart, &point);
termClick(point, (keyMapState & VKS_SHIFT) ? TRUE : FALSE, wParam);
onCursor();
activSelect = TRUE;
noSelect = FALSE; /* rjs bugs 020 */
break;
}
break;
default:
switch(wParam)
{
case VK_INSERT:
switch(keyMapState & (VKS_SHIFT | VKS_CTRL))
{
case VKS_SHIFT:
if (!scrapSeq && ((xferFlag == XFRNONE) || (xferFlag == XFRRCV)) ) /* jtf 3.17 disable send if in transfer */
doEditMenu(EMPASTE);
break;
case VKS_CTRL:
if (!scrapSeq && ((xferFlag == XFRNONE) || (xferFlag == XFRRCV)) ) /* jtf 3.Final disable copy if in transfer */
doEditMenu(EMCOPY);
break;
case VKS_SHIFT | VKS_CTRL:
if (!scrapSeq && ((xferFlag == XFRNONE) || (xferFlag == XFRRCV)) ) /* jtf 3.17 disable send if in transfer */
doEditMenu(EMCOPYTHENPASTE);
break;
}
break;
case VK_BACK:
if(keyMapState & VKS_CTRL) /* rjs bugs 014 */
{
fKeyStrBuffer("\177", 1); /* rjs bugs 014 */
}
else /* rjs bugs 014 */
{
wParam = VK_DELETE;
fKeyStrBuffer("\010\040\010", 3); /* jtf 3.33 */
}
break;
case 'C':
case 'c':
if(!trmParams.useWinCtrl)
break;
switch(keyMapState & (VKS_SHIFT | VKS_CTRL | VKS_ALT))
{
case VKS_CTRL:
if (!scrapSeq && ((xferFlag == XFRNONE) || (xferFlag == XFRRCV)) ) /* jtf 3.Final disable copy if in transfer */
doEditMenu(EMCOPY);
return;
default:
break;
}
break;
case 'V':
case 'v':
if(!trmParams.useWinCtrl)
break;
switch(keyMapState & (VKS_SHIFT | VKS_CTRL | VKS_ALT))
{
case VKS_CTRL:
if (!scrapSeq && ((xferFlag == XFRNONE) || (xferFlag == XFRRCV)) ) /* jtf 3.Final disable copy if in transfer */
doEditMenu(EMPASTE);
return;
default:
break;
}
break;
}
keyMapKeyProc(hWnd, message, wParam, lParam); // sdj: AltGr
break;
}
}
}
/* mbbx 1.04: split DC & TF... */
LRESULT APIENTRY TF_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT TF_WndProc = 0L;
INT tmpPortLocks;
HDC tmpThePort;
PAINTSTRUCT ps;
RECT clipRect; /* mbbx 1.04: erase bkgd */
POINT point;
DEBOUT("TF_WndProc: msg[%lx] GOT IT\n",message);
switch(message)
{
case WM_SIZE:
break;
case WM_SETFOCUS:
case WM_KILLFOCUS:
if (hTermWnd != NULL) /* jtf 3.30 */
UpdateWindow(hTermWnd); /* jtf 3.30 */
if(message == WM_SETFOCUS)
{
BringWindowToTop(hWnd);
if(childZoomStatus(0x4001, 0) && !IsZoomed(hWnd))
ShowWindow(hWnd, SW_MAXIMIZE);
showTermCursor(); /* rjs bugs 011 */
}
else
{
if(childZoomStatus(0x8000, 0) && IsZoomed(hWnd))
ShowWindow(hWnd, SW_RESTORE);
hideTermCursor(); /* rjs bugs 011 */
}
FlashWindow(hWnd, TRUE);
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_PAINT:
offCursor();
tmpThePort = thePort;
tmpPortLocks = portLocks;
BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);
thePort = ps.hdc;
if (xferFlag <= XFRNONE)
FrameRect(thePort, (LPRECT) &statusRect, blackBrush); // This works, used to be after reDrawTermLine
portLocks = 1;
hTE.active = FALSE;
SelectObject(thePort, hTE.hFont);
/* rjs swat - was below next if block */
termDeactivate(&hTE); /* rjs swat - added this line */
reDrawTermScreen(0, visScreenLine+1, curTopLine - savTopLine); /* jtf 3.20 this was up one line this should repaint faster */
termActivate(&hTE);
if(xferFlag > XFRNONE) /* mbbx 1.04: fkeys... */
updateIndicators();
else
reDrawTermLine(maxScreenLine+1, 0, maxChars);
EndPaint(hWnd, (LPPAINTSTRUCT) &ps);
portLocks = tmpPortLocks;
thePort = tmpThePort;
onCursor();
break;
case WM_ERASEBKGND: /* mbbx 1.04: fkeys... */
GetClipBox((HDC) wParam, (LPRECT) &clipRect);
eraseColorRect((HDC) wParam, (LPRECT) &clipRect, ANORMAL);
TF_WndProc = 1L;
break;
case WM_NCLBUTTONDOWN:
BringWindowToTop(hWnd);
SetFocus(hWnd);
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_KEYDOWN: /* mbbx 1.04: keymap ... */
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
if (wParam==VK_F10) /* jtf 3.21 */
{
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
}
termKeyProc(hWnd, message, wParam, lParam);
break;
case WM_CHAR: /* mbbx 1.04: keymap... */
if((xferFlag == XFRNONE) || (xferFlag == XFRRCV) || xferPaused)
if(!fKeyStrBuffer((BYTE *) &wParam, 1))
sysBeep();
/* rjs bugs 017 -> this entire if statement */
if(nScrollPos.y != nScrollRange.y)
if(maxScreenLine < visScreenLine)
{
nScrollPos.y = nScrollRange.y;
updateTermScrollBars(TRUE);
}
else
if((maxScreenLine - visScreenLine) < curLin)
{
nScrollPos.y = nScrollRange.y;
updateTermScrollBars(TRUE);
}
/* rjs bugs 017 -> the end of the fix */
break;
case WM_SETCURSOR: /* block resize box make it arrow jtfterm */
if ( (LOWORD(lParam) == HTBOTTOMRIGHT) ||
(LOWORD(lParam) == HTBOTTOM) )
lParam = MAKELONG( HTNOWHERE, HIWORD(lParam) );
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_SYSCOMMAND:
switch(wParam & 0xFFF0)
{
case SC_SIZE: /* block resize box jtfterm */
break;
case SC_CLOSE:
termCloseFile();
break;
default:
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
break;
}
break;
case WM_HSCROLL:
switch(GET_WM_HSCROLL_CODE(wParam, lParam))
{
case SB_LINEUP:
scrollUp(SB_HORZ, GET_WM_HSCROLL_CODE(wParam, lParam), 1);
break;
case SB_LINEDOWN:
scrollDown(SB_HORZ, GET_WM_HSCROLL_CODE(wParam, lParam), 1);
break;
case SB_PAGEUP:
case SB_PAGEDOWN:
#ifdef ORGCODE
hpageScroll(GET_WM_HSCROLL_CODE(wParam, lParam));
#else
/* it is coded a hPageScroll in scroll.c, no such routine as hpageScroll-sdj*/
hPageScroll(GET_WM_HSCROLL_CODE(wParam, lParam));
#endif
break;
case SB_THUMBPOSITION:
nScrollPos.x = GET_WM_HSCROLL_POS(wParam, lParam);
updateTermScrollBars(TRUE);
break;
}
break;
case WM_VSCROLL:
switch(GET_WM_VSCROLL_CODE(wParam, lParam))
{
case SB_LINEUP:
scrollUp(SB_VERT, GET_WM_VSCROLL_CODE(wParam, lParam), 1);
break;
case SB_LINEDOWN:
scrollDown(SB_VERT, GET_WM_VSCROLL_CODE(wParam, lParam), 1);
break;
case SB_PAGEUP:
case SB_PAGEDOWN:
pageScroll(GET_WM_VSCROLL_CODE(wParam, lParam));
break;
case SB_THUMBPOSITION:
nScrollPos.y = GET_WM_VSCROLL_POS(wParam, lParam);
updateTermScrollBars(TRUE);
break;
}
break;
case WM_LBUTTONDOWN:
if(GetFocus() != hWnd) /* mbbx 1.04 ... */
{
BringWindowToTop(hWnd);
SetFocus(hWnd);
break;
}
offCursor();
// termClick(MAKEMPOINT(lParam), (wParam & MK_SHIFT), FALSE);
point.x = (LONG)LOWORD(lParam);
point.y = (LONG)HIWORD(lParam);
termClick(point, (wParam & MK_SHIFT), FALSE);
onCursor();
activSelect = TRUE;
noSelect = FALSE; /* rjs bugs 020 */
break;
default:
TF_WndProc = DefWindowProc(hWnd, message, wParam, lParam);
// idleProcess(); -sdj CAUSES RECURSION AND GDI/USER DEATH
break;
}
DEBOUT("TF_WndProc: msg[%lx] PRCESSED\n",message);
return(TF_WndProc);
}