e_input: add a config 'touch_block_on_palm' and apply it on palm 31/313731/2 accepted/tizen/7.0/unified/20240705.165249
authorduna.oh <duna.oh@samsung.com>
Fri, 28 Jun 2024 06:52:51 +0000 (15:52 +0900)
committerduna.oh <duna.oh@samsung.com>
Mon, 1 Jul 2024 08:22:06 +0000 (17:22 +0900)
Change-Id: I9c36de81e91ebf30151a2baf7b5f7efba7c0201a

src/bin/e_comp_cfdata.c
src/bin/e_comp_cfdata.h
src/bin/e_input_evdev.c

index beebbdd6e03020e7f5ad3b83e75ab5437a88a43b..01dd2028af474f2238197885e53d1cf15a4e128e 100644 (file)
@@ -96,6 +96,7 @@ e_comp_cfdata_edd_init(E_Config_DD **conf_edd, E_Config_DD **match_edd)
    E_CONFIG_VAL(D, T, commit_handler_timer.interval, DOUBLE);
    E_CONFIG_VAL(D, T, e_wheel_click_angle, INT);
    E_CONFIG_VAL(D, T, input_output_assign_policy, INT);
+   E_CONFIG_VAL(D, T, touch_block_on_palm, INT);
 }
 
 E_API E_Comp_Config *
@@ -269,6 +270,8 @@ e_comp_cfdata_config_new(void)
 
    cfg->input_output_assign_policy = 0;
 
+   cfg->touch_block_on_palm = 0;
+
    return cfg;
 
 error:
index 373030496220c36ee54f68b2e0aa8bee9088fa74..74646600cd2d8618db362512b4fad9b22770a01b 100644 (file)
@@ -84,6 +84,7 @@ struct _E_Comp_Config
 
    int e_wheel_click_angle;
    int input_output_assign_policy;
+   int touch_block_on_palm;
 };
 
 struct _E_Comp_Match
index 438e7afd0d88b27320b4964f629e02b2516338af..b1cd8908187ea743d73a08a5e12735b7f3656099 100644 (file)
@@ -5,6 +5,8 @@ static void  _device_modifiers_update(E_Input_Evdev *edev);
 static void  _device_configured_size_get(E_Input_Evdev *edev, int *x, int *y, int *w, int *h);
 static void  _device_output_assign(E_Input_Evdev *edev, E_Input_Seat_Capabilities cap);
 
+static Eina_Bool _touch_blocked_by_palm, _touch_up_blocked_by_palm;
+
 void
 _device_calibration_set(E_Input_Evdev *edev)
 {
@@ -1746,6 +1748,13 @@ _device_handle_touch_down(struct libinput_device *device, struct libinput_event_
 
    edev->touch.raw_pressed |= (1 << edev->mt_slot);
 
+   if (_touch_blocked_by_palm)
+     {
+        ELOGF("Touch", "Down (id: %d, x: %d, y: %d) is blocked during palm", NULL,
+              edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
+        return;
+     }
+
    if (edev->touch.blocked)
      {
         ELOGF("Touch", "Down (id: %d, x: %d, y: %d) is blocked by %p, server: 0x%x", NULL,
@@ -1808,6 +1817,13 @@ _device_handle_touch_motion(struct libinput_device *device, struct libinput_even
         edev->touch.coords[edev->mt_slot].y = edev->seat->ptr.iy;
      }
 
+   if (_touch_blocked_by_palm)
+     {
+        ELOGF("Touch", "Move (id: %d, x: %d, y: %d) is blocked during palm", NULL,
+              edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
+        return;
+     }
+
    if (!(edev->touch.pressed & (1 << edev->mt_slot)))
      {
         if (edev->touch.blocked)
@@ -1861,6 +1877,23 @@ _device_handle_touch_up(struct libinput_device *device, struct libinput_event_to
 
    edev->touch.raw_pressed &= ~(1 << edev->mt_slot);
 
+   if (_touch_blocked_by_palm)
+     {
+        ELOGF("Touch", "Up (id: %d, x: %d, y: %d) is blocked during palm", NULL,
+              edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
+
+        return;
+     }
+   else if (_touch_up_blocked_by_palm)
+     {
+        ELOGF("Touch", "Up (id: %d, x: %d, y: %d) is blocked lastly on palm up.", NULL,
+              edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
+
+        _touch_up_blocked_by_palm = EINA_FALSE;
+
+        return;
+     }
+
    if (edev->touch.blocked)
      {
         if (!(edev->touch.pressed & (1 << edev->mt_slot)))
@@ -1942,6 +1975,7 @@ _device_handle_touch_aux_data(struct libinput_device *device, struct libinput_ev
    Ecore_Device *ecore_dev = NULL, *data;
    Eina_List *l;
    E_Comp_Config *comp_conf;
+   int touch_value;
 
    if (libinput_event_touch_aux_data_get_type(event) != LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM &&
        libinput_event_touch_aux_data_get_value(event) > 0)
@@ -1950,6 +1984,8 @@ _device_handle_touch_aux_data(struct libinput_device *device, struct libinput_ev
    if (!(edev = libinput_device_get_user_data(device))) goto end;
    if (!(input = edev->seat->input)) goto end;
 
+   touch_value = libinput_event_touch_aux_data_get_value(event);
+
    if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
    else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
      {
@@ -1985,7 +2021,7 @@ _device_handle_touch_aux_data(struct libinput_device *device, struct libinput_ev
    if (axis)
      {
         axis->label = ECORE_AXIS_LABEL_TOUCH_PALM;
-        axis->value = libinput_event_touch_aux_data_get_value(event);
+        axis->value = touch_value;
         ev->naxis = 1;
      }
    ev->axis = axis;
@@ -1995,6 +2031,19 @@ _device_handle_touch_aux_data(struct libinput_device *device, struct libinput_ev
    if (comp_conf && comp_conf->input_log_enable)
      ELOGF("Touch", "Axis (label: %d, value: %lf)", NULL, axis?axis->label:-1, axis?axis->value:0.0);
 
+   if (comp_conf && comp_conf->touch_block_on_palm == 1)
+     {
+        if (touch_value > 0)
+          {
+             _touch_blocked_by_palm = EINA_TRUE;
+             _touch_up_blocked_by_palm = EINA_TRUE;
+          }
+        else
+          {
+             _touch_blocked_by_palm = EINA_FALSE;
+          }
+     }
+
    ecore_event_add(ECORE_EVENT_AXIS_UPDATE, ev, _e_input_aux_data_event_free, NULL);
 
 end: