From 027e5afb181b80aa196bb1c9469b53c0715a10fb Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 15 Oct 2005 10:49:54 +0000 Subject: [PATCH] shorne's intl work! :) SVN revision: 17575 --- src/bin/e_config.c | 5 ++ src/bin/e_config.h | 1 + src/bin/e_intl.c | 110 +++++++++++++++++++++++++++++++++- src/bin/e_intl.h | 28 +++++++-- src/bin/e_ipc_handlers.h | 77 ++++++++++++++++++++++++ src/bin/e_ipc_handlers_list.h | 6 ++ 6 files changed, 219 insertions(+), 8 deletions(-) diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 2f0116691..6040ffe69 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -359,6 +359,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, menu_eap_name_show, INT); /**/ 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 = e_config_domain_load("e", _e_config_edd); if (e_config) @@ -487,6 +488,7 @@ e_config_init(void) e_config->menu_eap_name_show = 1; e_config->menu_eap_generic_show = 1; e_config->menu_eap_comment_show = 0; + e_config->input_method = NULL; { E_Config_Module *em; @@ -1450,6 +1452,9 @@ e_config_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); + return 1; } diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 3343d6a61..3ee691a9f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -172,6 +172,7 @@ struct _E_Config int cursor_size; int menu_autoscroll_margin; int menu_autoscroll_cursor_margin; + char *input_method; struct { int move; int resize; diff --git a/src/bin/e_intl.c b/src/bin/e_intl.c index b7a5a92c3..7f533c9ec 100644 --- a/src/bin/e_intl.c +++ b/src/bin/e_intl.c @@ -6,8 +6,6 @@ /* TODO List: * - * * load/save language in config so u can change language runtime via a gui and/or ipc - * * add ipc to get/set/list languages, get language name, simplified language string, etc. (so a config tool can be written to display supported languages and be able to select from them) * * add more language names to the language name list list in e_intl_language_name_get() * * as we get translations add languages to the simplified lang list (C and en are currently the same, ja is a test translation - incomplete) */ @@ -19,12 +17,21 @@ static char *_e_intl_orig_lang = NULL; static char *_e_intl_language = NULL; static Evas_List *_e_intl_languages = NULL; +static char *_e_intl_orig_gtk_im_module_file = NULL; +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; + #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) int e_intl_init(void) { char *s; + E_Language_Pack *elp; if (_e_intl_languages) return 1; @@ -73,9 +80,38 @@ e_intl_init(void) if ((s = getenv("LANGUAGE"))) _e_intl_orig_language = strdup(s); if ((s = getenv("LC_ALL"))) _e_intl_orig_lc_all = strdup(s); if ((s = getenv("LANG"))) _e_intl_orig_lang = strdup(s); + + if ((s = getenv("GTK_IM_MODULE"))) _e_intl_orig_gtk_im_module = strdup(s); + if ((s = getenv("QT_IM_MODULE"))) _e_intl_orig_qt_im_module = strdup(s); + if ((s = getenv("XMODIFIERS"))) _e_intl_orig_xmodifiers = strdup(s); + if ((s = getenv("GTK_IM_MODULE_FILE"))) _e_intl_orig_gtk_im_module_file = strdup(s); - /* FIXME: NULL == use LANG. make this read a config value if it exists */ + + /* Exception: NULL == use LANG. this will get setup in e_config */ e_intl_language_set(NULL); + + elp = malloc(sizeof(E_Language_Pack)); + elp->version = 1; + elp->e_im_name = strdup("scim"); + elp->gtk_im_module = strdup("scim"); + elp->qt_im_module = strdup("scim"); + elp->xmodifiers = strdup("@im=SCIM"); + elp->e_im_exec = strdup("scim"); + elp->gtk_im_module_file = NULL; + + ADD_IM(elp); + + elp = malloc(sizeof(E_Language_Pack)); + elp->version = 1; + elp->e_im_name = strdup("uim"); + elp->gtk_im_module = strdup("uim"); + elp->qt_im_module = strdup("uim"); + elp->xmodifiers = strdup("@im=uim"); + elp->gtk_im_module_file = NULL; + elp->e_im_exec = strdup("uim-xim"); + + ADD_IM(elp); + return 1; } @@ -172,3 +208,71 @@ e_intl_language_list(void) /* FIXME: hunt dirs for locales */ return _e_intl_languages; } + +void +e_intl_input_method_set(const char *method) +{ + E_Language_Pack *elp; + Evas_List *next; + + if (_e_intl_input_method) free(_e_intl_input_method); + + if (!method) + { + 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); + e_util_env_set("GTK_IM_MODULE_FILE", _e_intl_orig_gtk_im_module_file); + } + + if (method) + { + _e_intl_input_method = strdup(method); + for (next = _e_intl_input_methods; next; next = next->next) + { + elp = next->data; + if (!strcmp(elp->e_im_name, _e_intl_input_method)) + { + e_util_env_set("GTK_IM_MODULE", elp->gtk_im_module); + e_util_env_set("QT_IM_MODULE", elp->qt_im_module); + e_util_env_set("XMODIFIERS", elp->xmodifiers); + e_util_env_set("GTK_IM_MODULE_FILE", elp->gtk_im_module_file); + if (elp->e_im_exec != NULL) + { + /* FIXME: first check ok exec availability */ + ecore_exe_run(elp->e_im_exec, NULL); + } + break; + } + } + } + else + { + _e_intl_input_method = NULL; + } +} + +const char * +e_intl_input_method_get(void) +{ + return _e_intl_input_method; +} + +const Evas_List * +e_intl_input_method_list(void) +{ + Evas_List *im_list; + Evas_List *next; + E_Language_Pack *elp; + + im_list = NULL; + + for (next = _e_intl_input_methods; next; next = next->next) + { + elp = next->data; + im_list = evas_list_append(im_list, elp->e_im_name); + } + + return im_list; +} + diff --git a/src/bin/e_intl.h b/src/bin/e_intl.h index e5d24a8d2..50c965eee 100644 --- a/src/bin/e_intl.h +++ b/src/bin/e_intl.h @@ -9,15 +9,33 @@ #define _(str) gettext(str) #define d_(str, dom) dgettext(PACKAGE dom, str) +typedef struct _E_Language_Pack E_Language_Pack; + #else #ifndef E_INTL_H #define E_INTL_H -EAPI int e_intl_init(void); -EAPI int e_intl_shutdown(void); -EAPI void e_intl_language_set(const char *lang); -EAPI const char *e_intl_language_get(void); -EAPI const Evas_List *e_intl_language_list(void); +struct _E_Language_Pack +{ + int version; + char *e_im_name; + char *gtk_im_module; + char *qt_im_module; + char *xmodifiers; + char *gtk_im_module_file; + char *e_im_exec; +}; + +EAPI int e_intl_init(void); +EAPI int e_intl_shutdown(void); +/* Setting & Getting Language */ +EAPI void e_intl_language_set(const char *lang); +EAPI const char *e_intl_language_get(void); +EAPI const Evas_List *e_intl_language_list(void); +/* Setting & Getting Input Method */ +EAPI void e_intl_input_method_set(const char *method); +EAPI const char *e_intl_input_method_get(void); +EAPI const Evas_List *e_intl_input_method_list(void); #endif #endif diff --git a/src/bin/e_ipc_handlers.h b/src/bin/e_ipc_handlers.h index 0cf5bcb6d..d08414867 100644 --- a/src/bin/e_ipc_handlers.h +++ b/src/bin/e_ipc_handlers.h @@ -5447,7 +5447,84 @@ break; END_INT; #endif #undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_IM_LIST +#if (TYPE == E_REMOTE_OPTIONS) + OP("-input-method-list", 0, "List all available input methods", 1, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_NULL(HDL); +#elif (TYPE == E_WM_IN) + GENERIC(HDL); + LIST_DATA(); + ENCODE((Evas_List *)e_intl_input_method_list(), e_ipc_codec_str_list_enc); + SEND_DATA(E_IPC_OP_IM_LIST_REPLY); + END_GENERIC(); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_IM_LIST_REPLY +#if (TYPE == E_REMOTE_OPTIONS) +#elif (TYPE == E_REMOTE_OUT) +#elif (TYPE == E_WM_IN) +#elif (TYPE == E_REMOTE_IN) + GENERIC(HDL); + LIST(); + DECODE(e_ipc_codec_str_list_dec) { + FOR(dat) { + printf("REPLY: \"%s\"\n", (char *)(l->data)); + } + FREE_LIST(dat); + } + END_GENERIC(); +#endif +#undef HDL +/****************************************************************************/ +#define HDL E_IPC_OP_IM_SET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-input-method-set", 1, "Set the current input method to 'OPT1'", 0, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_STRING(params[0], HDL); +#elif (TYPE == E_WM_IN) + STRING(s, HDL); + E_FREE(e_config->input_method); + e_config->input_method = strdup(s); + if ((e_config->input_method) && (strlen(e_config->input_method) > 0)) + e_intl_input_method_set(e_config->input_method); + else + e_intl_input_method_set(NULL); + SAVE; + END_STRING(s); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_IM_GET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-input-method-get", 0, "Get the current input method", 1, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_NULL(HDL); +#elif (TYPE == E_WM_IN) + SEND_STRING(e_config->input_method, E_IPC_OP_IM_GET_REPLY, HDL); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_IM_GET_REPLY +#if (TYPE == E_REMOTE_OPTIONS) +#elif (TYPE == E_REMOTE_OUT) +#elif (TYPE == E_WM_IN) +#elif (TYPE == E_REMOTE_IN) + STRING(s, HDL); + printf("REPLY: \"%s\"\n", s); + END_STRING(s); +#endif +#undef HDL /****************************************************************************/ #define HDL E_IPC_OP_WINDOW_PLACEMENT_POLICY_SET diff --git a/src/bin/e_ipc_handlers_list.h b/src/bin/e_ipc_handlers_list.h index 7ae3836ab..4005c864e 100644 --- a/src/bin/e_ipc_handlers_list.h +++ b/src/bin/e_ipc_handlers_list.h @@ -329,3 +329,9 @@ #define E_IPC_OP_MENU_EAP_COMMENT_SHOW_GET 313 #define E_IPC_OP_MENU_EAP_COMMENT_SHOW_GET_REPLY 314 +#define E_IPC_OP_IM_LIST 315 +#define E_IPC_OP_IM_LIST_REPLY 316 +#define E_IPC_OP_IM_SET 317 +#define E_IPC_OP_IM_GET 318 +#define E_IPC_OP_IM_GET_REPLY 319 +