e_comp_wl: Unlock pointer constraint when listening to mouse out signal 12/308512/1
authorduna.oh <duna.oh@samsung.com>
Tue, 26 Mar 2024 08:23:45 +0000 (17:23 +0900)
committerduna.oh <duna.oh@samsung.com>
Wed, 27 Mar 2024 01:26:51 +0000 (10:26 +0900)
A bug has been identified in a client app, such as 'tv-viewer'. It has
an empty area where there is no evas and mouse IN does not occur.
If the unlock (deactivate pointer constraint lock) is only triggered
by the mouse IN signal, the unlock is not performed in this case.
This patch adds a mouse OUT signal and the unlock is triggered by the
mouse out signal instead.

< AS-IS >
MOUSE OUT from browser
MOUSE IN to edge (requested lock)--> mouse in signal --> activate

MOUSE OUT from edge
MOUSE IN to browser --> mouse in signal --> deactivate

< TO-BE >
MOUSE OUT from browser --> mouse out signal
MOUSE IN to edge --> mouse in signal --> activate

MOUSE OUT from edge --> mouse out signal --> deactivate
MOUSE IN to browser --> mouse in signal

Change-Id: I27c8df332917eb06b4aa8ad9047ab8efd8eff3c6

src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_comp_wl_input.c

index c90ad5d7b35475fc372ba6e92a0d879fd27611aa..7728a6a042a2693db3b23af5690cbce9cf4bee4f 100644 (file)
@@ -1359,6 +1359,7 @@ _e_comp_wl_evas_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
         wl_pointer_send_leave(res, serial, surface);
         ec->pointer_enter_sent = EINA_FALSE;
      }
+   wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mouseout_signal, ec);
 }
 
 static void
@@ -5107,6 +5108,7 @@ e_comp_wl_mouse_out_send(E_Client *ec, Ecore_Device *dev, uint32_t time)
         wl_pointer_send_leave(res, serial, surface);
         ec->pointer_enter_sent = EINA_FALSE;
      }
+   wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mouseout_signal, ec);
 
    return EINA_TRUE;
 }
index 38c04ba28fde9b1f8a49a2b4222284ba81528e41..9aafc47b2c64dcdb60f7d4e63db02ab36eeacd7f 100644 (file)
@@ -264,6 +264,7 @@ struct _E_Comp_Wl_Data
         struct wl_signal surface_unmap_signal;
         struct wl_signal surface_commit_signal;
         struct wl_signal surface_mousein_signal;
+        struct wl_signal surface_mouseout_signal;
         struct wl_global *global;
      } ptr_constraints;
 
index 2fd9e0d8496a86012cc8612114254b3979a42639..6546f04427d339fe23f092065e526fe80477fb10 100644 (file)
@@ -44,6 +44,7 @@ struct _E_Comp_Wl_Pointer_Constraint
    struct wl_listener surface_unmap_listener;
    struct wl_listener surface_commit_listener;
    struct wl_listener surface_mousein_listener;
+   struct wl_listener surface_mouseout_listener;
 };
 
 E_API int E_EVENT_TEXT_INPUT_PANEL_VISIBILITY_CHANGE = -1;
@@ -664,6 +665,7 @@ _e_comp_wl_input_pointer_constraint_destroy(E_Comp_Wl_Pointer_Constraint *constr
    wl_list_remove(&constraint->surface_unmap_listener.link);
    wl_list_remove(&constraint->surface_commit_listener.link);
    wl_list_remove(&constraint->surface_mousein_listener.link);
+   wl_list_remove(&constraint->surface_mouseout_listener.link);
 
    wl_resource_set_user_data(constraint->resource, NULL);
    pixman_region32_fini(&constraint->region);
@@ -857,18 +859,44 @@ _e_comp_wl_input_cb_pointer_constraints_surface_mousein(struct wl_listener *list
 
    Eina_Bool found = EINA_FALSE;
    E_Comp_Wl_Pointer_Constraint *tmp_constraint;
+
    wl_list_for_each(tmp_constraint, &ec->comp_data->pointer_constraints, link)
      {
         if (tmp_constraint == constraint)
           {
              found = EINA_TRUE;
+             INF("Pointer Constraint. Mouse In ec: %p constraint: %p", ec, constraint);
              break;
           }
      }
 
    if (found && !constraint->active)
      _e_comp_wl_input_pointer_constraints_check_enable(constraint);
-   else if (!found && constraint->active)
+}
+
+static void
+_e_comp_wl_input_cb_pointer_constraints_surface_mouseout(struct wl_listener *listener,
+                                                        void *data)
+{
+   E_Client *ec = (E_Client *)data;
+   E_Comp_Wl_Pointer_Constraint *constraint = container_of(listener,
+                                              E_Comp_Wl_Pointer_Constraint,
+                                              surface_mouseout_listener);
+
+   Eina_Bool found = EINA_FALSE;
+   E_Comp_Wl_Pointer_Constraint *tmp_constraint;
+
+   wl_list_for_each(tmp_constraint, &ec->comp_data->pointer_constraints, link)
+     {
+        if (tmp_constraint == constraint)
+          {
+             found = EINA_TRUE;
+             INF("Pointer Constraint. Mouse Out ec: %p constraint: %p", ec, constraint);
+             break;
+          }
+     }
+
+   if (found && constraint->active)
      _e_comp_wl_input_pointer_constraint_disable(constraint);
 }
 
@@ -952,6 +980,8 @@ _e_comp_wl_input_pointer_constraint_create(E_Client *ec,
      _e_comp_wl_input_cb_pointer_constraints_surface_unmapped;
    constraint->surface_mousein_listener.notify =
      _e_comp_wl_input_cb_pointer_constraints_surface_mousein;
+   constraint->surface_mouseout_listener.notify =
+     _e_comp_wl_input_cb_pointer_constraints_surface_mouseout;
 
    wl_signal_add(&e_comp_wl->ptr_constraints.pointer_destroy_signal,
                  &constraint->pointer_destroy_listener);
@@ -959,6 +989,8 @@ _e_comp_wl_input_pointer_constraint_create(E_Client *ec,
                  &constraint->surface_commit_listener);
    wl_signal_add(&e_comp_wl->ptr_constraints.surface_mousein_signal,
                  &constraint->surface_mousein_listener);
+   wl_signal_add(&e_comp_wl->ptr_constraints.surface_mouseout_signal,
+                 &constraint->surface_mouseout_listener);
    wl_list_init(&constraint->surface_unmap_listener.link);
 
    return constraint;
@@ -1470,6 +1502,7 @@ e_comp_wl_input_init(void)
    wl_signal_init(&e_comp_wl->ptr_constraints.surface_unmap_signal);
    wl_signal_init(&e_comp_wl->ptr_constraints.surface_commit_signal);
    wl_signal_init(&e_comp_wl->ptr_constraints.surface_mousein_signal);
+   wl_signal_init(&e_comp_wl->ptr_constraints.surface_mouseout_signal);
 
    _surface_commit_hook = e_comp_wl_hook_add(E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT,
                                              _e_comp_wl_input_cb_surface_commit,