diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 94129f079..df5a73660 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -1327,7 +1327,11 @@ _e_border_free(E_Border *bd) e_object_del(E_OBJECT(bd->border_menu)); bd->border_menu = NULL; } - if (focused == bd) focused = NULL; + if (focused == bd) + { + ecore_x_window_focus(bd->container->manager->root); + focused = NULL; + } while (bd->handlers) { Ecore_Event_Handler *h; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index b9e159528..b075db634 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -83,6 +83,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, font_cache, INT); E_CONFIG_VAL(D, T, zone_desks_x_count, INT); E_CONFIG_VAL(D, T, zone_desks_y_count, INT); + E_CONFIG_VAL(D, T, language, STR); E_CONFIG_LIST(D, T, modules, _e_config_module_edd); E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd); E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd); @@ -106,6 +107,7 @@ e_config_init(void) e_config->zone_desks_x_count = 4; e_config->zone_desks_y_count = 1; e_config->use_virtual_roots = 0; + e_config->language = strdup(""); { E_Config_Module *em; @@ -194,6 +196,11 @@ e_config_init(void) E_CONFIG_LIMIT(e_config->image_cache, 0, 256 * 1024); E_CONFIG_LIMIT(e_config->font_cache, 0, 32 * 1024); + /* apply config */ + + if ((e_config->language) && (strlen(e_config->language) > 0)) + e_intl_language_set(e_config->language); + { Evas_List *l; @@ -258,6 +265,7 @@ e_config_shutdown(void) } E_FREE(e_config->desktop_default_background); + E_FREE(e_config->language); E_FREE(e_config); } E_CONFIG_DD_FREE(_e_config_edd); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index fccc58d25..7d6f82f90 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -55,6 +55,7 @@ struct _E_Config int zone_desks_x_count; int zone_desks_y_count; int use_virtual_roots; + char *language; Evas_List *modules; Evas_List *font_fallbacks; Evas_List *font_defaults; diff --git a/src/bin/e_ipc.c b/src/bin/e_ipc.c index 0073aa82f..bfdf3d88d 100644 --- a/src/bin/e_ipc.c +++ b/src/bin/e_ipc.c @@ -5,6 +5,7 @@ static int _e_ipc_cb_client_add(void *data, int type, void *event); static int _e_ipc_cb_client_del(void *data, int type, void *event); static int _e_ipc_cb_client_data(void *data, int type, void *event); static char *_e_ipc_path_str_get(char **paths, int *bytes); +static char *_e_ipc_str_list_get(Evas_List *strs, int *bytes); static char *_e_ipc_simple_str_dec(char *data, int bytes); static char **_e_ipc_multi_str_dec(char *data, int bytes, int str_count); @@ -14,6 +15,7 @@ ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_available_list_enc); ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_enc); ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_default_list_enc); ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc); +//ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_string_list_enc); /* local subsystem globals */ static Ecore_Ipc_Server *_e_ipc_server = NULL; @@ -213,9 +215,9 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event) case E_IPC_OP_BG_GET: { char *bg; + bg = e_config->desktop_default_background; - if (!bg) - bg = ""; + if (!bg) bg = ""; ecore_ipc_client_send(e->client, E_IPC_DOMAIN_REPLY, E_IPC_OP_BG_GET_REPLY, @@ -328,7 +330,7 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event) int bytes; text_class = _e_ipc_simple_str_dec(e->data, e->size); - efd = e_font_default_get (text_class); + efd = e_font_default_get(text_class); free(text_class); data = _e_ipc_font_default_enc(efd, &bytes); ecore_ipc_client_send(e->client, @@ -399,6 +401,45 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event) ecore_main_loop_quit(); } break; + case E_IPC_OP_LANG_LIST: + { + Evas_List *langs; + int bytes; + char *data; + + langs = (Evas_List *)e_intl_language_list(); + data = _e_ipc_str_list_get(langs, &bytes); + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_LANG_LIST_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + free(data); + } + case E_IPC_OP_LANG_SET: + { + char *lang; + + lang = _e_ipc_simple_str_dec(e->data, e->size); + IF_FREE(e_config->language); + e_config->language = lang; + e_intl_language_set(e_config->language); + e_config_save_queue(); + } + case E_IPC_OP_LANG_GET: + { + char *lang; + + lang = e_config->language; + if (!lang) lang = ""; + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_LANG_GET_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + lang, strlen(lang) + 1); + free(data); + } + break; default: break; } @@ -422,7 +463,7 @@ _e_ipc_path_str_get(char **paths, int *bytes) char *data = NULL, **cur, *home; int pos = 0; char tmp[PATH_MAX]; - + *bytes = 0; home = e_user_homedir_get(); for (cur = paths; *cur != NULL; cur++) @@ -444,6 +485,30 @@ _e_ipc_path_str_get(char **paths, int *bytes) return data; } +static char * +_e_ipc_str_list_get(Evas_List *strs, int *bytes) +{ + char *data = NULL, **cur; + int pos = 0; + Evas_List *l; + + *bytes = 0; + for (l = strs; l; l = l->next) + { + char *p; + + p = l->data; + + *bytes += strlen(p) + 1; + data = realloc(data, *bytes); + + memcpy(data + pos, p, strlen(p)); + pos = *bytes; + data[pos - 1] = 0; + } + return data; +} + /** * Decode a simple string that was passed by an IPC client * @@ -452,13 +517,13 @@ _e_ipc_path_str_get(char **paths, int *bytes) static char * _e_ipc_simple_str_dec(char *data, int bytes) { - char *str; - - str = malloc(bytes + 1); - str[bytes] = 0; - memcpy(str, data, bytes); - - return str; + char *str; + + str = malloc(bytes + 1); + str[bytes] = 0; + memcpy(str, data, bytes); + + return str; } /** @@ -472,26 +537,25 @@ _e_ipc_simple_str_dec(char *data, int bytes) static char ** _e_ipc_multi_str_dec(char *data, int bytes, int str_count) { - char ** str_array; - int i; - - /* Make sure our data is packed for us 00 */ - if( data[bytes - 1] != 0) { - return NULL; - } - - str_array = malloc(sizeof(char *)*str_count); - - for(i = 0; i < str_count; i++) - { + char **str_array; + int i; + + /* Make sure our data is packed for us 00 */ + if (data[bytes - 1] != 0) + return NULL; + + str_array = malloc(sizeof(char *) * str_count); + + for (i = 0; i < str_count; i++) + { str_array[i] = data; data += strlen(str_array[i]) + 1; - } - - return str_array; + } + + return str_array; } - - + + /* list/struct encoding functions */ ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_module_list_enc) { @@ -556,3 +620,16 @@ ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc) ECORE_IPC_PUT32(size); ECORE_IPC_ENC_STRUCT_FOOT(); } + +/* +ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_string_list_enc) +{ + ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_String); + ECORE_IPC_CNTS(str); + ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH(); + int l1; + ECORE_IPC_SLEN(l1, str); + ECORE_IPC_PUTS(str, l1); + ECORE_IPC_ENC_EVAS_LIST_FOOT(); +} +*/ diff --git a/src/bin/e_ipc.h b/src/bin/e_ipc.h index dbff091b2..503d4a98b 100644 --- a/src/bin/e_ipc.h +++ b/src/bin/e_ipc.h @@ -44,6 +44,11 @@ typedef enum _E_Ipc_Op { E_IPC_OP_FONT_DEFAULT_LIST_REPLY, E_IPC_OP_RESTART, E_IPC_OP_SHUTDOWN, + E_IPC_OP_LANG_LIST, + E_IPC_OP_LANG_LIST_REPLY, + E_IPC_OP_LANG_SET, + E_IPC_OP_LANG_GET, + E_IPC_OP_LANG_GET_REPLY, E_IPC_OP_LAST } E_Ipc_Op; diff --git a/src/bin/e_remote_main.c b/src/bin/e_remote_main.c index d27505a5e..0dab6ed43 100644 --- a/src/bin/e_remote_main.c +++ b/src/bin/e_remote_main.c @@ -72,7 +72,10 @@ E_IPC_Opt_Handler handlers[] = OREQ("-font-default-list", "List all configured text classes", E_IPC_OP_FONT_DEFAULT_LIST, 1), OMUL("-font-default-set", "Set textclass (OPT1) font (OPT2) and size (OPT3)", E_IPC_OP_FONT_DEFAULT_SET, 0, 3), OREQ("-restart", "Restart E17", E_IPC_OP_RESTART, 0), - OREQ("-shutdown", "Shutdown E17", E_IPC_OP_SHUTDOWN, 0) + OREQ("-shutdown", "Shutdown E17", E_IPC_OP_SHUTDOWN, 0), + OREQ("-lang-get", "Get the current language", E_IPC_OP_LANG_GET, 1), + OREQ("-lang-list", "List all available languages", E_IPC_OP_LANG_LIST, 1), + OSTR("-lang-set", "Set the current language", E_IPC_OP_LANG_SET, 0) }; /* externally accessible functions */ @@ -338,7 +341,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event) else printf("REPLY: MODULE NONE\n"); break; - case E_IPC_OP_MODULE_DIRS_LIST_REPLY: + case E_IPC_OP_MODULE_DIRS_LIST_REPLY: if (e->data) { char *p; @@ -347,35 +350,35 @@ _e_ipc_cb_server_data(void *data, int type, void *event) while (p < (char *)(e->data + e->size)) { char *dir; - + dir = p; printf("REPLY: MODULE DIR=%s\n", dir); p += strlen(dir) + 1; } } - break; + break; case E_IPC_OP_BG_GET_REPLY: - if (e->data) - { - printf("REPLY: %s\n", e->data); - } - break; + if (e->data) + { + printf("REPLY: %s\n", e->data); + } + break; case E_IPC_OP_BG_DIRS_LIST_REPLY: - if (e->data) - { - char *p; - - p = e->data; - while (p < (char *)(e->data + e->size)) - { - char *dir; - - dir = p; - printf("REPLY: BG DIR=%s\n", dir); - p += strlen(dir) + 1; - } - } - break; + if (e->data) + { + char *p; + + p = e->data; + while (p < (char *)(e->data + e->size)) + { + char *dir; + + dir = p; + printf("REPLY: BG DIR=%s\n", dir); + p += strlen(dir) + 1; + } + } + break; case E_IPC_OP_FONT_FALLBACK_LIST_REPLY: if (e->data) { @@ -384,12 +387,12 @@ _e_ipc_cb_server_data(void *data, int type, void *event) fallbacks = _e_ipc_font_fallback_list_dec(e->data, e->size); while(fallbacks) - { - eff = fallbacks->data; - printf("REPLY: FALLBACK NAME=\"%s\"\n", eff->name); - fallbacks = evas_list_remove_list(fallbacks, fallbacks); - E_FREE(eff); - } + { + eff = fallbacks->data; + printf("REPLY: FALLBACK NAME=\"%s\"\n", eff->name); + fallbacks = evas_list_remove_list(fallbacks, fallbacks); + E_FREE(eff); + } } else printf("REPLY: FALLBACK NONE\n"); @@ -399,15 +402,15 @@ _e_ipc_cb_server_data(void *data, int type, void *event) { Evas_List *available; E_Font_Available *fa; - + available = _e_ipc_font_available_list_dec(e->data, e->size); while(available) - { - fa = available->data; - printf("REPLY: AVAILABLE NAME=\"%s\"\n", fa->name); - available = evas_list_remove_list(available, available); - E_FREE(fa); - } + { + fa = available->data; + printf("REPLY: AVAILABLE NAME=\"%s\"\n", fa->name); + available = evas_list_remove_list(available, available); + E_FREE(fa); + } } else printf("REPLY: AVAILABLE NONE\n"); @@ -418,7 +421,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event) E_Font_Default efd; _e_ipc_font_default_dec(e->data, e->size, &efd); printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n", - efd.text_class, efd.font, efd.size); + efd.text_class, efd.font, efd.size); } else printf("REPLY: DEFAULT NONE\n"); @@ -428,13 +431,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) { Evas_List *defaults; E_Font_Default *efd; - + defaults = _e_ipc_font_default_list_dec(e->data, e->size); while(defaults) { - efd = defaults->data; - printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n", - efd->text_class, efd->font, efd->size); + efd = defaults->data; + printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n", + efd->text_class, efd->font, efd->size); defaults = evas_list_remove_list(defaults, defaults); E_FREE(efd); } @@ -442,6 +445,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) else printf("REPLY: DEFAULT NONE\n"); break; + case E_IPC_OP_LANG_LIST_REPLY: + if (e->data) + { + } + else + printf("REPLY: AVAILABLE NONE\n"); + break; default: break; }