LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 953|回复: 6

fedora core 2下fcitx2.1.0对多locale的同时输入问题

[复制链接]
发表于 2004-5-24 14:29:16 | 显示全部楼层 |阅读模式
上次贴的那个帖子的方法没用了http://www.linuxsir.cn/forum.php?mod=viewthread&tid=109986

程序和fcitx初次连接的时候给出自己的locale都是"C"了
发表于 2004-5-24 14:49:31 | 显示全部楼层
至少应该是将LC_CTYPE设置为中文。而且locale=C是不能输入中文的
 楼主| 发表于 2004-5-24 15:31:45 | 显示全部楼层
最初由 Yuking 发表
至少应该是将LC_CTYPE设置为中文。而且locale=C是不能输入中文的


Ft, 不好意思,是我搞错了,我在手工patch的时候少加了一行。
下面提供新的diff文件

使用方法:$ patch -p1 < fcitx.diff.txt

(会自动提示不能对某个文件做patch,手工输入文件名即可)
我只有fc2的系统了,不知道其他的系统下能不能用这个patch,如果可以不知Yuking是否可以考虑把这个patch加入到正式的版本中。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-5-24 17:04:27 | 显示全部楼层
谢谢!
您的补丁是不是不全,我没有找到ICL这个数据结构的定义……
 楼主| 发表于 2004-5-24 18:52:32 | 显示全部楼层
最初由 Yuking 发表
谢谢!
您的补丁是不是不全,我没有找到ICL这个数据结构的定义……


不会吧,ICL的定义是在IC.h中啊。此外,这里有个bug的修正。
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=111726
发表于 2004-5-25 08:39:46 | 显示全部楼层
但我自己的IC.h中的确没有ICL这个结构,它是您自己写的吗?
 楼主| 发表于 2004-5-25 10:09:36 | 显示全部楼层
是的,我依照你的IC结构写的,ICL的L代表Locale。
IC.H中
[PHP]
typedef struct _ICL {
       CARD16 connect_id;
       char *locale;
        unsigned int created;
       struct _ICL *next;

}ICL;
[/PHP]

IC.C中
[PHP]
static ICL *icl_list=(ICL*)NULL;
static ICL     *freel_list =(ICL *)NULL;

void    NewICL(IMOpenStruct *call_data)
/*在open hangler中调用,因为IMOpenStruct中给出了本窗口的locale*/
{
      CARD16 cnid=call_data->connect_id;

      ICL *rec;
      if (freel_list != NULL) {
              rec = freel_list;
              freel_list = freel_list->next;
      }
      else {
              rec=(ICL *) malloc (sizeof (ICL));
      }

      memset (rec, 0, sizeof(ICL));
      rec->connect_id = cnid;
      rec->next=icl_list;
      rec->locale=(char *)malloc(sizeof(char)*(1+call_data->lang.length));
      strcpy(rec->locale, call_data->lang.name);
      icl_list=rec;
      //return rec;
}
char *GetIcLocale(CARD16 connect_id)
/*在SendHZtoClient中调用,此时需要知道窗口的locale*/
{
      ICL *rec;
      for(rec=icl_list; rec != NULL; rec = rec->next) {
              if(rec->connect_id==connect_id) {
                      return rec->locale;
              }
      }
      return "C";
}

static void DeleteICL (CARD16 icid)
{
      ICL *rec, *last;
      last = NULL;

      for(rec=icl_list; rec != NULL; last = rec, rec = rec->next) {
              if (rec->connect_id==icid) {
                        rec->created--;
                }
              if (!rec->created) {
                //printf("truely deleted\n");
                      if(last != NULL)
                              last->next = rec->next;
                      else
                              icl_list=rec->next;
                      rec->next=freel_list;
                      freel_list=rec;
                      if(rec->locale)
                              free(rec->locale);
                      return;
              }
      }
}

void CreateIC (IMChangeICStruct * call_data)
//我应该写个CreateICL的,偷懒了一把。
{
    IC             *rec;
    ICL *recl;
//printf("createic conn and icid %d %d\n", call_data->connect_id, call_data->icid);
    rec = NewIC ();
    if (rec == NULL)
        return;

    //**********************************
    rec->imeState = IS_CLOSED;
    //**********************************

    StoreIC (rec, call_data);
    call_data->icid = rec->id;
    for(recl=icl_list; recl!=NULL; recl=recl->next) {
          if(recl->connect_id==call_data->connect_id) {
                  recl->created++;
                  break;
          }
    }     
    return;
}

void DestroyIC (IMChangeICStruct * call_data)
{
//printf("destroy conn and icid %d %d\n", call_data->connect_id, call_data->icid);
    DeleteIC (call_data->icid);
    DeleteICL(call_data->connect_id);
    return;
}
[/PHP]

xim.c中
[PHP]
void SendHZtoClient (XIMS ims, IMForwardEventStruct * call_data, char *strHZ)
{
   

      XTextProperty   tp;
      Display        *display = ims->core.display;
      char            strOutput[300];
      char           *ps;
      
      char *loc=GetIcLocale(call_data->connect_id);

      if(strstr(loc, "utf")||strstr(loc, "UTF")) {
              int             l1, l2;
              ps = strOutput;
              l1 = strlen (strHZ);
              l2 = 299;
              iconv (convUTF8, (char **) (&strHZ), (size_t *) & l1, &ps, (size_t *) & l2);
              *ps = '\0';
              ps = strOutput;
              Xutf8TextListToTextProperty(display, (char **) &ps, 1, XCompoundTextStyle, &tp);
      }
      else {
              ps = strHZ;
              setlocale(LC_CTYPE, loc);
              XmbTextListToTextProperty (display, (char **) &ps, 1, XCompoundTextStyle, &tp);
      }

      ((IMCommitStruct *) call_data)->flag |= XimLookupChars;
      ((IMCommitStruct *) call_data)->commit_string = (char *) tp.value;
      
     //printf("locale is %s\n strHZ is %s\n", GetIcLocale(call_data->connect_id), ps);
     //printf("the tp is %s\n", tp.value);
      IMCommitString (ims, (XPointer) call_data);
      XFree (tp.value);
      setlocale(LC_CTYPE, "zh_CN.gbk");

}

[/PHP]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表