static char *_e_intl_orig_qt_im_module = NULL;
static char *_e_intl_orig_gtk_im_module = NULL;
static char *_e_intl_input_method = NULL;
-static Evas_List *_e_intl_input_methods = NULL;
static Eet_Data_Descriptor *_e_intl_input_method_config_edd = NULL;
#define ADD_LANG(lang) _e_intl_languages = evas_list_append(_e_intl_languages, lang)
-#define ADD_IM(method) _e_intl_input_methods = evas_list_append(_e_intl_input_methods, method)
#define E_EXE_STOP(EXE) if (EXE != NULL) { ecore_exe_terminate(EXE); ecore_exe_free(EXE); EXE = NULL; }
#define E_EXE_IS_VALID(EXE) (!((EXE == NULL) || (strlen(EXE) == 0)))
-static int _e_intl_exe_valid_get(char *exe);
static int _e_intl_cb_exit(void *data, int type, void *event);
+static Evas_List *_e_intl_imc_path_scan(E_Path *path);
+static Evas_List *_e_intl_imc_dir_scan(char *dir);
+static E_Input_Method_Config *_e_intl_imc_find(Evas_List *imc_list, char *name);
+
int
e_intl_init(void)
ADD_LANG("hu_HU.UTF-8");
ADD_LANG("sl_SI.UTF-8");
ADD_LANG("it_IT.UTF-8");
- ADD_LANG("cs_CS.UTF-8");
+ ADD_LANG("cs_CZ.UTF-8");
ADD_LANG("da_DK.UTF-8");
ADD_LANG("sk_SK.UTF-8");
ADD_LANG("sv_SV.UTF-8");
if ((s = getenv("QT_IM_MODULE"))) _e_intl_orig_qt_im_module = strdup(s);
if ((s = getenv("XMODIFIERS"))) _e_intl_orig_xmodifiers = strdup(s);
-
- /* Exception: NULL == use LANG. this will get setup in e_config */
- e_intl_language_set(NULL);
-
- imc = malloc(sizeof(E_Input_Method_Config));
- imc->version = E_INTL_INPUT_METHOD_CONFIG_VERSION;
- imc->e_im_name = strdup("scim");
- imc->gtk_im_module = strdup("scim");
- imc->qt_im_module = strdup("scim");
- imc->xmodifiers = strdup("@im=SCIM");
- imc->e_im_exec = strdup("scim");
-
- ADD_IM(imc);
-
- imc = malloc(sizeof(E_Input_Method_Config));
- imc->version = E_INTL_INPUT_METHOD_CONFIG_VERSION;
- imc->e_im_name = strdup("uim");
- imc->gtk_im_module = strdup("uim");
- imc->qt_im_module = strdup("uim");
- imc->xmodifiers = strdup("@im=uim");
- imc->e_im_exec = strdup("uim-xim");
-
- ADD_IM(imc);
-
- _e_intl_exit_handler = ecore_event_handler_add(ECORE_EVENT_EXE_EXIT, _e_intl_cb_exit, NULL);
-
return 1;
}
evas_list_free(_e_intl_languages);
- while (_e_intl_input_methods)
- {
- E_Input_Method_Config *imc;
- imc = _e_intl_input_methods->data;
- _e_intl_input_methods = evas_list_remove_list(_e_intl_input_methods, _e_intl_input_methods);
- e_intl_input_method_config_free(imc);
- }
-
E_CONFIG_DD_FREE(_e_intl_input_method_config_edd);
- E_EXE_STOP(_e_intl_input_method_exec);
+ return 1;
+}
+
+/* Setup configuration settings and start services */
+int
+e_intl_post_init(void)
+{
+ if ((e_config->language) && (strlen(e_config->language) > 0))
+ e_intl_language_set(e_config->language);
+ if ((e_config->input_method) && (strlen(e_config->input_method) > 0))
+ e_intl_input_method_set(e_config->input_method);
+
+ _e_intl_exit_handler = ecore_event_handler_add(ECORE_EVENT_EXE_EXIT, _e_intl_cb_exit, NULL);
+}
+
+int
+e_intl_post_shutdown(void)
+{
if (_e_intl_exit_handler)
{
ecore_event_handler_del(_e_intl_exit_handler);
_e_intl_exit_handler = NULL;
}
-
- return 1;
+
+ e_intl_input_method_set(NULL);
+ e_intl_language_set(NULL);
+ E_EXE_STOP(_e_intl_input_method_exec);
}
-/* FIXME: finish this */
static Evas_List *
-_e_intl_dir_scan(char *dir)
+_e_intl_imc_path_scan(E_Path *path)
{
+
+ Evas_List *next;
+ Evas_List *dir_list;
+ Evas_List *all_imcs;
+
+ if (!path) return NULL;
+
+ all_imcs = NULL;
+ dir_list = e_path_dir_list_get(path);
+
+ for (next = dir_list ; next ; next = next->next)
+ {
+ E_Path_Dir *epd;
+ Evas_List *dir_imcs;
+
+ epd = next->data;
+
+ dir_imcs = _e_intl_imc_dir_scan(epd->dir);
+
+ while (dir_imcs)
+ {
+ E_Input_Method_Config *imc;
+
+ imc = dir_imcs->data;
+ dir_imcs = evas_list_remove_list(dir_imcs, dir_imcs);
+
+ if (_e_intl_imc_find(all_imcs, imc->e_im_name))
+ {
+ e_intl_input_method_config_free(imc);
+ }
+ else
+ {
+ all_imcs = evas_list_append(all_imcs, imc);
+ }
+ }
+ }
+
+ e_path_dir_list_free(dir_list);
+
+ return all_imcs;
+}
+
+static Evas_List *
+_e_intl_imc_dir_scan(char *dir)
+{
+ Evas_List *imcs;
Ecore_List *files;
char *file;
+ imcs = NULL;
+
files = ecore_file_ls(dir);
if (!files) return NULL;
-
+
ecore_list_goto_first(files);
if (files)
{
while ((file = ecore_list_next(files)))
{
- /* Do something! */
+ E_Input_Method_Config *imc;
+ Eet_File *imc_file;
+ char buf[PATH_MAX];
+
+ snprintf(buf, sizeof(buf), "%s/%s", dir, file);
+ imc_file = eet_open(buf, EET_FILE_MODE_READ);
+ if (imc_file)
+ {
+ imc = e_intl_input_method_config_read (imc_file);
+ if (imc)
+ {
+ imcs = evas_list_append(imcs, imc);
+ }
+ }
}
ecore_list_destroy(files);
}
+ return imcs;
+}
+
+static E_Input_Method_Config *
+_e_intl_imc_find(Evas_List *imc_list, char * name)
+{
+ Evas_List *l;
+
+ if (!imc_list) return NULL;
+ if (!name) return NULL;
+
+ for (l = imc_list; l; l = l->next)
+ {
+ E_Input_Method_Config *imc;
+
+ imc = l->data;
+ if (!strcmp(imc->e_im_name, name)) return imc;
+ }
+
return NULL;
}
/* NULL lang means set everything back to the original environemtn defaults */
if (!lang)
{
- if (_e_intl_orig_lc_messages) e_util_env_set("LC_MESSAGES", _e_intl_orig_lc_messages);
- if (_e_intl_orig_language) e_util_env_set("LANGUAGE", _e_intl_orig_language);
- if (_e_intl_orig_lc_all) e_util_env_set("LC_ALL", _e_intl_orig_lc_all);
- if (_e_intl_orig_lang) e_util_env_set("LANG", _e_intl_orig_lang);
+ e_util_env_set("LC_MESSAGES", _e_intl_orig_lc_messages);
+ e_util_env_set("LANGUAGE", _e_intl_orig_language);
+ e_util_env_set("LC_ALL", _e_intl_orig_lc_all);
+ e_util_env_set("LANG", _e_intl_orig_lang);
}
if (!lang) lang = getenv("LC_MESSAGES");
if (!lang) lang = getenv("LANGUAGE");
void
e_intl_input_method_set(const char *method)
{
- E_Input_Method_Config *imc;
- Evas_List *next;
-
if (_e_intl_input_method) free(_e_intl_input_method);
if (!method)
{
+ E_EXE_STOP(_e_intl_input_method_exec);
e_util_env_set("GTK_IM_MODULE", _e_intl_orig_gtk_im_module);
e_util_env_set("QT_IM_MODULE", _e_intl_orig_qt_im_module);
e_util_env_set("XMODIFIERS", _e_intl_orig_xmodifiers);
if (method)
{
- _e_intl_input_method = strdup(method);
- for (next = _e_intl_input_methods; next; next = next->next)
- {
- imc = next->data;
- if (!strcmp(imc->e_im_name, _e_intl_input_method))
+ Evas_List * input_methods;
+ E_Input_Method_Config *imc;
+
+ input_methods = _e_intl_imc_path_scan(path_input_methods);
+ _e_intl_input_method = strdup(method);
+
+ imc = _e_intl_imc_find (input_methods, _e_intl_input_method);
+
+ if (imc)
{
e_util_env_set("GTK_IM_MODULE", imc->gtk_im_module);
e_util_env_set("QT_IM_MODULE", imc->qt_im_module);
if (E_EXE_IS_VALID(imc->e_im_exec))
{
-
- printf("E_INTL: START IN (%x)", _e_intl_input_method_exec);
_e_intl_input_method_exec = ecore_exe_run(imc->e_im_exec, NULL);
- ecore_exe_tag_set(_e_intl_input_method_exec, "E/im_exec");
- printf("E_INTL: START OUT (%x)", _e_intl_input_method_exec);
-
+ ecore_exe_tag_set(_e_intl_input_method_exec,"E/im_exec");
+
if ( !_e_intl_input_method_exec ||
!ecore_exe_pid_get(_e_intl_input_method_exec))
e_error_dialog_show(_("Input Method Error"),
"that your configuration's\n"
"executable is in your PATH\n"));
}
- break;
}
- }
+
+ /* Need to free up the directory listing */
+ while (input_methods)
+ {
+ E_Input_Method_Config *imc;
+
+ imc = input_methods->data;
+ input_methods = evas_list_remove_list(input_methods,input_methods);
+ e_intl_input_method_config_free (imc);
+ }
}
else
{
Evas_List *
e_intl_input_method_list(void)
{
+ Evas_List *input_methods;
Evas_List *im_list;
- Evas_List *next;
+ Evas_List *l;
E_Input_Method_Config *imc;
im_list = NULL;
- for (next = _e_intl_input_methods; next; next = next->next)
+ input_methods = _e_intl_imc_path_scan(path_input_methods);
+ for (l = input_methods; l; l = l->next)
{
- imc = next->data;
+ imc = l->data;
im_list = evas_list_append(im_list, strdup(imc->e_im_name));
}
+ /* Need to free up the directory listing */
+ while (input_methods)
+ {
+ E_Input_Method_Config *imc;
+
+ imc = input_methods->data;
+ input_methods = evas_list_remove_list(input_methods, input_methods);
+ e_intl_input_method_config_free (imc);
+ }
return im_list;
}