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:


More work on module. Now, the window policy should work fine, and fast as 
possible.
Ofcourse, in order, to get this seed it would be nice do E update.

===================================================================
RCS file: /cvs/e/e_modules/language/src/module/e_mod_config.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- e_mod_config.c      23 May 2006 09:41:18 -0000      1.13
+++ e_mod_config.c      27 May 2006 22:05:08 -0000      1.14
@@ -185,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, 80);
+              e_widget_min_size_set(ob, 390, 80);
               e_widget_ilist_go(ob);
            }
            e_widget_framelist_object_append(of, ob);
@@ -269,14 +269,14 @@
    for (l = cfdata->selected_languages; l; l = l->next)
      {
        lang = lang_language_copy(l->data);
+       lang_language_xorg_values_get(lang);
        if (lang) 
          cfdata->conf->languages = evas_list_append(cfdata->conf->languages, 
lang);
      }
    cfdata->conf->language_selector = 0;
    e_config_save_queue();
-   //e_config_save();
 
-   lang_language_switch_to(cfdata->conf, (cfdata->conf->language_selector = 
0), 0);
+   lang_language_switch_to(cfdata->conf, (cfdata->conf->language_selector = 
0));
    return 1;
 }
 static void
@@ -485,7 +485,7 @@
          {
             lkm = l->data;
 
-            if (!strcmp(lkm->kbd_model, selected_lang->kbd_model))
+            if (!strcmp(lkm->kbd_model, selected_lang->rdefs.model))
               kbd_model_indx = i;
 
             //snprintf(buf, sizeof(buf), "%s (%s)", 
lkm->kbd_model_desctiption, lkm->kbd_model);
@@ -499,7 +499,7 @@
             l; l = l->next, kbd_model_indx++)
          {
             lkm = l->data;
-            if (!strcmp(lkm->kbd_model, selected_lang->kbd_model))
+            if (!strcmp(lkm->kbd_model, selected_lang->rdefs.model))
               break;
          }
        if (!l)
@@ -541,7 +541,8 @@
                  char *variant = l->data;
                  if (!strcmp(variant, "basic")) continue;
 
-                 if (selected_lang->kbd_variant && 
!strcmp(selected_lang->kbd_variant, variant))
+                 if (selected_lang->rdefs.variant &&
+                     !strcmp(selected_lang->rdefs.variant, variant))
                    kbd_variant_indx = i;
 
                  e_widget_ilist_append(cfdata->gui.kbd_layout_variant_ilist,
@@ -588,13 +589,14 @@
    lang = E_NEW(Language, 1);
    if (!lang) return;
 
-   lang->id = evas_list_count(cfdata->selected_languages);
-   lang->lang_name = evas_stringshare_add(lp->lang_name);
+   lang->id           = evas_list_count(cfdata->selected_languages);
+   lang->lang_name     = evas_stringshare_add(lp->lang_name);
    lang->lang_shortcut = evas_stringshare_add(lp->lang_shortcut);
-   lang->lang_flag = !(lp->lang_flag) ? NULL : 
evas_stringshare_add(lp->lang_flag);
-   lang->kbd_model = lang_language_current_kbd_model_get();
-   lang->kbd_layout = evas_stringshare_add(lp->kbd_layout);
-   lang->kbd_variant = evas_stringshare_add("basic");
+   lang->lang_flag     = !(lp->lang_flag) ? NULL : 
evas_stringshare_add(lp->lang_flag);
+   lang->rdefs.model   = (char *) 
evas_stringshare_add(lang_language_current_kbd_model_get());
+   lang->rdefs.layout  = (char *) evas_stringshare_add(lp->kbd_layout);
+   lang->rdefs.variant = (char *) evas_stringshare_add("basic");
+   //lang_language_xorg_values_get(lang);
 
    cfdata->selected_languages = evas_list_append(cfdata->selected_languages, 
lang);
    //DO NOT sort selected_languages list. Here the sequence of the langs is 
essential!
@@ -742,8 +744,9 @@
 
    if (!lang || !lkm) return;
 
-   if (lang->kbd_model) evas_stringshare_del(lang->kbd_model);
-   lang->kbd_model = evas_stringshare_add(lkm->kbd_model);
+   if (lang->rdefs.model) evas_stringshare_del(lang->rdefs.model);
+   lang->rdefs.model = (char *) evas_stringshare_add(lkm->kbd_model);
+   //lang_language_xorg_values_get(lang);
 }
 static void 
 _lang_kbd_layout_variant_ilist_cb_change(void *data, Evas_Object *obj)
@@ -763,8 +766,9 @@
    lang = evas_list_nth(cfdata->selected_languages, indx_lang);
    if (indx_variant == 0)
      {
-       if (lang->kbd_variant) evas_stringshare_del(lang->kbd_variant);
-       lang->kbd_variant = evas_stringshare_add("basic");
+       if (lang->rdefs.variant) evas_stringshare_del(lang->rdefs.variant);
+       lang->rdefs.variant = (char *) evas_stringshare_add("basic");
+       //lang_language_xorg_values_get(lang);
        return;
      }
    else
@@ -780,8 +784,9 @@
               {
                  variant = evas_list_nth(lp->kbd_variant, indx_variant - 1);
 
-                 if (lang->kbd_variant) 
evas_stringshare_del(lang->kbd_variant);
-                 lang->kbd_variant = evas_stringshare_add(variant);
+                 if (lang->rdefs.variant) 
evas_stringshare_del(lang->rdefs.variant);
+                 lang->rdefs.variant = (char *) evas_stringshare_add(variant);
+                 //lang_language_xorg_values_get(lang);
                  break;
               }
          }
===================================================================
RCS file: /cvs/e/e_modules/language/src/module/e_mod_lang.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- e_mod_lang.c        23 May 2006 09:41:18 -0000      1.22
+++ e_mod_lang.c        27 May 2006 22:05:08 -0000      1.23
@@ -1,11 +1,7 @@
 
 #include "e_mod_lang.h"
 #include "e_mod_main.h"
-
 #include <EXML.h>
-#include <X11/Xlib.h>
-#include <X11/XKBlib.h>
-#include <X11/extensions/XKBrules.h>
 
 #define EXML_RETURN_ON_ERROR(xml) \
    { \
@@ -15,73 +11,12 @@
 
 /******************************************************/
 
-//#define DFLT_XKB_RULES_FILE   "/usr/share/X11/xkb/rules/xorg"
 #define DFLT_XKB_RULES_FILE   "/etc/X11/xkb/rules/xfree86"
 #define DFLT_XKB_LAYOUT              "us"
 #define DFLT_XKB_MODEL       "pc101"
 
-#define RULES_INDX     0
-#define CONFIG_INDX    1
-#define DISPLAY_INDX   2
-#define LOCALE_INDX    3
-#define MODEL_INDX     4
-#define LAYOUT_INDX    5
-#define VARIANT_INDX   6
-#define KEYCODES_INDX  7
-#define TYPES_INDX     8
-#define COMPAT_INDX    9
-#define SYMBOLS_INDX   10
-#define GEOMETRY_INDX  11
-#define KEYMAP_INDX    12
-#define NUM_OF_INDX    13
-
-#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); \
-   }
-
-#define LANG_SETTING_SET_RETURN_ON_ERROR(__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>" \
-                                   "contains incorrect rules information. This 
can happen if<br>" \
-                                   "you updated your X server to version 7.x. 
Please fix the<br>" \
-                                   "X keyboar rules file located via 
/etc/X11/xkb/rules/xfree86." \
-                          ); \
-      return; \
-   }
-
-#define LXC_SET_STRING(l, c, s) \
-   { \
-      if (!(l->sv[c])) \
-        l->sv[c] = (!s ? NULL : (char *)evas_stringshare_add(s)); \
-   }
-
-typedef struct _Language_Xkb_Config Language_Xkb_Config;
-
-struct _Language_Xkb_Config
-{
-   Display          *dpy;
-   XkbRF_VarDefsRec  rdefs;
-   char                     *sv[NUM_OF_INDX];
-};
-
-#if 0
-static int _lang_check_name(char *name, char* string);
-#endif
-
-static int _lang_apply_components_names(Language_Xkb_Config *lxc);
-static int _lang_apply_rules(Language_Xkb_Config *lxc);
-static int _lang_server_values_get(Language_Xkb_Config *lxc);
-static Display * _lang_server_display_get();
-static void _lang_apply_language_settings(const char *model, const char 
*layout,
-                                         const char *variant);
+static int  _lang_apply_language_conponent_names(Language *l);
+static void _lang_apply_language_settings(Language *l);
 
 /******************************************************/
 
@@ -99,13 +34,13 @@
 /****************************************/
 
 void
-lang_language_switch_to(Config *cfg, unsigned int n, int ignore_n)
+lang_language_switch_to(Config *cfg, unsigned int n)
 {
 #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); \
-   }
+     { \
+       Language *__l = evas_list_nth(__c->languages, __c->language_selector); \
+       if (__l) _lang_apply_language_settings(__l); \
+     }
    
    
    if (!cfg) return;
@@ -121,146 +56,67 @@
        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;
-
-            desk = e_desk_current_get
-                    
(e_zone_current_get(e_container_current_get(e_manager_current_get())));
-
-            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;
-              }
-
-            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;
+     { 
+       Evas_List *l; 
+       E_Border *bd = NULL;
 
-                 for (l = cfg->border_lang_setup; l; l = l->next)
-                   {
-                      bls = l->data;
+       if (n >= evas_list_count(cfg->languages)) 
+         n = evas_list_count(cfg->languages) - 1;
 
-                      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;
-                   }
+        bd = e_border_focused_get();
 
-                 if (bls) 
-                   cfg->language_selector = bls->language_selector;
-              } 
-            APPLY_LANGUAGE_SETTINGS(cfg);
-         }
-       else
-         { 
+       if (bd)
+         {
             Evas_List *l;
-            E_Border *bd = NULL;
+            Border_Language_Settings *bls; 
+            Language *lang;
 
-            if (n >= evas_list_count(cfg->languages))
-              n = evas_list_count(cfg->languages) - 1;
+            cfg->language_selector = n;
+            lang = evas_list_nth(cfg->languages, n);
 
-            bd = e_border_focused_get();
-
-            if (bd)
+            bls = NULL;
+            for (l = cfg->l.border_lang_setup; l; l = l->next)
               {
-                 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) 
+                 bls = l->data;
+                 if (bls && (bls->bd = bd))
+                   { 
+                      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);
+                           if (bls->language_name) 
evas_stringshare_del(bls->language_name);
+                           E_FREE(bls);
+                           cfg->l.border_lang_setup = evas_list_remove_list(
+                                                                    
cfg->l.border_lang_setup, l);
                         }
+                      break;
                    }
+                 bls = NULL;
               }
-            else
-              cfg->language_selector = n;
 
-            APPLY_LANGUAGE_SETTINGS(cfg);
-                 //e_module_dialog_show("Warning", "Focused window on 
desktop");
-         }
+            if (bls)
+              {
+                 bls->language_selector = n;
+                 if (bls->language_name) 
evas_stringshare_del(bls->language_name);
+                 bls->language_name = evas_stringshare_add(lang->lang_name);
+                 cfg->l.current = bd;
+              }
+            else
+              {
+                 cfg->l.current = NULL;
+                 if (n) 
+                   {
+                      bls = E_NEW(Border_Language_Settings, 1); 
+                      bls->bd = bd; 
+                      bls->language_selector = n; 
+                      bls->language_name = 
evas_stringshare_add(lang->lang_name); 
+                      
+                      cfg->l.border_lang_setup = 
evas_list_append(cfg->l.border_lang_setup, bls);
+                   }
+              }
+         } 
+       else 
+         cfg->language_selector = n; 
+       
+       APPLY_LANGUAGE_SETTINGS(cfg);
      }
    else if (cfg->lang_policy == LS_APPLICATION_POLICY)
      {
@@ -279,9 +135,9 @@
    if (size <= 1) return;
 
    if (cfg->language_selector >= size - 1)
-     lang_language_switch_to(cfg, 0, 0);
+     lang_language_switch_to(cfg, 0);
    else
-     lang_language_switch_to(cfg, cfg->language_selector + 1, 0);
+     lang_language_switch_to(cfg, cfg->language_selector + 1);
 }
 void
 lang_language_switch_to_prev(Config *cfg)
@@ -293,9 +149,9 @@
    if (size <= 1) return;
 
    if (cfg->language_selector == 0)
-     lang_language_switch_to(cfg, size - 1, 0);
+     lang_language_switch_to(cfg, size - 1);
    else
-     lang_language_switch_to(cfg, cfg->language_selector - 1, 0);
+     lang_language_switch_to(cfg, cfg->language_selector - 1);
 }
 Language *
 lang_get_default_language(Config *cfg)
@@ -313,13 +169,16 @@
             if (!lang)
               break;
 
-            lang->id = 0; 
-            lang->lang_name = evas_stringshare_add(lp->lang_name); 
+            lang->id            = 0; 
+            lang->lang_name     = evas_stringshare_add(lp->lang_name); 
             lang->lang_shortcut = evas_stringshare_add(lp->lang_shortcut); 
-            lang->lang_flag = evas_stringshare_add(lp->lang_flag); 
-            lang->kbd_model = lang_language_current_kbd_model_get();
-            lang->kbd_layout = evas_stringshare_add(lp->kbd_layout); 
-            lang->kbd_variant = evas_stringshare_add("basic"); 
+            lang->lang_flag     = evas_stringshare_add(lp->lang_flag); 
+
+            lang->rdefs.model   = (char *)evas_stringshare_add
+                                                  
(lang_language_current_kbd_model_get());
+            lang->rdefs.layout  = (char *) 
evas_stringshare_add(lp->kbd_layout); 
+            lang->rdefs.variant = (char *) evas_stringshare_add("basic"); 
+            lang_language_xorg_values_get(lang);
             break; 
          }
      }
@@ -532,13 +391,27 @@
    lang = E_NEW(Language, 1);
    if (!lang) return NULL;
 
-   lang->id = l->id;
-   lang->lang_name = l->lang_name ? evas_stringshare_add(l->lang_name) : NULL;
+   lang->id           = l->id;
+   lang->lang_name     = l->lang_name ? evas_stringshare_add(l->lang_name) : 
NULL;
    lang->lang_shortcut = l->lang_shortcut ? 
evas_stringshare_add(l->lang_shortcut) : NULL;
-   lang->lang_flag = l->lang_flag ? evas_stringshare_add(l->lang_flag) : NULL;
-   lang->kbd_model = l->kbd_model ? evas_stringshare_add(l->kbd_model) : NULL;
-   lang->kbd_layout = l->kbd_layout ? evas_stringshare_add(l->kbd_layout) : 
NULL;
-   lang->kbd_variant = l->kbd_variant ? evas_stringshare_add(l->kbd_variant) : 
NULL;
+   lang->lang_flag     = l->lang_flag ? evas_stringshare_add(l->lang_flag) : 
NULL;
+
+   lang->rdefs.model   = !l->rdefs.model ? NULL : (char *) 
evas_stringshare_add(l->rdefs.model);
+   lang->rdefs.layout  = !l->rdefs.layout ? NULL : (char *) 
evas_stringshare_add(l->rdefs.layout);
+   lang->rdefs.variant = !l->rdefs.variant ? NULL : (char *) 
evas_stringshare_add(l->rdefs.variant);
+
+   lang->cNames.keycodes = !l->cNames.keycodes ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.keycodes);
+   lang->cNames.symbols         = !l->cNames.symbols ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.symbols);
+   lang->cNames.types   = !l->cNames.types ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.types);
+   lang->cNames.compat  = !l->cNames.compat ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.compat);
+   lang->cNames.geometry = !l->cNames.geometry ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.geometry);
+   lang->cNames.keymap = !l->cNames.keymap ? NULL :
+                                               (char *) 
evas_stringshare_add(l->cNames.keymap);
 
    return lang;
 }
@@ -551,16 +424,29 @@
    if (l->lang_name) evas_stringshare_del(l->lang_name);
    if (l->lang_shortcut) evas_stringshare_del(l->lang_shortcut);
    if (l->lang_flag) evas_stringshare_del(l->lang_flag);
-   if (l->kbd_model) evas_stringshare_del(l->kbd_model);
-   if (l->kbd_layout) evas_stringshare_del(l->kbd_layout);
-   if (l->kbd_variant) evas_stringshare_del(l->kbd_variant);
+
+   if (l->rdefs.model) evas_stringshare_del(l->rdefs.model);
+   if (l->rdefs.layout) evas_stringshare_del(l->rdefs.layout);
+   if (l->rdefs.variant) evas_stringshare_del(l->rdefs.variant);
+
+   if (l->cNames.keycodes) evas_stringshare_del(l->cNames.keycodes);
+   if (l->cNames.symbols) evas_stringshare_del(l->cNames.symbols);
+   if (l->cNames.types) evas_stringshare_del(l->cNames.types);
+   if (l->cNames.compat) evas_stringshare_del(l->cNames.compat);
+   if (l->cNames.geometry) evas_stringshare_del(l->cNames.geometry);
+   if (l->cNames.keymap) evas_stringshare_del(l->cNames.keymap);
+
    E_FREE(l);
 }
 const char *
 lang_language_current_kbd_model_get()
 {
-   //FIXME: make the function return the actual keyboard model
-   return evas_stringshare_add("compaqik13");
+   XkbRF_VarDefsRec vd;
+   char *tmp;
+
+   if (!XkbRF_GetNamesProp((Display *)ecore_x_display_get(), &tmp, &vd))
+     return "pc101";
+   return vd.model;
 } 
 
 /************** private ******************/
@@ -751,186 +637,102 @@
    return strcmp((const char *)lp1->lang_name, (const char *)lp2->lang_name);
 }
 /****************************************/
-
 static void
-_lang_apply_language_settings(const char *model, const char *layout,
-                             const char *variant)
-{
-   Language_Xkb_Config *lxc;
-
-   if (!layout) return;
-
-   lxc = E_NEW(Language_Xkb_Config, 1);
-   if (!lxc) return;
-
-   LXC_SET_STRING(lxc, MODEL_INDX, model);
-   LXC_SET_STRING(lxc, LAYOUT_INDX, layout);
-   LXC_SET_STRING(lxc, VARIANT_INDX, variant);
-
-   if (!(lxc->dpy = _lang_server_display_get()))
-     LANG_SETTING_SET_RETURN_ON_ERROR(lxc);
-
-   // this is a hack of locale.
-   lxc->sv[LOCALE_INDX] = (char *)evas_stringshare_add("C");
-
-   if (!_lang_server_values_get(lxc))
-     LANG_SETTING_SET_RETURN_ON_ERROR(lxc);
-
-   if (!_lang_apply_rules(lxc))
-     LANG_SETTING_SET_RETURN_ON_ERROR(lxc);
-
-   if (!_lang_apply_components_names(lxc))
-     LANG_SETTING_SET_RETURN_ON_ERROR(lxc);
-
-   LXC_FREE(lxc);
-}
-static Display *
-_lang_server_display_get()
+_lang_apply_language_settings(Language *l)
 {
-   int     major, minor, why;
-   char            *display;
-
-   major = XkbMajorVersion;
-   minor = XkbMinorVersion;
+   if (!l) return;
 
-   display = getenv("DISPLAY");
 
-   return XkbOpenDisplay(display, NULL, NULL, &major, &minor, &why);
+   if (!_lang_apply_language_conponent_names(l))
+     return;
 }
-
-static int
-_lang_server_values_get(Language_Xkb_Config *lxc)
+////////////////// move this to public ////////////////////////
+int 
+lang_language_xorg_values_get(Language *l)
 {
+#if 0
    XkbRF_VarDefsRec  vd;
    char                     *tmp = NULL;
+#endif
+   XkbComponentNamesRec        rnames;
+   XkbRF_RulesPtr      rules = NULL;
 
-   if (!lxc) return 0;
+   if (!l) return 0;
 
-   if (!XkbRF_GetNamesProp(lxc->dpy, &tmp, &vd) || !tmp)
+#if 0
+   if (!XkbRF_GetNamesProp((Display *)ecore_x_display_get(), &tmp, &vd) || 
!tmp)
      {
-       tmp          = DFLT_XKB_RULES_FILE;
-       vd.model     = DFLT_XKB_MODEL;
-       vd.layout    = DFLT_XKB_LAYOUT;
+       vd.model     =  DFLT_XKB_MODEL;
+       vd.layout    =  DFLT_XKB_LAYOUT;
        vd.variant   = NULL;
        vd.options   = NULL;
      }
-
-   if (tmp) LXC_SET_STRING(lxc, RULES_INDX, tmp);
-   if (vd.model) LXC_SET_STRING(lxc, MODEL_INDX, vd.model);
-   if (vd.layout) LXC_SET_STRING(lxc, LAYOUT_INDX, vd.layout);
-   if (vd.variant) LXC_SET_STRING(lxc, VARIANT_INDX, vd.variant);
+   if (vd.model)
+     { if (!l->rdefs.model) l->rdefs.model = vd.model; }
+   if (vd.layout)
+     { if (!l->rdefs.layout) l->rdefs.layout = vd.layout; }
+   if (vd.variant)
+     { if (!l->rdefs.variant) l->rdefs.variant = vd.variant; }
 
    if (vd.options) XFree(vd.options);
+#endif 
 
-   return 1;
-}
-
-static int
-_lang_apply_rules(Language_Xkb_Config *lxc)
-{
-   //FIXME: rfName is a hack it points to /usr/share/X11/xkb/rules/xorg
-   //I'm not sure that this file exist in all the versions of X
-   //Mostprobably this path should be /usr/X11R6/lib/X11/xkb/rules/xfree86
-   char                        *rfName = DFLT_XKB_RULES_FILE;
-   XkbComponentNamesRec        rnames;
-   XkbRF_RulesPtr      rules = NULL;
-
-   if (!lxc) return 0;
-
-   lxc->rdefs.model    = lxc->sv[MODEL_INDX];
-   lxc->rdefs.layout   = lxc->sv[LAYOUT_INDX];
-   lxc->rdefs.variant  = lxc->sv[VARIANT_INDX];
-
-   rules = XkbRF_Load(rfName, lxc->sv[LOCALE_INDX], True, True);
+   rules = XkbRF_Load(DFLT_XKB_RULES_FILE, "C", True, True);
+   if (!rules) return 0;
 
-   if (!rules)
-     return 0;
-
-   XkbRF_GetComponents(rules, &(lxc->rdefs), &rnames);
+   XkbRF_GetComponents(rules, &(l->rdefs), &rnames);
 
    if (rnames.keycodes)
      { 
-       LXC_SET_STRING(lxc, KEYCODES_INDX, rnames.keycodes);
-       rnames.keycodes = NULL;
-       //E_FREE(rnames.keycodes);
+       if (l->cNames.keycodes) evas_stringshare_del(l->cNames.keycodes);
+       l->cNames.keycodes = (char *) evas_stringshare_add(rnames.keycodes);
      }
    if (rnames.symbols)
-     {
-       LXC_SET_STRING(lxc, SYMBOLS_INDX, rnames.symbols);
-       rnames.symbols = NULL;
-       //E_FREE(rnames.symbols);
+     { 
+       if (l->cNames.symbols) evas_stringshare_del(l->cNames.symbols);
+       l->cNames.symbols = (char *) evas_stringshare_add(rnames.symbols);
      }
-   if(rnames.types)
-     {
-       LXC_SET_STRING(lxc, TYPES_INDX, rnames.types);
-       rnames.types = NULL;
-       //E_FREE(rnames.types);
+   if (rnames.types)
+     { 
+       if (l->cNames.types) evas_stringshare_del(l->cNames.types);
+       l->cNames.types = (char *) evas_stringshare_add(rnames.types);
      }
    if (rnames.compat)
-     {
-       LXC_SET_STRING(lxc, COMPAT_INDX, rnames.compat);
-       rnames.compat = NULL;
-       //E_FREE(rnames.compat);
+     { 
+       if (l->cNames.compat) evas_stringshare_del(l->cNames.compat);
+       l->cNames.compat = (char *) evas_stringshare_add(rnames.compat);
      }
    if (rnames.geometry)
-     {
-       LXC_SET_STRING(lxc, GEOMETRY_INDX, rnames.geometry);
-       rnames.geometry = NULL;
-       //E_FREE(rnames.geometry);
+     { 
+       if (l->cNames.geometry) evas_stringshare_del(l->cNames.geometry);
+       l->cNames.geometry = (char *) evas_stringshare_add(rnames.geometry); 
      }
    if (rnames.keymap)
-     {
-       LXC_SET_STRING(lxc, KEYMAP_INDX, rnames.keymap);
-       rnames.keymap = NULL;
-       //E_FREE(rnames.keymap);
+     { 
+       if (l->cNames.keymap) evas_stringshare_del(l->cNames.keymap);
+       l->cNames.keymap = (char *) evas_stringshare_add(rnames.keymap); 
      }
+
    return 1;
 }
 static int
-_lang_apply_components_names(Language_Xkb_Config *lxc)
+_lang_apply_language_conponent_names(Language *l)
 {
-   XkbDescPtr          xkb = NULL;
-   XkbComponentNamesRec        cmdNames;
-
-   if (!lxc) return 0;
-
-#if 0
-   if (!_lang_check_name(lxc->sv[TYPES_INDX], "types")) { 
printf("\n[1]\n");return 0;}
-   if (!_lang_check_name(lxc->sv[COMPAT_INDX], "compat")) { 
printf("\n[2]\n");return 0;}
-   if (!_lang_check_name(lxc->sv[SYMBOLS_INDX], "symbols")) { 
printf("\n[3]\n");return 0;}
-   if (!_lang_check_name(lxc->sv[KEYCODES_INDX], "keycodes")) { 
printf("\n[4]\n");return 0;}
-   if (!_lang_check_name(lxc->sv[GEOMETRY_INDX], "geometry")) { 
printf("\n[5]\n");return 0;}
-   if (!_lang_check_name(lxc->sv[KEYMAP_INDX], "keymap")) { 
printf("\n[6]\n");return 0;}
-#endif
-
-   memset(&cmdNames, 0, sizeof(XkbComponentNamesRec));
-
-   cmdNames.types    = lxc->sv[TYPES_INDX];
-   cmdNames.compat   = lxc->sv[COMPAT_INDX];
-   cmdNames.symbols  = lxc->sv[SYMBOLS_INDX];
-   cmdNames.keycodes = lxc->sv[KEYCODES_INDX];
-   cmdNames.geometry = lxc->sv[GEOMETRY_INDX];
-   cmdNames.keymap   = lxc->sv[KEYMAP_INDX];
+   XkbDescPtr  xkb = NULL;
+   if (!l) return 0;
 
-   xkb = XkbGetKeyboardByName(lxc->dpy, XkbUseCoreKbd, &cmdNames,
+   xkb = XkbGetKeyboardByName((Display *)ecore_x_display_get(), XkbUseCoreKbd, 
&(l->cNames),
                              XkbGBN_AllComponentsMask,
-                             XkbGBN_AllComponentsMask & 
(~XkbGBN_GeometryMask), 1);
+                             XkbGBN_AllComponentsMask & (~XkbGBN_GeometryMask) 
, True);
 
-   if (!xkb)
-     {
-       return 0;
-     }
+   if (!xkb) return 0;
+
+   if (!XkbRF_SetNamesProp((Display *)ecore_x_display_get(),
+                          DFLT_XKB_RULES_FILE, &(l->rdefs))) 
+     return 0;
 
-   if (lxc->rdefs.model || lxc->rdefs.layout)
-     {
-       if (!XkbRF_SetNamesProp(lxc->dpy, DFLT_XKB_RULES_FILE, &(lxc->rdefs)))
-         {
-            return 0;
-         }
-     }
    return 1;
 }
-
 /********************** event callbacks 
***************************************/
 int
 lang_cb_event_desk_show(void *data, int type, void *event)
@@ -965,48 +767,81 @@
        bd = NULL; 
      }
 
-   if (!bd)
-     lang_language_switch_to(conf, 0, 0);
+   if (!bd && conf->language_selector)
+     lang_language_switch_to(conf, 0);
 
    return 1;
 }
 
-int lang_cb_event_border_focus_in(void *data, int type, void *ev)
+int
+lang_cb_event_border_focus_in(void *data, int type, void *ev)
 {
+   Border_Language_Settings *bls;
+   Config *conf;
    E_Event_Border_Focus_In *e;
+   Evas_List *l;
 
    e = ev;
+   conf = data;
+
+   if (conf->l.current == e->border)
+     return 1;
+   else
+     conf->l.current = e->border;
+
+   bls = NULL;
+   for (l = conf->l.border_lang_setup; l; l = l->next)
+     {
+       bls = l->data;
+       if (bls->bd == e->border && (bls->language_selector != 
conf->language_selector))
+         {
+            Language *lang;
+
+            conf->language_selector = bls->language_selector;
+            lang = evas_list_nth(conf->languages, conf->language_selector);
+            _lang_apply_language_settings(lang);
+            language_face_language_indicator_update();
+            break;
+         }
+       bls = NULL;
+     }
+
+   if (!bls && conf->language_selector)
+     {
+       conf->language_selector = 0;
+       _lang_apply_language_settings(conf->languages->data);
+       language_face_language_indicator_update();
+     }
 
-   lang_language_switch_to(data, 0, 1);
    return 1;
 }
-
-int lang_cb_event_border_remove(void *data, int type, void *ev)
+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;
+   Config      *conf;
 
    e = ev;
-   cfg = data;
+   conf = data;
 
-   for (l = cfg->border_lang_setup; l; l = l->next)
+   for (l = conf->l.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);
+            conf->l.border_lang_setup = 
evas_list_remove(conf->l.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);
+   if (!e_border_focused_get() && conf->language_selector)
+     lang_language_switch_to(conf, 0);
 
    return 1;
 }
@@ -1015,90 +850,19 @@
 lang_cb_event_border_iconify(void *data, int type, void *ev)
 {
    E_Event_Border_Iconify *e;
+   Config *conf;
 
    e = ev;
+   conf = data;
 
-   if (!e_border_focused_get())
-     lang_language_switch_to(data, 0, 0);
+   if (!e_border_focused_get() && conf->language_selector)
+     lang_language_switch_to(conf, 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 
-_lang_check_name(char *name, char* string)
-{
-   char *i = name, *opar = NULL;
-   int ret = 1; 
 
-   if(!name)
-      return 1;
 
-   while (*i){
-      if (opar == NULL) {
-         if (*i == '(')
-         opar = i;
-      } else {
-         if ((*i == '(') || (*i == '|') || (*i == '+')) {
-             ret = 0;
-             break;
-         }
-         if (*i == ')')
-             opar = NULL;
-      }
-      i++;
-   }
-   if (opar)
-      ret = 0;
-   if (!ret) {
-      char c;
-      int n = 1;
-      for(i = opar+1; *i && n; i++) {
-         if (*i == '(') n++;
-         if (*i == ')') n--;
-      }
-      if (*i) i++;
-      c = *i;
-      *i = '\0';
-      printf("Illegal map name '%s' ", opar);
-      *i = c;
-      printf("in %s name '%s'\n", string, name);
-   }
-   return ret;
-}
-#endif
+
+
===================================================================
RCS file: /cvs/e/e_modules/language/src/module/e_mod_lang.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- e_mod_lang.h        23 May 2006 09:41:18 -0000      1.12
+++ e_mod_lang.h        27 May 2006 22:05:08 -0000      1.13
@@ -4,6 +4,10 @@
 #include <e.h>
 #include "e_mod_main.h"
 
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <X11/extensions/XKBrules.h>
+
 typedef struct _Language                 Language;
 typedef struct _Language_Predef                  Language_Predef;
 typedef struct _Language_Kbd_Model       Language_Kbd_Model;
@@ -24,13 +28,12 @@
 
 struct _Language
 {
-   unsigned int          id;
-   const char    *lang_name;
-   const char    *lang_shortcut;
-   const char    *lang_flag;
-   const char    *kbd_model;
-   const char    *kbd_layout;
-   const char    *kbd_variant;
+   unsigned int                id;
+   const char          *lang_name;
+   const char          *lang_shortcut;
+   const char          *lang_flag;
+   XkbRF_VarDefsRec    rdefs;
+   XkbComponentNamesRec        cNames;
 };
 
 struct _Language_Predef
@@ -42,7 +45,7 @@
    Evas_List   *kbd_variant; // const char *
 };
 
-void       lang_language_switch_to(Config *cfg, unsigned int n, int ignore_n);
+void       lang_language_switch_to(Config *cfg, unsigned int n);
 void       lang_language_switch_to_next(Config *cfg);
 void       lang_language_switch_to_prev(Config *cfg);
 
@@ -57,7 +60,9 @@
 Language    *lang_language_copy(const Language *l);
 void       lang_language_free(Language *l);
 
-const char *lang_language_current_kbd_model_get();
+const char  *lang_language_current_kbd_model_get();
+
+int        lang_language_xorg_values_get(Language *l);
 
 /*************** border callback handlers *****************/
 
===================================================================
RCS file: /cvs/e/e_modules/language/src/module/e_mod_main.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- e_mod_main.c        23 May 2006 09:41:18 -0000      1.13
+++ e_mod_main.c        27 May 2006 22:05:08 -0000      1.14
@@ -77,7 +77,7 @@
                                  _lang_button_cb_mouse_down, inst);
 
    language_config->instances = evas_list_append(language_config->instances, 
inst);
-   lang_language_switch_to(language_config, 
language_config->language_selector, 0);
+   lang_language_switch_to(language_config, 
language_config->language_selector);
    return gcc;
 }
 static void
@@ -127,7 +127,8 @@
 EAPI void *
 e_modapi_init(E_Module *m)
 {
-   int  load_default_config = 0;
+   int      load_default_config = 0;
+   Evas_List *l;
 
    conf_langlist_edd = E_CONFIG_DD_NEW("Language_List_Config", Language);
 #undef T
@@ -138,9 +139,12 @@
    E_CONFIG_VAL(D, T, lang_name, STR);
    E_CONFIG_VAL(D, T, lang_shortcut, STR);
    E_CONFIG_VAL(D, T, lang_flag, STR);
-   E_CONFIG_VAL(D, T, kbd_model, STR);
+   E_CONFIG_VAL(D, T, rdefs.model, STR);
+   E_CONFIG_VAL(D, T, rdefs.layout, STR);
+   E_CONFIG_VAL(D, T, rdefs.variant, STR);
+   /*E_CONFIG_VAL(D, T, kbd_model, STR);
    E_CONFIG_VAL(D, T, kbd_layout, STR);
-   E_CONFIG_VAL(D, T, kbd_variant, STR);
+   E_CONFIG_VAL(D, T, kbd_variant, STR);*/
 
    conf_edd = E_CONFIG_DD_NEW("Language_Config", Config);
 #undef T
@@ -208,6 +212,13 @@
 
    language_config->module = m;
 
+   /* initializing languages */
+   for (l = language_config->languages; l; l = l->next)
+     {
+       lang_language_xorg_values_get(l->data);
+     }
+
+   language_config->l.current = e_border_focused_get();
 
    e_gadcon_provider_register((E_Gadcon_Client_Class *)(&_gadcon_class));
 
@@ -220,13 +231,14 @@
 EAPI int
 e_modapi_shutdown(E_Module *m)
 {
+   Evas_List *l;
+
    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, 0);
+   lang_language_switch_to(language_config, 0);
 
    if (language_config->config_dialog)
      e_object_del(E_OBJECT(language_config->config_dialog));
@@ -243,6 +255,10 @@
    lang_unregister_module_keybindings();
    lang_unregister_module_actions();
 
+   for (l = language_config->languages; l; l = l->next)
+     {
+       lang_language_free(l->data);
+     }
 
    free(language_config);
    language_config = NULL;
@@ -292,12 +308,15 @@
 {
    Evas_List   *l;
    Instance    *inst; 
+   static int counter = 0;
 
    if (!language_config) return;
 
+
    for (l = language_config->instances; l; l = l->next)
      {
        inst = l->data;
+
        if (language_config->languages)
          {
             Language   *lang = evas_list_nth(language_config->languages,
@@ -321,7 +340,6 @@
    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));
@@ -329,22 +347,6 @@
    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()
 { 
@@ -359,16 +361,17 @@
 {
    if (!language_config) return;
 
-   while (language_config->border_lang_setup)
+   language_config->l.current = NULL;
+   while (language_config->l.border_lang_setup)
      {
-       Border_Language_Settings *bls = 
language_config->border_lang_setup->data;
+       Border_Language_Settings *bls = 
language_config->l.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);
+       language_config->l.border_lang_setup = 
+          evas_list_remove_list(language_config->l.border_lang_setup,
+                                language_config->l.border_lang_setup);
      }
 }
 /************************* Private funcs 
*************************************************/
@@ -429,9 +432,7 @@
                  e_menu_item_radio_set(mi, 1);
                  e_menu_item_radio_group_set(mi, 
SELECTED_LANG_SET_RADIO_GROUP);
                  e_menu_item_toggle_set(mi, indx == 
language_config->language_selector ? 1 : 0);
-                 //FIXME: enable
                  e_menu_item_callback_set(mi, 
_language_face_cb_menu_switch_language_to, NULL);
-                 //e_menu_item_callback_set(mi, 
_language_face_menu_cb_switch_language_to, NULL);
               }
             
             e_menu_post_deactivate_callback_set(mn, 
_lang_menu_cb_post_deactivate, inst); 
@@ -493,7 +494,7 @@
             if (language_config->language_selector == indx)
               break;
 
-            lang_language_switch_to(language_config, indx, 0);
+            lang_language_switch_to(language_config, indx);
             break;
          }
      }
===================================================================
RCS file: /cvs/e/e_modules/language/src/module/e_mod_main.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- e_mod_main.h        23 May 2006 09:41:18 -0000      1.12
+++ e_mod_main.h        27 May 2006 22:05:08 -0000      1.13
@@ -35,7 +35,11 @@
    Evas_List     *language_predef_list; // Language_Predef
    Evas_List     *language_kbd_model_list; // Language_Kbd_Model
 
-   Evas_List     *border_lang_setup; // Border_Language_Settings
+   struct
+     { 
+       Evas_List *border_lang_setup; // Border_Language_Settings 
+       E_Border  *current;
+     } l;
 };
 
 /********** module api *********************/




-------------------------------------------------------
All the advantages of Linux Managed Hosting--Without the Cost and Risk!
Fully trained technicians. The highest number of Red Hat certifications in
the hosting industry. Fanatical Support. Click to learn more
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to