diff --git a/src/bin/e.h b/src/bin/e.h index 2cc78ceff..cae0d5b24 100644 --- a/src/bin/e.h +++ b/src/bin/e.h @@ -112,6 +112,7 @@ extern EAPI E_Path *path_icons; extern EAPI E_Path *path_init; extern EAPI E_Path *path_modules; extern EAPI E_Path *path_backgrounds; +extern EAPI E_Path *path_input_methods; extern EAPI int restart; extern EAPI int good; extern EAPI int evil; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 9c0747481..a34699d8e 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -360,6 +360,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, menu_eap_generic_show, INT); /**/ E_CONFIG_VAL(D, T, menu_eap_comment_show, INT); /**/ E_CONFIG_VAL(D, T, input_method, STR); /**/ + E_CONFIG_LIST(D, T, path_append_input_methods, _e_config_path_append_edd); /**/ e_config = e_config_domain_load("e", _e_config_edd); if (e_config) @@ -1446,15 +1447,6 @@ e_config_init(void) E_CONFIG_LIMIT(e_config->menu_eap_name_show, 0, 1); E_CONFIG_LIMIT(e_config->menu_eap_generic_show, 0, 1); E_CONFIG_LIMIT(e_config->menu_eap_comment_show, 0, 1); - - /* apply lang config - exception because config is loaded after intl setup */ - - 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); - return 1; } @@ -1940,6 +1932,14 @@ _e_config_free(void) E_FREE(epd->dir); E_FREE(epd); } + while (e_config->path_append_input_methods) + { + E_Path_Dir *epd; + epd = e_config->path_append_input_methods->data; + e_config->path_append_input_methods = evas_list_remove_list(e_config->path_append_input_methods, e_config->path_append_input_methods); + E_FREE(epd->dir); + E_FREE(epd); + } while (e_config->remembers) { E_Remember *rem; diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 3ee691a9f..d9627de7f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -50,7 +50,7 @@ typedef Eet_Data_Descriptor E_Config_DD; * defaults for e to work - started at 100 when we introduced this config * versioning feature */ -#define E_CONFIG_FILE_VERSION 127 +#define E_CONFIG_FILE_VERSION 128 #define E_EVAS_ENGINE_DEFAULT 0 #define E_EVAS_ENGINE_SOFTWARE_X11 1 @@ -119,6 +119,7 @@ struct _E_Config Evas_List *path_append_icons; Evas_List *path_append_modules; Evas_List *path_append_backgrounds; + Evas_List *path_append_input_methods; int window_placement_policy; int focus_policy; int focus_setting; diff --git a/src/bin/e_intl.c b/src/bin/e_intl.c index 4eed30a9a..57c460a04 100644 --- a/src/bin/e_intl.c +++ b/src/bin/e_intl.c @@ -24,18 +24,19 @@ static char *_e_intl_orig_xmodifiers = NULL; 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) @@ -80,7 +81,7 @@ 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"); @@ -104,32 +105,6 @@ e_intl_init(void) 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; } @@ -148,46 +123,136 @@ e_intl_shutdown(void) 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; } @@ -202,10 +267,10 @@ e_intl_language_set(const char *lang) /* 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"); @@ -254,13 +319,11 @@ e_intl_language_list(void) 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); @@ -268,11 +331,15 @@ e_intl_input_method_set(const char *method) 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); @@ -282,12 +349,9 @@ e_intl_input_method_set(const char *method) 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"), @@ -299,9 +363,17 @@ e_intl_input_method_set(const char *method) "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 { @@ -318,18 +390,29 @@ e_intl_input_method_get(void) 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; } diff --git a/src/bin/e_intl.h b/src/bin/e_intl.h index 73c366917..f40baaf8d 100644 --- a/src/bin/e_intl.h +++ b/src/bin/e_intl.h @@ -40,6 +40,8 @@ struct _E_Input_Method_Config EAPI int e_intl_init(void); EAPI int e_intl_shutdown(void); +EAPI int e_intl_post_init(void); +EAPI int e_intl_post_shutdown(void); /* Setting & Getting Language */ EAPI void e_intl_language_set(const char *lang); EAPI const char *e_intl_language_get(void); diff --git a/src/bin/e_ipc_handlers.h b/src/bin/e_ipc_handlers.h index fa814bcf9..b1cfec981 100644 --- a/src/bin/e_ipc_handlers.h +++ b/src/bin/e_ipc_handlers.h @@ -805,7 +805,9 @@ break; else if (!strcmp(__str, "modules")) \ __path = path_modules; \ else if (!strcmp(__str, "backgrounds")) \ - __path = path_backgrounds; + __path = path_backgrounds; \ + else if (!strcmp(__str, "input_methods")) \ + __path = path_input_methods; #endif @@ -1424,6 +1426,9 @@ break; dir_list = e_path_dir_list_get(path_modules); else if (!strcmp(s, "backgrounds")) dir_list = e_path_dir_list_get(path_backgrounds); + else if (!strcmp(s, "input_methods")) + dir_list = e_path_dir_list_get(path_input_methods); + E_Path_Dir *p; dat = evas_list_append(dat, strdup(s)); FOR(dir_list) { p = l->data; diff --git a/src/bin/e_main.c b/src/bin/e_main.c index c5dee79f2..15887bd5f 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -377,6 +377,13 @@ main(int argc, char **argv) _e_main_shutdown(-1); } _e_main_shutdown_push(_e_main_path_shutdown); + /* init intl system */ + if (!e_intl_post_init()) + { + e_error_message_show(_("Enlightenment cannot set up its intl system.")); + _e_main_shutdown(-1); + } + _e_main_shutdown_push(e_intl_post_shutdown); /* init actions system */ if (!e_actions_init()) { @@ -562,13 +569,12 @@ main(int argc, char **argv) /* Store current selected desktops */ _e_main_desk_save(); - - /* shutdown intl before ecore to clean up exe */ - e_intl_shutdown(); /* unroll our stack of shutdown functions with exit code of 0 */ _e_main_shutdown(0); + e_intl_shutdown(); + /* if we were flagged to restart, then restart. */ if (restart) { @@ -909,6 +915,18 @@ _e_main_path_init(void) e_path_default_path_append(path_backgrounds, "~/.e/e/backgrounds"); e_path_user_path_set(path_backgrounds, &(e_config->path_append_backgrounds)); + path_input_methods = e_path_new(); + if (!path_input_methods) + { + e_error_message_show("Cannot allocate path for path_input_methods\n"); + return 0; + } + e_path_default_path_append(path_input_methods, "~/.e/e/intl"); + snprintf(buf, sizeof(buf), "%s/enlightenment/intl", e_prefix_lib_get()); + e_path_default_path_append(path_input_methods, buf); + e_path_user_path_set(path_input_methods, &(e_config->path_append_input_methods)); + + return 1; } @@ -955,6 +973,11 @@ _e_main_path_shutdown(void) e_object_del(E_OBJECT(path_backgrounds)); path_backgrounds = NULL; } + if (path_input_methods) + { + e_object_del(E_OBJECT(path_input_methods)); + path_input_methods = NULL; + } return 1; } diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index c53189201..e8b78b295 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -11,6 +11,7 @@ E_Path *path_init = NULL; E_Path *path_icons = NULL; E_Path *path_modules = NULL; E_Path *path_backgrounds = NULL; +E_Path *path_input_methods = NULL; int restart = 0; int good = 0; int evil = 0;