raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=05b0ff59a8a5a18afbcb4a4ced8a72c7f146068d

commit 05b0ff59a8a5a18afbcb4a4ced8a72c7f146068d
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Nov 13 12:00:49 2020 +0000

    x - add xinput device watching and beginnings of configuring them
---
 data/config/default/e.src                         |  12 +-
 data/config/standard/e.src                        |  12 +-
 data/config/tiling/e.src                          |  12 +-
 src/bin/e_comp_x.c                                |  18 +
 src/bin/e_comp_x_devices.c                        | 429 ++++++++++++++++++++++
 src/bin/e_comp_x_devices.h                        |  12 +
 src/bin/e_config.c                                |  31 +-
 src/bin/e_config.h                                |  12 +-
 src/bin/e_includes.h                              |   1 +
 src/bin/e_mouse.c                                 |  38 +-
 src/bin/meson.build                               |   2 +
 src/modules/conf_interaction/e_int_config_mouse.c | 111 ++++--
 12 files changed, 599 insertions(+), 91 deletions(-)

diff --git a/data/config/default/e.src b/data/config/default/e.src
index 012e468c1..9d592f13b 100644
--- a/data/config/default/e.src
+++ b/data/config/default/e.src
@@ -1,5 +1,5 @@
 group "E_Config" struct {
-  value "config_version" int: 1000032;
+  value "config_version" int: 1000033;
   value "config_type" uint: 0; // this profile seems to just be super 
minimalist
   value "desktop_default_name" string: "%i-%i";
   value "desktop_default_window_profile" string: "";
@@ -137,9 +137,15 @@ group "E_Config" struct {
   value "clientlist_limit_caption_len" int: 0;
   value "clientlist_max_caption_len" int: 2;
   value "mouse_hand" int: 1;
-  value "mouse_accel_numerator" int: 2;
-  value "mouse_accel_denominator" int: 1;
+  value "mouse_accel" double: 0.0;
   value "mouse_accel_threshold" int: 4;
+  value "touch_tap_to_click" uchar: 0;
+  value "mouse_natural_scroll" uchar: 0;
+  value "mouse_emulate_middle_button" uchar: 1;
+  value "touch_clickpad" uchar: 1;
+  value "touch_scrolling_mode" uchar: 0;
+  value "touch_scrolling_horiz" uchar: 1;
+  value "touch_palm_detect" uchar: 1;
   value "border_raise_on_mouse_action" int: 1;
   value "desk_flip_wrap" int: 0;
   value "fullscreen_flip" int: 1;
diff --git a/data/config/standard/e.src b/data/config/standard/e.src
index 6ad850bc0..447001192 100644
--- a/data/config/standard/e.src
+++ b/data/config/standard/e.src
@@ -1,5 +1,5 @@
 group "E_Config" struct {
-    value "config_version" int: 1000032;
+    value "config_version" int: 1000033;
     value "config_type" uint: 3;
     value "desktop_default_name" string: "%i-%i";
     value "desktop_default_window_profile" string: "standard";
@@ -135,9 +135,15 @@ group "E_Config" struct {
     value "clientlist_limit_caption_len" int: 0;
     value "clientlist_max_caption_len" int: 2;
     value "mouse_hand" int: 1;
-    value "mouse_accel_numerator" int: 2;
-    value "mouse_accel_denominator" int: 1;
+    value "mouse_accel" double: 0.0;
     value "mouse_accel_threshold" int: 4;
+    value "touch_tap_to_click" uchar: 0;
+    value "mouse_natural_scroll" uchar: 0;
+    value "mouse_emulate_middle_button" uchar: 1;
+    value "touch_clickpad" uchar: 1;
+    value "touch_scrolling_mode" uchar: 0;
+    value "touch_scrolling_horiz" uchar: 1;
+    value "touch_palm_detect" uchar: 1;
     value "border_raise_on_mouse_action" int: 1;
     value "desk_flip_wrap" int: 0;
     value "fullscreen_flip" int: 1;
diff --git a/data/config/tiling/e.src b/data/config/tiling/e.src
index e0f14b4b6..af306fe34 100644
--- a/data/config/tiling/e.src
+++ b/data/config/tiling/e.src
@@ -1,5 +1,5 @@
 group "E_Config" struct {
-    value "config_version" int: 1000032;
+    value "config_version" int: 1000033;
     value "config_type" uint: 3;
     value "desktop_default_name" string: "%i-%i";
     value "desktop_default_window_profile" string: "standard";
@@ -135,9 +135,15 @@ group "E_Config" struct {
     value "clientlist_limit_caption_len" int: 0;
     value "clientlist_max_caption_len" int: 2;
     value "mouse_hand" int: 1;
-    value "mouse_accel_numerator" int: 2;
-    value "mouse_accel_denominator" int: 1;
+    value "mouse_accel" double: 0.0;
     value "mouse_accel_threshold" int: 4;
+    value "touch_tap_to_click" uchar: 0;
+    value "mouse_natural_scroll" uchar: 0;
+    value "mouse_emulate_middle_button" uchar: 1;
+    value "touch_clickpad" uchar: 1;
+    value "touch_scrolling_mode" uchar: 0;
+    value "touch_scrolling_horiz" uchar: 1;
+    value "touch_palm_detect" uchar: 1;
     value "border_raise_on_mouse_action" int: 1;
     value "desk_flip_wrap" int: 0;
     value "fullscreen_flip" int: 1;
diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index 7c737aef6..4095100a6 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -5472,6 +5472,22 @@ _e_comp_x_randr_change(void *data EINA_UNUSED, int 
ev_type EINA_UNUSED, void *ev
    return ECORE_CALLBACK_RENEW;
 }
 
+static Eina_Bool
+_e_comp_x_devices_change_cb(void *data EINA_UNUSED, int t EINA_UNUSED, void 
*ev EINA_UNUSED)
+{
+#ifdef HAVE_WAYLAND
+   if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
+     {
+        // do nothing here
+     }
+   else
+#endif
+     {
+        e_comp_x_devices_config_apply();
+     }
+   return ECORE_CALLBACK_RENEW;
+}
+
 static void
 _e_comp_x_del(E_Comp *c)
 {
@@ -5999,6 +6015,7 @@ e_comp_x_init(void)
    E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_PING,
                          _e_comp_x_cb_ping, NULL);
    E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, 
_e_comp_x_backlight_notify_cb, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_X_DEVICES_CHANGE, 
_e_comp_x_devices_change_cb, NULL);
    if (ecore_x_randr_version_get() >= RANDR_VERSION_1_3)
      backlight_atom = ecore_x_atom_get("Backlight");
 
@@ -6036,6 +6053,7 @@ e_comp_x_init(void)
                                 0,
                                 e_config->screensaver_blanking,
                                 e_config->screensaver_expose);
+        e_comp_x_devices_config_apply();
      }
    else
      e_dnd_init();
diff --git a/src/bin/e_comp_x_devices.c b/src/bin/e_comp_x_devices.c
new file mode 100644
index 000000000..31a7b0539
--- /dev/null
+++ b/src/bin/e_comp_x_devices.c
@@ -0,0 +1,429 @@
+#define EXECUTIVE_MODE_ENABLED
+#define E_COMP_X
+#include "e.h"
+
+static void
+_handle_dev_prop(int dev_slot, const char *dev, const char *prop)
+{
+   int num, size;
+   Ecore_X_Atom fmt;
+
+   ///////////////////////////////////////////////////////////////////////////
+   // libinput devices
+   if (!strcmp(prop, "libinput Middle Emulation Enabled"))
+     {
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->mouse_emulate_middle_button) != (val[0]))
+          {
+             val[0] = e_config->mouse_emulate_middle_button;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "libinput Accel Speed"))
+     {
+        float *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 32) && (num == 1) &&
+            (fabs(e_config->mouse_accel - val[0]) >= 0.01))
+          {
+             val[0] = e_config->mouse_accel;
+             printf("DEV: change [%s] [%s] -> %1.3f\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "libinput Tapping Enabled"))
+     {
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->touch_tap_to_click) != (val[0]))
+          {
+             val[0] = e_config->touch_tap_to_click;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+//   else if (!strcmp(prop, "libinput Tapping Button Mapping Enabled"))
+//     {
+//        // 1 bool, 0 = LRM, 1 = LMR
+//     }
+   else if (!strcmp(prop, "libinput Horizontal Scrolling Enabled"))
+     {
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->touch_scrolling_horiz) != (val[0]))
+          {
+             val[0] = e_config->touch_scrolling_horiz;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "libinput Scroll Method Enabled"))
+     {
+        unsigned char cfval = 0;
+        Eina_Bool doit = EINA_TRUE;
+
+        if      (e_config->touch_scrolling_mode == 0) cfval = 1;
+        else if (e_config->touch_scrolling_mode == 1) cfval = 0;
+        else if (e_config->touch_scrolling_mode == 2) cfval = 1;
+
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, "libinput Scroll Methods Available", &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 3))
+          {
+             if (!val[cfval]) doit = EINA_FALSE;
+          }
+        free(val);
+        if (doit)
+          {
+             // 1 bool, 0=2-finger, 1=edge, 2=button
+             val = ecore_x_input_device_property_get
+               (dev_slot, prop, &num, &fmt, &size);
+             if ((val) && (size == 8) && (num == 1) &&
+                 (cfval) != (val[0]))
+               {
+                  val[0] = cfval;
+                  printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+                  ecore_x_input_device_property_set
+                  (dev_slot, prop, val, num, fmt, size);
+               }
+             free(val);
+          }
+     }
+// do via button mapping for now - not sure about this evdev can't do this
+//   else if (!strcmp(prop, "libinput Natural Scrolling Enabled"))
+//     {
+//        // 1 bool
+//     }
+// not for now - default
+//   else if (!strcmp(prop, "libinput Accel Profile Enabled"))
+//     {
+//        // 1 bool, 0 = adaptive, 1 = flat
+//     }
+// do via button mapping for now - not sure about this evdev can't do this
+//   else if (!strcmp(prop, "libinput Left Handed Enabled"))
+//     {
+//        // 1 bool
+//     }
+// do via button mapping for now - not sure about this evdev can't do this
+//   else if (!strcmp(prop, "libinput Natural Scrolling Enabled"))
+//     {
+//        // 1 bool
+//     }
+
+   ///////////////////////////////////////////////////////////////////////////
+   // synaptics devices
+   else if (!strcmp(prop, "Synaptics Middle Button Timeout"))
+     {
+        unsigned int *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 32) && (num == 1) &&
+            (e_config->mouse_emulate_middle_button && (val[0] != 50)))
+          {
+             val[0] = 50;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Move Speed"))
+     {
+        float chval[4] = { 0.0 };
+
+        // 4 val float min, max, accel, unused
+        chval[0] = 1.0;
+        chval[1] = 1.75;
+        chval[2] = 0.15 + (e_config->mouse_accel * 0.15);
+        float *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 32) && (num == 4) &&
+            ((fabs(chval[0] - val[0]) >= 0.01) ||
+             (fabs(chval[1] - val[1]) >= 0.01) ||
+             (fabs(chval[2] - val[2]) >= 0.01)))
+          {
+             val[0] = chval[0];
+             val[1] = chval[1];
+             val[2] = chval[2];
+             printf("DEV: change [%s] [%s] -> %1.3f %1.3f %1.3f %1.3f\n", dev, 
prop, val[1], val[1], val[2], val[3]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Tap Action"))
+     {
+        // 7 val, 8 bit bit 0 = off, >0 mouse button reported
+        // TR, BR, TL, BL, F1, F2, F3
+        // 0, 0, 0, 0, 1, 2, 3 <- tap to click
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num >= 7) &&
+            (((e_config->touch_tap_to_click) &&
+              ((val[4] != 1) || (val[5] != 2) || (val[6] != 3))) ||
+             ((!e_config->touch_tap_to_click) &&
+              ((val[4] != 0) || (val[5] != 0) || (val[6] != 0)))))
+          {
+             if (e_config->touch_tap_to_click)
+               {
+                  val[4] = 1;
+                  val[5] = 2;
+                  val[6] = 3;
+               }
+             else
+               {
+                  val[4] = 0;
+                  val[5] = 0;
+                  val[6] = 0;
+               }
+             printf("DEV: change [%s] [%s] -> %i %i %i\n", dev, prop, val[4], 
val[5], val[6]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics ClickPad"))
+     {
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->touch_clickpad) != (val[0]))
+          {
+             val[0] = e_config->touch_clickpad;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Edge Scrolling"))
+     {
+        // 3 bool - v, h, corner
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num >= 2) &&
+            (((e_config->touch_scrolling_mode == 0) &&
+              ((!val[0]) || (val[1] != e_config->touch_scrolling_horiz))) ||
+             ((e_config->touch_scrolling_mode != 0) &&
+              ((val[0]) || (val[1])))))
+          {
+             if (e_config->touch_scrolling_mode == 0)
+               {
+                  val[0] = 1;
+                  val[1] = e_config->touch_scrolling_horiz;
+               }
+             else
+               {
+                  val[0] = 0;
+                  val[1] = 0;
+               }
+             printf("DEV: change [%s] [%s] -> %i %i\n", dev, prop, val[0], 
val[1]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Two-Finger Scrolling"))
+     {
+        // 2 bool - h, v
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num >= 2) &&
+            (((e_config->touch_scrolling_mode == 1) &&
+              ((!val[0]) || (val[1] != e_config->touch_scrolling_horiz))) ||
+             ((e_config->touch_scrolling_mode != 1) &&
+              ((val[0]) || (val[1])))))
+          {
+             if (e_config->touch_scrolling_mode == 1)
+               {
+                  val[0] = 1;
+                  val[1] = e_config->touch_scrolling_horiz;
+               }
+             else
+               {
+                  val[0] = 0;
+                  val[1] = 0;
+               }
+             printf("DEV: change [%s] [%s] -> %i %i\n", dev, prop, val[0], 
val[1]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Circular Scrolling"))
+     {
+        // 1 bool
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (((e_config->touch_scrolling_mode == 2) &&
+              (!val[0])) ||
+             ((e_config->touch_scrolling_mode != 2) &&
+              (val[0]))))
+          {
+             if (e_config->touch_scrolling_mode == 2)
+               val[0] = 1;
+             else
+               val[0] = 0;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Synaptics Palm Detection"))
+     {
+        // 1 bool - always turn on
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->touch_palm_detect) != (val[0]))
+          {
+             val[0] = e_config->touch_palm_detect;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+//   else if (!strcmp(prop, "Synaptics Off"))
+//     {
+//        // 8 bit 0 = on, 1 = off (except physical clicks), 2 = 
+//     }
+
+   ///////////////////////////////////////////////////////////////////////////
+   // evdev devices
+   else if (!strcmp(prop, "Evdev Middle Button Emulation"))
+     {
+        unsigned char *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 8) && (num == 1) &&
+            (e_config->mouse_emulate_middle_button) != (val[0]))
+          {
+             val[0] = e_config->mouse_emulate_middle_button;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+   else if (!strcmp(prop, "Evdev Middle Button Timeout"))
+     {
+        unsigned short *val = ecore_x_input_device_property_get
+          (dev_slot, prop, &num, &fmt, &size);
+        if ((val) && (size == 16) && (num == 1) &&
+            (e_config->mouse_emulate_middle_button && (val[0] != 50)))
+          {
+             val[0] = 50;
+             printf("DEV: change [%s] [%s] -> %i\n", dev, prop, val[0]);
+             ecore_x_input_device_property_set
+               (dev_slot, prop, val, num, fmt, size);
+          }
+        free(val);
+     }
+}
+
+E_API void
+e_comp_x_devices_config_apply(void)
+{
+   // XXX: configure devices based on settings
+   // list devices - for each device, check properties
+   // if property does not match the config, set it to
+   // config val
+   int num_devs, i;
+
+   num_devs = ecore_x_input_device_num_get();
+   printf("DEV: CHANGES ... have %i devices\n", num_devs);
+   for (i = 0; i < num_devs; i++)
+     {
+        const char *name;
+        char **props;
+        int num_props, j;
+
+        name = ecore_x_input_device_name_get(i);
+//        printf("DEV: DEV=%i: [%s]\n", i, name);
+        props = ecore_x_input_device_properties_list(i, &num_props);
+        if (props)
+          {
+             for (j = 0; j < num_props; j++)
+               {
+//                  printf("DEV:   PROP=%i: [%s]\n", j, props[j]);
+                  _handle_dev_prop(i, name, props[j]);
+               }
+             ecore_x_input_device_properties_free(props, num_props);
+          }
+     }
+
+   // generic accel - if synatics or evdev props found?
+     {
+        int accel_numerator, accel_denominator;
+
+        accel_numerator = 20 + (e_config->mouse_accel * 20.0);
+        accel_denominator = 10;
+        ecore_x_pointer_control_set(accel_numerator, accel_denominator,
+                                    e_config->mouse_accel_threshold);
+     }
+   // button mapping - for mouse hand and natural scroll
+     {
+        unsigned char map[256] = { 0 };
+        int n;
+
+        if (ecore_x_pointer_mapping_get(map, 256))
+          {
+             for (n = 0; n < 256; n++)
+               {
+                  if (!map[n]) break;
+               }
+             if (n < 12)
+               {
+                  map[0]  = 1;
+                  map[1]  = 2;
+                  map[2]  = 3;
+                  map[3]  = 4;
+                  map[4]  = 5;
+                  map[5]  = 6;
+                  map[6]  = 7;
+                  map[7]  = 8;
+                  map[8]  = 9;
+                  map[9]  = 10;
+                  map[10] = 11;
+                  map[11] = 12;
+                  n = 12;
+               }
+             if (e_config->mouse_hand == E_MOUSE_HAND_RIGHT)
+               {
+                  map[0] = 1;
+                  map[2] = 3;
+               }
+             else if (e_config->mouse_hand == E_MOUSE_HAND_LEFT)
+               {
+                  map[0] = 3;
+                  map[2] = 1;
+               }
+
+             if (e_config->mouse_natural_scroll)
+               {
+                  map[3] = 5;
+                  map[4] = 4;
+               }
+             else
+               {
+                  map[3] = 4;
+                  map[4] = 5;
+               }
+             ecore_x_pointer_mapping_set(map, n);
+          }
+     }
+}
diff --git a/src/bin/e_comp_x_devices.h b/src/bin/e_comp_x_devices.h
new file mode 100644
index 000000000..74e10b2b2
--- /dev/null
+++ b/src/bin/e_comp_x_devices.h
@@ -0,0 +1,12 @@
+#ifdef E_TYPEDEFS
+
+#else
+# ifndef E_COMP_X_DEVICES_H
+#  define E_COMP_X_DEVICES_H
+#  include <Ecore_X.h>
+#  include "e_atoms.h"
+
+E_API void e_comp_x_devices_config_apply(void);
+
+# endif
+#endif
diff --git a/src/bin/e_config.c b/src/bin/e_config.c
index 4d07cfd8c..8129b79b4 100644
--- a/src/bin/e_config.c
+++ b/src/bin/e_config.c
@@ -833,11 +833,17 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, clientlist_max_caption_len, INT);
 
    E_CONFIG_VAL(D, T, mouse_hand, INT);
-   E_CONFIG_VAL(D, T, mouse_accel_numerator, INT);
-   E_CONFIG_VAL(D, T, mouse_accel_denominator, INT);
+   E_CONFIG_VAL(D, T, mouse_accel, DOUBLE);
    E_CONFIG_VAL(D, T, mouse_accel_threshold, INT);
    E_CONFIG_VAL(D, T, touch_tap_to_click, UCHAR);
 
+   E_CONFIG_VAL(D, T, mouse_natural_scroll, UCHAR);
+   E_CONFIG_VAL(D, T, mouse_emulate_middle_button, UCHAR);
+   E_CONFIG_VAL(D, T, touch_clickpad, UCHAR);
+   E_CONFIG_VAL(D, T, touch_scrolling_mode, UCHAR);
+   E_CONFIG_VAL(D, T, touch_scrolling_horiz, UCHAR);
+   E_CONFIG_VAL(D, T, touch_palm_detect, UCHAR);
+
    E_CONFIG_VAL(D, T, border_raise_on_mouse_action, INT);
    E_CONFIG_VAL(D, T, border_raise_on_focus, INT);
    E_CONFIG_VAL(D, T, raise_on_revert_focus, INT);
@@ -1775,6 +1781,15 @@ e_config_load(void)
                e_config->winlist_list_size = 0.3333;
                e_config_save_queue();
             }
+          CONFIG_VERSION_CHECK(33)
+            {
+               CONFIG_VERSION_UPDATE_INFO(33);
+               e_config->touch_clickpad = 1;
+               e_config->mouse_emulate_middle_button = 1;
+               e_config->touch_scrolling_horiz = 1;
+               e_config->touch_palm_detect = 1;
+               e_config_save_queue();
+            }
      }
    elm_config_profile_set(_e_config_profile);
    if (!e_config->remember_internal_fm_windows)
@@ -1910,10 +1925,16 @@ e_config_load(void)
    E_CONFIG_LIMIT(e_config->clientlist_limit_caption_len, 0, 1);
    E_CONFIG_LIMIT(e_config->clientlist_max_caption_len, 2, 
E_CLIENTLIST_MAX_CAPTION_LEN);
 
-   E_CONFIG_LIMIT(e_config->mouse_accel_numerator, 1, 30);
-   E_CONFIG_LIMIT(e_config->mouse_accel_denominator, 1, 10);
+   E_CONFIG_LIMIT(e_config->mouse_accel, -1.0, 1.0);
    E_CONFIG_LIMIT(e_config->mouse_accel_threshold, 0, 10);
-   E_CONFIG_LIMIT(e_config->touch_tap_to_click, 0, 3);
+   E_CONFIG_LIMIT(e_config->touch_tap_to_click, 0, 1);
+
+   E_CONFIG_LIMIT(e_config->mouse_natural_scroll, 0, 1);
+   E_CONFIG_LIMIT(e_config->mouse_emulate_middle_button, 0, 1);
+   E_CONFIG_LIMIT(e_config->touch_clickpad, 0, 1);
+   E_CONFIG_LIMIT(e_config->touch_scrolling_mode, 0, 2);
+   E_CONFIG_LIMIT(e_config->touch_scrolling_horiz, 0, 1);
+   E_CONFIG_LIMIT(e_config->touch_palm_detect, 0, 1);
 
    E_CONFIG_LIMIT(e_config->menu_favorites_show, 0, 1);
    E_CONFIG_LIMIT(e_config->menu_apps_show, 0, 1);
diff --git a/src/bin/e_config.h b/src/bin/e_config.h
index 75f20f7ec..ca7515d27 100644
--- a/src/bin/e_config.h
+++ b/src/bin/e_config.h
@@ -47,7 +47,7 @@ typedef enum
 /* increment this whenever a new set of config values are added but the users
  * config doesn't need to be wiped - simply new values need to be put in
  */
-#define E_CONFIG_FILE_GENERATION 32
+#define E_CONFIG_FILE_GENERATION 33
 #define E_CONFIG_FILE_VERSION    ((E_CONFIG_FILE_EPOCH * 1000000) + 
E_CONFIG_FILE_GENERATION)
 
 #define E_CONFIG_BINDINGS_VERSION 0 // DO NOT INCREMENT UNLESS YOU WANT TO 
WIPE ALL BINDINGS!!!!!
@@ -242,11 +242,17 @@ struct _E_Config
    int                       clientlist_max_caption_len; // GUI
 
    int                       mouse_hand; //GUI
-   int                       mouse_accel_numerator; // GUI
-   int                       mouse_accel_denominator; // GUI
+   double                    mouse_accel; // GUI
    int                       mouse_accel_threshold; // GUI
    unsigned char             touch_tap_to_click; // GUI
 
+   unsigned char             mouse_natural_scroll; // GUI
+   unsigned char             mouse_emulate_middle_button; // GUI
+   unsigned char             touch_clickpad; // GUI
+   unsigned char             touch_scrolling_mode; // GUI 0=edge, 1=2finger, 
2=circle
+   unsigned char             touch_scrolling_horiz; // GUI
+   unsigned char             touch_palm_detect; // GUI
+
    int                       border_raise_on_mouse_action; // GUI
    int                       border_raise_on_focus; // GUI
    int                       raise_on_revert_focus; // GUI
diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h
index e7ad9ac3e..b3611268d 100644
--- a/src/bin/e_includes.h
+++ b/src/bin/e_includes.h
@@ -151,6 +151,7 @@
 #include "e_comp_canvas.h"
 #include "e_utils.h"
 #include "e_hints.h"
+#include "e_comp_x_devices.h"
 #include "e_comp_x_randr.h"
 
 #ifdef HAVE_WAYLAND
diff --git a/src/bin/e_mouse.c b/src/bin/e_mouse.c
index cc217e1a7..9138f092f 100644
--- a/src/bin/e_mouse.c
+++ b/src/bin/e_mouse.c
@@ -8,41 +8,7 @@ e_mouse_update(void)
 {
 #ifndef HAVE_WAYLAND_ONLY
    if (e_comp->comp_type == E_PIXMAP_TYPE_X)
-     {
-        unsigned char map[256] = { 0 };
-        int n;
-
-        if (!ecore_x_pointer_control_set(e_config->mouse_accel_numerator,
-                                         e_config->mouse_accel_denominator,
-                                         e_config->mouse_accel_threshold))
-          return 0;
-
-        if (!ecore_x_pointer_mapping_get(map, 256)) return 0;
-
-        for (n = 0; n < 256; n++)
-          {
-             if (!map[n]) break;
-          }
-        if (n < 3)
-          {
-             map[0] = 1;
-             map[1] = 2;
-             map[2] = 3;
-             n = 3;
-          }
-        if (e_config->mouse_hand == E_MOUSE_HAND_RIGHT)
-          {
-             map[0] = 1;
-             map[2] = 3;
-          }
-        else if (e_config->mouse_hand == E_MOUSE_HAND_LEFT)
-          {
-             map[0] = 3;
-             map[2] = 1;
-          }
-
-        if (!ecore_x_pointer_mapping_set(map, n)) return 0;
-     }
+     e_comp_x_devices_config_apply();
 #endif
 
 #ifdef USE_MODULE_WL_DRM
@@ -54,7 +20,7 @@ e_mouse_update(void)
         if (dev)
           {
              ecore_drm2_device_pointer_left_handed_set(dev, 
(Eina_Bool)!e_config->mouse_hand);
-             ecore_drm2_device_pointer_accel_speed_set(dev, 
e_config->mouse_accel_numerator);
+             ecore_drm2_device_pointer_accel_speed_set(dev, 
e_config->mouse_accel);
              ecore_drm2_device_touch_tap_to_click_enabled_set(dev, 
e_config->touch_tap_to_click);
           }
      }
diff --git a/src/bin/meson.build b/src/bin/meson.build
index 87079a658..c796652b2 100644
--- a/src/bin/meson.build
+++ b/src/bin/meson.build
@@ -255,6 +255,7 @@ hdr = [
   'e_comp_cfdata.h',
   'e_comp_object.h',
   'e_comp_x.h',
+  'e_comp_x_devices.h',
   'e_comp_x_randr.h',
   'e_config_data.h',
   'e_config_dialog.h',
@@ -421,6 +422,7 @@ endif
 if config_h.has('HAVE_WAYLAND_ONLY') == false
   src += [
     'e_comp_x.c',
+    'e_comp_x_devices.c',
     'e_comp_x_randr.c',
     'e_alert.c',
     'e_xsettings.c'
diff --git a/src/modules/conf_interaction/e_int_config_mouse.c 
b/src/modules/conf_interaction/e_int_config_mouse.c
index 258807828..24c659f9d 100644
--- a/src/modules/conf_interaction/e_int_config_mouse.c
+++ b/src/modules/conf_interaction/e_int_config_mouse.c
@@ -21,10 +21,16 @@ struct _E_Config_Dialog_Data
    } gui;
 
    int mouse_hand;
-   double numerator;
-   double denominator;
+   double accel;
    double threshold;
+   int emulate_middle_button;
+   int natural_scroll;
+
    int tap_to_click;
+   int clickpad;
+   int scrolling_mode;
+   int scrolling_horiz;
+   int palm_detect;
 };
 
 E_Config_Dialog *
@@ -45,8 +51,8 @@ e_int_config_mouse(Evas_Object *parent EINA_UNUSED, const 
char *params EINA_UNUS
    v->basic.check_changed = _basic_check_changed;
 
    cfd = e_config_dialog_new(NULL, _("Mouse Settings"), "E",
-                            "keyboard_and_mouse/mouse_settings",
-                            "preferences-desktop-mouse", 0, v, NULL);
+                             "keyboard_and_mouse/mouse_settings",
+                             "preferences-desktop-mouse", 0, v, NULL);
    return cfd;
 }
 
@@ -59,10 +65,15 @@ _fill_data(E_Config_Dialog_Data *cfdata)
    cfdata->cursor_size = e_config->cursor_size;
 
    cfdata->mouse_hand = e_config->mouse_hand;
-   cfdata->numerator = e_config->mouse_accel_numerator;
-   cfdata->denominator = e_config->mouse_accel_denominator;
+   cfdata->accel = e_config->mouse_accel;
    cfdata->threshold = e_config->mouse_accel_threshold;
    cfdata->tap_to_click = e_config->touch_tap_to_click;
+   cfdata->emulate_middle_button = e_config->mouse_emulate_middle_button;
+   cfdata->natural_scroll = e_config->mouse_natural_scroll;
+   cfdata->clickpad = e_config->touch_clickpad;
+   cfdata->scrolling_mode = e_config->touch_scrolling_mode;
+   cfdata->scrolling_horiz = e_config->touch_scrolling_horiz;
+   cfdata->palm_detect = e_config->touch_palm_detect;
 }
 
 static void *
@@ -81,14 +92,19 @@ static int
 _basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data 
*cfdata)
 {
    return !((cfdata->show_cursor == e_config->show_cursor) &&
-           (cfdata->idle_cursor == e_config->idle_cursor) &&
-           (cfdata->use_e_cursor == e_config->use_e_cursor) &&
-           (cfdata->cursor_size == e_config->cursor_size) &&
-           (cfdata->mouse_hand == e_config->mouse_hand) &&
-           (cfdata->tap_to_click == e_config->touch_tap_to_click) &&
-           EINA_DBL_EQ(cfdata->numerator, e_config->mouse_accel_numerator) &&
-           EINA_DBL_EQ(cfdata->denominator, e_config->mouse_accel_denominator) 
&&
-           EINA_DBL_EQ(cfdata->threshold, e_config->mouse_accel_threshold));
+            (cfdata->idle_cursor == e_config->idle_cursor) &&
+            (cfdata->use_e_cursor == e_config->use_e_cursor) &&
+            (cfdata->cursor_size == e_config->cursor_size) &&
+            (cfdata->mouse_hand == e_config->mouse_hand) &&
+            (cfdata->tap_to_click == e_config->touch_tap_to_click) &&
+            (cfdata->emulate_middle_button == 
e_config->mouse_emulate_middle_button) &&
+            (cfdata->natural_scroll == e_config->mouse_natural_scroll) &&
+            (cfdata->clickpad == e_config->touch_clickpad) &&
+            (cfdata->scrolling_mode == e_config->touch_scrolling_mode) &&
+            (cfdata->scrolling_horiz == e_config->touch_scrolling_horiz) &&
+            (cfdata->palm_detect == e_config->touch_palm_detect) &&
+            EINA_DBL_EQ(cfdata->accel, e_config->mouse_accel) &&
+            EINA_DBL_EQ(cfdata->threshold, e_config->mouse_accel_threshold));
 }
 
 static void
@@ -108,10 +124,15 @@ _basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata
    e_config->cursor_size = cfdata->cursor_size;
 
    e_config->mouse_hand = cfdata->mouse_hand;
-   e_config->mouse_accel_numerator = cfdata->numerator;
-   e_config->mouse_accel_denominator = cfdata->denominator;
+   e_config->mouse_accel = cfdata->accel;
    e_config->mouse_accel_threshold = cfdata->threshold;
    e_config->touch_tap_to_click = cfdata->tap_to_click;
+   e_config->mouse_emulate_middle_button = cfdata->emulate_middle_button;
+   e_config->mouse_natural_scroll = cfdata->natural_scroll;
+   e_config->touch_clickpad = cfdata->clickpad;
+   e_config->touch_scrolling_mode = cfdata->scrolling_mode;
+   e_config->touch_scrolling_horiz = cfdata->scrolling_horiz;
+   e_config->touch_palm_detect = cfdata->palm_detect;
    e_config_save_queue();
 
    /* Apply the above settings */
@@ -211,36 +232,50 @@ _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, 
Evas *evas, E_Config_Dia
 
    ob = e_widget_label_add(evas, _("Acceleration"));
    e_widget_framelist_object_append(of, ob);
-#ifndef HAVE_WAYLAND_ONLY
-   if (e_comp->comp_type == E_PIXMAP_TYPE_X)
-     {
-        ob = e_widget_slider_add(evas, 1, 0, _("%1.0f"), 1.0, 30.0, 1.0, 0,
-                                 &(cfdata->numerator), NULL, 100);
-     }
-#endif
-#ifdef HAVE_WAYLAND
-   if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
-     {
-        ob = e_widget_slider_add(evas, 1, 0, _("%1.1f"), -1.0, 1.0, 0.2, 0,
-                                 &(cfdata->numerator), NULL, 100);
-     }
-#endif
+   ob = e_widget_slider_add(evas, 1, 0, _("%1.1f"), -1.0, 1.0, 0.1, 0,
+                            &(cfdata->accel), NULL, 100);
 
    e_widget_framelist_object_append(of, ob);
 
    ob = e_widget_label_add(evas, _("Threshold"));
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f"), 0.0, 10.0, 1.0, 0,
-                           &(cfdata->threshold), NULL, 100);
+                            &(cfdata->threshold), NULL, 100);
    e_widget_framelist_object_append(of, ob);
 
-#ifdef HAVE_WAYLAND
-   if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
-     {
-        oc = e_widget_check_add(evas, _("Tap to click"), 
&(cfdata->tap_to_click));
-        e_widget_framelist_object_append(of, oc);
-     }
-#endif
+   e_widget_list_object_append(ol, of, 1, 0, 0.5);
+
+   of = e_widget_framelist_add(evas, _("Clicks"), 0);
+
+   oc = e_widget_check_add(evas, _("Tap to click"), &(cfdata->tap_to_click));
+   e_widget_framelist_object_append(of, oc);
+
+   oc = e_widget_check_add(evas, _("Middle mouse button emulation"), 
&(cfdata->emulate_middle_button));
+   e_widget_framelist_object_append(of, oc);
+
+   oc = e_widget_check_add(evas, _("Clickpad"), &(cfdata->clickpad));
+   e_widget_framelist_object_append(of, oc);
+
+   oc = e_widget_check_add(evas, _("Palm detect"), &(cfdata->palm_detect));
+   e_widget_framelist_object_append(of, oc);
+
+   e_widget_list_object_append(ol, of, 1, 0, 0.5);
+
+   of = e_widget_framelist_add(evas, _("Scrolling"), 0);
+
+   oc = e_widget_check_add(evas, _("Natural scrolling"), 
&(cfdata->natural_scroll));
+   e_widget_framelist_object_append(of, oc);
+
+   oc = e_widget_check_add(evas, _("Horizontal scrolling"), 
&(cfdata->scrolling_horiz));
+   e_widget_framelist_object_append(of, oc);
+
+   rg = e_widget_radio_group_new(&(cfdata->scrolling_mode));
+   ob = e_widget_radio_add(evas, _("Edge scrolling"), 0, rg);
+   e_widget_framelist_object_append(of, ob);
+   ob = e_widget_radio_add(evas, _("Two finger scrolling"), 1, rg);
+   e_widget_framelist_object_append(of, ob);
+   ob = e_widget_radio_add(evas, _("Circular scrolling"), 2, rg);
+   e_widget_framelist_object_append(of, ob);
 
    e_widget_list_object_append(ol, of, 1, 0, 0.5);
    e_widget_toolbook_page_append(otb, NULL, _("Mouse"), ol,

-- 


Reply via email to