e_desk: use transform_core to desk zoom 91/290991/1
authorJunseok Kim <juns.kim@samsung.com>
Tue, 4 Apr 2023 04:07:31 +0000 (13:07 +0900)
committerJunseok Kim <juns.kim@samsung.com>
Thu, 6 Apr 2023 05:46:31 +0000 (14:46 +0900)
Use transform_core API to desk zoom instead of transform_core_update_with_desk_zoom function.

There was a bug that video window blinking that enabled both of transform and desk zoom.

When the video window changed their size, the transform_core_update called by EVAS_CALLBACK_RESIZE before idle time.
And then, after idle time, following called the transform_core_update_with_desk_zoom by E_EVENT_CLIENT_RESIZE.
In this situation, it makese the window blinking because their're has different coordinates and zoom value of evas_map.

For fix this issue, use transform_core API to doing desk zoom to zoom at same time with other transform.

Change-Id: Ie2adf7d4af1d6239fb04d732ea3e51d6fc2ecee5

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_desk.c

index abcfd15..26be10b 100644 (file)
@@ -72,7 +72,6 @@ static Eina_Bool _e_visibility_changed = EINA_FALSE;
 
 EINTERN void e_client_focused_set(E_Client *ec);
 static void _e_client_transient_for_group_make(E_Client *ec, Eina_List **list);
-static void _e_client_transform_core_update_with_zoom(E_Client *ec, double zoomx, double zoomy, int cx, int cy);
 static Evas_Object *_e_client_resize_object_create(E_Client *ec);
 static void _e_client_resize_object_del(E_Client *ec);
 static void _e_client_stay_within_canvas(E_Client *ec, int x, int y, int *new_x, int *new_y);
@@ -1382,6 +1381,12 @@ _e_client_del(E_Client *ec)
    ec->base_output_resolution.transform = NULL;
    E_FREE_FUNC(ec->base_output_resolution.hook_subsurf_create, e_comp_wl_hook_del);
 
+   // desk_zoom
+   e_client_transform_core_remove(ec, ec->desk_zoom.transform);
+   e_util_transform_del(ec->desk_zoom.transform);
+   ec->desk_zoom.transform = NULL;
+   E_FREE_FUNC(ec->desk_zoom.hook_subsurf_create, e_comp_wl_hook_del);
+
    if (ec->transform_core.transform_list)
      {
         E_Util_Transform *transform;
@@ -4325,8 +4330,7 @@ _e_client_transform_core_vertices_apply_with_zoom(E_Client *ec,
                                         Evas_Object *obj,
                                         E_Util_Transform_Rect_Vertex *vertices,
                                         E_Util_Transform *transform,
-                                        double zoomx, double zoomy,
-                                        Evas_Coord cx, Evas_Coord cy)
+                                        E_Util_Transform_Zoom zoom)
 {
    E_Map *map = NULL;
 
@@ -4338,7 +4342,7 @@ _e_client_transform_core_vertices_apply_with_zoom(E_Client *ec,
                                                ec->transform_core.direct_render);
         EINA_SAFETY_ON_NULL_RETURN(map);
 
-        e_map_util_zoom(map, zoomx, zoomy, cx, cy);
+        e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
 
         e_comp_object_map_set(obj, map);
         e_comp_object_map_enable_set(obj, EINA_TRUE);
@@ -4394,31 +4398,6 @@ _e_client_transform_core_sub_update(E_Client *ec, E_Util_Transform_Rect_Vertex *
 }
 
 static void
-_e_client_transform_core_sub_update_with_zoom(E_Client *ec, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
-{
-   E_Comp_Wl_Client_Data *cdata;
-   Eina_List *l;
-   E_Client *subc;
-
-   if (!ec) return;
-
-   cdata = e_client_cdata_get(ec);
-   if (!cdata) return;
-
-   ELOGF("TRANSFORM", "transform_core_sub_update_with_zoom, (zoom:%lf,%lf / coord:%d,%d)", ec, zoomx, zoomy, cx, cy);
-
-   EINA_LIST_FOREACH(cdata->sub.list, l, subc)
-     {
-        _e_client_transform_core_update_with_zoom(subc, zoomx, zoomy, cx, cy);
-     }
-
-   EINA_LIST_FOREACH(cdata->sub.below_list, l, subc)
-     {
-        _e_client_transform_core_update_with_zoom(subc, zoomx, zoomy, cx, cy);
-     }
-}
-
-static void
 _e_client_cb_hook_shell_surface_ready(void *data EINA_UNUSED, E_Client *ec)
 {
    if (EINA_UNLIKELY(!ec))
@@ -7826,12 +7805,26 @@ e_client_transform_core_update(E_Client *ec)
                                                                                                    &ec->transform_core.result.boundary.vertices);
 
         // 5. apply vertices
-        e_comp_object_transform_transp_vertices_set(ec->frame, &ec->transform_core.result.vertices);
-        e_comp_object_transform_bg_vertices_set(ec->frame, &ec->transform_core.result.boundary.vertices);
-        _e_client_transform_core_boundary_update(ec, &ec->transform_core.result.boundary.vertices);
-        _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform);
+        if (ec->transform_core.result.transform.use_zoom)
+          {
+             // TODO: apply zoom values to vertices
+             e_comp_object_transform_transp_vertices_set_with_zoom(ec->frame, &ec->transform_core.result.vertices,
+                                                                   ec->transform_core.result.transform.zoom);
+             e_comp_object_transform_bg_vertices_set_with_zoom(ec->frame, &ec->transform_core.result.boundary.vertices,
+                                                               ec->transform_core.result.transform.zoom);
+             _e_client_transform_core_boundary_update(ec, &ec->transform_core.result.boundary.vertices);
+             _e_client_transform_core_vertices_apply_with_zoom(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform,
+                                                               ec->transform_core.result.transform.zoom);
+          }
+        else
+          {
+             e_comp_object_transform_transp_vertices_set(ec->frame, &ec->transform_core.result.vertices);
+             e_comp_object_transform_bg_vertices_set(ec->frame, &ec->transform_core.result.boundary.vertices);
+             _e_client_transform_core_boundary_update(ec, &ec->transform_core.result.boundary.vertices);
+             _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform);
+          }
 
-        // 6. subsurface update'
+        // 6. subsurface update
         _e_client_transform_core_sub_update(ec, &ec->transform_core.result.vertices);
 
         if (!e_object_is_del(E_OBJECT(ec)))
@@ -7917,34 +7910,6 @@ e_client_transform_core_input_inv_rect_transform(E_Client *ec, int x, int y, int
                                                x, y, out_x, out_y);
 }
 
-static void
-_e_client_transform_core_update_with_zoom(E_Client *ec, double zoomx, double zoomy, int cx, int cy)
-{
-   if (!ec) return;
-
-   e_comp_object_transform_transp_vertices_set_with_zoom(ec->frame, &ec->transform_core.result.vertices,
-                                                         zoomx, zoomy, cx, cy);
-   e_comp_object_transform_bg_vertices_set_with_zoom(ec->frame, &ec->transform_core.result.boundary.vertices,
-                                                     zoomx, zoomy, cx, cy);
-   _e_client_transform_core_vertices_apply_with_zoom(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform,
-                                                     zoomx, zoomy, cx, cy);
-   _e_client_transform_core_sub_update_with_zoom(ec, &ec->transform_core.result.vertices,
-                                                 zoomx, zoomy, cx, cy);
-}
-
-EINTERN void
-e_client_transform_core_update_with_desk_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
-{
-   Eina_Bool enable;
-
-   if (!ec) return;
-   if (ec->new_client) return;
-
-   enable = e_client_transform_core_enable_get(ec);
-   if (enable)
-     _e_client_transform_core_update_with_zoom(ec, zoomx, zoomy, cx, cy);
-}
-
 E_API void
 e_client_transform_core_direct_render_set(E_Client *ec, Eina_Bool set)
 {
@@ -9140,12 +9105,12 @@ EINTERN void
 e_client_desk_zoom_enable_set(E_Client *ec, Eina_Bool enable)
 {
    if (!ec) return;
-   ec->desk_zoom = enable;
+   ec->desk_zoom.enable = enable;
 }
 
 EINTERN Eina_Bool
 e_client_desk_zoom_enable_get(E_Client *ec)
 {
    if (!ec) return EINA_FALSE;
-   return ec->desk_zoom;
+   return ec->desk_zoom.enable;
 }
index 4a35fa6..5348b7c 100644 (file)
@@ -1057,7 +1057,12 @@ struct E_Client
       int x, y, w, h;
    } maximized_info;
 
-   Eina_Bool desk_zoom;
+   struct
+   {
+      Eina_Bool enable;
+      E_Util_Transform *transform;
+      E_Comp_Wl_Hook *hook_subsurf_create;
+   } desk_zoom;
 
    E_Maximize_Direction maximize_dir;
 };
@@ -1240,7 +1245,6 @@ E_API E_Util_Transform *e_client_transform_core_transform_get(E_Client *ec, int
 E_API void              e_client_transform_core_input_transform(E_Client *ec, int x, int y, int *out_x, int *out_y);
 E_API void              e_client_transform_core_input_inv_transform(E_Client *ec, int x, int y, int *out_x, int *out_y);
 E_API void              e_client_transform_core_input_inv_rect_transform(E_Client *ec, int x, int y, int *out_x, int *out_y);
-EINTERN void            e_client_transform_core_update_with_desk_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
 E_API void              e_client_transform_core_direct_render_set(E_Client *ec, Eina_Bool set);
 
 E_API E_Pixmap *e_client_pixmap_change(E_Client *ec, E_Pixmap *newcp);
index 5d74c93..32ebad6 100644 (file)
@@ -540,7 +540,7 @@ _e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Ver
 }
 
 static void
-_e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+_e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
 {
    if (!obj) return;
 
@@ -549,7 +549,7 @@ _e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transfor
         E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
         if (map)
           {
-             e_map_util_zoom(map, zoomx, zoomy, cx, cy);
+             e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
 
              e_comp_object_map_set(obj, map);
              e_comp_object_map_enable_set(obj, EINA_TRUE);
@@ -5757,14 +5757,14 @@ e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_
 }
 
 EINTERN void
-e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
 {
    API_ENTRY;
    EINA_SAFETY_ON_NULL_RETURN(cw->ec);
    if (cw->ec->input_only) return;
    if (!cw->transform_bg_obj) return;
 
-   _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoomx, zoomy, cx, cy);
+   _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
 }
 
 E_API void
@@ -5815,14 +5815,14 @@ e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_R
 }
 
 EINTERN void
-e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
 {
    API_ENTRY;
    EINA_SAFETY_ON_NULL_RETURN(cw->ec);
    if (cw->ec->input_only) return;
    if (!cw->transform_tranp_obj) return;
 
-   _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoomx, zoomy, cx, cy);
+   _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
 }
 
 E_API void
index 3bfc22f..6c21a84 100644 (file)
@@ -163,10 +163,10 @@ E_API void e_comp_object_size_update(Evas_Object *obj, int w, int h);
 E_API void e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a);
 E_API void e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
-EINTERN void e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
+EINTERN void e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom);
 E_API void e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
-EINTERN void e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
+EINTERN void e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom);
 
 E_API void e_comp_object_layer_update(Evas_Object *obj, Evas_Object *above, Evas_Object *below);
 EINTERN int e_comp_object_layer_get(Evas_Object *obj);
index 5545a7e..fd9f46a 100644 (file)
@@ -1824,6 +1824,58 @@ _e_desk_client_subsurface_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Co
 }
 
 static void
+_e_desk_client_subsurf_create(void *data, E_Client *subc)
+{
+   E_Client *ec, *parent;
+   ec = data;
+
+   if (ec != subc) return;
+
+   if (ec->desk_zoom.transform)
+     {
+        e_client_transform_core_remove(ec, ec->desk_zoom.transform);
+        E_FREE_FUNC(ec->desk_zoom.transform, e_util_transform_del);
+     }
+
+   parent = e_comp_wl_topmost_parent_get(ec);
+   if (parent)
+     {
+        parent->transform_core.changed = EINA_TRUE;
+        e_client_transform_core_update(parent);
+     }
+}
+
+static void
+_e_desk_client_deskzoom_set(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+{
+   if ((zoomx == 1.0) && (zoomy == 1.0))
+     {
+        if (ec->desk_zoom.transform)
+          e_client_transform_core_remove(ec, ec->desk_zoom.transform);
+        e_client_transform_core_update(ec);
+        return;
+     }
+
+   if (!ec->desk_zoom.transform)
+     {
+        ec->desk_zoom.transform = e_util_transform_new();
+        e_util_transform_role_set(ec->desk_zoom.transform, "desk_zoom");
+
+        if (!ec->desk_zoom.hook_subsurf_create)
+          {
+             ec->desk_zoom.hook_subsurf_create =
+                 e_comp_wl_hook_add(E_COMP_WL_HOOK_SUBSURFACE_CREATE,
+                                    _e_desk_client_subsurf_create, ec);
+          }
+     }
+
+   e_util_transform_zoom_set(ec->desk_zoom.transform, zoomx, zoomy, cx, cy);
+   e_client_transform_core_add(ec, ec->desk_zoom.transform);
+
+   e_client_transform_core_update(ec);
+}
+
+static void
 _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
 {
    Eina_Bool transformed;
@@ -1839,7 +1891,7 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva
    transformed = e_client_transform_core_enable_get(ec);
 
    if (transformed)
-     e_client_transform_core_update_with_desk_zoom(ec, zoomx, zoomy, cx, cy);
+     _e_desk_client_deskzoom_set(ec, zoomx, zoomy, cx, cy);
    else
      {
         _e_desk_object_zoom(ec->frame, zoomx, zoomy, cx, cy);