Get a default keymap rmlvo rule from the config file 56/72056/4
authorJengHyun Kang <jhyuni.kang@samsung.com>
Mon, 30 May 2016 10:11:52 +0000 (19:11 +0900)
committerJeongHyun Kang <jhyuni.kang@samsung.com>
Wed, 8 Jun 2016 09:04:08 +0000 (18:04 +0900)
Change-Id: I9f38547c7bdaec5ecddc1b1d96d4db407fb27ebd

src/bin/e_comp_screen.c
src/bin/e_comp_wl_input.c
src/bin/e_comp_wl_input.h
src/bin/e_config.c
src/bin/e_config.h

index 885f085002c5dded257053069e6769a7f4506ee9..d183c4b15ac2ff3a3f9512f65e920e3e0201e9b1 100644 (file)
@@ -456,6 +456,7 @@ _e_comp_screen_keymap_set(struct xkb_context **ctx, struct xkb_keymap **map)
    struct xkb_context *context;
    struct xkb_keymap *keymap;
    struct xkb_rule_names names = {0,};
+   const char* default_rules, *default_model, *default_layout, *default_variant, *default_options;
 
    TRACE_INPUT_BEGIN(_e_comp_screen_keymap_set);
 
@@ -464,9 +465,18 @@ _e_comp_screen_keymap_set(struct xkb_context **ctx, struct xkb_keymap **map)
 
    /* assemble xkb_rule_names so we can fetch keymap */
    memset(&names, 0, sizeof(names));
-   names.rules = strdup("evdev");
-   names.model = strdup("pc105");
-   names.layout = strdup("us");
+
+   default_rules = e_comp_wl_input_keymap_default_rules_get();
+   default_model = e_comp_wl_input_keymap_default_model_get();
+   default_layout = e_comp_wl_input_keymap_default_layout_get();
+   default_variant = e_comp_wl_input_keymap_default_variant_get();
+   default_options = e_comp_wl_input_keymap_default_options_get();
+
+   names.rules = strdup(default_rules);
+   names.model = strdup(default_model);
+   names.layout = strdup(default_layout);
+   if (default_variant) names.variant = strdup(default_variant);
+   if (default_options) names.options = strdup(default_options);
 
    keymap = e_comp_wl_input_keymap_compile(context, names, &keymap_path);
    eina_stringshare_del(keymap_path);
@@ -485,6 +495,8 @@ cleanup:
    free((char *)names.rules);
    free((char *)names.model);
    free((char *)names.layout);
+   if (names.variant) free((char *)names.variant);
+   if (names.options) free((char *)names.options);
 
    TRACE_INPUT_END();
 }
@@ -661,7 +673,12 @@ e_comp_screen_init()
    /* FIXME: This is just for testing at the moment....
     * happens to jive with what drm does */
    e_main_ts("\tE_Comp_WL Keymap Init");
-   e_comp_wl_input_keymap_set("evdev", "pc105", "us", ctx, map);
+   e_comp_wl_input_keymap_set(e_comp_wl_input_keymap_default_rules_get(),
+                              e_comp_wl_input_keymap_default_model_get(),
+                              e_comp_wl_input_keymap_default_layout_get(),
+                              e_comp_wl_input_keymap_default_variant_get(),
+                              e_comp_wl_input_keymap_default_options_get(),
+                              ctx, map);
    e_main_ts("\tE_Comp_WL Keymap Init Done");
 
    E_LIST_HANDLER_APPEND(event_handlers, ECORE_DRM_EVENT_ACTIVATE,         _e_comp_screen_cb_activate,         comp);
index 19972bce7e504a98365860d3dafd4ffc7ab39242..7915c6c1e713b5e227a1725ce95904972f659dd1 100644 (file)
@@ -794,12 +794,14 @@ e_comp_wl_input_keymap_compile(struct xkb_context *ctx, struct xkb_rule_names na
 
 E_API void
 e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *layout,
+                           const char *variant, const char *options,
                            struct xkb_context *dflt_ctx, struct xkb_keymap *dflt_map)
 {
    struct xkb_keymap *keymap;
    struct xkb_rule_names names;
    char *keymap_path = NULL;
    Eina_Bool use_dflt_xkb = EINA_FALSE;
+   const char *default_rules, *default_model, *default_layout, *default_variant, *default_options;
 
    /* DBG("COMP_WL: Keymap Set: %s %s %s", rules, model, layout); */
    TRACE_INPUT_BEGIN(e_comp_wl_input_keymap_set);
@@ -828,11 +830,35 @@ e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *lay
    /* assemble xkb_rule_names so we can fetch keymap */
    memset(&names, 0, sizeof(names));
    if (rules) names.rules = strdup(rules);
-   else names.rules = strdup("evdev");
+   else
+     {
+        default_rules = e_comp_wl_input_keymap_default_rules_get();
+        names.rules = strdup(default_rules);
+     }
    if (model) names.model = strdup(model);
-   else names.model = strdup("pc105");
+   else
+     {
+        default_model = e_comp_wl_input_keymap_default_model_get();
+        names.model = strdup(default_model);
+     }
    if (layout) names.layout = strdup(layout);
-   else names.layout = strdup("us");
+   else
+     {
+        default_layout = e_comp_wl_input_keymap_default_layout_get();
+        names.layout = strdup(default_layout);
+     }
+   if (variant) names.variant = strdup(variant);
+   else
+     {
+        default_variant = e_comp_wl_input_keymap_default_variant_get();
+        if (default_variant) names.variant = strdup(default_variant);
+     }
+   if (options) names.options = strdup(options);
+   else
+     {
+        default_options = e_comp_wl_input_keymap_default_options_get();
+        if (default_options) names.options = strdup(default_options);
+     }
 
    TRACE_INPUT_BEGIN(e_comp_wl_input_keymap_set_keymap_compile);
    if (use_dflt_xkb)
@@ -862,9 +888,81 @@ e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *lay
    free((char *)names.rules);
    free((char *)names.model);
    free((char *)names.layout);
+   if (names.variant) free((char *)names.variant);
+   if (names.options) free((char *)names.options);
    TRACE_INPUT_END();
 }
 
+E_API const char*
+e_comp_wl_input_keymap_default_rules_get(void)
+{
+   const char *rules;
+   if (e_config->xkb.default_rmlvo.rules)
+     return e_config->xkb.default_rmlvo.rules;
+   else
+     {
+        rules = getenv("E_DEFAULT_XKB_RULES");
+        if (rules) return rules;
+        else return "evdev";
+     }
+}
+
+E_API const char*
+e_comp_wl_input_keymap_default_model_get(void)
+{
+   const char *model;
+   if (e_config->xkb.default_rmlvo.model)
+     return e_config->xkb.default_rmlvo.model;
+   else
+     {
+        model = getenv("E_DEFAULT_XKB_MODEL");
+        if (model) return model;
+        else return "pc105";
+     }
+}
+
+E_API const char*
+e_comp_wl_input_keymap_default_layout_get(void)
+{
+   const char *layout;
+   if (e_config->xkb.default_rmlvo.layout)
+     return e_config->xkb.default_rmlvo.layout;
+   else
+     {
+        layout = getenv("E_DEFAULT_XKB_LAYOUT");
+        if (layout) return layout;
+        else return "us";
+     }
+}
+
+E_API const char*
+e_comp_wl_input_keymap_default_variant_get(void)
+{
+   const char *variant;
+   if (e_config->xkb.default_rmlvo.variant)
+     return e_config->xkb.default_rmlvo.variant;
+   else
+     {
+        variant = getenv("E_DEFAULT_XKB_VARIANT");
+        if (variant) return variant;
+        else return NULL;
+     }
+}
+
+E_API const char*
+e_comp_wl_input_keymap_default_options_get(void)
+{
+   const char *options;
+   if (e_config->xkb.default_rmlvo.options)
+     return e_config->xkb.default_rmlvo.options;
+   else
+     {
+        options = getenv("E_DEFAULT_XKB_OPTIONS");
+        if (options) return options;
+        else return NULL;
+     }
+}
+
 E_API void
 e_comp_wl_input_touch_enabled_set(Eina_Bool enabled)
 {
index 3195c446f2387f5fde63d165e751efcef713a69e..f7658f048982930e606f9844ced4320b0f326e77 100644 (file)
@@ -30,7 +30,13 @@ E_API void e_comp_wl_input_touch_enabled_set(Eina_Bool enabled);
 E_API Eina_Bool e_comp_wl_input_keymap_cache_file_use_get(void);
 E_API Eina_Stringshare *e_comp_wl_input_keymap_path_get(struct xkb_rule_names names);
 E_API struct xkb_keymap *e_comp_wl_input_keymap_compile(struct xkb_context *ctx, struct xkb_rule_names names, char **keymap_path);
-E_API void e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *layout, struct xkb_context *dflt_ctx, struct xkb_keymap *dflt_map);
+E_API void e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *layout, const char *variant, const char *options, struct xkb_context *dflt_ctx, struct xkb_keymap *dflt_map);
+
+E_API const char *e_comp_wl_input_keymap_default_rules_get(void);
+E_API const char *e_comp_wl_input_keymap_default_model_get(void);
+E_API const char *e_comp_wl_input_keymap_default_layout_get(void);
+E_API const char *e_comp_wl_input_keymap_default_variant_get(void);
+E_API const char *e_comp_wl_input_keymap_default_options_get(void);
 
 # endif
 #endif
index 1dc9bcce52891210083439b81aa2414c24da10b4..0da0e75b931c616f3c347a22241eba8bf64196b0 100644 (file)
@@ -186,6 +186,11 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, xkb.dont_touch_my_damn_keyboard, UCHAR);
    E_CONFIG_VAL(D, T, xkb.use_cache, UCHAR);
    E_CONFIG_VAL(D, T, xkb.delay_held_key_input_to_focus, UINT);
+   E_CONFIG_VAL(D, T, xkb.default_rmlvo.rules, STR);
+   E_CONFIG_VAL(D, T, xkb.default_rmlvo.model, STR);
+   E_CONFIG_VAL(D, T, xkb.default_rmlvo.layout, STR);
+   E_CONFIG_VAL(D, T, xkb.default_rmlvo.variant, STR);
+   E_CONFIG_VAL(D, T, xkb.default_rmlvo.options, STR);
    E_CONFIG_VAL(D, T, keyboard.repeat_delay, INT);
    E_CONFIG_VAL(D, T, keyboard.repeat_rate, INT);
    E_CONFIG_VAL(D, T, use_desktop_window_profile, INT);
@@ -796,6 +801,11 @@ _e_config_free(E_Config *ecf)
      }
 
    eina_stringshare_del(ecf->xkb.default_model);
+   eina_stringshare_del(ecf->xkb.default_rmlvo.rules);
+   eina_stringshare_del(ecf->xkb.default_rmlvo.model);
+   eina_stringshare_del(ecf->xkb.default_rmlvo.layout);
+   eina_stringshare_del(ecf->xkb.default_rmlvo.variant);
+   eina_stringshare_del(ecf->xkb.default_rmlvo.options);
 
    eina_stringshare_del(ecf->wl_sock_access.owner);
    eina_stringshare_del(ecf->wl_sock_access.group);
index da50b4a39289bbb29ffc8a8e94a2f16429a9336d..af4931428473bcb624b7d3f33157802ce7892d3c 100644 (file)
@@ -112,6 +112,14 @@ struct _E_Config
       Eina_Bool    dont_touch_my_damn_keyboard;
       Eina_Bool    use_cache;
       unsigned int delay_held_key_input_to_focus;
+      struct
+      {
+          const char *rules;
+          const char *model;
+          const char *layout;
+          const char *variant;
+          const char *options;
+      } default_rmlvo;
    } xkb;
    struct
    {