📄 vcongui.c
字号:
free (newrows);
if (result != IDOK)
return;
if (col < MIN_COLS || col > MAX_COLS
|| row < MIN_ROWS || row > MAX_ROWS) {
MessageBox (pConInfo->hWnd,
"Please specify a valid terminal window size.",
"Virtual Console on MiniGUI",
MB_OK | MB_ICONINFORMATION);
return;
}
break;
}
default:
return;
}
pConInfo->termType = cmd_id;
if (!VtChangeWindowSize (pConInfo, row, col))
return;
GetWindowRect (pConInfo->hWnd, &new_win_rc);
MoveWindow (pConInfo->hWnd, new_win_rc.left, new_win_rc.top,
ClientWidthToWindowWidth (WS_CAPTION | WS_BORDER,
col * GetCharWidth ()),
ClientHeightToWindowHeight (WS_CAPTION | WS_BORDER,
row * GetCharHeight (),
GetMenu (pConInfo->hWnd)), TRUE);
// Set new terminal window size
twinsz.ws_row = row;
twinsz.ws_col = col;
ioctl (pConInfo->masterPty, TIOCSWINSZ, &twinsz);
}
int VCOnGUIMainWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
PCONINFO pConInfo;
pConInfo = (PCONINFO)GetWindowAdditionalData (hWnd);
switch (message) {
case MSG_CREATE:
break;
break;
case MSG_SETFOCUS:
ActiveCaret (hWnd);
ShowCaret (hWnd);
init_key_info (&pConInfo->kinfo);
break;
case MSG_KILLFOCUS:
HideCaret (hWnd);
init_key_info (&pConInfo->kinfo);
break;
case MSG_KEYUP:
HandleInputKeyUp (pConInfo, wParam, lParam);
break;
case MSG_KEYDOWN:
HandleInputKeyDown (pConInfo, wParam, lParam);
break;
case MSG_CHAR:
HandleInputChar (pConInfo, wParam, lParam);
break;
case MSG_PAINT:
{
HDC hdc;
hdc = BeginPaint (hWnd);
TextRepaintAll (pConInfo);
EndPaint (hWnd, hdc);
}
break;
case MSG_ERASEBKGND:
return 0;
case MSG_LBUTTONDOWN:
if (GetShiftKeyStatus() & 0x00000200)
HandleMouseBothDown (pConInfo,
LOWORD (lParam), HIWORD (lParam), wParam);
else {
SetCapture (hWnd);
HandleMouseLeftDownWhenCaptured (pConInfo,
LOWORD (lParam), HIWORD (lParam), wParam);
pConInfo->m_captured = true;
}
break;
case MSG_MOUSEMOVE:
if (pConInfo->m_captured == true) {
int x = LOWORD (lParam);
int y = HIWORD (lParam);
if (wParam & KS_CAPTURED)
ScreenToClient (hWnd, &x, &y);
HandleMouseMoveWhenCaptured (pConInfo, x, y, wParam);
}
break;
case MSG_LBUTTONUP:
ReleaseCapture ();
if (pConInfo->m_captured == true) {
int x = LOWORD (lParam);
int y = HIWORD (lParam);
if (wParam & KS_CAPTURED)
ScreenToClient (hWnd, &x, &y);
HandleMouseLeftUpWhenCaptured (pConInfo, x, y, wParam);
pConInfo->m_captured = false;
}
break;
case MSG_RBUTTONDOWN:
if (GetShiftKeyStatus() & 0x00000100)
HandleMouseBothDown (pConInfo,
LOWORD (lParam), HIWORD (lParam), wParam);
break;
case MSG_RBUTTONUP:
HandleMouseRightUp (pConInfo,
LOWORD (lParam), HIWORD (lParam), wParam);
break;
case MSG_ACTIVEMENU:
if (wParam == 2) {
CheckMenuRadioItem ((HMENU)lParam,
IDM_40X15, IDM_CUSTOMIZE,
pConInfo->termType, MF_BYCOMMAND);
}
break;
case MSG_COMMAND:
switch (wParam)
{
case IDM_NEW:
case IDM_OPEN:
case IDM_SAVE:
case IDM_SAVEAS:
case IDM_CLOSE:
break;
case IDM_COPY:
TextCopy (pConInfo, 0, 0, pConInfo->dispxmax - 1,
pConInfo->dispymax - 1);
break;
case IDM_PASTE:
TextPaste (pConInfo);
break;
case IDM_EXIT:
SendMessage (hWnd, MSG_CLOSE, 0, 0L);
break;
case IDM_40X15 ... IDM_CUSTOMIZE:
SetTerminalWindowSize (pConInfo, wParam);
break;
case IDM_ABOUT_THIS:
MessageBox (hWnd,
"VCOnGUI - Virtual Console On MiniGUI " VCONGUI_VERSION "\n"
"Copyright (C) 1999-2000 Yongming Wei (ymwei@263.net).\n"
"Some idea comes from CCE by Rui He and others.\n"
" CCE: Copyright (C) 1998-1999 Rui He and others.\n",
"About VC On MiniGUI",
MB_OK | MB_ICONINFORMATION);
break;
case IDM_ABOUT:
OpenAboutDialog ();
break;
}
break;
case MSG_CLOSE:
MessageBox (hWnd,
"Please type \"exit\" at shell prompt "
"or terminate the current program to quit.",
"Virtual Console on MiniGUI",
MB_OK | MB_ICONQUESTION);
return 0;
}
if (pConInfo->DefWinProc)
return (*pConInfo->DefWinProc)(hWnd, message, wParam, lParam);
else
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}
static void InitCreateInfo (PMAINWINCREATE pCreateInfo,
PCONINFO pConInfo, int x, int y, bool fMenu)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER;
pCreateInfo->dwExStyle = WS_EX_IMECOMPOSE | WS_EX_USEPRIVATECDC;
pCreateInfo->spCaption = "Virtual Console on MiniGUI";
pCreateInfo->hMenu = fMenu?createmenu ():0;
pCreateInfo->hCursor = GetSystemCursor (IDC_IBEAM);
pCreateInfo->hIcon = GetSmallSystemIcon (IDI_APPLICATION);
pCreateInfo->MainWindowProc = VCOnGUIMainWinProc;
pCreateInfo->lx = x;
pCreateInfo->ty = y;
pCreateInfo->rx
= x + ClientWidthToWindowWidth (WS_CAPTION | WS_BORDER,
pConInfo->cols * GetCharWidth ());
pCreateInfo->by
= y + ClientHeightToWindowHeight (WS_CAPTION | WS_BORDER,
pConInfo->rows * GetCharHeight (), fMenu);
pCreateInfo->iBkColor = COLOR_transparent;
pCreateInfo->dwAddData = (DWORD)pConInfo;
pCreateInfo->hHosting = HWND_DESKTOP;
}
void* VCOnMiniGUI (void* data)
{
MSG Msg;
MAINWINCREATE CreateInfo;
HWND hMainWnd;
PCONINFO pConInfo;
CHILDINFO ChildInfo;
if (!data) {
ChildInfo.startupMessage = true;
ChildInfo.startupStr = NULL;
ChildInfo.execProg = NULL;
ChildInfo.DefWinProc = NULL;
ChildInfo.fMenu = true;
ChildInfo.left = 0;
ChildInfo.top = 0;
ChildInfo.rows = 0;
ChildInfo.cols = 0;
}
else
ChildInfo = *((PCHILDINFO)data);
if ( !(pConInfo = AllocConInfo ()) ) {
MessageBox (HWND_DESKTOP, "Init Virtual Console information error!",
"Error", MB_OK | MB_ICONSTOP);
return NULL;
}
if (ChildInfo.rows > 0) {
pConInfo->rows = ChildInfo.rows;
pConInfo->termType = IDM_CUSTOMIZE;
}
if (ChildInfo.cols > 0) {
pConInfo->cols = ChildInfo.cols;
pConInfo->termType = IDM_CUSTOMIZE;
}
init_key_info (&pConInfo->kinfo);
InitCreateInfo (&CreateInfo, pConInfo,
ChildInfo.left, ChildInfo.top, ChildInfo.fMenu);
pConInfo->DefWinProc = ChildInfo.DefWinProc;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID) {
FreeConInfo (pConInfo);
MessageBox (HWND_DESKTOP, "Create Virtual Console window error!",
"Error", MB_OK | MB_ICONSTOP);
return NULL;
}
if (!CreateCaret (hMainWnd, NULL, GetCCharWidth (), GetCharHeight ()))
fprintf (stderr, "Create caret error!\n");
ShowWindow (hMainWnd, SW_SHOWNORMAL);
ShowCaret (hMainWnd);
pConInfo->hWnd = hMainWnd;
if (!TerminalStart (pConInfo, &ChildInfo)) {
MessageBox (hMainWnd, "Create Terminal error!",
"Error", MB_OK | MB_ICONSTOP);
goto error;
}
// Enter message loop.
do {
// It is time to read from master pty, and output.
ReadMasterPty (pConInfo);
if (pConInfo->terminate)
break;
while (HavePendingMessage (hMainWnd)) {
if (!GetMessage (&Msg, hMainWnd))
break;
DispatchMessage (&Msg);
}
} while (TRUE);
TerminalCleanup (pConInfo);
error:
FreeConInfo (pConInfo);
DestroyCaret (hMainWnd);
DestroyMainWindow (hMainWnd);
MainWindowThreadCleanup (hMainWnd);
return NULL;
}
void* NewVirtualConsole (PCHILDINFO pChildInfo)
{
pthread_t th;
#if 0
pthread_attr_t th_attr;
pthread_attr_init (&th_attr);
pthread_attr_setschedpolicy (&th_attr, SCHED_OTHER);
CreateThreadForMainWindow (&th, &th_attr, VCOnMiniGUI, pChildInfo);
pthread_attr_destroy (&th_attr);
#else
CreateThreadForMainWindow (&th, NULL, VCOnMiniGUI, pChildInfo);
#endif
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -