return EINA_FALSE;
}
- if (e_surface_viewporter_resource_get(surface))
- {
- ERR("E_Surface(%p) already has a viewport", surface);
- return EINA_FALSE;
- }
-
if (!(client = wl_resource_get_client(surface_resource)))
{
ERR("Could not get client from wl_surface@%d",
return EINA_FALSE;
}
+ if (!e_surface_viewporter_resource_set(surface, res))
+ {
+ ERR("E_Surface(%p) already has a viewporter", surface);
+ wl_resource_destroy(res);
+ free(viewport);
+ return EINA_FALSE;
+ }
+
viewport->resource = res;
viewport->ec = ec;
viewport->surface = surface;
viewport->surface_apply_viewport_listener.notify = _e_comp_wl_viewport_cb_apply_viewport;
wl_signal_add(&ec->comp_data->apply_viewport_signal, &viewport->surface_apply_viewport_listener);
- /* Use scaler variable because tizen_viewport is the alternative of wl_viewport */
- e_surface_viewporter_resource_set(viewport->surface, res);
-
wl_resource_set_implementation(res, &_e_comp_wl_viewport_interface,
viewport, _e_comp_wl_viewport_destroy);
E_Client *ec;
struct ds_surface *ds_surface;
+ struct ds_surface_viewport *surface_viewport;
E_Client_Hook *client_del_hook;
wl_signal_add(&surface->events.parent_destroy, listener);
}
-EINTERN struct wl_resource *
-e_surface_viewporter_resource_get(E_Surface *surface)
-{
- EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
- return surface->base.scaler.viewport;
-}
-
-EINTERN void
+EINTERN Eina_Bool
e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter)
{
- EINA_SAFETY_ON_NULL_RETURN(surface);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+ if (surface->base.scaler.viewport)
+ return EINA_FALSE;
+
+ if (surface->surface_viewport)
+ return EINA_FALSE;
+
+ surface->surface_viewport = ds_surface_take_viewport(surface->ds_surface);
+ if (!surface->surface_viewport)
+ return EINA_FALSE;
+
surface->base.scaler.viewport = viewporter;
+
+ return EINA_TRUE;
}
EINTERN void
surface->base.pending.buffer_viewport.surface.width = -1;
surface->base.pending.buffer_viewport.changed = 1;
+ if (surface->surface_viewport)
+ {
+ ds_surface_viewport_release(surface->surface_viewport);
+ surface->surface_viewport = NULL;
+ }
+
if (surface->ds_surface)
_ds_surface_viewport_unset(surface->ds_surface);
}
EINTERN void e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *listener);
EINTERN struct wl_listener *e_surface_destroy_listener_get(E_Surface *surface, wl_notify_func_t notify);
EINTERN struct wl_resource *e_surface_viewporter_resource_get(E_Surface *surface);
-EINTERN void e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter);
+EINTERN Eina_Bool e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter);
EINTERN void e_surface_viewporter_resource_unset(E_Surface *surface);
EINTERN enum wl_output_transform e_surface_buffer_transform_get(E_Surface *surface);
EINTERN Eina_Bool e_surface_buffer_transform_set(E_Surface *surface, enum wl_output_transform transform);