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

📄 uniconinputserver.cpp

📁 linux文本方式下的外挂中文环境,很好用,有源码.功能很全.我都用它
💻 CPP
字号:
// vi:ts=4:shiftwidth=4:expandtab/***************************************************************************                          uniconinputserver.cpp  -  description                             -------------------    begin                : Mon Sep 17 2001    copyright            : (C) 2001 by ejoy    email                : ejoy@users.sourceforge.net ***************************************************************************//*************************************************************************** *                                                                         * *   This program 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.                                   * *                                                                         * ***************************************************************************/#ifdef HAVE_CONFIG_H#include <config.h>#endif#ifdef HAVE_UNICON_LIB#include <unistd.h>#include <cassert>#include "debug.h"#include "candilist.h"#include "uniconinputserver.h"string UniconInputServer::mDataPath = "/usr/lib/unicon/";bool UniconInputServer::SetDataPath(string datapath) {    mDataPath = datapath;    return true;}UniconInputServer::UniconInputServer():mImmServer(0),mpImm(NULL) {    LibOpen();    mImmServer = IMM_OpenClient("127.0.0.1", 9010);    if (!mImmServer)        throw runtime_error("Unable to connect to Unicon Input Server");}UniconInputServer::~UniconInputServer() {    if (mpImm)        IMM_CloseInput(mpImm);    IMM_CloseClient(mImmServer);    LibRelease();}void UniconInputServer::GetCandilist(Candilist & rList) {    //from xl_hzinput.c it seems that return value of IMM_GetSelectDisplay    //is the count of words found,but no comment found on this in ImmClient.h    //maybe I'm wrong.    rList.Reset();    rList.mCount = IMM_GetSelectDisplay (mpImm, mSelectBuf, sizeof(mSelectBuf));    if (rList.mCount == 0)        return ;    string s;    char *p = mSelectBuf;    while (*p != ' ')        p++;    if (*p == '<') {        rList.mHavePrev = true;        p++;    }    int i = 0;    while (*p != '\0' && *p != '>') {        if (*p == ' ')            p++;        else {            p++;            s = "";            while (*p != ' ')                s += *p++;            assert(i < 10);            rList.mList[i].mKey = '\0'; //unicon does not need key highlight            rList.mList[i++].mText = s;        }    }    if (*p == '>')        rList.mHaveNext = true;}void UniconInputServer::GetInputBuf(char * pBuf, int len) {    assert(len);    IMM_GetInputDisplay (mpImm, pBuf, len);}string UniconInputServer::GetServerType() {    return string("unicon");}bool UniconInputServer::LoadImm(ImmInfo & rModule) {    if (mpImm) {        IMM_CloseInput(mpImm);        mpImm = NULL;    }//#warning hard coded path!    u_long type;    switch (rModule.mEncode) {        case GB2312:        case GBK:            type = IMM_LC_GB2312;            break;        case BIG5:            type = IMM_LC_BIG5;            break;        default:            throw runtime_error("unsupport encode type found in Imm");    }    string module;    module = mDataPath + rModule.mModule;    string table;    table = mDataPath + rModule.mTable;    //unicon will fail if unable to open file    //so check here to prevent from core dump    if (access(module.c_str(), R_OK) || access(table.c_str(), R_OK))        return false;    mpImm = IMM_OpenInput (mImmServer, (char*)module.c_str(), (char*)table.c_str(), type);    if (mpImm == NULL)        return false;    SetInputMode();    assert(mClientBufLen);    IMM_ConfigInputArea(mpImm, mClientBufLen);    mImmInfo = rModule;    return true;}bool UniconInputServer::ProcessKey(char key, string & rBuf) {    char buf[64];    int len = 63;    buf[0] = '\0';    int r = IMM_KeyFilter (mpImm,                           key,       // 2 -- have filtered and translated                           buf,        // 1 -- have filtered                           &len);        // 0 -- not filtered                                        // < 0 -- error code    assert(r >= 0);    switch (r) {        case 2:            rBuf = buf;            break;        case 1:            rBuf = "";            break;        case 0:            rBuf = key;            break;        default:            assert(!"wrong return value got from unicon,it's not my fault!");    }    return true;}void UniconInputServer::SetFullChar(bool value) {    mIsFullChar = value;    SetInputMode();}void UniconInputServer::SetFullComma(bool value) {    mIsFullComma = value;    SetInputMode();}void UniconInputServer::SetInputMode() {    long mode = IMM_DOUBLE_BYTE_MODE;    if (mIsFullChar)        mode |= IMM_FULL_CHAR_MODE;    if (mIsFullComma)        mode |= IMM_FULL_SYMBOL_MODE;    IMM_SetInputMode(mpImm, mode);}void UniconInputServer::SetClientBufLen(int len){    mClientBufLen = len;    if (mpImm)        IMM_ConfigInputArea(mpImm, mClientBufLen);}#endif //HAVE_UNICON_LIB

⌨️ 快捷键说明

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