e_comp_wl: Unlock pointer constraint when listening to mouse out signal 11/308511/1
authorduna.oh <duna.oh@samsung.com>
Tue, 26 Mar 2024 08:23:45 +0000 (17:23 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 27 Mar 2024 01:16:29 +0000 (10:16 +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_input.c
src/include/e_comp_wl.h

index dfea164..fcd6bb6 100644 (file)
@@ -1406,6 +1406,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
@@ -5035,6 +5036,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 47b5913..2ac0a59 100644 (file)
@@ -55,6 +55,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;
@@ -676,6 +677,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);
@@ -869,18 +871,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);
 }
 
@@ -964,6 +992,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);
@@ -971,6 +1001,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;
@@ -1564,6 +1596,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,
index e09f85c..a46d9ef 100644 (file)
@@ -272,6 +272,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;