Enlightenment CVS committal Author : sndev Project : e_modules Module : language
Dir : e_modules/language/src/module Modified Files: e_mod_config.c e_mod_lang.c e_mod_lang.h e_mod_main.c e_mod_main.h Log Message: * new policy per window is added. unfortunatelly, it works a little bit slowly for now, but this will be fixed. =================================================================== RCS file: /cvs/e/e_modules/language/src/module/e_mod_config.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- e_mod_config.c 18 May 2006 16:32:17 -0000 1.12 +++ e_mod_config.c 23 May 2006 09:41:18 -0000 1.13 @@ -121,6 +121,7 @@ static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { + E_Radio_Group *rg; Evas_Object *o, *of, *ob, *ot, *ot2, *oft; cfdata->evas = evas; @@ -137,7 +138,7 @@ ob = e_widget_ilist_add(evas, ILIST_ICON_LANG_WIDTH, ILIST_ICON_LANG_HEIGHT, NULL); e_widget_on_change_hook_set(ob, _lang_languages_ilist_cb_change, cfdata); cfdata->gui.lang_ilist = ob; - e_widget_min_size_set(ob, 250, 250); + e_widget_min_size_set(ob, 250, 170); e_widget_ilist_go(ob); e_widget_framelist_object_append(of, ob); } @@ -150,7 +151,7 @@ ob = e_widget_ilist_add(evas, ILIST_ICON_WIDTH, ILIST_ICON_HEIGHT, NULL); e_widget_on_change_hook_set(ob, _lang_selected_languages_ilist_cb_change, cfdata); cfdata->gui.selected_lang_ilist = ob; - e_widget_min_size_set(ob, 250, 250); + e_widget_min_size_set(ob, 250, 170); e_widget_ilist_go(ob); e_widget_frametable_object_append(oft, ob, 0, 0, 4, 1, 1, 1, 1, 1); @@ -184,7 +185,7 @@ e_widget_on_change_hook_set(ob, _lang_kbd_model_ilist_cb_change, cfdata); cfdata->gui.kbd_model_ilist = ob; { - e_widget_min_size_set(ob, 380, 100); + e_widget_min_size_set(ob, 380, 80); e_widget_ilist_go(ob); } e_widget_framelist_object_append(of, ob); @@ -197,7 +198,7 @@ e_widget_on_change_hook_set(ob, _lang_kbd_layout_variant_ilist_cb_change, cfdata); cfdata->gui.kbd_layout_variant_ilist = ob; { - e_widget_min_size_set(ob, 120, 100); + e_widget_min_size_set(ob, 120, 80); e_widget_ilist_go(ob); } e_widget_framelist_object_append(of, ob); @@ -208,11 +209,26 @@ } e_widget_list_object_append(o, ot, 1, 1, 0.5); - /*of = e_widget_framelist_add(evas, _("Options"), 0); - ob = e_widget_check_add(evas, _("Show Language Indicator"), (&(cfdata->lang_show_indicator))); - e_widget_framelist_object_append(of, ob); + - e_widget_list_object_append(o, of, 1, 1, 0.5);*/ + of = e_widget_framelist_add(evas, _("Language Switching Policy"), 1); + { + rg = e_widget_radio_group_new((int *)&(cfdata->lang_policy)); + + ob = e_widget_radio_add(evas, "Global", LS_GLOBAL_POLICY, rg); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_radio_add(evas, "Window", LS_WINDOW_POLICY, rg); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_radio_add(evas, "Application", LS_APPLICATION_POLICY, rg); + e_widget_framelist_object_append(of, ob); + e_widget_disabled_set(ob, 1); + } + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + /****************************************************/ _lang_update_lang_defined_list(cfdata); _lang_update_selected_lang_list(cfdata); @@ -231,6 +247,17 @@ Language *lang, *lang2; cfdata->conf->lang_policy = cfdata->lang_policy; + if (cfdata->conf->lang_policy == LS_GLOBAL_POLICY) + { + language_clear_border_language_setup_list(); + language_unregister_callback_handlers(); + } + else if (cfdata->conf->lang_policy == LS_WINDOW_POLICY || + cfdata->conf->lang_policy == LS_APPLICATION_POLICY) + { + language_register_callback_handlers(); + } + cfdata->conf->lang_show_indicator = cfdata->lang_show_indicator; while (cfdata->conf->languages) @@ -246,10 +273,10 @@ cfdata->conf->languages = evas_list_append(cfdata->conf->languages, lang); } cfdata->conf->language_selector = 0; - //e_config_save_queue(); - e_config_save(); + e_config_save_queue(); + //e_config_save(); - lang_language_switch_to(cfdata->conf, cfdata->conf->language_selector = 0); + lang_language_switch_to(cfdata->conf, (cfdata->conf->language_selector = 0), 0); return 1; } static void =================================================================== RCS file: /cvs/e/e_modules/language/src/module/e_mod_lang.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- e_mod_lang.c 18 May 2006 15:00:30 -0000 1.21 +++ e_mod_lang.c 23 May 2006 09:41:18 -0000 1.22 @@ -35,18 +35,18 @@ #define KEYMAP_INDX 12 #define NUM_OF_INDX 13 -#define LXC_FREE(p) \ +#define LXC_FREE(__p) \ { \ int i; \ for (i = 0; i < NUM_OF_INDX; i++) \ - if (p->sv[i]) evas_stringshare_del(p->sv[i]); \ - if (p->dpy) XCloseDisplay(p->dpy); \ - E_FREE(p); \ + if (__p->sv[i]) evas_stringshare_del(__p->sv[i]); \ + if (__p->dpy) XCloseDisplay(__p->dpy); \ + E_FREE(__p); \ } -#define LANG_SETTING_SET_RETURN_ON_ERROR(p) \ +#define LANG_SETTING_SET_RETURN_ON_ERROR(__p) \ { \ - LXC_FREE(p); \ + LXC_FREE(__p); \ e_module_dialog_show("Error", "Error: The module was not able to switch between the<br>" \ "selected languages. The main reason could be is that X<br>" \ "keyboard rules file cannot be loaded propertly, or it <br>" \ @@ -99,42 +99,173 @@ /****************************************/ void -lang_language_switch_to(Config *cfg, unsigned int n) +lang_language_switch_to(Config *cfg, unsigned int n, int ignore_n) { - if (!cfg || n >= evas_list_count(cfg->languages)) return; +#define APPLY_LANGUAGE_SETTINGS(__c) \ + { \ + Language *__l = evas_list_nth(__c->languages, __c->language_selector); \ + if (__l) _lang_apply_language_settings(__l->kbd_model, __l->kbd_layout, __l->kbd_variant); \ + } + + + if (!cfg) return; - cfg->language_selector = n; + if (cfg->lang_policy == LS_GLOBAL_POLICY) + { + if (n < 0) n = 0; + else if (n >= evas_list_count(cfg->languages)) + n = evas_list_count(cfg->languages) - 1; - /* here goes the actuall work that calls X to switch the kbd layout, etc. */ + cfg->language_selector = n; + + APPLY_LANGUAGE_SETTINGS(cfg); + } + else if (cfg->lang_policy == LS_WINDOW_POLICY) + { + if (ignore_n) + { + Evas_List *l; + E_Border *bd = NULL; + E_Desk *desk; - { - Language *l; + desk = e_desk_current_get + (e_zone_current_get(e_container_current_get(e_manager_current_get()))); - l = evas_list_nth(cfg->languages, cfg->language_selector); - if (l) - { - _lang_apply_language_settings(l->kbd_model, l->kbd_layout, l->kbd_variant); - } - } + for (l = e_border_focus_stack_get(); l; l = l->next) + { + bd = l->data; + if ((!bd->iconic) && (bd->visible) && + (((bd->desk == desk) || + ((bd->sticky) && (bd->zone == desk->zone))))) + { + break; + } + bd = NULL; + } - /* debug */ -#if 0 - { - char buf[4096]; - Language *l; - - l = evas_list_nth(cfg->languages, cfg->language_selector); - - snprintf(buf, sizeof(buf), - "message 1: current_lang_selector : %d : lang->confg->languages.size() : %d<br>" - "ll->lang_name: %s<br>ll->lang_shortcut: %s<br>ll->lang_flag: %s<br>ll->kbd_model:" - "%s<br>ll->kbd_layout: %s<br>ll->kbd_variant: %s", - cfg->language_selector, evas_list_count(cfg->languages), - l->lang_name, l->lang_shortcut, l->lang_flag, l->kbd_model, - l->kbd_layout, l->kbd_variant); - e_module_dialog_show( _("Enlightenment Language Enhancment Module"), buf); - } -#endif + cfg->language_selector = 0; + if (bd) + { + // here we have to set the language used by the window + // if at all we have to do this ???? QUESTION - because, + // if we just switch the desktop and we have focused window on it + // them most probably !!! the focus_in callback will activate + Border_Language_Settings *bls = NULL; + + for (l = cfg->border_lang_setup; l; l = l->next) + { + bls = l->data; + + if (bls->bd == bd) + { + // so we found a window with border settings set + // + Language *lang = evas_list_nth(cfg->languages, + bls->language_selector); + if (strcmp(bls->language_name, lang->lang_name)) + { + // here we will be smart :) we will try first to + // find correct language settings and if we fail + // then to fallback to default language + + bls->language_selector = 0; + + /*Evas_List *l2; + int j = 0; + for (l2 = cfg->languages; l2; l2 = l2->next, j++) + { + lang = l->data; + if (!strcmp(bls->language_name, lang->lang_name)) + break; + } + + if (j) + bls->language_selector = j; + else + { + //hhhhmmm the language_settings of the border is incorrect. + //remove them. and fallback to default language. + if (bls->language_name) + evas_stringshare_del(bls->language_name); + E_FREE(bls); + cfg->border_lang_setup = evas_list_remove_list + (cfg->border_lang_setup, l); + }*/ + } + break; + } + bls = NULL; + } + + if (bls) + cfg->language_selector = bls->language_selector; + } + APPLY_LANGUAGE_SETTINGS(cfg); + } + else + { + Evas_List *l; + E_Border *bd = NULL; + + if (n >= evas_list_count(cfg->languages)) + n = evas_list_count(cfg->languages) - 1; + + bd = e_border_focused_get(); + + if (bd) + { + Evas_List *l; + Border_Language_Settings *bls; + Language *lang; + // we have a border. Let find it in the list of borders that have + // language settings. + + cfg->language_selector = n; + lang = evas_list_nth(cfg->languages, n); + + bls = NULL; + for (l = cfg->border_lang_setup; l; l = l->next) + { + bls = l->data; + if (bls && (bls->bd = bd)) + break; + bls = NULL; + } + + if (bls) + { + // kewl (ooohhh devilhorns :)) we have a border with language + // settings set. Updata them + bls->language_selector = n; + if (bls->language_name) evas_stringshare_del(bls->language_name); + bls->language_name = evas_stringshare_add(lang->lang_name); + } + else + { + // there is no window. + if (n) + { + // we need to save none default lang settings + bls = E_NEW(Border_Language_Settings, 1); + bls->bd = bd; + bls->language_selector = n; + bls->language_name = evas_stringshare_add(lang->lang_name); + + cfg->border_lang_setup = evas_list_append(cfg->border_lang_setup, bls); + } + } + } + else + cfg->language_selector = n; + + APPLY_LANGUAGE_SETTINGS(cfg); + //e_module_dialog_show("Warning", "Focused window on desktop"); + } + } + else if (cfg->lang_policy == LS_APPLICATION_POLICY) + { + //e_module_dialog_show("Warning" , "Warning : This feature is not implemented yet."); + } language_face_language_indicator_update(); } @@ -148,9 +279,9 @@ if (size <= 1) return; if (cfg->language_selector >= size - 1) - lang_language_switch_to(cfg, 0); + lang_language_switch_to(cfg, 0, 0); else - lang_language_switch_to(cfg, cfg->language_selector + 1); + lang_language_switch_to(cfg, cfg->language_selector + 1, 0); } void lang_language_switch_to_prev(Config *cfg) @@ -162,9 +293,9 @@ if (size <= 1) return; if (cfg->language_selector == 0) - lang_language_switch_to(cfg, size - 1); + lang_language_switch_to(cfg, size - 1, 0); else - lang_language_switch_to(cfg, cfg->language_selector - 1); + lang_language_switch_to(cfg, cfg->language_selector - 1, 0); } Language * lang_get_default_language(Config *cfg) @@ -428,7 +559,7 @@ const char * lang_language_current_kbd_model_get() { - //FIXME: make the function return the actuall keyboard model + //FIXME: make the function return the actual keyboard model return evas_stringshare_add("compaqik13"); } @@ -799,6 +930,134 @@ } return 1; } + +/********************** event callbacks ***************************************/ +int +lang_cb_event_desk_show(void *data, int type, void *event) +{ + E_Event_Desk_Show *ev; + Config *conf; + Evas_List *l; + E_Border *bd; + + if (!(conf = data)) return 1; + + ev = event; + // Actually this code should be executed only if WINDOW ir APPLICATION policy + // is used. + if (conf->lang_policy == LS_GLOBAL_POLICY) + { + e_module_dialog_show("Warning", "Warning: This is a bug in the code. This message<br>" + "should in this context when GLOBAL policy is used.<br>" + "Please report this behaviour."); + return 1; + } + + for (l = e_border_focus_stack_get(); l; l = l->next) + { + bd = l->data; + if ((!bd->iconic) && (bd->visible) && + (((bd->desk == ev->desk) || + ((bd->sticky) && (bd->zone == ev->desk->zone))))) + { + break; + } + bd = NULL; + } + + if (!bd) + lang_language_switch_to(conf, 0, 0); + + return 1; +} + +int lang_cb_event_border_focus_in(void *data, int type, void *ev) +{ + E_Event_Border_Focus_In *e; + + e = ev; + + lang_language_switch_to(data, 0, 1); + return 1; +} + +int lang_cb_event_border_remove(void *data, int type, void *ev) +{ + E_Event_Border_Remove *e; + Border_Language_Settings *bls; + + Evas_List *l; + Config *cfg; + + e = ev; + cfg = data; + + for (l = cfg->border_lang_setup; l; l = l->next) + { + bls = l->data; + + if (bls->bd == e->border) + { + cfg->border_lang_setup = evas_list_remove(cfg->border_lang_setup, bls); + if (bls->language_name) evas_stringshare_del(bls->language_name); + E_FREE(bls); + break; + } + } + + if (!e_border_focused_get()) + lang_language_switch_to(cfg, 0, 0); + + return 1; +} + +int +lang_cb_event_border_iconify(void *data, int type, void *ev) +{ + E_Event_Border_Iconify *e; + + e = ev; + + if (!e_border_focused_get()) + lang_language_switch_to(data, 0, 0); + + return; +} + +#if 0 +int +lang_cb_event_border_iconify(void *data, int type, void *event) +{ + // e_module_dialog_show("1", "lang_cb_event_border_iconify"); + return 1; +} +int +lang_cb_event_border_uniconify(void *data, int type, void *event) +{ + //e_module_dialog_show("1", "lang_cb_event_border_uniconify"); + return 1; +} +int +lang_cb_event_border_zone_set(void *data, int type, void *event) +{ + //e_module_dialog_show("1", "lang_cb_event_border_zone_set"); + return 1; +} +int +lang_cb_event_border_desk_set(void *data, int type, void *event) +{ + //e_module_dialog_show("1", "lang_cb_event_border_desk_set"); + return 1; +} +int +lang_cb_event_border_hide(void *data, int type, void *event) +{ + //e_module_dialog_show("1", "lang_cb_event_border_hide"); + return 1; +} +#endif + +/******************************************************************************/ #if 0 static int =================================================================== RCS file: /cvs/e/e_modules/language/src/module/e_mod_lang.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_mod_lang.h 18 May 2006 15:03:28 -0000 1.11 +++ e_mod_lang.h 23 May 2006 09:41:18 -0000 1.12 @@ -4,9 +4,10 @@ #include <e.h> #include "e_mod_main.h" -typedef struct _Language Language; -typedef struct _Language_Predef Language_Predef; -typedef struct _Language_Kbd_Model Language_Kbd_Model; +typedef struct _Language Language; +typedef struct _Language_Predef Language_Predef; +typedef struct _Language_Kbd_Model Language_Kbd_Model; +typedef struct _Border_Language_Settings Border_Language_Settings; struct _Language_Kbd_Model { @@ -14,6 +15,13 @@ const char *kbd_model_desctiption; }; +struct _Border_Language_Settings +{ + E_Border *bd; + int language_selector; + const char *language_name; +}; + struct _Language { unsigned int id; @@ -34,7 +42,7 @@ Evas_List *kbd_variant; // const char * }; -void lang_language_switch_to(Config *cfg, unsigned int n); +void lang_language_switch_to(Config *cfg, unsigned int n, int ignore_n); void lang_language_switch_to_next(Config *cfg); void lang_language_switch_to_prev(Config *cfg); @@ -50,5 +58,19 @@ void lang_language_free(Language *l); const char *lang_language_current_kbd_model_get(); + +/*************** border callback handlers *****************/ + +int lang_cb_event_desk_show(void *data, int type, void *ev); +int lang_cb_event_border_focus_in(void *data, int type, void *ev); +int lang_cb_event_border_remove(void *data, int type, void *ev); +int lang_cb_event_border_iconify(void *data, int type, void *ev); + +#if 0 +int lang_cb_event_border_zone_set(void *data, int type, void *event); +int lang_cb_event_border_desk_set(void *data, int type, void *event); +int lang_cb_event_border_show(void *data, int type, void *event); +int lang_cb_event_border_hide(void *data, int type, void *event); +#endif #endif =================================================================== RCS file: /cvs/e/e_modules/language/src/module/e_mod_main.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- e_mod_main.c 18 May 2006 16:32:17 -0000 1.12 +++ e_mod_main.c 23 May 2006 09:41:18 -0000 1.13 @@ -77,8 +77,7 @@ _lang_button_cb_mouse_down, inst); language_config->instances = evas_list_append(language_config->instances, inst); - //language_face_language_indicator_update(); - lang_language_switch_to(language_config, language_config->language_selector); + lang_language_switch_to(language_config, language_config->language_selector, 0); return gcc; } static void @@ -179,7 +178,6 @@ if (load_default_config) { - e_module_dialog_show("aaaaaaaaa", "neeewwwwwwwww config!!!!!!!!!!!"); Language *lang; language_config->lang_policy = LS_GLOBAL_POLICY; language_config->lang_show_indicator = 1; @@ -209,9 +207,12 @@ E_CONFIG_LIMIT(language_config->lang_show_indicator, 0, 1); language_config->module = m; + + e_gadcon_provider_register((E_Gadcon_Client_Class *)(&_gadcon_class)); - //language_face_language_indicator_update(); + language_register_callback_handlers(); + lang_register_module_actions(); lang_register_module_keybindings(); } @@ -221,8 +222,11 @@ { e_gadcon_provider_unregister((E_Gadcon_Client_Class *)(&_gadcon_class)); + language_unregister_callback_handlers(); + language_clear_border_language_setup_list(); + // - lang_language_switch_to(language_config, 0); + lang_language_switch_to(language_config, 0, 0); if (language_config->config_dialog) e_object_del(E_OBJECT(language_config->config_dialog)); @@ -239,6 +243,7 @@ lang_unregister_module_keybindings(); lang_unregister_module_actions(); + free(language_config); language_config = NULL; @@ -304,6 +309,68 @@ } } +void language_register_callback_handlers() +{ + if (language_config->lang_policy == LS_GLOBAL_POLICY || + language_config->handlers) return; + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_DESK_SHOW, lang_cb_event_desk_show, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_FOCUS_IN, lang_cb_event_border_focus_in, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_REMOVE, lang_cb_event_border_remove, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_ICONIFY, lang_cb_event_border_iconify, language_config)); + + /*language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_ZONE_SET, lang_cb_event_border_zone_set, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_DESK_SET, lang_cb_event_border_desk_set, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_SHOW, lang_cb_event_border_show, language_config)); + + language_config->handlers = evas_list_append + (language_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_HIDE, lang_cb_event_border_hide, language_config));*/ +} +void language_unregister_callback_handlers() +{ + while (language_config->handlers) + { + ecore_event_handler_del(language_config->handlers->data); + language_config->handlers = evas_list_remove_list(language_config->handlers, + language_config->handlers); + } +} +void language_clear_border_language_setup_list() +{ + if (!language_config) return; + + while (language_config->border_lang_setup) + { + Border_Language_Settings *bls = language_config->border_lang_setup->data; + + if (bls->language_name) evas_stringshare_del(bls->language_name); + E_FREE(bls); + + language_config->border_lang_setup = + evas_list_remove_list(language_config->border_lang_setup, + language_config->border_lang_setup); + } +} /************************* Private funcs *************************************************/ static void _lang_button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -426,7 +493,7 @@ if (language_config->language_selector == indx) break; - lang_language_switch_to(language_config, indx); + lang_language_switch_to(language_config, indx, 0); break; } } =================================================================== RCS file: /cvs/e/e_modules/language/src/module/e_mod_main.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_mod_main.h 18 May 2006 15:03:28 -0000 1.11 +++ e_mod_main.h 23 May 2006 09:41:18 -0000 1.12 @@ -6,6 +6,7 @@ /******************* Shelf Code ****************************/ typedef enum { LS_GLOBAL_POLICY, LS_WINDOW_POLICY, + LS_APPLICATION_POLICY, LS_UNKNOWN_POLICY }lang_switch_policy_t; typedef struct _Config Config; @@ -27,10 +28,14 @@ Evas_List *instances; // Instance E_Menu *menu; + Evas_List *handlers; + /* lang related stuff */ unsigned int language_selector; Evas_List *language_predef_list; // Language_Predef Evas_List *language_kbd_model_list; // Language_Kbd_Model + + Evas_List *border_lang_setup; // Border_Language_Settings }; /********** module api *********************/ @@ -48,14 +53,11 @@ /************ Just publics *****************/ void language_face_language_indicator_update(); -/*******************************************/ -/**********************************************************/ +void language_register_callback_handlers(); +void language_unregister_callback_handlers(); -/* - -void lang_face_language_indicator_set(Lang *l); -void lang_face_menu_language_indicator_set(Lang *l); -void lang_face_menu_regenerate(Lang_Face *lf);*/ +void language_clear_border_language_setup_list(); +/*******************************************/ #endif ------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs