This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch x11-keeb-repeat-delay
in repository enlightenment.

View the commit online.

commit b979888e24c9fab86b58edc5378ad49c4ff9376f
Author: Swagtoy <m...@ow.swag.toys>
AuthorDate: Thu Jun 26 03:08:44 2025 -0400

    xkbswitch: Support for X11 keyboard repeat (rate/delay)
    
    I am surprised this feature is not supported yet. Will allow me to delete my xresources file.
    
    Wayland may actually work since I'm using a struct that is used by the wayland compositor, though I have not tested it. (though, I am not certain it will work when apply is pressed, only on E restart)
---
 src/bin/e_xkb.c                      | 16 +++++++++
 src/bin/e_xkb.h                      |  2 ++
 src/modules/xkbswitch/e_mod_config.c | 70 ++++++++++++++++++++++++++++++++++--
 3 files changed, 86 insertions(+), 2 deletions(-)

diff --git a/src/bin/e_xkb.c b/src/bin/e_xkb.c
index d54fee190..7addbf82f 100644
--- a/src/bin/e_xkb.c
+++ b/src/bin/e_xkb.c
@@ -252,6 +252,7 @@ _e_x_xkb_reconfig(void)
                }
           }
      }
+   e_xkb_repeat_set(e_config->keyboard.repeat_delay, e_config->keyboard.repeat_rate);
 #ifndef HAVE_WAYLAND_ONLY
    skip_new_keyboard ++;
 #endif
@@ -525,6 +526,21 @@ e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name)
               e_prefix_data_get());
 }
 
+E_API void
+e_xkb_repeat_set(int delay, int rate)
+{
+#ifndef HAVE_WAYLAND_ONLY
+   Ecore_X_Display *display = ecore_x_display_get();
+   if (!display)
+     return;
+   Ecore_X_Keyboard_Repeat repeat = {
+     .delay = delay,
+     .rate = rate,
+   };
+   ecore_x_keyboard_repeat_set(display, &repeat);
+#endif
+}
+
 E_API Eina_Bool
 e_config_xkb_layout_eq(const E_Config_XKB_Layout *a, const E_Config_XKB_Layout *b)
 {
diff --git a/src/bin/e_xkb.h b/src/bin/e_xkb.h
index 49f153fb4..cc0fa1a55 100644
--- a/src/bin/e_xkb.h
+++ b/src/bin/e_xkb.h
@@ -10,7 +10,9 @@ E_API void e_xkb_update(int);
 E_API void e_xkb_layout_next(void);
 E_API void e_xkb_layout_prev(void);
 E_API E_Config_XKB_Layout *e_xkb_layout_get(void);
+E_API void e_xkb_repeat_set(int delay, int rate);
 E_API void e_xkb_layout_set(const E_Config_XKB_Layout *cl);
+E_API void e_xkb_keyboard_repeat_get();
 E_API const char *e_xkb_layout_name_reduce(const char *name);
 E_API void e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name);
 E_API void e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name);
diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c
index e40516512..4e8b5aa75 100644
--- a/src/modules/xkbswitch/e_mod_config.c
+++ b/src/modules/xkbswitch/e_mod_config.c
@@ -1,3 +1,4 @@
+#include "Evas.h"
 #include "e.h"
 #include "e_mod_main.h"
 #include "e_mod_parse.h"
@@ -14,6 +15,8 @@ struct _E_Config_Dialog_Data
 
    Evas_Object *btn_layout;
    Evas_Object *led_list;
+   Evas_Object *key_rate_slider;
+   Evas_Object *key_delay_slider;
    Evas_Object *switch_list;
    Evas_Object *ctrl_list;
    Evas_Object *lv3_list;
@@ -59,6 +62,8 @@ struct _E_Config_Dialog_Data
 
    int          only_label;
    int          dont_touch_my_damn_keyboard;
+   int          key_rate;
+   int          key_delay;
 
    E_Dialog *dlg_add_new;
    E_Config_Dialog *cfd;
@@ -76,6 +81,8 @@ static int          _check_changed(E_Config_Dialog_Data *cfdata);
 
 static void         _dont_touch_my_damn_keyboard_changed(void *data, Evas_Object *obj, void *event);
 static void         _only_label_changed(void *data, Evas_Object *obj, void *event);
+static void         _key_rate_changed(void *data, Evas_Object *obj, void *event);
+static void         _key_delay_changed(void *data, Evas_Object *obj, void *event);
 
 static void         _layout_clicked(void *data, Evas_Object *obj, void *event);
 static void         _cb_add(void *data, Evas_Object *obj, void *event);
@@ -164,6 +171,7 @@ _fill_data(E_XKB_Option *op, const char *name, int size, Eina_List *check, Eina_
                }
           }
      }
+   
    return EINA_FALSE;
 }
 
@@ -197,6 +205,8 @@ _create_data(E_Config_Dialog *cfd)
 
    cfdata->_only_label_ = e_config->xkb.only_label;
    cfdata->dont_touch_my_damn_keyboard = e_config->xkb.dont_touch_my_damn_keyboard;
+   cfdata->key_rate = e_config->keyboard.repeat_rate;
+   cfdata->key_delay = e_config->keyboard.repeat_delay;
 
 #undef FILL_DATA
 #define FILL_DATA(name, list_name) \
@@ -293,7 +303,9 @@ _check_changed(E_Config_Dialog_Data *cfdata)
         eina_list_count(cfdata->cfg_layouts)) ||
        (e_config->xkb.default_model != cfdata->default_model) ||
        (e_config->xkb.only_label != cfdata->only_label) ||
-       (e_config->xkb.dont_touch_my_damn_keyboard != cfdata->dont_touch_my_damn_keyboard))
+       (e_config->xkb.dont_touch_my_damn_keyboard != cfdata->dont_touch_my_damn_keyboard) ||
+	   (e_config->keyboard.repeat_delay != cfdata->key_delay) ||
+	   (e_config->keyboard.repeat_rate != cfdata->key_rate))
      return 1;
 
    l2 = cfdata->cfg_layouts;
@@ -435,6 +447,8 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
    /* Save options */
    e_config->xkb._only_label_ = cfdata->only_label;
    e_config->xkb.dont_touch_my_damn_keyboard = cfdata->dont_touch_my_damn_keyboard;
+   e_config->keyboard.repeat_delay = cfdata->key_delay;
+   e_config->keyboard.repeat_rate = cfdata->key_rate;
 
    EINA_LIST_FREE(e_config->xkb.used_options, oc)
      {
@@ -523,6 +537,8 @@ _basic_create_fill(E_Config_Dialog_Data *cfdata)
      elm_object_text_set(cfdata->btn_layout, cfdata->default_model);
    else
      elm_object_text_set(cfdata->btn_layout, "default");
+   elm_slider_value_set(cfdata->key_delay_slider, cfdata->key_delay);
+   elm_slider_value_set(cfdata->key_rate_slider, cfdata->key_rate);
 
    /* Update the list of used layouts */
    elm_list_clear(cfdata->used_list);
@@ -609,7 +625,8 @@ static Evas_Object *
 _config_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
 {
    Evas_Object *mainn, *configs, *buttons, *only_label,
-               *dont_touch_my_damn_keyboard;
+               *dont_touch_my_damn_keyboard, *key_rate,
+			   *key_delay;
    Evas_Object *listh, *frame;
    Evas_Object *o;
 
@@ -640,6 +657,33 @@ _config_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfd
    evas_object_show(only_label);
    evas_object_size_hint_align_set(only_label, 0.0, 0.5);
    elm_box_pack_end(mainn, only_label);
+   
+   o = elm_separator_add(mainn);
+   elm_separator_horizontal_set(o, EINA_TRUE);
+   
+   key_rate = elm_slider_add(mainn);
+   elm_slider_min_max_set(key_rate, 30, 1000);
+   elm_slider_value_set(mainn, cfdata->key_rate);
+   elm_object_text_set(key_rate, _("Key rate"));
+   evas_object_smart_callback_add(key_rate, "changed",
+                                  _key_rate_changed, cfdata);
+   evas_object_size_hint_fill_set(key_rate, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(key_rate, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(key_rate);
+   elm_box_pack_end(mainn, key_rate);
+   cfdata->key_rate_slider = key_rate;
+   
+   key_delay = elm_slider_add(mainn);
+   elm_slider_min_max_set(key_delay, 30, 3000);
+   elm_slider_value_set(mainn, cfdata->key_delay);
+   elm_object_text_set(key_delay, _("Key delay"));
+   evas_object_smart_callback_add(key_delay, "changed",
+                                  _key_delay_changed, cfdata);
+   evas_object_size_hint_fill_set(key_delay, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(key_delay, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(key_delay);
+   elm_box_pack_end(mainn, key_delay);
+   cfdata->key_delay_slider = key_delay;
 
    o = elm_separator_add(mainn);
    elm_separator_horizontal_set(o, EINA_TRUE);
@@ -1266,6 +1310,28 @@ _only_label_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
    e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
 }
 
+static void
+_key_rate_changed(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+   double val = elm_slider_value_get(obj);
+
+   if (!(cfdata = data)) return;
+   cfdata->key_rate = val;
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_key_delay_changed(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+   double val = elm_slider_value_get(obj);
+
+   if (!(cfdata = data)) return;
+   cfdata->key_delay = val;
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
 static void
 _cb_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
 {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to