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

📄 oxim_module.c#1.45

📁 linux 下的 oxim 输入法,简单易用.
💻 45
📖 第 1 页 / 共 2 页
字号:
	OXIM_IMFree(i);	free(imlist->IMList[i]);    }    free(imlist->IMList);    imlist->NumberOfIM = 0;    imlist->IMList = NULL;}/*-------------------------------------------------------------------  掃描使用者自訂之輸入法表格與輸入法模組  順序為 使用者 > 系統  Add By Firefly(firefly@opendesktop.org.tw)-------------------------------------------------------------------*/static void OXIM_IMRegister(im_rc *imlist, char *modname, char *objname, char *cname, char *path){    int i;    im_t *im = NULL;    for (i = 0; i < imlist->NumberOfIM ; i++)    {	/* 找出第一個可用的位置 */	if (im == NULL && !imlist->IMList[i]->objname)	    im = imlist->IMList[i];	/* 重複就不紀錄了 */	if (strcmp(imlist->IMList[i]->objname, objname) == 0)	    return;    }    /* 沒有可用位置, 那就配置一個空間 */    if (im == NULL)    {        imlist->NumberOfIM++;	im = (im_t *)oxim_malloc(sizeof(im_t), True);	if (imlist->NumberOfIM == 1)	{	    imlist->IMList = (im_t **)oxim_malloc(sizeof(im_t *), True);	}	else	{	    imlist->IMList = (im_t **)oxim_realloc(imlist->IMList, imlist->NumberOfIM * sizeof(im_t *));	}	imlist->IMList[imlist->NumberOfIM - 1] = im;    }    im->key = -1;    im->circular = True; /* 預設加入輪切 */    im->inpname = strdup((cname ? cname : "No Name"));    im->aliasname = NULL;    im->modname = strdup(modname);    im->objname = strdup(objname);    int user_dir_len = strlen(_Config->user_dir);    im->inuserdir = (strncmp(path, _Config->user_dir, user_dir_len) == 0);    settings_t *im_settings = oxim_get_im_settings(objname);    if (!im_settings)	return;    /* 將該輸入法表格的其餘相關設定寫入記憶體相應位置(im->settings) */    oxim_set_IMSettings(imlist->NumberOfIM - 1, im_settings);    int setkey;    if (oxim_setting_GetInteger(im_settings, "SetKey", &setkey))    {	if (setkey >= 1 && setkey <= 9)	    im->key = setkey;	else if (setkey == 0)	    im->key = 10;	else	    im->key = -1;    }    int circular;    if (oxim_setting_GetBoolean(im_settings, "Circular", &circular))    {	im->circular = circular;    }    char *AliasName;    if (oxim_setting_GetString(im_settings, "AliasName", &AliasName))    {	if (strlen(AliasName))	    im->aliasname = strdup(AliasName);    }    oxim_settings_destroy(im_settings);}/* 檢查 tab 檔是否合格 */int oxim_CheckTable(char *path, char *name, char *ret_cname, int *ret_ver){    char *fullpath = oxim_malloc(BUFFER_LEN, True);    gzFile *fp;    int valid = True;    /* 檔案完整路徑 */    sprintf(fullpath, "%s/%s", path, name);    /* 開檔 */    if ((fp = gzopen(fullpath, "rb")) != NULL)    {	table_prefix_t tp;    	cintab_head_t tab_hd;	cintab_head_v1_t tab_v1_hd;	int read_size, hd_size;	int size = sizeof(table_prefix_t);	if (gzread(fp , &tp, size) == size && strcmp(tp.prefix, "gencin") == 0)	{	    switch (tp.version)	    {		case 0:		    hd_size = sizeof(cintab_head_t);		    read_size = gzread(fp, &tab_hd, hd_size);		    break;		case 1:		    hd_size = sizeof(cintab_head_v1_t);		    read_size = gzread(fp, &tab_v1_hd, hd_size);		    break;		default:		    valid = False;	    }	    /* 檔頭 */	    if (valid && read_size == hd_size)	    {		switch (tp.version)		{		    case 0:			if (strcmp(GENCIN_VERSION, tab_hd.version) != 0)			{			    valid = False;			}			else			{			    if (ret_cname)			    {				strcpy(ret_cname, tab_hd.cname);			    }			    if (ret_ver)			    {				*ret_ver = 0;			    }			}			break;		    case 1:			{			    unsigned int checksum = crc32(0L,  (Bytef *)&tab_v1_hd, sizeof(cintab_head_v1_t) - sizeof(unsigned int));			    if (checksum == tab_v1_hd.chksum)			    {				if (ret_cname)				{				    strcpy(ret_cname, realCname(tab_v1_hd.cname, tab_v1_hd.orig_name));// 				    strcpy(ret_cname, tab_v1_hd.cname);				}				if (ret_ver)				{				    *ret_ver = 1;				}			    }			    else			    {				valid = False;			    }			}			break;		    default:			valid = False;		}	    }	}	else	{	    valid = False;	}	gzclose(fp);    }    free(fullpath);    return valid;}/**/char *realCname(char *c_name, char *e_name){	char delims[] = ";";	char *result = NULL;	char loc[BUFFER_LEN];	strcpy(loc, setlocale(LC_MESSAGES, NULL));	/*檢查有沒有包含冒號,若沒有應該是舊的中文名稱*/	if( NULL == strchr(e_name, delims[0]) )	{		return 			0==strncmp(loc, "zh_", 3) ?				c_name :  /*若locale開頭=『zh_』則傳回中文名稱*/				e_name;	/*否則傳回英文名稱*/	}	char loc_comp[3][BUFFER_LEN];	char ename[BUFFER_LEN];	char *ptr;	/*將包含『.』以後的字串予以清除*/	if( NULL != (ptr=strchr(loc, '.')) )	{		ptr[0] = '\0';	}	strcpy(loc_comp[0], loc);	if( NULL != (ptr=strchr(loc, '_')) )	/*locale包含『_』才進行比對*/	{		ptr[0] = '\0';	/*清除包括『_』之後的字元*/		strcpy(loc_comp[1], loc);	}	strcpy(loc_comp[2], "en");	int i, j, k;	char *tmp = NULL;	char split[] = ":";	char *saveptr1, *saveptr2;	/*check for zh_TW、zh*/	for( k=0; k<3; k++)	{		strcpy(ename, e_name);		for( i=0, result = strtok_r( ename, delims, &saveptr1 ); result != NULL; i++, result = strtok_r( NULL, delims, &saveptr1 ) )		{			char *data[2];			for( j=0, tmp = strtok_r( result, split, &saveptr2 ); tmp!=NULL; j++, tmp = strtok_r( NULL, split, &saveptr2 ) )			{				data[j] = tmp;			}			if( 0 == strcmp(data[1], loc_comp[k]) )			{				return data[0];			}		}	}	return c_name;}static void ScanDirRegisterIM(im_rc *imlist, char *path, char *extname){    struct dirent **namelist;    struct stat stat;    const unsigned int ext_len = strlen(extname);    int n;    char cname[256];    if (chdir(path) == 0)    {	n = scandir(path, &namelist, 0, 0);	if (n < 0) /* 錯誤 */	{	    oxim_perr(OXIMMSG_IWARNING, N_("Scan dir: \"%s\" No any files!\n"), path);	}	else	{	    while (n--)	    {		char *name = namelist[n]->d_name;		unsigned int name_len;		lstat(name, &stat);		/* 一般檔案或 Symbolic link */		if ((name_len = strlen(name)) > ext_len &&		    strncmp(name, "gen-inp", 7) != 0 &&		   (S_ISREG(stat.st_mode) || S_ISLNK(stat.st_mode)))		{		    /* 是否符合副檔名 */		    if (strcmp(name + name_len - ext_len, extname) == 0)		    {			char objname[256];			strcpy(objname, name);			objname[name_len - ext_len] = '\0';			/* 檢查表格或模組是否正確 */			if (strcmp(extname, ".tab") == 0)			{			    int version = 0;			    if (oxim_CheckTable(path, name, cname, &version))			    {				OXIM_IMRegister(imlist, (version == 1 ? "gen-inp-v1" : "gen-inp"), objname, cname, path);			    }			}			if (strcmp(extname, ".so") == 0)			{			    module_t *modp = (module_t *)load_module(objname, MTYPE_IM, MODULE_VERSION, "modules");			    if (modp)			    {				OXIM_IMRegister(imlist, objname, objname, gettext(modp->module_header.name), path);				unload_module((mod_header_t *)modp);			    }			}		    }		}		free(namelist[n]);	    }	    free(namelist);	}    }    else    {	oxim_perr(OXIMMSG_IWARNING, N_("Can not change dir to \"%s\"\n"), path);    }}/* 取得輸入法總數 */int oxim_get_NumberOfIM(void){    return _Config->sys_imlist.NumberOfIM;}/* 以索引取得輸入法顯示名稱與 key*/iminfo_t *oxim_get_IM(int idx){    if (idx < 0 || idx >= _Config->sys_imlist.NumberOfIM)	return NULL;    return (iminfo_t *)_Config->sys_imlist.IMList[idx];}/* 以索引取得輸入法顯示名稱與 key*/im_t *oxim_get_IMByIndex(int idx){    if (idx < 0 || idx >= _Config->sys_imlist.NumberOfIM)	return NULL;    return _Config->sys_imlist.IMList[idx];}/* 設定輸入法快速鍵 */int oxim_set_IMKey(int idx, int key){    im_rc *imlist = &_Config->sys_imlist;    if (idx < 0 || idx >= imlist->NumberOfIM)	return True;    /* key < 1 表示取消快速鍵 */    if (key < 0)    {	imlist->IMList[idx]->key = -1;	return True;    }    /* 檢查有無重複 */    int i;    for (i=0 ; i < imlist->NumberOfIM ; i++)    {	if (imlist->IMList[i]->key == key && i != idx)	    return False;    }    imlist->IMList[idx]->key = key;    return True;}/* 設定輸入法別名 */int oxim_set_IMAliasName(int idx, const char *alias){    im_rc *imlist = &_Config->sys_imlist;    if (idx < 0 || idx >= imlist->NumberOfIM)	return False;    if (imlist->IMList[idx]->aliasname)    {	free(imlist->IMList[idx]->aliasname);    }    if (alias)	imlist->IMList[idx]->aliasname = strdup(alias);    else	imlist->IMList[idx]->aliasname = NULL;    return True;}/* 設定輸入法設定 */int oxim_set_IMSettings(int idx, settings_t *settings){    im_rc *imlist = &_Config->sys_imlist;    if (idx < 0 || idx >= imlist->NumberOfIM || !settings)	return False;    if (imlist->IMList[idx]->settings)    {	oxim_settings_destroy(imlist->IMList[idx]->settings);    }    imlist->IMList[idx]->settings = oxim_settings_create();    int i;    for (i = 0 ; i < settings->nsetting ; i++)    {	oxim_settings_add_key_value(imlist->IMList[idx]->settings,		settings->setting[i]->key, settings->setting[i]->value);    }    return True;}int oxim_set_IMCircular(int idx, int OnOff){    im_rc *imlist = &_Config->sys_imlist;    if (idx < 0 || idx >= imlist->NumberOfIM)	return False;    imlist->IMList[idx]->circular = OnOff;    return True;}/* 查詢某輸入法是否可 Circular */int oxim_IMisCircular(int idx){    im_rc *imlist = &_Config->sys_imlist;    if (idx < 0 || idx >= imlist->NumberOfIM)	return False;    return imlist->IMList[idx]->circular;}/* 以按鍵碼取得輸入法索引值 */int oxim_get_IMIdxByKey(int key){    int idx;    for (idx = 0 ; idx < _Config->sys_imlist.NumberOfIM ; idx++)    {	if (_Config->sys_imlist.IMList[idx]->key == key)	    return idx;    }    return -1;}/* 取得預設輸入法索引編號 */int oxim_get_Default_IM(void){    im_rc *imlist = &_Config->sys_imlist;    /* 預設輸入法 */    int i;    char *defim = oxim_get_config(DefauleInputMethod);    if (defim)    {	for (i = 0; i < imlist->NumberOfIM ; i++)	{	    if (strcasecmp(imlist->IMList[i]->objname, defim) == 0)	    {		return i;	    }	}    }    return 0;}void OXIM_LoadIMList(void){    im_rc *imlist = &_Config->sys_imlist;    char *tmp = oxim_malloc(BUFFER_LEN, False);    sprintf(tmp, "%s/tables", _Config->user_dir);    ScanDirRegisterIM(imlist, tmp, ".tab");    sprintf(tmp, "%s/tables", _Config->default_dir);    ScanDirRegisterIM(imlist, tmp, ".tab");    sprintf(tmp, "%s/modules", _Config->user_dir);    ScanDirRegisterIM(imlist, tmp, ".so");    sprintf(tmp, "%s/modules", _Config->default_dir);    ScanDirRegisterIM(imlist, tmp, ".so");    if (imlist->NumberOfIM > 1)    {	int i, j;	im_t *imp;	/* 依照按鍵順序,排序輸入法 */	for (i = 0; i < imlist->NumberOfIM ; i++)	{	    for (j = i + 1 ; j < imlist->NumberOfIM ; j++)	    {		if (imlist->IMList[i]->key > imlist->IMList[j]->key)		{		    imp = imlist->IMList[i];		    imlist->IMList[i] = imlist->IMList[j];		    imlist->IMList[j] = imp;		}	    }	}    }    free(tmp);}

⌨️ 快捷键说明

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