⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcongui.c

📁 这是一个介绍 linux 编程知识的文章。
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -