📄 oxim_module.c#1.45
字号:
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 + -