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

📄 zhcon.cpp

📁 zhcon是工作在Linux控制台下的高效双字节中/日/韩(CJK)虚拟终端
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    t.c_cc[VINTR] = _POSIX_VDISABLE;    t.c_cc[VSUSP] = _POSIX_VDISABLE;    t.c_cc[VDSUSP] = _POSIX_VDISABLE;    t.c_cc[VQUIT] = _POSIX_VDISABLE;    setenv("TERM","linux",1);#endif    if (tcsetattr(mConFd, TCSAFLUSH, &t) < 0)        throw runtime_error("Can't set console termios\n");    ioctl(mConFd, TIOCGWINSZ, &mOldWinSize);        setenv("PTY_SLAVE", TtyName, 1);    // disable console auto blanking to prevent screen redraw    // problem when waking up#if defined(linux)    // see kernel's console.c, function setterm_command    write(mConFd, "\033[9;0]",6);#elif defined(__FreeBSD__)     // man splash    // see /usr/src/sys/dev/syscons/syscons.c    int BlankTime = 0;    ioctl(mConFd, CONS_BLANKTIME, &BlankTime);#endif    // for mouse, keep text mode clean    char* TermType = getenv("TERM");    if (TermType == NULL) {        // printf("can't find the TERM environment variable.");        return;    }    int rc = tgetent(NULL, TermType);    if (rc == -1) {        //printf("can't find the termcap database.\n");        //printf("check your termcap environment variable ...\n");        return;    }    if (rc == 0) {        //printf("can't find the terminal type in the termcap database.\n");        return;    }    char *pCap = mCapBuf;    mpCapClearScr = tgetstr("cl", &pCap);    mpCapCursorOff = tgetstr("vi", &pCap);    mpCapCursorOn  = tgetstr("ve",  &pCap);    if (mpCapClearScr) write(mConFd, mpCapClearScr, strlen(mpCapClearScr));    if (mpCapCursorOff) write(mConFd, mpCapCursorOff, strlen(mpCapCursorOff));    // clear screen and home cursor, use termcap "cl" instead    //write(mConFd, "\E[H\E[J", 6);    // invisible cursor even in text mode, use termcap "vi" instead    //write(mConFd, "\E[?25l\E[?1c", 11);}void Zhcon::SetEncode(Encode e, Encode font) {    if (mEncode == e && mFontEncode == font)        return;    try {        BaseFont *f = NULL;        HzDecoder *h = NULL;        string locale;        switch (e) {            case GB2312:                assert(font == GB2312 || font == BIG5);                if (font == BIG5) {                    f = new BaseFont(mBIG5Font, 16, 16);                    h = new GB2BIG5Decoder();                } else {                    f = new BaseFont(mGB2312Font, 16, 16);                    h = new GBDecoder();                }                locale = "zh_CN.GB2312";                break;            case GBK:                assert(font == GBK);                f = new BaseFont(mGBKFont, 16, 16);                h = new GBKDecoder();                locale = "zh_CN.GBK";                break;            case BIG5:                assert(font == GB2312 || font == BIG5);                if (font == GB2312) {                    f = new BaseFont(mGB2312Font, 16, 16);                    h = new BIG52GBDecoder();                } else {                    f = new BaseFont(mBIG5Font, 16, 16);                    h = new BIG5Decoder();                }                locale = "zh_TW.Big5";                break;            case JIS:                assert(font == e);                f = new BaseFont(mJISFont, 16, 16);                h = new JISDecoder();                locale = "ja.JIS";                break;            case KSC:                assert(font == e);                f = new BaseFont(mKSCFont, 16, 16);                h = new KSCDecoder();                locale = "ko";                break;            default:                assert(!"unknown encode and font type");        }        delete gpHzFont;        gpHzFont = f;        gpScreen->SetDblFont(gpHzFont);        delete gpDecoder;        gpDecoder = h;        mEncode = e;        mFontEncode = font;        //i18n locale support        setlocale(LC_ALL,locale.c_str());        textdomain(PACKAGE);        //Fix me:how to change child's shell env?        if (mpCon) {            mpCon->SelClear();            mpCon->ResetFlagAll();            mpCon->Redraw(true);        }        if (mpInputManager)            mpInputManager->Redraw();        Beep();    }//try    catch (runtime_error & e) {}}void Zhcon::VtSignalSet(int mode){    if (GraphDev::mpGraphDev->Name() == "ggi") // no signal handling under ggi-X        return;    vt_mode vtm;    if (ioctl(mConFd, VT_GETMODE, &vtm))        throw runtime_error("ioctl VT_GETMODE failed!");    switch (mode) {        case 1:  // leave            signal(SIGUSR1, Zhcon::SignalVtLeave);            vtm.mode = VT_PROCESS;            vtm.relsig = SIGUSR1;            vtm.acqsig = SIGUSR1; // for FreeBSD, see syscons.c, 0 < signal < NSIG            vtm.frsig = SIGUSR1;            break;        case 2:  // enter            signal(SIGUSR1, Zhcon::SignalVtEnter);            vtm.mode = VT_PROCESS;            vtm.relsig = SIGUSR1;             vtm.acqsig = SIGUSR1;            vtm.frsig = SIGUSR1;            break;        default:  // clean            signal(SIGUSR1, SIG_DFL);            vtm.mode = VT_AUTO;            break;    }        if (ioctl(mConFd, VT_SETMODE, &vtm))        throw runtime_error("ioctl VT_SETMODE failed!");}void Zhcon::VtDoLeave() {    mpCon->SelClear();    mpCon->CursorHide();  // when window has cursor, put in hide()    mpCon->Hide();    mpInputManager->Hide();    // not needed, may change color platte when libggi used    // TextMode();    gpScreen->SwitchToText();    ioctl(mConFd, VT_RELDISP, 1);    VtSignalEnter();}void Zhcon::VtDoEnter() {    // GraphMode();    gpScreen->SwitchToGraph();    gpScreen->ClearScr();    mpCon->Show();    mpCon->CursorShow();  // when window has cursor, put in show()    mpInputManager->Show();    ioctl(mConFd, VT_RELDISP, VT_ACKACQ);    VtSignalLeave();}void Zhcon::GraphMode() {    // for mouse, keep text mode    //if (ioctl(mConFd, KDSETMODE, KD_GRAPHICS))    //    throw runtime_error("ioctl KDSETMODE failed!");    ioctl(mConFd, TIOCCONS, NULL);}void Zhcon::TextMode() {    // for mouse, keep text mode    //if (ioctl(mConFd, KDSETMODE, KD_TEXT))    //    throw runtime_error("ioctl KDSETMODE failed!");    ioctl(mConFd, TIOCCONS, NULL);}//set encode,locale then load appropriate fontsvoid Zhcon::InitLocale(ConfigFile& f){    bindtextdomain(PACKAGE,NULL);    if (getenv("LC_ALL"))        mOldLocale = getenv("LC_ALL");    string prefix = PREFIX"/lib/zhcon/";    mASCIIFont = prefix + f.GetOption(string("ascfont"), string(ASCIIFONT));    mGB2312Font = prefix + f.GetOption(string("gbfont"), string(GB2312FONT));    mGBKFont = prefix + f.GetOption(string("gbkfont"), string(GBKFONT));    mBIG5Font = prefix + f.GetOption(string("big5font"), string(BIG5FONT));    mJISFont = prefix + f.GetOption(string("jisfont"), string(JISFONT));    mKSCFont = prefix + f.GetOption(string("kscfont"), string(KSCFONT));    gpAscFont = new BaseFont(mASCIIFont, 8, 16);    gpScreen->SetAscFont(gpAscFont);    //dblfont loaded in SetEncode()    string s;    s = f.GetOption(string("defaultencode"), string("gb2312"));    if (s == "gb2312") {        //SetEncode(GB2312,GB2312);        //FreeBsd use zh_CN.EUC instead of zh_CN.GB2312        //a broken locale? workaround it#if defined (__FreeBSD__)        setenv("LC_ALL", "zh_CN.EUC", 1);#else        if (mArgs.utf8_flag)            setenv("LC_ALL", "zh_CN.UTF-8", 1);        else            setenv("LC_ALL", "zh_CN.GB2312", 1);#endif        mDefaultEncode = GB2312;    } else if (s == "gbk") {        if (mArgs.utf8_flag)            setenv("LC_ALL", "zh_CN.UTF-8", 1);        else            setenv("LC_ALL", "zh_CN.GBK", 1);        mDefaultEncode = GBK;    } else if (s == "big5") {        if (mArgs.utf8_flag)            setenv("LC_ALL", "zh_TW.UTF-8", 1);        else            setenv("LC_ALL", "zh_TW.Big5", 1);        mDefaultEncode = BIG5;    } else if (s == "jis") {        //SetEncode(JIS,JIS);        setenv("LC_ALL", "ja.JIS", 1);        mDefaultEncode = JIS;    } else if (s == "ksc") {        //SetEncode(KSC,KSC);        setenv("LC_ALL", "ko", 1);        mDefaultEncode = GBK;    } else {        throw runtime_error("unable to set default encode!");    }    if (mArgs.utf8_flag) {        SetupEncodingFilter(s.c_str());    }    s = f.GetOption(string("autoencode"), string("manual"));    if (s == "auto")        mAutoEncode = AUTO;    else if (s == "auto-gb")        mAutoEncode = AUTO_GB;    else if (s == "auto-big5")        mAutoEncode = AUTO_BIG5;    else        mAutoEncode = MANUAL;}void Zhcon::InitGraphDev(ConfigFile& f){    bool r;#if defined(linux)    r = GraphDev::Open(mArgs.drv_arg);#elif defined(__FreeBSD__)    int xres = f.GetOption(string("x_resolution"), 640);    int yres = f.GetOption(string("y_resolution"), 480);    int depth = f.GetOption(string("color_depth"), 4);    r = GraphDev::Open(xres, yres, depth);#endif    if (!r)        throw(runtime_error("Can not open graph device,make sure "            "you have a kernel compiled with framebuffer support or "            "you have a vga card."));    gpScreen = GraphDev::mpGraphDev;    GraphDev::mBlankLineHeight = f.GetOption(string("blanklineheight"), 0);    if (GraphDev::mBlankLineHeight < 0)        GraphDev::mBlankLineHeight = 0;    // debug << gpScreen->Width() << "," << gpScreen->Height() << endl;    gpScreen->ClearScr();}void Zhcon::InitCon(ConfigFile& f){    /*    int BarHeight;    if (gpScreen->BlockHeight()/2 < 4)        BarHeight = gpScreen->BlockHeight() + 4;    else        BarHeight = gpScreen->BlockHeight() + gpScreen->BlockHeight()/2;    mpCon = new Console(0, 0, gpScreen->Width() - 1,                        gpScreen->Height() - BarHeight - 1);    */    mpCon = new Console(0, 0, gpScreen->Width() - 1,                        gpScreen->Height() - 1);    int CursorType;    CursorType = f.GetOption(string("cursortype"), CUR_DEF);    mpCon->SetCursorType(CursorType);    // for mouse support    struct winsize ws;    ws.ws_col = mpCon->MaxCols();    ws.ws_row = mpCon->MaxRows();    // debug << "tty size " << mConFd << " " << ws.ws_col << "," << ws.ws_row << endl;    ioctl(mConFd, TIOCSWINSZ, &ws);}void Zhcon::InitInputManager(ConfigFile& f){    assert(mConFd >= 0); // set by InitTty()    char *TtyName = ttyname(mConFd);    int ttyno = atoi(&TtyName[8]);  // must be /dev/tty? style    assert(mTtyFd >= 0); // set by ForkPty()    InputManager::SetTty(mConFd, ttyno, mTtyFd);        string s;    s = f.GetOption(string("zhconpath"), string(PREFIX"/lib/zhcon/"));    NativeInputServer::SetDataPath(s);#ifdef HAVE_UNICON_LIB    s = f.GetOption(string("uniconpath"), string("/usr/lib/unicon/"));    UniconInputServer::SetDataPath(s);#endif    string sOverSpot, sNativeBar;    sOverSpot = f.GetOption(string("overspotcolor"), string("0,7,1,1,15,8"));    sNativeBar = f.GetOption(string("nativebarcolor"), string("15,4,11,14,0,12"));    s = f.GetOption(string("inputstyle"),string("overspot"));    if (s == "overspot")        mpInputManager = new InputManager(mpCon, InputManager::OverSpot, sOverSpot, sNativeBar);    else // others as default, "nativebar")        mpInputManager = new InputManager(mpCon, InputManager::NativeBar, sOverSpot, sNativeBar);    mpInputManager->LoadImmInfo(f);    mpInputManager->Show();    if (f.GetOption("promptmode",true))        mpInputManager->PromptMode();}void Zhcon::InitMisc(ConfigFile& f){    Beep(f.GetOption(string("beep"),true));}void Zhcon::StartupMsg(){    #include "logo.h"    string scr = screendata;    string s = PLATFORM;    s.resize(8,' ');    scr.replace(scr.find("PLATFORM"),8,s);    s = VERSION;    s.resize(7,' ');    scr.replace(scr.find("VERSION"),7,s);    char buf[1024];    sprintf(buf, "screen resolution: %dx%d [col=%d, row=%d]\r\ndefault encoding: %s %s\r\n",             gpScreen->Width(), gpScreen->Height(), mpCon->MaxCols(), mpCon->MaxRows(),             GetEncode().c_str(), (mArgs.utf8_flag?" [UTF-8]":""));    scr += buf;    mpCon->Write(scr.c_str(),scr.size());}string Zhcon::GetEncode(){    string s;    switch (mAutoEncode) {        case Zhcon::AUTO:            s = "A:";            break;        case Zhcon::AUTO_GB:            s = "A-GB:";            break;        case Zhcon::AUTO_BIG5:            s = "A-B5:";            break;        case Zhcon::MANUAL:            s = "M:";            break;    }    switch (mEncode) {        case ASCII:            s += "ASCII";            break;        case GB2312:                s += "GB2312";            break;        case GBK:            s += "GBK";            break;        case BIG5:                s += "BIG5";            break;        case JIS:            s += "JIS";            break;        case KSC:            s += "KSC";            break;        default:            s += "Unknown";    }    return s;}

⌨️ 快捷键说明

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