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
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);
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;
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;
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);
}
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))
&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)))
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)
{
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;
}
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;
};
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);
}
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;
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);
}
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
}
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
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);
}
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;
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);