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

📄 vc.c

📁 这是一个介绍 linux 编程知识的文章。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * KON2 - Kanji ON Console -
 * Copyright (C) 1992-1996 Takashi MANABE (manabe@papilio.tutics.tut.ac.jp)
 * 
 * CCE - Console Chinese Environment -
 * Copyright (C) 1998-1999 Rui He (herui@cs.duke.edu)
 *
 * VCOnGUI - Virtual Console On MiniGUI -
 * Copyright (C) 1999 Wei Yongming (ymwei@263.net)
 *
 */

/*
**  This source is free software; you can redistribute it and/or
**  modify it under the terms of the GNU General Public
**  License as published by the Free Software Foundation; either
**  version 2 of the License, or (at your option) any later version.
**
**  This software is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  General Public License for more details.
**
**  You should have received a copy of the GNU General Public
**  License along with this library; if not, write to the Free
**  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
**  MA 02111-1307, USA
*/

// Create date: 1999.09.23
//
// Modify records:
//
//  Who             When        Where       For What                Status
//-----------------------------------------------------------------------------
//
// TODO:
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/vt.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <fcntl.h>
#include <signal.h>
#include <termio.h>
#include <pthread.h>
#include <semaphore.h>
#include <dirent.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#include "vcongui.h"
#include "resource.h"
#include "defs.h"
#include "vc.h"
#include "vt.h"
#include "paint.h"

static void TextClearBand (CONINFO *con, int top, int btm);

PCONINFO AllocConInfo ()
{
    PCONINFO pCONINFO;

    if ( !(pCONINFO = malloc (sizeof (CONINFO))) )
        return NULL;

    memset (pCONINFO, 0, sizeof (CONINFO));

    pCONINFO->cols = VGASTD_NUMBER_COLS;
    pCONINFO->rows = VGASTD_NUMBER_ROWS;
    pCONINFO->termType = IDM_80X25;

    return pCONINFO;
}


void FreeConInfo (PCONINFO pCONINFO)
{
    free (pCONINFO);
}

/*
  con->flagBuff:
  |      7|      6|      5|4||3|2|1|0|
  |CLEAN_S|LATCH_2|LATCH_1| ||<----->|
  |0=latch|  byte2|  byte1| ||   LANG|

  Usage: CLEAN_S         indicate if we need to redraw this char
         LATCH_1/LATCH_2 double byte char (Chinese, Japanese, Korean)
         LANG            language, we can support BIG5/GB same screen
*/

/* blatch clear the bit 7 of array head  byte , force to redraw */
static inline void blatch(void *head, int n)
{
    __asm__("\t clc\n"
        "1:\n"
        "\t andb %%bl, (%%eax)\n"
        "\t incl %%eax\n"
        "\t loop 1b\n"
        :
        : "eax" ((long)head), "bl" (0x7F), "c" (n)
        : "bl", "cx" );
}

/* long latch */
static inline void llatch(void *head, int n)
{
    __asm__("\t clc\n"
        "1:\n"
        "\t andl %%ebx, (%%eax)\n"
        "\t addl $4, %%eax\n"
        "\t loop 1b\n"
        :
        : "eax" ((long)head), "ebx" (0x7F7F7F7F), "c" (n>>2)
        : "ebx", "cx" );
}

static inline u_int TextAddress (CONINFO *con, u_int x, u_int y)
{
    return (con->textHead + x + y * con->dispxmax) % con->textSize;
}

static inline bool IsKanji (CONINFO *con, u_int x, u_int y)
{
    return(*(con->flagBuff + TextAddress (con, x, y)) & CODEIS_1);
}

static inline bool IsKanji2 (CONINFO *con, u_int x, u_int y)
{
    return(*(con->flagBuff + TextAddress (con, x, y)) & CODEIS_2);
}

/****************************************************************************
 *                     TextDeleteChar/TextInsertChar                        *
 ****************************************************************************/
void TextDeleteChar (CONINFO *con, int n)
{
    u_int addr, dx;
    
    addr = TextAddress (con, con->x, con->y);
    dx = con->dispxmax - con->x - n;
    
    bmove (con->textBuff + addr, con->textBuff + addr + n, dx);
    bmove (con->attrBuff + addr, con->attrBuff + addr + n, dx);
    blatch (con->flagBuff + addr, dx);
    
    addr = TextAddress (con, con->dispxmax - n, con->y);

    bzero2 (con->textBuff + addr, n);
    bzero2 (con->attrBuff + addr, n);
    bzero2 (con->flagBuff + addr, n);
}

void TextInsertChar (CONINFO *con, int n)
{
    u_int addr, dx;

#if 0
    addr = TextAddress (con, con->dispxmax, con->y);
    dx = con->dispxmax - con->x - n;
    
    brmove (con->textBuff + addr, con->textBuff + addr - n, dx + 1);
    brmove (con->attrBuff + addr, con->attrBuff + addr - n, dx + 1);
    
    addr = TextAddress (con, con->x, con->y);
    blatch (con->flagBuff + addr + n, dx);
    bzero2 (con->textBuff + addr, n);
    bzero2 (con->attrBuff + addr, n);
    bzero2 (con->flagBuff + addr, n);
#else
    addr = TextAddress (con, con->x, con->y);
    dx = con->dispxmax - con->x - n;
    
    memmove (con->textBuff + addr + n, con->textBuff + addr, dx);
    memmove (con->attrBuff + addr + n, con->attrBuff + addr, dx);
    
    addr = TextAddress (con, con->x, con->y);
    blatch (con->flagBuff + addr + n, dx);
    bzero2 (con->textBuff + addr, n);
    bzero2 (con->attrBuff + addr, n);
    bzero2 (con->flagBuff + addr, n);
#endif
}

/****************************************************************************
 *                     TextScrollUp/TextScrollDown                          *
 *                     TextMoveUp/TextMoveDown                              *
 *                        ScrollUp/ScrollDown                               *
 ****************************************************************************/

static void TextScrollUp (CONINFO *con, int line)
{
    int oldhead, len;

    oldhead = con->textHead;
    con->textHead += line * con->dispxmax;

    if (con->textHead > con->textSize) {
    
        con->textHead -= con->textSize;
        len = con->textSize - oldhead;
        
        if (con->textHead) {
            lzero (con->textBuff, con->textHead);
            lzero (con->attrBuff, con->textHead);
            lzero (con->flagBuff, con->textHead);
        }
    }
    else
        len = con->textHead - oldhead;

    lzero (con->textBuff + oldhead, len);
    lzero (con->attrBuff + oldhead, len);
    lzero (con->flagBuff + oldhead, len);
}

static void TextScrollDown (CONINFO *con, int line)
{
    int oldhead, len;

    oldhead = con->textHead;
    con->textHead -= line * con->dispxmax;

    if (con->textHead < 0) {
        con->textHead += con->textSize;
        if (oldhead) {
            lzero(con->textBuff, oldhead);
            lzero(con->attrBuff, oldhead);
            lzero(con->flagBuff, oldhead);
        }
        len = con->textSize - con->textHead;
    }
    else
        len = oldhead - con->textHead;

    lzero (con->textBuff + con->textHead, len);
    lzero (con->attrBuff + con->textHead, len);
    lzero (con->flagBuff + con->textHead, len);
}

void TextMoveUp (CONINFO *con, int top, int btm, int line)
{
    int n, src, dst;

    if (btm - top - line + 1 <= 0) {
        TextClearBand (con, top, btm);
        return;
    }
    
    for (n = top; n <= btm - line; n ++) {
        dst = TextAddress (con, 0, n);
        src = TextAddress (con, 0, n + line);
        lmove (con->textBuff + dst, con->textBuff + src, con->dispxmax);
        lmove (con->attrBuff + dst, con->attrBuff + src, con->dispxmax);
        lmove (con->flagBuff + dst, con->flagBuff + src, con->dispxmax);
        llatch (con->flagBuff + dst, con->dispxmax);
    }
    
    TextClearBand (con, btm - line + 1, btm);
}

void TextMoveDown (CONINFO *con, int top, int btm, int line)
{
    int n, src, dst;

    if (btm - top - line + 1 <= 0) {
        TextClearBand (con, top, btm);
        return;
    }
    
    for (n = btm; n >= top + line; n --) {
        dst = TextAddress (con, 0, n);
        src = TextAddress (con, 0, n - line);
        lmove (con->textBuff + dst, con->textBuff + src, con->dispxmax);
        lmove (con->attrBuff + dst, con->attrBuff + src, con->dispxmax);
        lmove (con->flagBuff + dst, con->flagBuff + src, con->dispxmax);
        llatch (con->flagBuff + dst, con->dispxmax);
    }

    TextClearBand (con, top, top + line - 1);
}

void ScrollUp (CONINFO *con, int line)
{
#if 1
    TextMoveUp(con, con->ymin, con->ymax, line);
#else
    if (con->soft) {
        TextMoveUp(con, con->ymin, con->ymax, line);
    }
    else {
        TextScrollUp (con, line);
        con->scrollLine += line;
    }
#endif
}

void ScrollDown (CONINFO *con, int line)
{
#if 1
    TextMoveDown (con, con->ymin, con->ymax, line);
#else
    if (con->soft) {
        TextMoveDown(con,con->ymin, con->ymax, line);
    }
    else {
        TextScrollDown (con, line);
        con->scrollLine -= line;
    }
#endif
}

/****************************************************************************
 *                       TextClearAll/TextClearEol                          *
 *                       TextClearEos/TextClearBand                         *
 ****************************************************************************/
void TextClearAll (CONINFO *con)
{
    // lzero (con->textBuff, con->textSize);
    // lzero (con->attrBuff, con->textSize);
    memset(con->textBuff, 0x20, con->textSize);
    memset(con->attrBuff, ((con->bcol << 4) | con->fcol), con->textSize);
    lzero (con->flagBuff, con->textSize);
    con->textClear = true;
}

void TextClearEol (CONINFO *con, u_char mode)
{
    u_int  addr;
    u_char len, x=0;

    switch(mode) {
    case 1:
        len = con->x;
        break;
        
    case 2:
        len = con->dispxmax;
        break;

    default:
        x = con->x;
        len = con->dispxmax - con->x;
        break;
    }
    
    addr = TextAddress (con, x, con->y);
    // bzero2 (con->textBuff + addr, len);
    // bzero2 (con->attrBuff + addr, len);
    memset (con->textBuff + addr, 0x20, len);
    memset (con->attrBuff + addr, (con->bcol << 4) | con->fcol, len);
    bzero2 (con->flagBuff + addr, len);     /* needless to latch */
}

void TextClearEos (CONINFO *con, u_char mode)
{
    int addr, len, y;

    if (mode == 2) {
        TextClearAll (con);
        return;
    }

    switch(mode) {
    case 1:
        for (y = 0; y < con->y; y ++) {
            addr = TextAddress (con, 0, y);

            // lzero (con->textBuff + addr, con->dispxmax);
            // lzero (con->attrBuff + addr, con->dispxmax);
            memset (con->textBuff + addr, 0x20, con->dispxmax);
            memset (con->attrBuff + addr, 
                    (con->bcol << 4) | con->fcol, con->dispxmax);

            lzero (con->flagBuff + addr, con->dispxmax);
            /* needless to latch */
        }
        
        addr = TextAddress (con, 0, con->y);
        // bzero2 (con->textBuff + addr, con->x);
        // bzero2 (con->attrBuff + addr, con->x);
        memset (con->textBuff + addr, 0x20, con->x);
        memset (con->attrBuff + addr, (con->bcol << 4) | con->fcol, con->x);
        bzero2 (con->flagBuff + addr, con->x); /* needless to latch */
        break;
        
    default:
        for (y = con->y + 1; y <= con->dispymax; y ++) {
            addr = TextAddress (con, 0, y);
            // lzero (con->textBuff + addr, con->dispxmax);
            // lzero (con->attrBuff + addr, con->dispxmax);
            memset (con->textBuff + addr, 0x20, con->dispxmax);
            memset (con->attrBuff + addr, 
                    (con->bcol << 4) | con->fcol, con->dispxmax);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -