return ec->vkbd.vkbd;
}
/////////////////////////////////////////////////////////
+EINTERN E_Comp_Wl_Subsurf_Data *
+e_client_subsurface_data_try_get(E_Client *ec)
+{
+ return ec->comp_data ? ec->comp_data->sub.data : NULL;
+}
EINTERN void e_client_resize_handle(E_Client *ec);
EINTERN int e_client_resize_end(E_Client *ec);
+E_Comp_Wl_Subsurf_Data *e_client_subsurface_data_try_get(E_Client *ec);
#endif
static void
_e_video_hwc_geometry_output_rect_get(E_Client *ec, Eina_Rectangle *out)
{
- E_Subsurface *subsurface;
+ E_Comp_Wl_Subsurf_Data *sdata;
- if (e_comp_wl_subsurface_check(ec))
+ sdata = e_client_subsurface_data_try_get(ec);
+ if (sdata)
{
- subsurface = e_subsurface_from_ec(ec);
- e_subsurface_coord_get(subsurface, &out->x, &out->y);
+ e_comp_wl_subsurface_data_coord_get(sdata, &out->x, &out->y);
}
else
{
E_Comp_Wl_Buffer_Viewport *vp;
E_Comp_Wl_Subsurf_Data *sdata;
E_Comp_Wl_Client_Data *cdata;
- E_Subsurface *subsurface;
int x1, y1, x2, y2, x, y;
int dx = 0, dy = 0;
Eina_Bool zoom_animating = EINA_FALSE;
(!cdata->viewport_transform))
return;
- if (e_comp_wl_subsurface_check(ec))
+ sdata = e_client_subsurface_data_try_get(ec);
+ if (sdata)
{
- subsurface = e_subsurface_from_ec(ec);
- e_subsurface_coord_get(subsurface, &dx, &dy);
+ e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
- sdata = ec->comp_data->sub.data;
if (sdata->remote_surface.offscreen_parent)
{
E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
break;
}
}
-
- e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
- if (x != dx || y != dy)
- e_subsurface_view_position_set(subsurface, dx, dy);
}
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);
}
+ 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();
wl_signal_emit(&e_comp_wl->ptr_constraints.surface_unmap_signal, ec);
}
+static void
+_e_comp_wl_subsurface_client_reposition(E_Client *subc)
+{
+ int x, y;
+
+ e_comp_wl_subsurface_data_coord_get(subc->comp_data->sub.data, &x, &y);
+ evas_object_move(subc->frame, x, y);
+
+ if (subc->comp_data->viewport_transform)
+ e_comp_wl_map_apply(subc);
+ else
+ e_client_transform_core_update(subc);
+}
+
static void
_e_comp_wl_evas_cb_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
E_Client *ec;
E_Client *subc;
Eina_List *l;
- E_Subsurface *subsurface;
if (!(ec = data)) return;
if (e_object_is_del(E_OBJECT(ec))) return;
EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
{
if (!e_comp_wl_subsurface_check(subc)) continue;
- subsurface = e_subsurface_from_ec(subc);
- e_subsurface_view_reposition(subsurface);
-
- E_Comp_Wl_Client_Data *cdata = subc->comp_data;
- if (cdata->viewport_transform)
- e_comp_wl_map_apply(subc);
+ _e_comp_wl_subsurface_client_reposition(subc);
}
EINA_LIST_FOREACH(ec->comp_data->sub.below_list, l, subc)
{
if (!e_comp_wl_subsurface_check(subc)) continue;
- subsurface = e_subsurface_from_ec(subc);
- e_subsurface_view_reposition(subsurface);
-
- E_Comp_Wl_Client_Data *cdata = subc->comp_data;
- if (cdata->viewport_transform)
- e_comp_wl_map_apply(subc);
+ _e_comp_wl_subsurface_client_reposition(subc);
}
}
static void
_e_comp_wl_surface_output_viewport_get(E_Client *ec, Eina_Rectangle *out)
{
- E_Subsurface *subsurface;
+ E_Comp_Wl_Subsurf_Data *sdata;
if (!out)
return;
if (!ec->comp_data)
return;
- if (e_comp_wl_subsurface_check(ec))
+ sdata = e_client_subsurface_data_try_get(ec);
+ if (sdata)
{
- subsurface = e_subsurface_from_ec(ec);
- e_subsurface_coord_get(subsurface, &out->x, &out->y);
+ e_comp_wl_subsurface_data_coord_get(sdata, &out->x, &out->y);
}
else
{
return EINA_TRUE;
}
+EINTERN void
+e_comp_wl_subsurface_data_position_set(E_Comp_Wl_Subsurf_Data *sdata, int x, int y)
+{
+ if ((sdata->position.x == x) && (sdata->position.y == y))
+ return;
+
+ sdata->position.x = x;
+ sdata->position.y = y;
+ sdata->position.set = EINA_TRUE;
+}
+
+EINTERN void
+e_comp_wl_subsurface_data_coord_get(E_Comp_Wl_Subsurf_Data *sdata, int *x, int *y)
+{
+ E_Comp_Wl_Subsurf_Data *iter = sdata;
+ E_Client *parent;
+ int ret_x = 0, ret_y = 0;
+
+ while (1)
+ {
+ ret_x += iter->position.x;
+ ret_y += iter->position.y;
+
+ parent = iter->parent;
+ if (!parent)
+ break;
+
+ if (parent->comp_data && parent->comp_data->sub.data)
+ {
+ iter = parent->comp_data->sub.data;
+ }
+ else
+ {
+ ret_x += parent->x;
+ ret_y += parent->y;
+ break;
+ }
+ }
+
+ if (x)
+ *x = ret_x;
+ if (y)
+ *y = ret_y;
+}
+
static E_Comp_Wl_Subsurf_Data *
_e_comp_wl_subsurface_data_get(E_Client *ec)
{
EINTERN void e_comp_wl_subsurface_data_init(E_Comp_Wl_Subsurf_Data *sdata, E_Client *ec, E_Client *parent, E_Client *offscreen_parent);
EINTERN void e_comp_wl_subsurface_data_finish(E_Comp_Wl_Subsurf_Data *sdata);
EINTERN void e_comp_wl_subsurface_data_parent_unset(E_Comp_Wl_Subsurf_Data *sdata);
+EINTERN void e_comp_wl_subsurface_data_position_set(E_Comp_Wl_Subsurf_Data *sdata, int x, int y);
+EINTERN void e_comp_wl_subsurface_data_coord_get(E_Comp_Wl_Subsurf_Data *sdata, int *x, int *y);
EINTERN Eina_Bool e_comp_wl_subsurface_add(struct wl_resource *resource, uint32_t id, struct wl_resource *surface_resource, struct wl_resource *parent_resource);
EINTERN Eina_Bool e_comp_wl_subsurface_order_commit(E_Client *ec);
struct wl_signal destroy;
struct wl_signal reposition;
} events;
-
- Eina_Bool internal;
};
struct _E_Frame_Callback
static void _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data);
static void _e_subsurface_view_init(E_Subsurface_View *view, E_Subsurface *subsurface);
static void _e_subsurface_view_finish(E_Subsurface_View *view);
+static void _e_subsurface_view_reposition(E_Subsurface *subsurface);
static void _ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform);
static void _ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box);
return _e_subsurface_try_from_surface(surface);
}
-EINTERN E_Subsurface *
-e_subsurface_internal_create(E_Surface *surface, E_Subsurface *parent_subsurface)
-{
- E_Subsurface *sub;
-
- sub = E_NEW(E_Subsurface, 1);
- if (!sub)
- return NULL;
-
- sub->internal = EINA_TRUE;
- sub->surface = surface;
-
- sub->parent = parent_subsurface->surface;
- sub->parent_surface_destroy.notify = _e_subsurface_cb_parent_surface_destroy;
- wl_signal_add(&sub->parent->events.destroy, &sub->parent_surface_destroy);
-
- e_comp_wl_subsurface_data_init(&sub->base, surface->ec, sub->parent->ec, NULL);
-
- _e_subsurface_view_init(&sub->view, sub);
-
- ELOGF("SUBSURFACE", "Create for internal use: parent(%p)", surface->ec, sub->parent->ec);
-
- return sub;
-}
-
-EINTERN void
-e_subsurface_internal_destroy(E_Subsurface *sub)
-{
- assert(sub->internal);
-
- ELOGF("SUBSURFACE", "Destroy internal subsurface", sub->surface->ec);
-
- _e_subsurface_view_finish(&sub->view);
- e_comp_wl_subsurface_data_finish(&sub->base);
- sub->surface->ec->comp_data->sub.data = NULL;
- wl_list_remove(&sub->parent_surface_destroy.link);
- free(sub);
-}
-
EINTERN void
e_subsurface_stand_alone_mode_set(E_Subsurface *sub)
{
{
EINA_SAFETY_ON_NULL_RETURN_VAL(subsurface, EINA_FALSE);
- if ((subsurface->base.position.x == x) && (subsurface->base.position.y == y))
- return EINA_FALSE;
-
- subsurface->base.position.x = x;
- subsurface->base.position.y = y;
- subsurface->base.position.set = EINA_TRUE;
+ e_comp_wl_subsurface_data_position_set(&subsurface->base, x, y);
if (subsurface->ds_subsurface)
_ds_subsurface_position_set(subsurface->ds_subsurface, x, y);
{
view->ec = subsurface->surface->ec;
- e_subsurface_view_reposition(subsurface);
+ _e_subsurface_view_reposition(subsurface);
}
static void
sub->base.position.x = ds_subsurface->current.x;
sub->base.position.y = ds_subsurface->current.y;
- e_subsurface_view_reposition(sub);
+ _e_subsurface_view_reposition(sub);
wl_signal_emit(&sub->events.reposition, sub);
}
e_subsurface_destroy_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
{
EINA_SAFETY_ON_NULL_RETURN(subsurface);
- assert(!subsurface->internal);
wl_signal_add(&subsurface->events.destroy, listener);
}
e_subsurface_reposition_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
{
EINA_SAFETY_ON_NULL_RETURN(subsurface);
- assert(!subsurface->internal);
wl_signal_add(&subsurface->events.reposition, listener);
}
EINTERN void
e_subsurface_coord_get(E_Subsurface *subsurface, int *x, int *y)
{
- E_Subsurface *iter = subsurface;
- E_Client *parent;
- int ret_x = 0, ret_y = 0;
-
- while (1)
- {
- ret_x += iter->base.position.x;
- ret_y += iter->base.position.y;
-
- parent = iter->base.parent;
- if (!parent)
- break;
-
- if (parent->comp_data && parent->comp_data->sub.data)
- {
- iter = wl_container_of(parent->comp_data->sub.data, iter, base);
- }
- else
- {
- ret_x += parent->x;
- ret_y += parent->y;
- break;
- }
- }
-
- if (x)
- *x = ret_x;
- if (y)
- *y = ret_y;
+ e_comp_wl_subsurface_data_coord_get(&subsurface->base, x, y);
}
EINTERN E_Surface *
return subsurface->parent;
}
-EINTERN void
-e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y)
+static void
+_e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y)
{
E_Subsurface_View *view = &subsurface->view;
E_View_Client *view_client;
e_client_transform_core_update(view->ec);
}
-EINTERN void
-e_subsurface_view_reposition(E_Subsurface *subsurface)
+static void
+_e_subsurface_view_reposition(E_Subsurface *subsurface)
{
int x, y;
- e_subsurface_coord_get(subsurface, &x, &y);
- e_subsurface_view_position_set(subsurface, x, y);
+ e_comp_wl_subsurface_data_coord_get(&subsurface->base, &x, &y);
+ _e_subsurface_view_position_set(subsurface, x, y);
}
E_Surface *e_subsurface_surface_get(E_Subsurface *subsurface);
E_Surface *e_subsurface_parent_try_get(E_Subsurface *subsurface);
void e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y);
-void e_subsurface_view_reposition(E_Subsurface *subsurface);
E_Subsurface *e_subsurface_internal_create(E_Surface *surface, E_Subsurface *parent_subsurface);
void e_subsurface_internal_destroy(E_Subsurface *subsurface);
struct _E_Video_Viewport_Source
{
+ E_Comp_Wl_Subsurf_Data base;
struct wl_resource *resource;
E_Video_Surface *surface;
E_Video_Viewport *viewport;
static void
_source_destroy(E_Video_Viewport_Source *source)
{
- E_Client *ec;
+ E_Client *ec = e_surface_ec_get(source->surface->surface);
VS_INF("SOURCE %p| Destroy", source);
if (source->transform)
{
- ec = e_surface_ec_get(source->surface->surface);
e_client_transform_core_remove(ec, source->transform);
e_util_transform_del(source->transform);
// TODO: Is it necessary to call e_client_transform_core_update?
}
- if (source->subsurface)
- e_subsurface_internal_destroy(source->subsurface);
+ e_comp_wl_subsurface_data_finish(&source->base);
+ ec->comp_data->sub.data = NULL;
if (source->resource)
wl_resource_set_user_data(source->resource, NULL);
in_out->h = fit_height;
}
+static void
+_source_view_move(E_Video_Viewport_Source *source, int x, int y)
+{
+ E_Client *ec = e_surface_ec_get(source->surface->surface);
+
+ evas_object_move(ec->frame, x, y);
+ e_client_transform_core_update(ec);
+}
+
+static void
+_source_view_reposition(E_Video_Viewport_Source *source)
+{
+ int x, y;
+
+ e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
+ _source_view_move(source, x, y);
+}
+
static void
_source_viewport_destination_update(E_Video_Viewport_Source *source)
{
}
end:
- if (source->subsurface)
- {
- e_subsurface_position_set(source->subsurface, dest_rect.x, dest_rect.y);
- e_subsurface_view_reposition(source->subsurface);
- }
+ e_comp_wl_subsurface_data_position_set(&source->base, dest_rect.x, dest_rect.y);
+ _source_view_reposition(source);
+
e_surface_viewport_destination_set(source->surface->surface, dest_rect.w, dest_rect.h);
}
e_client_transform_core_add(ec, source->transform);
}
- e_subsurface_coord_get(source->subsurface, &x, &y);
+ e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
w = ec->comp_data->width_from_viewport;
h = ec->comp_data->height_from_viewport;
transform = viewport->current.transform;
E_Comp_Wl_Buffer_Viewport *vp;
E_Comp_Wl_Subsurf_Data *sdata;
E_Comp_Wl_Client_Data *cdata;
- E_Subsurface *subsurface;
int x1, y1, x2, y2, x, y;
int dx = 0, dy = 0;
Eina_Bool zoom_animating = EINA_FALSE;
if (e_comp_wl_subsurface_check(ec))
{
- subsurface = e_subsurface_from_ec(ec);
- e_subsurface_coord_get(subsurface, &dx, &dy);
+ e_comp_wl_subsurface_data_coord_get(&source->base, &dx, &dy);
sdata = ec->comp_data->sub.data;
if (sdata->remote_surface.offscreen_parent)
e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
if (x != dx || y != dy)
- e_subsurface_view_position_set(subsurface, dx, dy);
+ _source_view_move(source, dx, dy);
}
else
{
static Eina_Bool
_source_viewport_link(E_Video_Viewport_Source *source, E_Video_Viewport *viewport)
{
+ E_Client *ec = e_surface_ec_get(source->surface->surface);
+ E_Client *parent_surface = NULL;
+
+ if (viewport)
+ {
+ _viewport_source_set(viewport, source);
+ parent_surface = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
+ }
+ else
+ wtz_video_viewport_source_send_viewport_destroyed(source->resource);
+
source->viewport = viewport;
- source->subsurface = e_subsurface_internal_create(source->surface->surface, viewport->subsurface);
- if (!source->subsurface)
+ e_comp_wl_subsurface_data_init(&source->base, ec, parent_surface, NULL);
+ if (source->base.parent)
{
- VS_ERR("SOURCE %p| Could not create an internal subsurface", source);
- return EINA_FALSE;
+ source->base.parent->comp_data->sub.list = eina_list_append(source->base.parent->comp_data->sub.list, ec);
+ source->base.parent->comp_data->sub.list_changed = EINA_FALSE;
}
if (source->surface->stand_alone)
- e_subsurface_stand_alone_mode_set(source->subsurface);
-
- _viewport_source_set(viewport, source);
+ source->base.stand_alone = EINA_TRUE;
_source_viewport_destination_update(source);
_source_viewport_apply(source);
VS_INF("SOURCE %p| viewport destroyed", source);
source->viewport = NULL;
+ e_comp_wl_subsurface_data_parent_unset(&source->base);
wtz_video_viewport_source_send_viewport_destroyed(source->resource);
}
}
wl_resource_set_implementation(source->resource, &_source_impl, source, _source_cb_resource_destroy);
- if (!viewport)
- {
- wtz_video_viewport_source_send_viewport_destroyed(source->resource);
- }
- else if (!_source_viewport_link(source, viewport))
- {
- wl_resource_post_no_memory(resource);
- _source_destroy(source);
- return;
- }
-
+ _source_viewport_link(source, viewport);
_video_surface_name_update(surface);
VS_INF("SOURCE %p| Created with E_Video_Surface(%p), Viewport(%p)", source, surface, viewport);
else if (surface->role == E_VIDEO_SURFACE_ROLE_VIEWPORT_SOURCE &&
surface->source->subsurface)
{
- e_subsurface_stand_alone_mode_set(surface->source->subsurface);
+ surface->source->base.stand_alone = EINA_TRUE;
}
}
else if (surface->role == E_VIDEO_SURFACE_ROLE_VIEWPORT_SOURCE &&
surface->source->subsurface)
{
- e_subsurface_stand_alone_mode_unset(surface->source->subsurface);
+ surface->source->base.stand_alone = EINA_FALSE;
}
}
if (source)
{
source = viewport->source;
- ec = e_surface_ec_get(e_subsurface_surface_get(source->subsurface));
+ ec = e_surface_ec_get(source->surface->surface);
name = (char *)e_client_netwm_name_get(ec);
if (!name)
name = (char *)e_client_icccm_title_get(ec);
if (viewport->border)
return;
- if (viewport->source && viewport->source->subsurface)
- ec = e_surface_ec_get(e_subsurface_surface_get(viewport->source->subsurface));
+ if (viewport->source)
+ ec = e_surface_ec_get(viewport->source->surface->surface);
else
ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
if (!viewport->border)
return;
- if (viewport->source && viewport->source->subsurface)
- ec = e_surface_ec_get(e_subsurface_surface_get(viewport->source->subsurface));
+ if (viewport->source)
+ ec = e_surface_ec_get(viewport->source->surface->surface);
else
ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));