#include "e_client_video_intern.h"
#include "e_comp_wl_video_intern.h"
#include "e_comp_object_intern.h"
-#include "e_desk_intern.h"
#include "e_zone_intern.h"
#include "e_hints_intern.h"
#include "e_comp_input_intern.h"
E_API void
e_comp_wl_map_apply(E_Client *ec)
{
- E_Comp_Wl_Buffer_Viewport *vp;
- E_Comp_Wl_Subsurf_Data *sdata;
- E_Comp_Wl_Client_Data *cdata;
- int x1, y1, x2, y2, x, y;
- int dx = 0, dy = 0;
- Eina_Bool zoom_animating = EINA_FALSE;
-
- if (!ec || !ec->comp_data || e_object_is_del(E_OBJECT(ec))) return;
-
- e_view_client_map_update(e_client_view_get(ec));
+ E_Surface_View *view;
- cdata = ec->comp_data;
- vp = &cdata->scaler.buffer_viewport;
- if ((vp->buffer.src_width == wl_fixed_from_int(-1)) &&
- (vp->surface.width == -1) &&
- (!cdata->viewport_transform))
+ view = e_surface_view_try_from_ec(ec);
+ if (!view)
return;
- sdata = e_client_subsurface_data_try_get(ec);
- if (sdata)
- {
- e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
-
- if (sdata->remote_surface.offscreen_parent)
- {
- E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
- Eina_Rectangle *rect;
- Eina_List *l;
-
- EINA_LIST_FOREACH(offscreen_parent->comp_data->remote_surface.regions, l, rect)
- {
- /* TODO: If there are one more regions, it means that provider's offscreen
- * is displayed by one more remote_surfaces. Have to consider it later. At
- * this time, just consider only one remote_surface.
- */
- dx += rect->x;
- dy += rect->y;
- break;
- }
- }
- }
- else
- {
- dx = ec->x;
- dy = ec->y;
- }
-
- e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
- if (x != dx || y != dy)
- e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
-
- if (!cdata->viewport_transform)
- {
- cdata->viewport_transform = e_util_transform_new();
- e_util_transform_role_set(cdata->viewport_transform, "viewport_transform");
- e_client_transform_core_add(ec, cdata->viewport_transform);
- }
-
- e_util_transform_viewport_set(cdata->viewport_transform, dx, dy,
- ec->comp_data->width_from_viewport,
- ec->comp_data->height_from_viewport);
-
- if (vp->buffer.src_width == wl_fixed_from_int(-1))
- {
- x1 = 0;
- y1 = 0;
- x2 = cdata->width_from_buffer;
- y2 = cdata->height_from_buffer;
- }
- else
- {
- x1 = wl_fixed_to_int(vp->buffer.src_x);
- y1 = wl_fixed_to_int(vp->buffer.src_y);
- x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
- y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
- }
-
- e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1);
- e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1);
- e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2);
- e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2);
-
- E_Desk *desk;
- desk = e_comp_desk_find_by_ec(ec);
- if (desk)
- zoom_animating = e_desk_zoom_is_animating(desk);
-
- ELOGF("TRANSFORM", "viewport map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d), zoom_animating: %d",
- ec, ec->x, ec->y, ec->comp_data->width_from_viewport,
- ec->comp_data->height_from_viewport, x1, y1, x2, y1, x2, y2, x1, y2, zoom_animating);
-
- /* workaround:: when the desk zoom is doing their animation,
- the transform core update can override animation's zoom boundary.
- so, don't doing transform core update while desk zoom animation */
- if (!zoom_animating)
- e_client_transform_core_update(ec);
-
+ e_surface_view_viewport_apply(view);
}
EINTERN void
_e_comp_wl_subsurface_client_reposition(E_Client *subc)
{
E_View_Client *view_client;
+ E_Surface_View *surface_view;
int x, y;
e_comp_wl_subsurface_data_coord_get(subc->comp_data->sub.data, &x, &y);
view_client = e_client_view_get(subc);
e_view_position_set(e_view_client_view_get(view_client), x, y);
- if (subc->comp_data->viewport_transform)
- e_comp_wl_map_apply(subc);
+ surface_view = e_surface_view_try_from_ec(subc);
+ if (e_surface_view_viewport_transform_try_get(surface_view))
+ e_surface_view_viewport_apply(surface_view);
else
e_client_transform_core_update(subc);
}
E_API E_Util_Transform *
e_comp_wl_viewport_transform_get(E_Client *ec)
{
+ E_Surface_View *surface_view;
+
if (!ec) return NULL;
- if (!ec->comp_data) return NULL;
- return ec->comp_data->viewport_transform;
+ surface_view = e_surface_view_try_from_ec(ec);
+ if (!surface_view)
+ return NULL;
+
+ return e_surface_view_viewport_transform_try_get(surface_view);
}
E_API int
e_comp_wl_data_secondary_remove(surface->ec);
- if (surface->base.viewport_transform)
- {
- e_client_transform_core_remove(surface->ec, surface->base.viewport_transform);
- e_util_transform_del(surface->base.viewport_transform);
- surface->base.viewport_transform = NULL;
- }
-
surface->ec->comp_data = NULL;
_e_surface_base_finish(&surface->base);
#include "e_compositor_private.h"
#include "e_surface_view_intern.h"
#include "e_view_client_intern.h"
+#include "e_desk_intern.h"
#include <stdlib.h>
#include <wayland-util.h>
{
E_Surface *surface;
E_Client *ec;
+ E_Util_Transform *transform;
struct wl_listener ec_destroy;
struct wl_listener viewport_commit;
e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, view->ec);
+ if (view->transform)
+ {
+ e_client_transform_core_remove(view->ec, view->transform);
+ e_util_transform_del(view->transform);
+ }
+
e_comp_wl_client_evas_deinit(view->ec);
_surface_view_surface_unlink(view);
{
E_Surface_View *view = wl_container_of(listener, view, viewport_commit);
- e_comp_wl_map_apply(view->ec);
+ e_surface_view_viewport_apply(view);
}
static Eina_Bool
return EINA_TRUE;
}
+
+EINTERN E_Surface_View *
+e_surface_view_try_from_ec(E_Client *ec)
+{
+ E_Surface_View *view;
+ struct wl_listener *listener;
+
+ listener = e_client_destroy_listener_get(ec, _surface_view_cb_ec_destroy);
+ if (!listener)
+ return NULL;
+
+ return wl_container_of(listener, view, ec_destroy);
+}
+
+EINTERN void
+e_surface_view_viewport_apply(E_Surface_View *view)
+{
+ E_Client *ec = view->ec;
+ E_Comp_Wl_Buffer_Viewport *vp;
+ E_Comp_Wl_Subsurf_Data *sdata;
+ E_Comp_Wl_Client_Data *cdata;
+ int x1, y1, x2, y2, x, y;
+ int dx = 0, dy = 0;
+ Eina_Bool zoom_animating = EINA_FALSE;
+
+ e_view_client_map_update(e_client_view_get(ec));
+
+ cdata = ec->comp_data;
+ vp = &cdata->scaler.buffer_viewport;
+ if ((vp->buffer.src_width == wl_fixed_from_int(-1)) &&
+ (vp->surface.width == -1) &&
+ (!view->transform))
+ return;
+
+ sdata = e_client_subsurface_data_try_get(ec);
+ if (sdata)
+ {
+ e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
+
+ if (sdata->remote_surface.offscreen_parent)
+ {
+ E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
+ Eina_Rectangle *rect;
+
+ /* TODO: If there are one more regions, it means that provider's offscreen
+ * is displayed by one more remote_surfaces. Have to consider it later. At
+ * this time, just consider only one remote_surface.
+ */
+ rect = eina_list_nth(offscreen_parent->comp_data->remote_surface.regions, 0);
+ if (rect)
+ {
+ dx += rect->x;
+ dy += rect->y;
+ }
+ }
+ }
+ else
+ {
+ dx = ec->x;
+ dy = ec->y;
+ }
+
+ e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
+ if (x != dx || y != dy)
+ e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
+
+ if (!view->transform)
+ {
+ view->transform = e_util_transform_new();
+ e_util_transform_role_set(view->transform, "viewport_transform");
+ e_client_transform_core_add(ec, view->transform);
+ }
+
+ e_util_transform_viewport_set(view->transform, dx, dy,
+ ec->comp_data->width_from_viewport,
+ ec->comp_data->height_from_viewport);
+
+ if (vp->buffer.src_width == wl_fixed_from_int(-1))
+ {
+ x1 = 0;
+ y1 = 0;
+ x2 = cdata->width_from_buffer;
+ y2 = cdata->height_from_buffer;
+ }
+ else
+ {
+ x1 = wl_fixed_to_int(vp->buffer.src_x);
+ y1 = wl_fixed_to_int(vp->buffer.src_y);
+ x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
+ y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
+ }
+
+ e_util_transform_texcoord_set(view->transform, 0, x1, y1);
+ e_util_transform_texcoord_set(view->transform, 1, x2, y1);
+ e_util_transform_texcoord_set(view->transform, 2, x2, y2);
+ e_util_transform_texcoord_set(view->transform, 3, x1, y2);
+
+ E_Desk *desk;
+ desk = e_comp_desk_find_by_ec(ec);
+ if (desk)
+ zoom_animating = e_desk_zoom_is_animating(desk);
+
+ ESV_INF("Apply viewport: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d), zoom_animating: %d",
+ ec, ec->x, ec->y, ec->comp_data->width_from_viewport,
+ ec->comp_data->height_from_viewport, x1, y1, x2, y1, x2, y2, x1, y2, zoom_animating);
+
+ /* workaround:: when the desk zoom is doing their animation,
+ the transform core update can override animation's zoom boundary.
+ so, don't doing transform core update while desk zoom animation */
+ if (!zoom_animating)
+ e_client_transform_core_update(ec);
+}
+
+EINTERN E_Util_Transform *
+e_surface_view_viewport_transform_try_get(E_Surface_View *view)
+{
+ return view->transform;
+}
Eina_Bool e_surface_view_module_init(struct wl_display *display);
+E_Surface_View *e_surface_view_try_from_ec(E_Client *ec);
+void e_surface_view_viewport_apply(E_Surface_View *view);
+E_Util_Transform *e_surface_view_viewport_transform_try_get(E_Surface_View *view);
+
#endif
E_Devicemgr_Input_Device *last_device_touch;
E_Devicemgr_Input_Device *last_device_kbd;
- E_Util_Transform *viewport_transform;
+ E_DEPRECATED E_Util_Transform *viewport_transform;
struct
{
E_DEPRECATED E_API struct wl_resource *e_comp_wl_scaler_viewport_resource_get(E_Client *ec);
E_DEPRECATED E_API void e_comp_wl_scaler_viewport_resource_set(E_Client *ec, struct wl_resource *resource);
-E_API E_Util_Transform *e_comp_wl_viewport_transform_get(E_Client *ec);
+E_DEPRECATED E_API E_Util_Transform *e_comp_wl_viewport_transform_get(E_Client *ec); // Use e_surface_view_viewport_transform_try_get
E_API int e_comp_wl_viewport_width_get(E_Client *ec);
E_API int e_comp_wl_viewport_height_get(E_Client *ec);
E_API struct wl_signal *e_comp_wl_viewport_apply_signal_get(E_Client *ec);