2.main函数

来源:互联网 发布:凯立德自适应端口文件 编辑:程序博客网 时间:2024/06/03 22:48
int main (int argc, char *argv[]){    XEvent          event;    // 见解说1    int             c;        //    用于保存用户输入的参数    Bool            bBackground = True;// 见解说2    // 解析命令行参数,见解说2、3    while((c = getopt(argc, argv, "dDvh")) != -1){        switch(c){            case 'd':// 见解说2                /* nothing to do */                break;            case 'D':// 见解说2                bBackground = False;                break;            case 'v':// 输出版本号                Version();                return 0;            case 'h':// h或者其他任何不合法的参数均,输出参数帮助信息            case '?':                Usage();                return 0;        }    }    // 下面两行代码用于检查当前系统使用的是否是UTF字符集。相当于在字符终端执行“locale charmap”。[6]    setlocale (LC_CTYPE, "");// 设置字符分类为当前系统类型,见解说4    bIsUtf8 = (strcmp (nl_langinfo (CODESET), "UTF-8") == 0);    /* 先初始化 X 再加载配置文件,因为设置快捷键从 keysym 转换到     * keycode 的时候需要 Display     */    if (!InitX ())        exit (1);// xWindow是必须的。如果此处初始化失败,程序肯定无法运行。个人认为应该输出输出相关信息的语句,或采用断言。如果可能发生,出了错就应该有信息输出。如果不可能发生就使用断言,写成:        // bReturn = InitX ();        // ASSERT(bReturn);        // (个人观点,仅供参考)    // 加载用户配置文件,通常是“~/.fcitx/config”,如果该文件不存在就从安装目录中拷贝“/data/config”到“~/.fcitx/config”,详细的解说见《LoadConfig及LoadProfile函数》    LoadConfig (True);    // 创建字体。实际上,就是根据用户的设置,使用xft读取字体的相关信息。xft是x11提供的处理字体的相关函数集。详细参考[7]    CreateFont ();    // 根据字体计算输入窗口的高度    CalculateInputWindowHeight ();    // 加载配置文件,这个配置文件不是用户配置的,而是用于记录fctix的运行状态的,比如是全角还是半角等等。通常是“~/.fcitx/profile”,如果该文件不存在就从安装目录中拷贝“/data/profile”到“~/.fcitx/profile”,详细的解说见《LoadConfig及LoadProfile函数》    LoadProfile ();    // 加载字典文件,详见《字典及成语的处理》    LoadPuncDict ();    // 加载成语,详见《字典及成语的处理》    LoadQuickPhrase ();    // 从 ~/.fcitx/AutoEng.dat (如果不存在,则从 /usr/local/share/fcitx/data/AutoEng.dat) 读取需要自动转换到英文输入状态的情况的数据[8]。    LoadAutoEng ();    // 以下是界面的处理。详细解说见《界面的处理》    // 创建主窗口,即输入法状态窗口    CreateMainWindow ();    // 处理颜色,即候选词窗口的颜色,也就是我们在“~/.fcitx/config”定义的那些颜色信息    InitGC (mainWindow);    // 创建候选次窗口    CreateVKWindow ();    // 创建输入窗口    CreateInputWindow ();    // 创建关于窗口,(说实话,用了这么长时间的fctix了,还从来没有见到过这个窗口)    CreateAboutWindow ();    // 将本程序加入到输入法组,告诉系统,使用我输入字符。    SetIM ();    // 处理主窗口的显示。详细解说见《界面的处理》    if (hideMainWindow != HM_HIDE) {        DisplayMainWindow ();        DrawMainWindow ();    }    // 初始化输入法,详细解说见《我是输入法》    if (!InitXIM (mainWindow))        exit (4);    //以后台方式运行    if (bBackground) {        pid_t   id;    id = fork ();    if (id == -1) {        printf ("Can't run as a daemon!\n");        exit (1);    }    else if (id > 0)        exit (0);    }    // 处理相关的信号    SetMyExceptionHandler ();    // 主循环,相当与windows下GUI程序的消息循环。详细解说见《事件处理》    for (;;) {        // 等待一个事件发生        XNextEvent (dpy, &event);        // 如果是超时,等待下一个事件        if (XFilterEvent (&event, None) == True)            continue;        // 处理事件        MyXEventHandler (&event);    }    return 0;}
  1. XEvent是xlib里面定义的结构。它用来保存从X服务器那里接受到的事件,包括事件的类型,以及与事件相关的数据(例如在屏幕什么地方生成的事件,鼠标键的事件等等),需要根据事件类型来读取相应的事件里的数据 1 。详细用法请参考“man XEvent”。

  2. 该变量用以标示是否以daemon运行。fcitx 启动时默认作为 daemon 运行(这个更常见些)。如需不作为 daemon运行,可使用 -D 选项。原来的 -d 选项仍保留,但什么也不做2。

    daemon:守护程序,操作系统的后台进程,通常具有root安全级别许可权。守护程序通常隐藏在后台,直至被某个事件(例如特定的时间或日期、时间间隔、收到电子邮件等)触发后它才会进入活动状态3。相当于windows下的服务的概念。

  3. 使用 getopt 解析命令行选项。使用 getopt 可以提供更一致的(相对于系统中的其他程序而言)命令行选项处理方式4。

    getopt:unix下解析命令行参数的函数,定义于:getopt.h 通常通过包含unistd.h间接包含它。具体用法请执行“man getopt”或参考5。

  4. setlocal不是一个函数,而是一个宏,实际上调用的是_Xsetlocale。setlocale(分类, locale)来初始化locale数据. 当locale设置为空时, locale的值便从系统的环境变量中取得。详细信息见源代码”usr/include/x11/xlocale.h”或参考6

参考资料:


  1. http://www.vekee.net/b55300/ ↩
  2. http://fcitx.net/browser/trunk/src/main.c ↩
  3. http://tech.ccidnet.com/art/2511/20050331/230889_1.html ↩
  4. http://fcitx.net/browser/trunk/src/main.c ↩
  5. 《用Getopt在Linux下获取命令行参数的方法》 ↩
  6. 《Linux 国际化本地化和中文化(二)》 ↩
原创粉丝点击