if (!ec->comp_data->buffer_ref.buffer)
{
- vp->width_from_buffer = 0;
- vp->height_from_buffer = 0;
+ ec->comp_data->width_from_buffer = 0;
+ ec->comp_data->height_from_buffer = 0;
return;
}
break;
}
- vp->width_from_buffer = width;
- vp->height_from_buffer = height;
+ ec->comp_data->width_from_buffer = width;
+ ec->comp_data->height_from_buffer = height;
}
static void
E_Comp_Wl_Buffer_Viewport *vp = &ec->comp_data->scaler.buffer_viewport;
int32_t width, height;
- width = vp->width_from_buffer;
- height = vp->height_from_buffer;
+ width = ec->comp_data->width_from_buffer;
+ height = ec->comp_data->height_from_buffer;
if (width != 0 && vp->surface.width != -1)
{
- vp->width_from_viewport = vp->surface.width;
- vp->height_from_viewport = vp->surface.height;
+ ec->comp_data->width_from_viewport = vp->surface.width;
+ ec->comp_data->height_from_viewport = vp->surface.height;
return;
}
{
int32_t w = wl_fixed_to_int(wl_fixed_from_int(1) - 1 + vp->buffer.src_width);
int32_t h = wl_fixed_to_int(wl_fixed_from_int(1) - 1 + vp->buffer.src_height);
- vp->width_from_viewport = w ?: 1;
- vp->height_from_viewport = h ?: 1;
+ ec->comp_data->width_from_viewport = w ?: 1;
+ ec->comp_data->height_from_viewport = h ?: 1;
return;
}
- vp->width_from_viewport = width;
- vp->height_from_viewport = height;
+ ec->comp_data->width_from_viewport = width;
+ ec->comp_data->height_from_viewport = height;
}
static void
evas_map_util_points_populate_from_geometry(map,
ec->x, ec->y,
- vp->width_from_viewport, vp->height_from_viewport, 0);
+ ec->comp_data->width_from_viewport, ec->comp_data->height_from_viewport, 0);
if (vp->buffer.src_width == wl_fixed_from_int(-1))
{
x1 = 0.0;
y1 = 0.0;
- x2 = vp->width_from_buffer;
- y2 = vp->height_from_buffer;
+ x2 = ec->comp_data->width_from_buffer;
+ y2 = ec->comp_data->height_from_buffer;
}
else
{
y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
}
- _e_comp_wl_map_transform(vp->width_from_buffer, vp->height_from_buffer,
+ _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x1, y1, &x, &y);
evas_map_point_image_uv_set(map, 0, x, y);
- _e_comp_wl_map_transform(vp->width_from_buffer, vp->height_from_buffer,
+ _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x2, y1, &x, &y);
evas_map_point_image_uv_set(map, 1, x, y);
- _e_comp_wl_map_transform(vp->width_from_buffer, vp->height_from_buffer,
+ _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x2, y2, &x, &y);
evas_map_point_image_uv_set(map, 2, x, y);
- _e_comp_wl_map_transform(vp->width_from_buffer, vp->height_from_buffer,
+ _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x1, y2, &x, &y);
evas_map_point_image_uv_set(map, 3, x, y);
/* eina_hash_add(clients_win_hash, &win, ec); */
e_hints_client_list_set();
- E_Comp_Wl_Client_Data *cdata = e_pixmap_cdata_get(ec->pixmap);
- struct wl_resource *wl_resource = cdata->wl_surface;
- ec->comp_data->scaler = cdata->scaler;
e_pixmap_cdata_set(ec->pixmap, ec->comp_data);
- _e_comp_wl_surface_cb_commit(NULL, wl_resource);
+ if (ec->comp_data->wl_surface)
+ _e_comp_wl_surface_cb_commit(NULL, ec->comp_data->wl_surface);
}
static void
} surface;
int changed;
-
- /* before applying viewport */
- int width_from_buffer;
- int height_from_buffer;
-
- /* after applying viewport */
- int width_from_viewport;
- int height_from_viewport;
};
struct _E_Comp_Wl_Surface_State
E_Comp_Wl_Buffer_Viewport buffer_viewport;
} scaler;
+ /* before applying viewport */
+ int width_from_buffer;
+ int height_from_buffer;
+
+ /* after applying viewport */
+ int width_from_viewport;
+ int height_from_viewport;
+
Eina_Bool keep_buffer : 1;
Eina_Bool mapped : 1;
Eina_Bool change_icon : 1;
struct wl_listener buffer_destroy_listener;
void *data;
Eina_Rectangle opaque;
-#endif
- E_Comp_Client_Data *cdata;
+ E_Comp_Wl_Client_Data *cdata;
+ Eina_Bool own_cdata : 1;
+#endif
Eina_Bool usable : 1;
Eina_Bool dirty : 1;
e_comp_wl_buffer_reference(&cp->buffer_ref, NULL);
+ if (cp->own_cdata)
+ {
+ free (cp->cdata);
+ cp->own_cdata = EINA_FALSE;
+ }
+
(void)cache;
#endif
break;
cp->refcount = 1;
cp->dirty = 1;
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
- cp->cdata = calloc(1, sizeof(E_Comp_Wl_Client_Data));
-#else
- cp->cdata = calloc(1, sizeof(E_Comp_X_Client_Data));
+ cp->own_cdata = EINA_TRUE;
+ cp->cdata = E_NEW(E_Comp_Wl_Client_Data, 1);
+ cp->cdata->pending.buffer_viewport.buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL;
+ cp->cdata->pending.buffer_viewport.buffer.scale = 1;
+ cp->cdata->pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
+ cp->cdata->pending.buffer_viewport.surface.width = -1;
+ cp->cdata->pending.buffer_viewport.changed = 0;
#endif
return cp;
}
e_pixmap_cdata_get(E_Pixmap *cp)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(cp, NULL);
+
+#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
return (E_Comp_Client_Data*)cp->cdata;
+#else
+ return NULL;
+#endif
}
EAPI void
e_pixmap_cdata_set(E_Pixmap *cp, E_Comp_Client_Data *cdata)
{
+#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
+ E_Comp_Wl_Client_Data *cd = (E_Comp_Wl_Client_Data*)cdata;
+
EINA_SAFETY_ON_NULL_RETURN(cp);
+ EINA_SAFETY_ON_NULL_RETURN(cp->cdata);
EINA_SAFETY_ON_NULL_RETURN(cdata);
- free (cp->cdata);
- cp->cdata = cdata;
+
+ if (cp->own_cdata)
+ {
+ cd->wl_surface = cp->cdata->wl_surface;
+ cd->scaler.viewport = cp->cdata->scaler.viewport;
+ cd->pending.buffer_viewport = cp->cdata->pending.buffer_viewport;
+
+ free (cp->cdata);
+ cp->own_cdata = EINA_FALSE;
+ }
+
+ cp->cdata = cd;
+#endif
}
static void
_e_viewport_destroy(struct wl_resource *resource)
{
- E_Comp_Client_Data *cdata = wl_resource_get_user_data(resource);
+ E_Pixmap *ep = wl_resource_get_user_data(resource);
+ E_Comp_Client_Data *cdata = e_pixmap_cdata_get(ep);
+ EINA_SAFETY_ON_NULL_RETURN(cdata);
EINA_SAFETY_ON_NULL_RETURN(cdata->scaler.viewport);
cdata->scaler.viewport = NULL;
int32_t dst_width,
int32_t dst_height)
{
- E_Comp_Client_Data *cdata = wl_resource_get_user_data(resource);
+ E_Pixmap *ep = wl_resource_get_user_data(resource);
+ E_Comp_Client_Data *cdata = e_pixmap_cdata_get(ep);
+ EINA_SAFETY_ON_NULL_RETURN(cdata);
EINA_SAFETY_ON_NULL_RETURN(cdata->scaler.viewport);
if (wl_fixed_to_double(src_width) < 0 || wl_fixed_to_double(src_height) < 0)
wl_fixed_t src_width,
wl_fixed_t src_height)
{
- E_Comp_Client_Data *cdata = wl_resource_get_user_data(resource);
+ E_Pixmap *ep = wl_resource_get_user_data(resource);
+ E_Comp_Client_Data *cdata = e_pixmap_cdata_get(ep);
+ EINA_SAFETY_ON_NULL_RETURN(cdata);
EINA_SAFETY_ON_NULL_RETURN(cdata->scaler.viewport);
if (src_width == wl_fixed_from_int(-1) && src_height == wl_fixed_from_int(-1))
int32_t dst_width,
int32_t dst_height)
{
- E_Comp_Client_Data *cdata = wl_resource_get_user_data(resource);
+ E_Pixmap *ep = wl_resource_get_user_data(resource);
+ E_Comp_Client_Data *cdata = e_pixmap_cdata_get(ep);
+ EINA_SAFETY_ON_NULL_RETURN(cdata);
EINA_SAFETY_ON_NULL_RETURN(cdata->scaler.viewport);
if (dst_width == -1 && dst_height == -1)
}
cdata->scaler.viewport = res;
- wl_resource_set_implementation(res, &_e_viewport_interface, cdata, _e_viewport_destroy);
+ wl_resource_set_implementation(res, &_e_viewport_interface, ep, _e_viewport_destroy);
}
static const struct wl_scaler_interface _e_scaler_interface =
static void
_e_scaler_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
{
- E_Comp_Data *cdata;
struct wl_resource *res;
- if (!(cdata = data))
- {
- wl_client_post_no_memory(client);
- return;
- }
-
if (!(res = wl_resource_create(client, &wl_scaler_interface, MIN(version, 2), id)))
{
ERR("Could not create scaler resource: %m");
return;
}
- wl_resource_set_implementation(res, &_e_scaler_interface, cdata, NULL);
+ wl_resource_set_implementation(res, &_e_scaler_interface, NULL, NULL);
}
Eina_Bool