pepper: send wl_surface::enter and wl_surface::leave events
authorJunghoon <jh13.son@samsung.com>
Thu, 12 Nov 2015 09:54:53 +0000 (18:54 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Fri, 13 Nov 2015 04:35:07 +0000 (13:35 +0900)
Change-Id: Ia74e2dbd4da848aa3bfdb518690ee6b8a697acd0

src/lib/pepper/pepper.h
src/lib/pepper/surface.c
src/lib/pepper/view.c

index b9a40aad44afdefe281d54330919498e0c2bb1e6..01791819bc6ff902a44a3e648db4e22fc40855e4 100644 (file)
@@ -1156,6 +1156,12 @@ pepper_surface_get_opaque_region(pepper_surface_t *surface);
 PEPPER_API pixman_region32_t *
 pepper_surface_get_input_region(pepper_surface_t *surface);
 
+PEPPER_API void
+pepper_surface_send_enter(pepper_surface_t *surface, pepper_output_t *output);
+
+PEPPER_API void
+pepper_surface_send_leave(pepper_surface_t *surface, pepper_output_t *output);
+
 /* Buffer. */
 PEPPER_API void
 pepper_buffer_reference(pepper_buffer_t *buffer);
index 383385d1134843df2170952f83950c984ba85548..e12c8077fe0ca9226168e59945671977fca3a1ce 100644 (file)
@@ -564,6 +564,32 @@ pepper_surface_get_input_region(pepper_surface_t *surface)
     return &surface->input_region;
 }
 
+PEPPER_API void
+pepper_surface_send_enter(pepper_surface_t *surface, pepper_output_t *output)
+{
+    struct wl_resource *resource;
+    struct wl_client   *client = wl_resource_get_client(surface->resource);
+
+    wl_resource_for_each(resource, &output->resource_list)
+    {
+        if (wl_resource_get_client(resource) == client)
+            wl_surface_send_enter(surface->resource, resource);
+    }
+}
+
+PEPPER_API void
+pepper_surface_send_leave(pepper_surface_t *surface, pepper_output_t *output)
+{
+    struct wl_resource *resource;
+    struct wl_client   *client = wl_resource_get_client(surface->resource);
+
+    wl_resource_for_each(resource, &output->resource_list)
+    {
+        if (wl_resource_get_client(resource) == client)
+            wl_surface_send_leave(surface->resource, resource);
+    }
+}
+
 void
 pepper_surface_flush_damage(pepper_surface_t *surface)
 {
index cdd7a4e5aeabd1122c567c6aac44116e010b74ef..ae72c70b6a5257db357cbe0ce6ad416255f138c4 100644 (file)
@@ -145,6 +145,7 @@ pepper_view_update(pepper_view_t *view)
 {
     pepper_bool_t   active;
     int             i;
+    uint32_t        output_overlap_prev;
 
     if (!view->dirty)
         return;
@@ -227,6 +228,7 @@ pepper_view_update(pepper_view_t *view)
         }
 
         /* Output overlap. */
+        output_overlap_prev = view->output_overlap;
         view->output_overlap = 0;
 
         pepper_list_for_each(output, &view->compositor->output_list, link)
@@ -240,7 +242,16 @@ pepper_view_update(pepper_view_t *view)
             };
 
             if (pixman_region32_contains_rectangle(&view->bounding_region, &box) != PIXMAN_REGION_OUT)
+            {
                 view->output_overlap |= (1 << output->id);
+                if (!(output_overlap_prev & (1 << output->id)))
+                    pepper_surface_send_enter(view->surface, output);
+            }
+            else
+            {
+                if (output_overlap_prev & (1 << output->id))
+                    pepper_surface_send_leave(view->surface, output);
+            }
         }
     }