diff --git a/src/lib/evas/canvas/evas_3d_camera.c b/src/lib/evas/canvas/evas_3d_camera.c index c6da2d3aa7..b72c173e46 100644 --- a/src/lib/evas/canvas/evas_3d_camera.c +++ b/src/lib/evas/canvas/evas_3d_camera.c @@ -15,6 +15,7 @@ _camera_node_change_notify(const Eina_Hash *hash EINA_UNUSED, const void *key, EOLIAN static void _evas_3d_camera_evas_3d_object_change_notify(Eo *obj,Evas_3D_Camera_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->nodes) eina_hash_foreach(pd->nodes, _camera_node_change_notify, obj); } @@ -74,6 +75,7 @@ EOLIAN static void _evas_3d_camera_eo_base_destructor(Eo *obj, Evas_3D_Camera_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); //evas_3d_object_unreference(&pd->base); if (pd->nodes) eina_hash_free(pd->nodes); eo_do_super(obj, MY_CLASS, eo_destructor()); @@ -93,6 +95,7 @@ EOLIAN static void _evas_3d_camera_projection_matrix_set(Eo *obj, Evas_3D_Camera_Data *pd, const Evas_Real *matrix) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_array_set(&pd->projection, matrix); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_CAMERA_PROJECTION, NULL)); } @@ -116,6 +119,7 @@ _evas_3d_camera_projection_perspective_set(Eo *obj, Evas_3D_Camera_Data *pd, ymax = dnear * (Evas_Real)tan((double)fovy * M_PI / 360.0); xmax = ymax * aspect; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_frustum_set(&pd->projection, -xmax, xmax, -ymax, ymax, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_CAMERA_PROJECTION, NULL)); } @@ -126,6 +130,7 @@ _evas_3d_camera_projection_frustum_set(Eo *obj, Evas_3D_Camera_Data *pd, Evas_Real bottom, Evas_Real top, Evas_Real dnear, Evas_Real dfar) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_frustum_set(&pd->projection, left, right, bottom, top, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_CAMERA_PROJECTION, NULL)); } @@ -136,6 +141,7 @@ _evas_3d_camera_projection_ortho_set(Eo *obj, Evas_3D_Camera_Data *pd, Evas_Real bottom, Evas_Real top, Evas_Real dnear, Evas_Real dfar) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_ortho_set(&pd->projection, left, right, bottom, top, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_CAMERA_PROJECTION, NULL)); } diff --git a/src/lib/evas/canvas/evas_3d_light.c b/src/lib/evas/canvas/evas_3d_light.c index f9ca75b17b..48abf0fd20 100644 --- a/src/lib/evas/canvas/evas_3d_light.c +++ b/src/lib/evas/canvas/evas_3d_light.c @@ -15,6 +15,7 @@ _light_node_change_notify(const Eina_Hash *hash EINA_UNUSED, const void *key, EOLIAN static void _evas_3d_light_evas_3d_object_change_notify(Eo *obj, Evas_3D_Light_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->nodes) eina_hash_foreach(pd->nodes, _light_node_change_notify, obj); } @@ -97,6 +98,7 @@ _evas_3d_light_eo_base_constructor(Eo *obj, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_eo_base_destructor(Eo *obj, Evas_3D_Light_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->nodes) eina_hash_free(pd->nodes); eo_do_super(obj, MY_CLASS, eo_destructor()); @@ -106,6 +108,7 @@ _evas_3d_light_eo_base_destructor(Eo *obj, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_directional_set(Eo *obj, Evas_3D_Light_Data *pd, Eina_Bool directional) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->directional != directional) { pd->directional = directional; @@ -122,6 +125,7 @@ _evas_3d_light_directional_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_ambient_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->ambient.r = r; pd->ambient.g = g; pd->ambient.b = b; @@ -142,6 +146,7 @@ _evas_3d_light_ambient_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd, Evas_Rea EOLIAN static void _evas_3d_light_diffuse_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->diffuse.r = r; pd->diffuse.g = g; pd->diffuse.b = b; @@ -162,6 +167,7 @@ _evas_3d_light_diffuse_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd, Evas_Rea EOLIAN static void _evas_3d_light_specular_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->specular.r = r; pd->specular.g = g; pd->specular.b = b; @@ -182,6 +188,7 @@ _evas_3d_light_specular_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd, Evas_Re EOLIAN static void _evas_3d_light_spot_exponent_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real exponent) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->spot_exp = exponent; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_SPOT_EXP, NULL)); } @@ -195,6 +202,7 @@ _evas_3d_light_spot_exponent_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_spot_cutoff_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real cutoff) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->spot_cutoff = cutoff; pd->spot_cutoff_cos = cos(cutoff * M_PI / 180.0); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_SPOT_CUTOFF, NULL)); @@ -209,6 +217,7 @@ _evas_3d_light_spot_cutoff_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd) EOLIAN static void _evas_3d_light_attenuation_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real constant, Evas_Real linear, Evas_Real quadratic) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->atten_const = constant; pd->atten_linear = linear; pd->atten_quad = quadratic; @@ -226,6 +235,7 @@ _evas_3d_light_attenuation_get(Eo *obj EINA_UNUSED, Evas_3D_Light_Data *pd, Evas EOLIAN static void _evas_3d_light_attenuation_enable_set(Eo *obj, Evas_3D_Light_Data *pd, Eina_Bool enable) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->enable_attenuation != enable) { pd->enable_attenuation = enable; @@ -243,6 +253,7 @@ EOLIAN static void _evas_3d_light_projection_matrix_set(Eo *obj, Evas_3D_Light_Data *pd, const Evas_Real *matrix) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_array_set(&pd->projection, matrix); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_PROJECTION, NULL)); } @@ -266,6 +277,7 @@ _evas_3d_light_projection_perspective_set(Eo *obj, Evas_3D_Light_Data *pd, ymax = dnear * (Evas_Real)tan((double)fovy * M_PI / 360.0); xmax = ymax * aspect; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_frustum_set(&pd->projection, -xmax, xmax, -ymax, ymax, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_PROJECTION, NULL)); } @@ -276,6 +288,7 @@ _evas_3d_light_projection_frustum_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real bottom, Evas_Real top, Evas_Real dnear, Evas_Real dfar) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_frustum_set(&pd->projection, left, right, bottom, top, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_PROJECTION, NULL)); } @@ -286,6 +299,7 @@ _evas_3d_light_projection_ortho_set(Eo *obj, Evas_3D_Light_Data *pd, Evas_Real bottom, Evas_Real top, Evas_Real dnear, Evas_Real dfar) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_mat4_ortho_set(&pd->projection, left, right, bottom, top, dnear, dfar); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_LIGHT_PROJECTION, NULL)); } diff --git a/src/lib/evas/canvas/evas_3d_material.c b/src/lib/evas/canvas/evas_3d_material.c index 8cd325d6a1..ca0b4037cf 100644 --- a/src/lib/evas/canvas/evas_3d_material.c +++ b/src/lib/evas/canvas/evas_3d_material.c @@ -15,14 +15,16 @@ _material_mesh_change_notify(const Eina_Hash *hash EINA_UNUSED, const void *key, EOLIAN static void _evas_3d_material_evas_3d_object_change_notify(Eo *obj, Evas_3D_Material_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->meshes) eina_hash_foreach(pd->meshes, _material_mesh_change_notify, obj); } EOLIAN static void -_evas_3d_material_evas_3d_object_update_notify(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd) +_evas_3d_material_evas_3d_object_update_notify(Eo *obj, Evas_3D_Material_Data *pd) { int i; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); for (i = 0; i < EVAS_3D_MATERIAL_ATTRIB_COUNT; i++) { if (pd->attribs[i].enable) @@ -106,6 +108,7 @@ _evas_3d_material_eo_base_destructor(Eo *obj, Evas_3D_Material_Data *pd) { int i; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->meshes) eina_hash_free(pd->meshes); @@ -121,8 +124,9 @@ _evas_3d_material_eo_base_destructor(Eo *obj, Evas_3D_Material_Data *pd) } EOLIAN static void -_evas_3d_material_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd, Evas_3D_Material_Attrib attrib, Eina_Bool enable) +_evas_3d_material_enable_set(Eo *obj, Evas_3D_Material_Data *pd, Evas_3D_Material_Attrib attrib, Eina_Bool enable) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->attribs[attrib].enable = enable; } @@ -135,6 +139,7 @@ _evas_3d_material_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd, Eva EOLIAN static void _evas_3d_material_color_set(Eo *obj, Evas_3D_Material_Data *pd, Evas_3D_Material_Attrib attrib, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_color_set(&pd->attribs[attrib].color, r, g, b, a); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MATERIAL_COLOR, NULL)); } @@ -149,8 +154,9 @@ _evas_3d_material_color_get(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd, Evas } EOLIAN static void -_evas_3d_material_shininess_set(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd, Evas_Real shininess) +_evas_3d_material_shininess_set(Eo *obj, Evas_3D_Material_Data *pd, Evas_Real shininess) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->shininess = shininess; } @@ -163,6 +169,7 @@ _evas_3d_material_shininess_get(Eo *obj EINA_UNUSED, Evas_3D_Material_Data *pd) EOLIAN static void _evas_3d_material_texture_set(Eo *obj, Evas_3D_Material_Data *pd, Evas_3D_Material_Attrib attrib, Evas_3D_Texture *texture) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->attribs[attrib].texture != texture) { if (pd->attribs[attrib].texture) diff --git a/src/lib/evas/canvas/evas_3d_mesh.c b/src/lib/evas/canvas/evas_3d_mesh.c index 4430438054..55b1d4795f 100644 --- a/src/lib/evas/canvas/evas_3d_mesh.c +++ b/src/lib/evas/canvas/evas_3d_mesh.c @@ -182,11 +182,12 @@ _evas_3d_mesh_evas_3d_object_change_notify(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_ } EOLIAN static void -_evas_3d_mesh_evas_3d_object_update_notify(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) +_evas_3d_mesh_evas_3d_object_update_notify(Eo *obj, Evas_3D_Mesh_Data *pd) { Eina_List *l; Evas_3D_Mesh_Frame *f; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); EINA_LIST_FOREACH(pd->frames, l, f) { if (f->material) @@ -259,14 +260,16 @@ _evas_3d_mesh_eo_base_constructor(Eo *obj, Evas_3D_Mesh_Data *pd) EOLIAN static void _evas_3d_mesh_eo_base_destructor(Eo *obj, Evas_3D_Mesh_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); //evas_3d_object_unreference(&pd->base); _mesh_fini(pd); eo_do_super(obj, MY_CLASS, eo_destructor()); } EOLIAN static void -_evas_3d_mesh_shade_mode_set(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd, Evas_3D_Shade_Mode mode) +_evas_3d_mesh_shade_mode_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_3D_Shade_Mode mode) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->shade_mode != mode) { pd->shade_mode = mode; @@ -283,6 +286,7 @@ _evas_3d_mesh_shade_mode_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) EOLIAN static void _evas_3d_mesh_vertex_count_set(Eo *obj, Evas_3D_Mesh_Data *pd, unsigned int count) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->vertex_count = count; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_VERTEX_COUNT, NULL)); } @@ -304,6 +308,7 @@ _evas_3d_mesh_frame_add(Eo *obj, Evas_3D_Mesh_Data *pd, int frame) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); f = evas_3d_mesh_frame_new(obj); if (f == NULL) @@ -325,6 +330,7 @@ _evas_3d_mesh_frame_del(Eo *obj, Evas_3D_Mesh_Data *pd, int frame) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->frames = eina_list_remove(pd->frames, f); evas_3d_mesh_frame_free(f); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_FRAME, NULL)); @@ -344,6 +350,7 @@ _evas_3d_mesh_frame_material_set(Eo *obj, Evas_3D_Mesh_Data *pd, int frame, Evas if (f->material == material) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (f->material) { evas_3d_material_mesh_del(f->material, obj); @@ -388,6 +395,7 @@ _evas_3d_mesh_frame_vertex_data_set(Eo *obj, Evas_3D_Mesh_Data *pd, int frame, E return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (attrib == EVAS_3D_VERTEX_POSITION) { int i = 0, j = 0, size = stride/sizeof(float); @@ -471,6 +479,7 @@ _evas_3d_mesh_frame_vertex_data_copy_set(Eo *obj, Evas_3D_Mesh_Data *pd, int fra return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (attrib == EVAS_3D_VERTEX_POSITION) { element_count = 3; @@ -599,6 +608,7 @@ _evas_3d_mesh_frame_vertex_data_map(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd, return NULL; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); f->vertices[attrib].mapped = EINA_TRUE; return f->vertices[attrib].data; } @@ -620,6 +630,7 @@ _evas_3d_mesh_frame_vertex_data_unmap(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); f->vertices[attrib].mapped = EINA_FALSE; } @@ -640,6 +651,7 @@ _evas_3d_mesh_frame_vertex_stride_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd EOLIAN static void _evas_3d_mesh_index_data_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_3D_Index_Format format, int count, const void *indices) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->owns_indices && pd->indices) free(pd->indices); @@ -671,6 +683,7 @@ _evas_3d_mesh_index_data_copy_set(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd, Ev return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (!pd->owns_indices || pd->index_size < size) { if (pd->owns_indices && pd->indices) @@ -716,6 +729,7 @@ _evas_3d_mesh_index_data_map(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) return NULL; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->index_mapped = EINA_TRUE; return pd->indices; } @@ -729,12 +743,14 @@ _evas_3d_mesh_index_data_unmap(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->index_mapped = EINA_FALSE; } EOLIAN static void _evas_3d_mesh_vertex_assembly_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_3D_Vertex_Assembly assembly) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->assembly = assembly; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_VERTEX_ASSEMBLY, NULL)); } @@ -742,12 +758,14 @@ _evas_3d_mesh_vertex_assembly_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_3D_Vertex EOLIAN static Evas_3D_Vertex_Assembly _evas_3d_mesh_vertex_assembly_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); return pd->assembly; } EOLIAN static void _evas_3d_mesh_fog_color_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_color_set(&pd->fog_color, r, g, b, a); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_FOG, NULL)); } @@ -765,6 +783,7 @@ _evas_3d_mesh_fog_color_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd, EOLIAN static void _evas_3d_mesh_fog_enable_set(Eo *obj, Evas_3D_Mesh_Data *pd, Eina_Bool enabled) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->fog_enabled = enabled; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_FOG, NULL)); } @@ -778,6 +797,7 @@ _evas_3d_mesh_fog_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) EOLIAN static void _evas_3d_mesh_blending_enable_set(Eo *obj, Evas_3D_Mesh_Data *pd, Eina_Bool blending) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->blending = blending; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_BLENDING, NULL)); } @@ -791,6 +811,7 @@ _evas_3d_mesh_blending_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) EOLIAN static void _evas_3d_mesh_blending_func_set(Eo *obj, Evas_3D_Mesh_Data *pd, Evas_3D_Blend_Func sfactor, Evas_3D_Blend_Func dfactor) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->blend_sfactor = sfactor; pd->blend_dfactor = dfactor; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_BLENDING, NULL)); @@ -808,6 +829,7 @@ EOLIAN static void _evas_3d_mesh_mmap_set(Eo *obj, Evas_3D_Mesh_Data *pd, Eina_File *file, const char *key EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); _mesh_fini(pd); _mesh_init(pd); @@ -821,6 +843,7 @@ _evas_3d_mesh_efl_file_file_set(Eo *obj, Evas_3D_Mesh_Data *pd, const char *file, const char *key EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); _mesh_fini(pd); _mesh_init(pd); @@ -838,6 +861,7 @@ _evas_3d_mesh_efl_file_save(Eo *obj, Evas_3D_Mesh_Data *pd, { if ((file == NULL) || (obj == NULL) || (pd == NULL)) return EINA_FALSE; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); Evas_3D_Mesh_Frame *f = evas_3d_mesh_frame_find(pd, 0); if (f == NULL) @@ -974,6 +998,7 @@ _evas_3d_mesh_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Mesh_Data *pd) EOLIAN static Eina_Bool _evas_3d_mesh_color_pick_enable_set(Eo *obj, Evas_3D_Mesh_Data *pd, Eina_Bool _enabled) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->color_pick_enabled != _enabled) pd->color_pick_enabled = _enabled; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_MESH_COLOR_PICK, NULL)); diff --git a/src/lib/evas/canvas/evas_3d_node.c b/src/lib/evas/canvas/evas_3d_node.c index 62e2c1cb01..ead5694e81 100644 --- a/src/lib/evas/canvas/evas_3d_node.c +++ b/src/lib/evas/canvas/evas_3d_node.c @@ -85,6 +85,7 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_ Eina_Bool scale; Eina_Bool parent_change; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Notify all scenes using this node that it has changed. */ if (pd->scenes_root) eina_hash_foreach(pd->scenes_root, _node_scene_root_change_notify, obj); @@ -457,6 +458,7 @@ _node_update_done(Evas_3D_Node *obj, void *data EINA_UNUSED) EOLIAN static void _evas_3d_node_evas_3d_object_update_notify(Eo *obj, Evas_3D_Node_Data *pd EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Update transform. */ evas_3d_node_tree_traverse(obj, EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER, EINA_FALSE, _node_transform_update, NULL); @@ -933,6 +935,7 @@ _evas_3d_node_member_add(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member) ERR("Failed to add a member node (adding to itself)."); return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); Evas_3D_Node_Data *pdmember = eo_data_scope_get(member, MY_CLASS); if (pdmember->parent == obj) return; @@ -973,6 +976,7 @@ _evas_3d_node_member_del(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Delete the member node. */ pd->members = eina_list_remove(pd->members, member); pdmember->parent = NULL; @@ -996,12 +1000,14 @@ _evas_3d_node_parent_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd) EOLIAN static const Eina_List * _evas_3d_node_member_list_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); return pd->members; } EOLIAN static void _evas_3d_node_position_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Real y, Evas_Real z) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->position.x = x; pd->position.y = y; pd->position.z = z; @@ -1012,6 +1018,7 @@ _evas_3d_node_position_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Rea EOLIAN static void _evas_3d_node_orientation_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Real y, Evas_Real z, Evas_Real w) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->orientation.x = x; pd->orientation.y = y; pd->orientation.z = z; @@ -1028,6 +1035,7 @@ _evas_3d_node_orientation_angle_axis_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real s = sin(half_angle); Evas_Vec3 axis; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_vec3_set(&axis, x, y, z); evas_vec3_normalize(&axis, &axis); @@ -1042,6 +1050,7 @@ _evas_3d_node_orientation_angle_axis_set(Eo *obj, Evas_3D_Node_Data *pd, EOLIAN static void _evas_3d_node_scale_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Real y, Evas_Real z) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->scale.x = x; pd->scale.y = y; pd->scale.z = z; @@ -1134,6 +1143,7 @@ _evas_3d_node_scale_get(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Space space, EOLIAN static void _evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->position_inherit = inherit; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_POSITION, NULL)); } @@ -1141,6 +1151,7 @@ _evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inh EOLIAN static void _evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->orientation_inherit = inherit; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL)); } @@ -1148,6 +1159,7 @@ _evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool EOLIAN static void _evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->scale_inherit = inherit; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_SCALE, NULL)); } @@ -1179,6 +1191,7 @@ _evas_3d_node_look_at_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Vec3 up; Evas_Vec3 x, y, z; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Target position in parent space. */ if (target_space == EVAS_3D_SPACE_LOCAL) { @@ -1292,6 +1305,7 @@ _evas_3d_node_camera_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Camera *camera) if (pd->data.camera.camera == camera) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->data.camera.camera) { /* Detach previous camera object. */ @@ -1327,6 +1341,7 @@ _evas_3d_node_light_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Light *light) if (pd->data.light.light == light) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->data.light.light) { /* Detach previous light object. */ @@ -1367,6 +1382,7 @@ _evas_3d_node_mesh_add(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Mesh *mesh) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if ((nm = _node_mesh_new(obj, mesh)) == NULL) { ERR("Failed to create node mesh."); @@ -1401,6 +1417,7 @@ _evas_3d_node_mesh_del(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Mesh *mesh) return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (!eina_hash_del(pd->data.mesh.node_meshes, &mesh, NULL)) { ERR("The given mesh doesn't belong to this node."); @@ -1418,6 +1435,7 @@ _evas_3d_node_mesh_del(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Mesh *mesh) EOLIAN static const Eina_List * _evas_3d_node_mesh_list_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); return pd->data.mesh.meshes; } @@ -1432,6 +1450,7 @@ _evas_3d_node_mesh_frame_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Mesh *mesh, return; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if ((nm = eina_hash_find(pd->data.mesh.node_meshes, &mesh)) == NULL) { ERR("The given mesh doesn't belongs to this node."); @@ -1453,6 +1472,7 @@ _evas_3d_node_mesh_frame_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd, Evas_3D return 0; } + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if ((nm = eina_hash_find(pd->data.mesh.node_meshes, &mesh)) == NULL) { ERR("The given mesh doesn't belongs to this node."); diff --git a/src/lib/evas/canvas/evas_3d_object.c b/src/lib/evas/canvas/evas_3d_object.c index 8116d098c4..ba1ecdc352 100644 --- a/src/lib/evas/canvas/evas_3d_object.c +++ b/src/lib/evas/canvas/evas_3d_object.c @@ -22,8 +22,9 @@ EOLIAN static Evas * } EOLIAN static void -_evas_3d_object_type_set(Eo *obj EINA_UNUSED, Evas_3D_Object_Data *pd, Evas_3D_Object_Type type) +_evas_3d_object_type_set(Eo *obj, Evas_3D_Object_Data *pd, Evas_3D_Object_Type type) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->type = type; } @@ -46,6 +47,7 @@ _evas_3d_object_change(Eo *obj, Evas_3D_Object_Data *pd, Evas_3D_State state, Ev if (pd->dirty[state]) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->dirty[state] = EINA_TRUE; pd->dirty[EVAS_3D_STATE_ANY] = EINA_TRUE; @@ -58,6 +60,7 @@ _evas_3d_object_update(Eo *obj, Evas_3D_Object_Data *pd) if (!pd->dirty[EVAS_3D_STATE_ANY]) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); eo_do(obj, evas_3d_object_update_notify()); memset(&pd->dirty[0], 0x00, sizeof(Eina_Bool) * EVAS_3D_STATE_MAX); diff --git a/src/lib/evas/canvas/evas_3d_scene.c b/src/lib/evas/canvas/evas_3d_scene.c index a26b6c8967..edab2922eb 100644 --- a/src/lib/evas/canvas/evas_3d_scene.c +++ b/src/lib/evas/canvas/evas_3d_scene.c @@ -24,11 +24,12 @@ evas_3d_scene_data_fini(Evas_3D_Scene_Public_Data *data) } EOLIAN static void -_evas_3d_scene_evas_3d_object_change_notify(Eo *eo_obj EINA_UNUSED, Evas_3D_Scene_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) +_evas_3d_scene_evas_3d_object_change_notify(Eo *eo_obj, Evas_3D_Scene_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) { Eina_List *l; Evas_Object *eo; + evas_object_async_block(eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS)); EINA_LIST_FOREACH(pd->images, l, eo) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo, EVAS_OBJECT_CLASS); @@ -37,8 +38,9 @@ _evas_3d_scene_evas_3d_object_change_notify(Eo *eo_obj EINA_UNUSED, Evas_3D_Scen } EOLIAN static void -_evas_3d_scene_evas_3d_object_update_notify(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd) +_evas_3d_scene_evas_3d_object_update_notify(Eo *obj, Evas_3D_Scene_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->root_node) { eo_do(pd->root_node, evas_3d_object_update()); @@ -80,6 +82,7 @@ _evas_3d_scene_root_node_set(Eo *obj, Evas_3D_Scene_Data *pd, Evas_3D_Node *node if (pd->root_node == node) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->root_node) { evas_3d_node_scene_root_del(pd->root_node, obj); @@ -109,6 +112,7 @@ _evas_3d_scene_camera_node_set(Eo *obj, Evas_3D_Scene_Data *pd, Evas_3D_Node *no if (pd->camera_node == node) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->camera_node) { evas_3d_node_scene_camera_del(pd->camera_node, obj); @@ -135,6 +139,7 @@ _evas_3d_scene_camera_node_get(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd) EOLIAN static void _evas_3d_scene_size_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, int w, int h) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->w = w; pd->h = h; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_SIZE, NULL)); @@ -151,6 +156,7 @@ EOLIAN static void _evas_3d_scene_background_color_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, Evas_Real r, Evas_Real g, Evas_Real b, Evas_Real a) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); evas_color_set(&pd->bg_color, r, g, b, a); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_BACKGROUND_COLOR, NULL)); } @@ -630,12 +636,13 @@ _evas_3d_scene_pick(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real y, Evas_3D_Camera_Data *pd_camera; Evas_3D_Object_Data *pd_parent; Evas_Public_Data *e; - int tex, px, py;; + int tex = 0, px, py;; double redcomponent; Eina_Stringshare *tmp; Eina_Array *arr = NULL; Eina_Bool update_scene = EINA_FALSE; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd_parent = eo_data_scope_get(obj, EVAS_3D_OBJECT_CLASS); e = eo_data_scope_get(pd_parent->evas, EVAS_CANVAS_CLASS); @@ -752,6 +759,7 @@ _evas_3d_scene_exist(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x, Evas_Real y, data.s = 0.0; data.t = 0.0; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Update the scene graph. */ eo_do(obj, evas_3d_object_update()); pd_camera_node = eo_data_scope_get(pd->camera_node, EVAS_3D_NODE_CLASS); @@ -778,6 +786,7 @@ _evas_3d_scene_pick_member_list_get(Eo *obj, Evas_3D_Scene_Data *pd, Evas_Real x void *node; Eina_Bool pick = EINA_FALSE; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); /* Check pick for given scene. */ pick = eo_do(obj, evas_3d_scene_pick(x, y, NULL, NULL, NULL, NULL)); @@ -805,6 +814,7 @@ _evas_3d_scene_shadows_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd) EOLIAN static void _evas_3d_scene_shadows_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, Eina_Bool _shadows_enabled) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); pd->shadows_enabled = _shadows_enabled; eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_SCENE_SHADOWS_ENABLED, NULL)); } @@ -818,6 +828,7 @@ _evas_3d_scene_color_pick_enable_get(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd EOLIAN static Eina_Bool _evas_3d_scene_color_pick_enable_set(Eo *obj EINA_UNUSED, Evas_3D_Scene_Data *pd, Eina_Bool _enabled) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->color_pick_enabled != _enabled) pd->color_pick_enabled = _enabled; diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index 8945fadea8..a324eb67f5 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -196,6 +196,7 @@ EOLIAN static void _evas_3d_texture_evas_3d_object_change_notify(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_State state EINA_UNUSED, Evas_3D_Object *ref EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->materials) eina_hash_foreach(pd->materials, _texture_material_change_notify, obj); } @@ -203,6 +204,7 @@ _evas_3d_texture_evas_3d_object_change_notify(Eo *obj, Evas_3D_Texture_Data *pd, EOLIAN static void _evas_3d_texture_evas_3d_object_update_notify(Eo *obj, Evas_3D_Texture_Data *pd) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (pd->source) { Eo *evas = NULL; @@ -311,19 +313,21 @@ _evas_3d_texture_eo_base_constructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUS EOLIAN static void _evas_3d_texture_eo_base_destructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUSED) { + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); //evas_3d_object_unreference(&pd->base); _texture_fini(obj); eo_do_super(obj, MY_CLASS, eo_destructor()); } EOLIAN static void -_evas_3d_texture_data_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_3D_Color_Format color_format, +_evas_3d_texture_data_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Color_Format color_format, Evas_3D_Pixel_Format pixel_format, int w, int h, const void *data) { Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (!pd->engine_data && e->engine.func->texture_new) pd->engine_data = e->engine.func->texture_new(e->engine.data.output); @@ -341,6 +345,7 @@ _evas_3d_texture_file_set(Eo *obj, Evas_3D_Texture_Data *pd, const char *file, c eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (!pd->engine_data && e->engine.func->texture_new) pd->engine_data = e->engine.func->texture_new(e->engine.data.output); @@ -361,6 +366,7 @@ _evas_3d_texture_source_set(Eo *obj , Evas_3D_Texture_Data *pd, Evas_Object *sou if (source == pd->source) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); _texture_fini(obj); if (source == NULL) @@ -391,7 +397,7 @@ _evas_3d_texture_source_set(Eo *obj , Evas_3D_Texture_Data *pd, Evas_Object *sou } EOLIAN static void -_evas_3d_texture_source_visible_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Eina_Bool visible) +_evas_3d_texture_source_visible_set(Eo *obj, Evas_3D_Texture_Data *pd, Eina_Bool visible) { Evas_Object_Protected_Data *src_obj; @@ -403,6 +409,7 @@ _evas_3d_texture_source_visible_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *p if (src_obj->proxy->src_invisible == !visible) return; + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src_obj->proxy, Evas_Object_Proxy_Data, proxy_write) proxy_write->src_invisible = !visible; EINA_COW_WRITE_END(evas_object_proxy_cow, src_obj->proxy, proxy_write); @@ -448,6 +455,7 @@ _evas_3d_texture_size_get(Eo *obj, Evas_3D_Texture_Data *pd, int *w, int *h) Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (e->engine.func->texture_size_get) { e->engine.func->texture_size_get(e->engine.data.output, @@ -461,6 +469,7 @@ _evas_3d_texture_wrap_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Wrap_Mode s Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (e->engine.func->texture_wrap_set) { e->engine.func->texture_wrap_set(e->engine.data.output, @@ -475,6 +484,7 @@ _evas_3d_texture_wrap_get(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Wrap_Mode * Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (e->engine.func->texture_wrap_set) { e->engine.func->texture_wrap_get(e->engine.data.output, @@ -488,6 +498,7 @@ _evas_3d_texture_filter_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Texture_F Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (e->engine.func->texture_filter_set) { e->engine.func->texture_filter_set(e->engine.data.output, @@ -502,6 +513,7 @@ _evas_3d_texture_filter_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_ Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); + evas_object_async_block(eo_data_scope_get(obj, EVAS_OBJECT_CLASS)); if (e->engine.func->texture_filter_get) { e->engine.func->texture_filter_get(e->engine.data.output, diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c index 0e1d43a0bd..833a7e4ccb 100644 --- a/src/lib/evas/canvas/evas_clip.c +++ b/src/lib/evas/canvas/evas_clip.c @@ -230,6 +230,8 @@ _evas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object * return; MAGIC_CHECK_END(); + evas_object_async_block(obj); + clip = eo_data_scope_get(eo_clip, EVAS_OBJECT_CLASS); if (obj->cur->clipper && obj->cur->clipper->object == eo_clip) return; if (eo_obj == eo_clip) @@ -264,7 +266,10 @@ _evas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object * return; } - if (evas_object_intercept_call_clip_set(eo_obj, obj, eo_clip)) return; + if (evas_object_intercept_call_clip_set(eo_obj, obj, eo_clip)) + { + return; + } // illegal to set anything but a rect or an image as a clip if (clip->type != o_rect_type && clip->type != o_image_type) { @@ -391,6 +396,7 @@ _evas_object_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj) { if (!obj->cur->clipper) return; + evas_object_async_block(obj); obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer); /* unclip */ diff --git a/src/lib/evas/canvas/evas_font_dir.c b/src/lib/evas/canvas/evas_font_dir.c index d540709918..31debb414f 100644 --- a/src/lib/evas/canvas/evas_font_dir.c +++ b/src/lib/evas/canvas/evas_font_dir.c @@ -1326,6 +1326,7 @@ evas_object_text_font_string_parse(char *buffer, char dest[14][256]) EOLIAN void _evas_canvas_font_path_clear(Eo *eo_e EINA_UNUSED, Evas_Public_Data *evas) { + evas_canvas_async_block(evas); while (evas->font_path) { eina_stringshare_del(evas->font_path->data); @@ -1337,6 +1338,7 @@ EOLIAN void _evas_canvas_font_path_append(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *path) { if (!path) return; + evas_canvas_async_block(e); e->font_path = eina_list_append(e->font_path, eina_stringshare_add(path)); evas_font_init(); @@ -1346,6 +1348,7 @@ EOLIAN void _evas_canvas_font_path_prepend(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *path) { if (!path) return; + evas_canvas_async_block(e); e->font_path = eina_list_prepend(e->font_path, eina_stringshare_add(path)); evas_font_init(); @@ -1422,6 +1425,7 @@ _evas_canvas_font_hinting_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Fo { Evas_Layer *lay; + evas_canvas_async_block(e); if (e->hinting == hinting) return; e->hinting = hinting; @@ -1452,6 +1456,7 @@ _evas_canvas_font_hinting_can_hint(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Ev EOLIAN void _evas_canvas_font_cache_flush(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { + evas_canvas_async_block(e); evas_render_rendering_wait(e); e->engine.func->font_cache_flush(e->engine.data.output); } @@ -1460,6 +1465,7 @@ EOLIAN void _evas_canvas_font_cache_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int size) { if (size < 0) size = 0; + evas_canvas_async_block(e); evas_render_rendering_wait(e); e->engine.func->font_cache_set(e->engine.data.output, size); } diff --git a/src/lib/evas/canvas/evas_layer.c b/src/lib/evas/canvas/evas_layer.c index 62b1c54c93..e1baf63d7b 100644 --- a/src/lib/evas/canvas/evas_layer.c +++ b/src/lib/evas/canvas/evas_layer.c @@ -7,10 +7,14 @@ void evas_object_inject(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas *e) { Evas_Layer *lay; + Evas_Public_Data *evas; if (!obj) return; if (!e) return; if (obj->in_layer) return; + evas = eo_data_scope_get(e, EVAS_CANVAS_CLASS); + if (!evas) return; + evas_canvas_async_block(evas); lay = evas_layer_find(e, obj->cur->layer); if (!lay) { @@ -180,6 +184,7 @@ _evas_object_layer_set(Eo *eo_obj, Evas_Object_Protected_Data *obj EINA_UNUSED, Evas *eo_e; if (obj->delete_me) return; + evas_object_async_block(obj); if (evas_object_intercept_call_layer_set(eo_obj, obj, l)) return; if (obj->smart.parent) return; if (obj->cur->layer == l) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 00d1f24639..7e281a4efb 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -184,6 +184,7 @@ _evas_canvas_eo_base_constructor(Eo *eo_obj, Evas_Public_Data *e) EVAS_ARRAY_SET(e, texts_unref_queue); #undef EVAS_ARRAY_SET + eina_lock_new(&(e->lock_objects)); } EAPI void @@ -206,9 +207,11 @@ _evas_canvas_eo_base_destructor(Eo *eo_e, Evas_Public_Data *e) int i; Eina_Bool del; + evas_canvas_async_block(e); if (e->walking_list == 0) evas_render_idle_flush(eo_e); if (e->walking_list > 0) return; + evas_render_idle_flush(eo_e); _evas_post_event_callback_free(eo_e); @@ -299,6 +302,8 @@ _evas_canvas_eo_base_destructor(Eo *eo_e, Evas_Public_Data *e) _evas_device_cleanup(eo_e); + eina_lock_free(&(e->lock_objects)); + e->magic = 0; eo_do_super(eo_e, MY_CLASS, eo_destructor()); } @@ -318,6 +323,7 @@ _evas_canvas_output_method_set(Eo *eo_e, Evas_Public_Data *e, int render_method) if (em->id_engine != render_method) return; if (!evas_module_load(em)) return; + evas_canvas_async_block(e); /* set the correct render */ e->output.render_method = render_method; e->engine.func = (em->functions); @@ -352,11 +358,15 @@ _evas_canvas_engine_info_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) EOLIAN static Eina_Bool _evas_canvas_engine_info_set(Eo *eo_e, Evas_Public_Data *e, Evas_Engine_Info *info) { + Eina_Bool res; + if (!info) return EINA_FALSE; if (info != e->engine.info) return EINA_FALSE; if (info->magic != e->engine.info_magic) return EINA_FALSE; - return (Eina_Bool)e->engine.func->setup(eo_e, info); + evas_canvas_async_block(e); + res = e->engine.func->setup(eo_e, info); + return res; } EOLIAN static void @@ -366,6 +376,7 @@ _evas_canvas_output_size_set(Eo *eo_e, Evas_Public_Data *e, int w, int h) if (w < 1) w = 1; if (h < 1) h = 1; + evas_canvas_async_block(e); e->output.w = w; e->output.h = h; e->output.changed = 1; @@ -394,6 +405,7 @@ _evas_canvas_output_viewport_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas x = 0; y = 0; } + evas_canvas_async_block(e); e->viewport.x = x; e->viewport.y = y; e->viewport.w = w; @@ -417,6 +429,7 @@ _evas_canvas_output_framespace_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Ev { if ((x == e->framespace.x) && (y == e->framespace.y) && (w == e->framespace.w) && (h == e->framespace.h)) return; + evas_canvas_async_block(e); e->framespace.x = x; e->framespace.y = y; e->framespace.w = w; diff --git a/src/lib/evas/canvas/evas_map.c b/src/lib/evas/canvas/evas_map.c index 453caba615..86ceebeba5 100644 --- a/src/lib/evas/canvas/evas_map.c +++ b/src/lib/evas/canvas/evas_map.c @@ -472,6 +472,7 @@ _evas_object_map_enable_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bo if (obj->map->cur.usemap == enabled) return; pchange = obj->changed; + evas_object_async_block(obj); EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) map_write->cur.usemap = enabled; EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); @@ -540,6 +541,7 @@ _evas_object_map_enable_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data * EOLIAN void _evas_object_map_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, const Evas_Map *map) { + evas_object_async_block(obj); if ((!map) || (map->count < 4)) { if (obj->map->surface) @@ -631,6 +633,7 @@ _evas_object_map_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, const Evas_Map EOLIAN Evas_Map * _evas_object_map_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj) { + evas_object_async_block(obj); return obj->map->cur.map; } diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index cf4309778c..cbeb11620d 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -557,7 +557,7 @@ _evas_image_mmap_set(Eo *eo_obj, Evas_Image_Data *o, const Eina_File *f, const c if ((o->cur->key) && (key) && (!strcmp(o->cur->key, key))) return; } - + evas_object_async_block(obj); _image_init_set(f, NULL, key, eo_obj, obj, o, &lo); o->engine_data = ENFN->image_mmap(ENDT, o->cur->u.f, o->cur->key, &o->load_error, &lo); _image_done_set(eo_obj, obj, o); @@ -590,6 +590,7 @@ _evas_image_efl_file_file_set(Eo *eo_obj, Evas_Image_Data *o, const char *file, if (!o->engine_data) ENFN->image_data_preload_cancel(ENDT, o->engine_data, eo_obj); */ + evas_object_async_block(obj); _image_init_set(NULL, file, key, eo_obj, obj, o, &lo); o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo); _image_done_set(eo_obj, obj, o); @@ -645,7 +646,7 @@ _evas_image_source_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Object *eo_src) } } if (o->cur->source == eo_src) return EINA_TRUE; - + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); /* Kill the image if any */ if (o->cur->u.file || o->cur->key) @@ -730,9 +731,11 @@ EOLIAN static void _evas_image_source_clip_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool source_clip) { Evas_Object_Protected_Data *src_obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); source_clip = !!source_clip; if (o->proxy_src_clip == source_clip) return; + evas_object_async_block(obj); o->proxy_src_clip = source_clip; if (!o->cur->source) return; @@ -802,6 +805,7 @@ EOLIAN static void _evas_image_source_visible_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool visible) { Evas_Object_Protected_Data *src_obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (!o->cur->source) return; @@ -809,6 +813,7 @@ _evas_image_source_visible_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_ src_obj = eo_data_scope_get(o->cur->source, EVAS_OBJECT_CLASS); if (src_obj->proxy->src_invisible == !visible) return; + evas_object_async_block(obj); EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src_obj->proxy, Evas_Object_Proxy_Data, proxy_write) proxy_write->src_invisible = !visible; EINA_COW_WRITE_END(evas_object_proxy_cow, src_obj->proxy, proxy_write); @@ -844,6 +849,7 @@ _evas_image_scene_set(Eo *eo_obj, Evas_Image_Data *o, Evas_3D_Scene *scene) if (o->cur->scene == scene) return; + evas_object_async_block(obj); _image_init_set(NULL, NULL, NULL, eo_obj, obj, o, &lo); o->engine_data = ENFN->image_load(ENDT, o->cur->u.file, o->cur->key, &o->load_error, &lo); _image_done_set(eo_obj, obj, o); @@ -872,6 +878,7 @@ _evas_image_border_set(Eo *eo_obj, Evas_Image_Data *o, int l, int r, int t, int (o->cur->border.t == t) && (o->cur->border.b == b)) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) { state_write->border.l = l; @@ -896,13 +903,14 @@ _evas_image_border_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, int *l, int * EOLIAN static void _evas_image_border_center_fill_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Border_Fill_Mode fill) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (fill == o->cur->border.fill) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) state_write->border.fill = fill; EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); o->changed = EINA_TRUE; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -915,9 +923,11 @@ _evas_image_border_center_fill_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) static void _evas_image_filled_set(Eo *eo_obj, Evas_Image_Data* o, Eina_Bool setting) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); setting = !!setting; if (o->filled == setting) return; + evas_object_async_block(obj); o->filled = setting; if (!o->filled) evas_object_event_callback_del(eo_obj, EVAS_CALLBACK_RESIZE, @@ -944,15 +954,15 @@ _evas_image_filled_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_border_scale_set(Eo *eo_obj, Evas_Image_Data *o, double scale) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (scale == o->cur->border.scale) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) state_write->border.scale = scale; EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); o->changed = EINA_TRUE; - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -965,7 +975,7 @@ _evas_image_border_scale_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_fill_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (w == 0) return; if (h == 0) return; @@ -977,6 +987,7 @@ _evas_image_fill_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Coord x, Evas_Coord y, (o->cur->fill.w == w) && (o->cur->fill.h == h)) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) { state_write->fill.x = x; @@ -988,7 +999,6 @@ _evas_image_fill_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Coord x, Evas_Coord y, EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); o->changed = EINA_TRUE; - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1004,16 +1014,16 @@ _evas_image_fill_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Evas_Coord *x, EOLIAN static void _evas_image_fill_spread_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Fill_Spread spread) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (spread == (Evas_Fill_Spread)o->cur->spread) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) state_write->spread = spread; EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); o->changed = EINA_TRUE; - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1032,6 +1042,7 @@ _evas_image_size_set(Eo *eo_obj, Evas_Image_Data *o, int w, int h) if (o->cur->scene) return; + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); if (w < 1) w = 1; if (h < 1) h = 1; @@ -1112,6 +1123,7 @@ _evas_image_data_convert(Eo *eo_obj, Evas_Image_Data *o, Evas_Colorspace to_cspa DATA32 *data; void* result = NULL; + evas_object_async_block(obj); if ((o->preloading) && (o->engine_data)) { o->preloading = EINA_FALSE; @@ -1140,6 +1152,7 @@ _evas_image_data_set(Eo *eo_obj, Evas_Image_Data *o, void *data) Eina_Bool resize_call = EINA_FALSE; + evas_object_async_block(obj); evas_render_rendering_wait(obj->layer->evas); _evas_object_image_cleanup(eo_obj, obj, o); @@ -1224,6 +1237,7 @@ _evas_image_data_get(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED, Eina_Bool for Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + if (for_writing) evas_object_async_block(obj); if (for_writing) evas_render_rendering_wait(obj->layer->evas); data = NULL; @@ -1309,12 +1323,16 @@ _image_preload_internal(Eo *eo_obj, void *_pd, Eina_Bool cancel) EOLIAN static void _evas_image_preload_begin(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _image_preload_internal(eo_obj, _pd, EINA_FALSE); } EOLIAN static void _evas_image_preload_cancel(Eo *eo_obj, Evas_Image_Data *_pd EINA_UNUSED) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _image_preload_internal(eo_obj, _pd, EINA_TRUE); } @@ -1324,6 +1342,7 @@ _evas_image_data_copy_set(Eo *eo_obj, Evas_Image_Data *o, void *data) Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (!data) return; + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); if ((o->cur->image.w <= 0) || (o->cur->image.h <= 0)) return; @@ -1365,12 +1384,14 @@ _evas_image_data_copy_set(Eo *eo_obj, Evas_Image_Data *o, void *data) EOLIAN static void _evas_image_data_update_add(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, int h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Eina_Rectangle *r; int cnt; RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, o->cur->image.w, o->cur->image.h); if ((w <= 0) || (h <= 0)) return; if (!o->written) return; + evas_object_async_block(obj); cnt = eina_list_count(o->pixels->pixel_updates); if (cnt == 1) { // detect single blob case already there to do a nop @@ -1399,7 +1420,6 @@ _evas_image_data_update_add(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, } o->changed = EINA_TRUE; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1408,6 +1428,7 @@ _evas_image_alpha_set(Eo *eo_obj, Evas_Image_Data *o, Eina_Bool has_alpha) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if ((o->preloading) && (o->engine_data)) { o->preloading = EINA_FALSE; @@ -1457,8 +1478,9 @@ _evas_image_alpha_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_efl_image_smooth_scale_set(Eo *eo_obj, Evas_Image_Data *o, Eina_Bool smooth_scale) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (((smooth_scale) && (o->cur->smooth_scale)) || ((!smooth_scale) && (!o->cur->smooth_scale))) return; @@ -1467,7 +1489,6 @@ _evas_image_efl_image_smooth_scale_set(Eo *eo_obj, Evas_Image_Data *o, Eina_Bool EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); o->changed = EINA_TRUE; - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1482,6 +1503,7 @@ _evas_image_reload(Eo *eo_obj, Evas_Image_Data *o) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if ((o->preloading) && (o->engine_data)) { o->preloading = EINA_FALSE; @@ -1516,6 +1538,7 @@ _evas_image_efl_file_save(Eo *eo_obj, Evas_Image_Data *o, const char *file, cons RGBA_Image *im; if (!o->engine_data) return 0; Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); o->engine_data = ENFN->image_data_get(ENDT, o->engine_data, 0, &data, &o->load_error); if (flags) { @@ -1571,6 +1594,7 @@ _evas_image_pixels_import(Eo *eo_obj, Evas_Image_Data *o, Evas_Pixel_Import_Sour { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); if ((pixels->w != o->cur->image.w) || (pixels->h != o->cur->image.h)) return EINA_FALSE; @@ -1631,6 +1655,8 @@ _evas_image_pixels_import(Eo *eo_obj, Evas_Image_Data *o, Evas_Pixel_Import_Sour EOLIAN static void _evas_image_pixels_get_callback_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Evas_Object_Image_Pixels_Get_Cb func, void *data) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); EINA_COW_PIXEL_WRITE_BEGIN(o, pixi_write) { pixi_write->func.get_pixels = func; @@ -1643,7 +1669,7 @@ EOLIAN static void _evas_image_pixels_dirty_set(Eo *eo_obj, Evas_Image_Data *o, Eina_Bool dirty) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); - + evas_object_async_block(obj); if (dirty) o->dirty_pixels = EINA_TRUE; else o->dirty_pixels = EINA_FALSE; o->changed = EINA_TRUE; @@ -1659,15 +1685,15 @@ _evas_image_pixels_dirty_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_load_dpi_set(Eo *eo_obj, Evas_Image_Data *o, double dpi) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (dpi == o->load_opts->dpi) return; - + evas_object_async_block(obj); EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low) low->dpi = dpi; EINA_COW_LOAD_OPTS_WRITE_END(o, low); if (o->cur->u.file) { - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_image_unload(eo_obj, 0); evas_object_inform_call_image_unloaded(eo_obj); evas_object_image_load(eo_obj, obj, o); @@ -1685,8 +1711,9 @@ _evas_image_load_dpi_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_efl_image_load_size_set(Eo *eo_obj, Evas_Image_Data *o, int w, int h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->load_opts->w == w) && (o->load_opts->h == h)) return; - + evas_object_async_block(obj); EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low) { low->w = w; @@ -1696,7 +1723,6 @@ _evas_image_efl_image_load_size_set(Eo *eo_obj, Evas_Image_Data *o, int w, int h if (o->cur->u.file) { - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_image_unload(eo_obj, 0); evas_object_inform_call_image_unloaded(eo_obj); evas_object_image_load(eo_obj, obj, o); @@ -1716,14 +1742,15 @@ _evas_image_efl_image_load_size_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, EOLIAN static void _evas_image_load_scale_down_set(Eo *eo_obj, Evas_Image_Data *o, int scale_down) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (o->load_opts->scale_down_by == scale_down) return; + evas_object_async_block(obj); EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low) low->scale_down_by = scale_down; EINA_COW_LOAD_OPTS_WRITE_END(o, low); if (o->cur->u.file) { - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_image_unload(eo_obj, 0); evas_object_inform_call_image_unloaded(eo_obj); evas_object_image_load(eo_obj, obj, o); @@ -1741,9 +1768,10 @@ _evas_image_load_scale_down_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o) EOLIAN static void _evas_image_load_region_set(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, int h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->load_opts->region.x == x) && (o->load_opts->region.y == y) && (o->load_opts->region.w == w) && (o->load_opts->region.h == h)) return; - + evas_object_async_block(obj); EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low) { low->region.x = x; @@ -1755,7 +1783,6 @@ _evas_image_load_region_set(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, if (o->cur->u.file) { - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_image_unload(eo_obj, 0); evas_object_inform_call_image_unloaded(eo_obj); evas_object_image_load(eo_obj, obj, o); @@ -1776,7 +1803,9 @@ _evas_image_load_region_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, int *x, EOLIAN static void _evas_image_load_orientation_set(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o, Eina_Bool enable) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (o->load_opts->orientation == !!enable) return; + evas_object_async_block(obj); EINA_COW_LOAD_OPTS_WRITE_BEGIN(o, low) low->orientation = !!enable; @@ -1793,6 +1822,7 @@ EOLIAN static void _evas_image_colorspace_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Colorspace cspace) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); @@ -1814,6 +1844,7 @@ EOLIAN static void _evas_image_video_surface_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Video_Surface *surf) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); if (o->video_surface) @@ -1877,6 +1908,7 @@ EOLIAN static void _evas_image_video_surface_caps_set(Eo *eo_obj, Evas_Image_Data *o, unsigned int caps) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _evas_object_image_cleanup(eo_obj, obj, o); @@ -1906,6 +1938,8 @@ evas_object_image_native_surface_set(Evas_Object *eo_obj, Evas_Native_Surface *s MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); return; MAGIC_CHECK_END(); + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); evas_object_event_callback_del_full (eo_obj, EVAS_CALLBACK_DEL, _on_image_native_surface_del, NULL); if (surf) // We need to unset native surf on del to remove shared hash refs @@ -1918,7 +1952,7 @@ EOLIAN static void _evas_image_native_surface_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Native_Surface *surf) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); - + evas_object_async_block(obj); evas_render_rendering_wait(obj->layer->evas); _evas_object_image_cleanup(eo_obj, obj, o); @@ -1945,6 +1979,7 @@ EOLIAN static void _evas_image_scale_hint_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Image_Scale_Hint hint) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (o->scale_hint == hint) return; o->scale_hint = hint; if (o->engine_data) @@ -1977,6 +2012,7 @@ EOLIAN static void _evas_image_content_hint_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Image_Content_Hint hint) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (o->content_hint == hint) return; o->content_hint = hint; if (o->engine_data) @@ -2005,6 +2041,8 @@ evas_object_image_alpha_mask_set(Evas_Object *eo_obj, Eina_Bool ismask) MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); return; MAGIC_CHECK_END(); + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!ismask) return; /* Convert to A8 if not already */ @@ -2122,7 +2160,7 @@ _evas_image_animated_frame_set(Eo *eo_obj, Evas_Image_Data *o, int frame_index) if (o->cur->frame == frame_index) return; if (!evas_object_image_animated_get(eo_obj)) return; - + evas_object_async_block(obj); frame_count = evas_object_image_animated_frame_count_get(eo_obj); /* limit the size of frame to FRAME_MAX */ @@ -2149,6 +2187,7 @@ _evas_image_animated_frame_set(Eo *eo_obj, Evas_Image_Data *o, int frame_index) EOLIAN void _evas_canvas_image_cache_flush(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { + evas_canvas_async_block(e); evas_render_rendering_wait(e); e->engine.func->image_cache_flush(e->engine.data.output); } @@ -2158,6 +2197,7 @@ _evas_canvas_image_cache_reload(Eo *eo_e, Evas_Public_Data *e) { Evas_Layer *layer; + evas_canvas_async_block(e); evas_image_cache_flush(eo_e); EINA_INLIST_FOREACH(e->layers, layer) { @@ -2195,6 +2235,7 @@ EOLIAN void _evas_canvas_image_cache_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int size) { if (size < 0) size = 0; + evas_canvas_async_block(e); evas_render_rendering_wait(e); e->engine.func->image_cache_set(e->engine.data.output, size); } @@ -2513,6 +2554,7 @@ evas_object_image_unload(Evas_Object *eo_obj, Eina_Bool dirty) (o->pixels_checked_out > 0)) return; Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (dirty) { if (o->engine_data) @@ -4660,13 +4702,14 @@ _evas_object_image_video_overlay_do(Evas_Object *eo_obj) EOLIAN static void _evas_image_filter_program_set(Eo *eo_obj, Evas_Image_Data *o, const char *arg) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Filter_Program *pgm = NULL; if (!o) return; if (o->cur->filter->code == arg) return; if (o->cur->filter->code && arg && !strcmp(arg, o->cur->filter->code)) return; + evas_object_async_block(obj); EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) EINA_COW_IMAGE_FILTER_WRITE_BEGIN(state_write, fcow) { @@ -4693,7 +4736,6 @@ _evas_image_filter_program_set(Eo *eo_obj, Evas_Image_Data *o, const char *arg) EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); // Update object - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); o->changed = EINA_TRUE; evas_object_change(eo_obj, obj); } @@ -4745,6 +4787,7 @@ _evas_image_filter_source_set(Eo *eo_obj, Evas_Image_Data *o, const char *name, Eina_Hash *sources = o->cur->filter->sources; obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (eo_source) source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS); if (!name) diff --git a/src/lib/evas/canvas/evas_object_line.c b/src/lib/evas/canvas/evas_object_line.c index 4c2d7891b1..8090c611de 100644 --- a/src/lib/evas/canvas/evas_object_line.c +++ b/src/lib/evas/canvas/evas_object_line.c @@ -118,6 +118,7 @@ _evas_line_xy_set(Eo *eo_obj, Evas_Line_Data *_pd, Evas_Coord x1, Evas_Coord y1, (y1 == (obj->cur->geometry.y + o->cur.y1)) && (x2 == (obj->cur->geometry.x + o->cur.x2)) && (y2 == (obj->cur->geometry.y + o->cur.y2))) return; + evas_object_async_block(obj); if (!(obj->layer->evas->is_frozen)) { diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index da97914345..8d286fd23b 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -645,6 +645,7 @@ evas_object_del(Evas_Object *eo_obj) Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, MY_CLASS); if (!obj) return; + evas_object_async_block(obj); if (obj->delete_me || obj->eo_del_called) return; if (obj->ref > 0) { @@ -764,6 +765,7 @@ _evas_object_position_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Coor if (obj->delete_me) return; if (!obj->layer) return; + evas_object_async_block(obj); if (evas_object_intercept_call_move(eo_obj, obj, x, y)) return; if (obj->doing.in_move > 0) @@ -846,6 +848,7 @@ _evas_object_size_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Coord w, if (!obj->layer) return; if (w < 0) w = 0; if (h < 0) h = 0; + evas_object_async_block(obj); if (evas_object_intercept_call_resize(eo_obj, obj, w, h)) return; if (obj->doing.in_resize > 0) @@ -978,6 +981,7 @@ _evas_object_size_hint_display_mode_set(Eo *eo_obj EINA_UNUSED, Evas_Object_Prot { if (!obj) return; if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if (obj->size_hints->dispmode == dispmode) return; obj->size_hints->dispmode = dispmode; @@ -1002,6 +1006,7 @@ _evas_object_size_hint_min_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->min.w == w) && (obj->size_hints->min.h == h)) return; obj->size_hints->min.w = w; @@ -1027,6 +1032,7 @@ _evas_object_size_hint_max_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->max.w == w) && (obj->size_hints->max.h == h)) return; obj->size_hints->max.w = w; @@ -1052,6 +1058,7 @@ _evas_object_size_hint_request_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->request.w == w) && (obj->size_hints->request.h == h)) return; obj->size_hints->request.w = w; @@ -1079,6 +1086,7 @@ _evas_object_size_hint_aspect_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, E { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->aspect.mode == aspect) && (obj->size_hints->aspect.size.w == w) && (obj->size_hints->aspect.size.h == h)) return; obj->size_hints->aspect.mode = aspect; @@ -1105,6 +1113,7 @@ _evas_object_size_hint_align_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, do { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->align.x == x) && (obj->size_hints->align.y == y)) return; obj->size_hints->align.x = x; @@ -1130,6 +1139,7 @@ _evas_object_size_hint_weight_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, d { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->weight.x == x) && (obj->size_hints->weight.y == y)) return; obj->size_hints->weight.x = x; @@ -1158,6 +1168,7 @@ _evas_object_size_hint_padding_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, { if (obj->delete_me) return; + evas_object_async_block(obj); _evas_object_size_hint_alloc(eo_obj, obj); if ((obj->size_hints->padding.l == l) && (obj->size_hints->padding.r == r) && (obj->size_hints->padding.t == t) && (obj->size_hints->padding.b == b)) return; obj->size_hints->padding.l = l; @@ -1187,6 +1198,7 @@ evas_object_hide(Evas_Object *eo_obj) static void _evas_object_visibility_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool visible) { + evas_object_async_block(obj); if (visible) _show(eo_obj, obj); else _hide(eo_obj, obj); } @@ -1390,6 +1402,7 @@ _evas_object_color_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, int r, int g ERR("Evas only handles pre multiplied colors!"); } + evas_object_async_block(obj); if (evas_object_intercept_call_color_set(eo_obj, obj, r, g, b, a)) return; if (obj->is_smart) { @@ -1442,6 +1455,7 @@ _evas_object_anti_alias_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bo anti_alias = !!anti_alias; if (obj->cur->anti_alias == anti_alias)return; + evas_object_async_block(obj); EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) { state_write->anti_alias = anti_alias; @@ -1464,6 +1478,7 @@ _evas_object_scale_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, double scale if (obj->delete_me) return; if (obj->cur->scale == scale) return; + evas_object_async_block(obj); EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) { state_write->scale = scale; @@ -1487,6 +1502,7 @@ _evas_object_render_op_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Ren if (obj->delete_me) return; if (obj->cur->render_op == render_op) return; + evas_object_async_block(obj); EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) { state_write->render_op = render_op; @@ -1841,6 +1857,7 @@ _evas_object_type_set(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, c EOLIAN static void _evas_object_precise_is_inside_set(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Bool precise) { + evas_object_async_block(obj); obj->precise_is_inside = precise; } @@ -1853,6 +1870,7 @@ _evas_object_precise_is_inside_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected EOLIAN static void _evas_object_static_clip_set(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Bool is_static_clip) { + evas_object_async_block(obj); obj->is_static_clip = is_static_clip; } @@ -1881,6 +1899,7 @@ _evas_object_is_frame_object_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Ei { Evas_Coord x, y; + evas_object_async_block(obj); evas_object_geometry_get(eo_obj, &x, &y, NULL, NULL); _is_frame_flag_set(obj, is_frame); diff --git a/src/lib/evas/canvas/evas_object_polygon.c b/src/lib/evas/canvas/evas_object_polygon.c index cd27199282..4e5ed04836 100644 --- a/src/lib/evas/canvas/evas_object_polygon.c +++ b/src/lib/evas/canvas/evas_object_polygon.c @@ -124,7 +124,7 @@ _evas_polygon_point_add(Eo *eo_obj, Evas_Polygon_Data *_pd, Evas_Coord x, Evas_C Evas_Coord min_x, max_x, min_y, max_y; int is, was = 0; - + evas_object_async_block(obj); if (!obj->layer->evas->is_frozen) { if (!evas_event_passes_through(eo_obj, obj) && @@ -230,6 +230,7 @@ _evas_polygon_points_clear(Eo *eo_obj, Evas_Polygon_Data *_pd) void *list_data; int is, was; + evas_object_async_block(obj); was = evas_object_is_in_output_rect(eo_obj, obj, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1); diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c index 3345776072..4623fc0b45 100644 --- a/src/lib/evas/canvas/evas_object_smart.c +++ b/src/lib/evas/canvas/evas_object_smart.c @@ -237,6 +237,7 @@ _evas_object_smart_member_add(Eo *smart_obj, Evas_Smart_Data *o, Evas_Object *eo if (obj->smart.parent == smart_obj) return; + evas_object_async_block(obj); if (obj->smart.parent) evas_object_smart_member_del(eo_obj); o->member_count++; @@ -283,6 +284,7 @@ _evas_object_smart_member_del(Eo *smart_obj, Evas_Smart_Data *_pd EINA_UNUSED, E if (!obj->smart.parent) return; + evas_object_async_block(obj); Evas_Object_Protected_Data *smart = eo_data_scope_get(smart_obj, EVAS_OBJECT_CLASS); if (smart->smart.smart && smart->smart.smart->smart_class->member_del) smart->smart.smart->smart_class->member_del(smart_obj, eo_obj); @@ -403,17 +405,19 @@ _evas_object_smart_iterator_free(Evas_Object_Smart_Iterator *it) // Should we have an eo_children_iterator_new API and just inherit from it ? EOLIAN static Eina_Iterator* -_evas_object_smart_iterator_new(Eo *o, Evas_Smart_Data *priv) +_evas_object_smart_iterator_new(Eo *eo_obj, Evas_Smart_Data *priv) { Evas_Object_Smart_Iterator *it; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (!priv->contained) return NULL; + evas_object_async_block(obj); it = calloc(1, sizeof(Evas_Object_Smart_Iterator)); if (!it) return NULL; EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR); - it->parent = eo_ref(o); + it->parent = eo_ref(eo_obj); it->current = priv->contained; it->iterator.next = FUNC_ITERATOR_NEXT(_evas_object_smart_iterator_next); @@ -424,13 +428,13 @@ _evas_object_smart_iterator_new(Eo *o, Evas_Smart_Data *priv) } EOLIAN static Eina_List* -_evas_object_smart_members_get(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o) +_evas_object_smart_members_get(Eo *eo_obj, Evas_Smart_Data *o) { - Eina_List *members; - + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + Eina_List *members = NULL; Eina_Inlist *member; - members = NULL; + evas_object_async_block(obj); for (member = o->contained; member; member = member->next) members = eina_list_append(members, ((Evas_Object_Protected_Data *)member)->object); @@ -440,9 +444,11 @@ _evas_object_smart_members_get(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o) const Eina_Inlist * evas_object_smart_members_get_direct(const Evas_Object *eo_obj) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); return NULL; MAGIC_CHECK_END(); + evas_object_async_block(obj); if (!eo_isa(eo_obj, MY_CLASS)) return NULL; Evas_Smart_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); return o->contained; @@ -858,6 +864,7 @@ _evas_object_smart_need_recalculate_set(Eo *eo_obj, Evas_Smart_Data *o, Eina_Boo // XXX: do i need this? if (!obj || !obj->layer || obj->delete_me) return; + evas_object_async_block(obj); /* remove this entry from calc_list or processed list */ if (eina_clist_element_is_linked(&o->calc_entry)) eina_clist_remove(&o->calc_entry); @@ -893,6 +900,7 @@ _evas_object_smart_calculate(Eo *eo_obj, Evas_Smart_Data *o) if (!obj->smart.smart || !obj->smart.smart->smart_class->calculate) return; + evas_object_async_block(obj); o->need_recalculate = 0; obj->smart.smart->smart_class->calculate(eo_obj); } @@ -921,6 +929,7 @@ evas_call_smarts_calculate(Evas *eo_e) Eina_Clist *elem; Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS); + evas_canvas_async_block(e); evas_event_freeze(eo_e); e->in_smart_calc++; @@ -963,6 +972,7 @@ EOLIAN static void _evas_object_smart_changed(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED) { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); evas_object_change(eo_obj, obj); eo_do(eo_obj, evas_obj_smart_need_recalculate_set(1)); } @@ -1297,6 +1307,7 @@ evas_object_smart_need_bounding_box_update(Evas_Object *eo_obj) Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Smart_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); + evas_object_async_block(obj); if (o->update_boundingbox_needed) return; o->update_boundingbox_needed = EINA_TRUE; @@ -1318,6 +1329,7 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected return; MAGIC_CHECK_END(); + evas_object_async_block(obj); os = eo_data_scope_get(eo_obj, MY_CLASS); if (!os->update_boundingbox_needed) return; diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index 8eadf07f17..004001fb34 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -380,11 +380,13 @@ _evas_text_eo_base_constructor(Eo *eo_obj, Evas_Text_Data *o) } EOLIAN static void -_evas_text_efl_text_properties_font_source_set(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, const char *font_source) +_evas_text_efl_text_properties_font_source_set(Eo *eo_obj, Evas_Text_Data *o, const char *font_source) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->cur.source) && (font_source) && (!strcmp(o->cur.source, font_source))) return; + evas_object_async_block(obj); /* if (o->cur.source) eina_stringshare_del(o->cur.source); if (font_source) o->cur.source = eina_stringshare_add(font_source); @@ -415,6 +417,7 @@ _evas_text_filter_changed_set(Evas_Text_Data *o, Eina_Bool val) EOLIAN static void _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Eina_Bool is, was = EINA_FALSE; Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE; Eina_Bool source_invisible = EINA_FALSE; @@ -423,6 +426,7 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha if ((!font) || (size <= 0)) return; + evas_object_async_block(obj); if (!(o->cur.font && !strcmp(font, o->cur.font))) { fdesc = evas_font_desc_new(); @@ -447,7 +451,6 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha eina_stringshare_replace(&o->cur.font, font); o->prev.font = NULL; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (!(obj->layer->evas->is_frozen)) { pass = evas_event_passes_through(eo_obj, obj); @@ -927,6 +930,7 @@ _evas_text_evas_object_size_set(Eo *eo_obj, Evas_Text_Data *o, Evas_Coord w, Eva { Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) { state_write->geometry.w = w; @@ -944,6 +948,7 @@ _evas_text_ellipsis_set(Eo *eo_obj, Evas_Text_Data *o, double ellipsis) if (o->cur.ellipsis == ellipsis) return; + evas_object_async_block(obj); o->cur.ellipsis = ellipsis; o->changed = 1; _evas_text_filter_changed_set(o, EINA_TRUE); @@ -979,15 +984,16 @@ _evas_text_eo_base_dbg_info_get(Eo *eo_obj, Evas_Text_Data *o EINA_UNUSED, Eo_Db EOLIAN static void _evas_text_efl_text_text_set(Eo *eo_obj, Evas_Text_Data *o, const char *_text) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); int is, was, len; Eina_Unicode *text; if ((o->cur.utf8_text) && (_text) && (!strcmp(o->cur.utf8_text, _text))) return; + evas_object_async_block(obj); text = eina_unicode_utf8_to_unicode(_text, &len); if (!text) text = eina_unicode_strdup(EINA_UNICODE_EMPTY_STRING); - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); was = evas_object_is_in_output_rect(eo_obj, obj, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1); @@ -1020,8 +1026,10 @@ _evas_text_efl_text_text_set(Eo *eo_obj, Evas_Text_Data *o, const char *_text) } EOLIAN static void -_evas_text_bidi_delimiters_set(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, const char *delim) +_evas_text_bidi_delimiters_set(Eo *eo_obj, Evas_Text_Data *o, const char *delim) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); eina_stringshare_replace(&o->bidi_delimiters, delim); } @@ -1212,11 +1220,12 @@ _evas_text_char_coords_get(Eo *eo_obj, Evas_Text_Data *o, Evas_Coord x, Evas_Coo EOLIAN static void _evas_text_style_set(Eo *eo_obj, Evas_Text_Data *o, Evas_Text_Style_Type style) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); int pl = 0, pr = 0, pt = 0, pb = 0, l = 0, r = 0, t = 0, b = 0; int w = 0, h = 0; if (o->cur.style == style) return; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); evas_text_style_pad_get(o->cur.style, &pl, &pr, &pt, &pb); o->cur.style = style; @@ -1239,15 +1248,16 @@ _evas_text_style_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o) EOLIAN static void _evas_text_shadow_color_set(Eo *eo_obj, Evas_Text_Data *o, int r, int g, int b, int a) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->cur.shadow.r == r) && (o->cur.shadow.g == g) && (o->cur.shadow.b == b) && (o->cur.shadow.a == a)) return; + evas_object_async_block(obj); o->cur.shadow.r = r; o->cur.shadow.g = g; o->cur.shadow.b = b; o->cur.shadow.a = a; o->changed = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1263,15 +1273,16 @@ _evas_text_shadow_color_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, int *r, i EOLIAN static void _evas_text_glow_color_set(Eo *eo_obj, Evas_Text_Data *o, int r, int g, int b, int a) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->cur.glow.r == r) && (o->cur.glow.g == g) && (o->cur.glow.b == b) && (o->cur.glow.a == a)) return; + evas_object_async_block(obj); o->cur.glow.r = r; o->cur.glow.g = g; o->cur.glow.b = b; o->cur.glow.a = a; o->changed = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1287,15 +1298,16 @@ _evas_text_glow_color_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, int *r, int EOLIAN static void _evas_text_glow2_color_set(Eo *eo_obj, Evas_Text_Data *o, int r, int g, int b, int a) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->cur.glow2.r == r) && (o->cur.glow2.g == g) && (o->cur.glow2.b == b) && (o->cur.glow2.a == a)) return; + evas_object_async_block(obj); o->cur.glow2.r = r; o->cur.glow2.g = g; o->cur.glow2.b = b; o->cur.glow2.a = a; o->changed = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1311,15 +1323,16 @@ _evas_text_glow2_color_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, int *r, in EOLIAN static void _evas_text_outline_color_set(Eo *eo_obj, Evas_Text_Data *o, int r, int g, int b, int a) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((o->cur.outline.r == r) && (o->cur.outline.g == g) && (o->cur.outline.b == b) && (o->cur.outline.a == a)) return; + evas_object_async_block(obj); o->cur.outline.r = r; o->cur.outline.g = g; o->cur.outline.b = b; o->cur.outline.a = a; o->changed = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -2357,13 +2370,15 @@ _evas_object_text_recalc(Evas_Object *eo_obj, Eina_Unicode *text) EOLIAN static void _evas_text_filter_program_set(Eo *eo_obj, Evas_Text_Data *o, const char *arg) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + Evas_Filter_Program *pgm = NULL; if (!o) return; if (o->cur.filter->code == arg) return; if (o->cur.filter->code && arg && !strcmp(arg, o->cur.filter->code)) return; + evas_object_async_block(obj); EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow) { // Parse filter program @@ -2387,7 +2402,6 @@ _evas_text_filter_program_set(Eo *eo_obj, Evas_Text_Data *o, const char *arg) EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow); // Update object - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); _evas_object_text_items_clear(o); o->changed = 1; _evas_object_text_recalc(eo_obj, o->cur.text); @@ -2435,14 +2449,14 @@ _filter_source_hash_free_cb(void *data) EOLIAN static void _evas_text_filter_source_set(Eo *eo_obj, Evas_Text_Data *o, const char *name, Evas_Object *eo_source) { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Filter_Proxy_Binding *pb, *pb_old = NULL; Evas_Object_Protected_Data *source = NULL; Evas_Object_Filter_Data *fcow = NULL; - obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if (eo_source) source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!name) { if (!eo_source || !o->cur.filter->sources) return; diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index e9db7bb639..52805ed85c 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -5842,6 +5842,8 @@ evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text) EINA_LIST_FOREACH(ts->objects, l, eo_obj) { Evas_Textblock_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _evas_textblock_invalidate_all(o); _evas_textblock_changed(o, eo_obj); } @@ -6060,6 +6062,8 @@ _textblock_style_generic_set(Evas_Object *eo_obj, Evas_Textblock_Style *ts, EOLIAN static void _evas_textblock_style_set(Eo *eo_obj, Evas_Textblock_Data *o, const Evas_Textblock_Style *ts) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _textblock_style_generic_set(eo_obj, (Evas_Textblock_Style *) ts, &(o->style)); } @@ -6072,6 +6076,8 @@ _evas_textblock_style_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) EOLIAN static void _evas_textblock_style_user_push(Eo *eo_obj, Evas_Textblock_Data *o, Evas_Textblock_Style *ts) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _textblock_style_generic_set(eo_obj, ts, &(o->style_user)); } @@ -6084,12 +6090,16 @@ _evas_textblock_style_user_peek(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) EOLIAN static void _evas_textblock_style_user_pop(Eo *eo_obj, Evas_Textblock_Data *o) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _textblock_style_generic_set(eo_obj, NULL, &(o->style_user)); } EOLIAN static void _evas_textblock_replace_char_set(Eo *eo_obj, Evas_Textblock_Data *o, const char *ch) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (o->repch) eina_stringshare_del(o->repch); if (ch) o->repch = eina_stringshare_add(ch); else o->repch = NULL; @@ -6100,6 +6110,8 @@ _evas_textblock_replace_char_set(Eo *eo_obj, Evas_Textblock_Data *o, const char EOLIAN static void _evas_textblock_legacy_newline_set(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o, Eina_Bool mode) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (o->legacy_newline == mode) return; @@ -6117,6 +6129,8 @@ _evas_textblock_legacy_newline_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data * EOLIAN static void _evas_textblock_valign_set(Eo *eo_obj, Evas_Textblock_Data *o, double align) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (align < 0.0) align = 0.0; else if (align > 1.0) align = 1.0; if (o->valign == align) return; @@ -6133,6 +6147,8 @@ _evas_textblock_valign_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) EOLIAN static void _evas_textblock_bidi_delimiters_set(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o, const char *delim) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); eina_stringshare_replace(&o->bidi_delimiters, delim); } @@ -6350,6 +6366,8 @@ _prepend_escaped_char(Evas_Textblock_Cursor *cur, const char *s, EOLIAN static void _evas_textblock_text_markup_set(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o, const char *text) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if ((text != o->markup_text) && (o->markup_text)) { free(o->markup_text); @@ -6391,6 +6409,8 @@ evas_object_textblock_text_markup_prepend(Evas_Textblock_Cursor *cur, const char { if (!cur) return; Evas_Object *eo_obj = cur->obj; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_HEAD(); if (text) { @@ -6595,6 +6615,8 @@ _evas_textblock_text_markup_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) Evas_Object_Textblock_Node_Text *n; Eina_Strbuf *txt = NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); const char *markup; if (o->markup_text) { @@ -7112,14 +7134,15 @@ EOLIAN static Evas_Textblock_Cursor* _evas_textblock_cursor_new(Eo *eo_obj, Evas_Textblock_Data *o) { Evas_Textblock_Cursor *cur; - { - cur = calloc(1, sizeof(Evas_Textblock_Cursor)); - (cur)->obj = (Evas_Object *) eo_obj; - (cur)->node = o->text_nodes; - (cur)->pos = 0; - o->cursors = eina_list_append(o->cursors, cur); - } + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); + cur = calloc(1, sizeof(Evas_Textblock_Cursor)); + if (!cur) return NULL; + cur->obj = (Evas_Object *) eo_obj; + cur->node = o->text_nodes; + cur->pos = 0; + o->cursors = eina_list_append(o->cursors, cur); return cur; } @@ -7127,6 +7150,8 @@ EAPI void evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) { if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); if (cur == o->cursor) return; o->cursors = eina_list_remove(o->cursors, cur); @@ -7136,14 +7161,18 @@ evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) EAPI Eina_Bool evas_textblock_cursor_is_format(const Evas_Textblock_Cursor *cur) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!cur || !cur->node) return EINA_FALSE; return (_evas_textblock_cursor_node_format_at_pos_get(cur)) ? EINA_TRUE : EINA_FALSE; } EOLIAN static const Eina_List * -_evas_textblock_node_format_list_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o, const char *anchor) +_evas_textblock_node_format_list_get(Eo *eo_obj, Evas_Textblock_Data *o, const char *anchor) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!strcmp(anchor, "a")) return o->anchors_a; else if (!strcmp(anchor, "item")) @@ -7152,14 +7181,18 @@ _evas_textblock_node_format_list_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data } EOLIAN static const Evas_Object_Textblock_Node_Format* -_evas_textblock_node_format_first_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) +_evas_textblock_node_format_first_get(Eo *eo_obj, Evas_Textblock_Data *o) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); return o->format_nodes; } EOLIAN static const Evas_Object_Textblock_Node_Format* -_evas_textblock_node_format_last_get(Eo *eo_obj EINA_UNUSED, Evas_Textblock_Data *o) +_evas_textblock_node_format_last_get(Eo *eo_obj, Evas_Textblock_Data *o) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); return o->format_nodes ? _NODE_FORMAT(EINA_INLIST_GET(o->format_nodes)->last) : NULL; } @@ -7188,6 +7221,8 @@ _evas_textblock_node_format_remove_pair(Eo *eo_obj, Evas_Textblock_Data *o, Evas fmt = n; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); do { const char *fstr = fmt->orig_format; @@ -7287,6 +7322,8 @@ EAPI void evas_textblock_cursor_paragraph_first(Evas_Textblock_Cursor *cur) { if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); cur->node = o->text_nodes; cur->pos = 0; @@ -7299,6 +7336,8 @@ evas_textblock_cursor_paragraph_last(Evas_Textblock_Cursor *cur) Evas_Object_Textblock_Node_Text *node; if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); node = o->text_nodes; if (node) @@ -7321,6 +7360,8 @@ EAPI Eina_Bool evas_textblock_cursor_paragraph_next(Evas_Textblock_Cursor *cur) { if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); /* If there is a current text node, return the next text node (if exists) * otherwise, just return False. */ @@ -7344,6 +7385,8 @@ evas_textblock_cursor_paragraph_prev(Evas_Textblock_Cursor *cur) { Evas_Object_Textblock_Node_Text *node; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); /* If the current node is a text node, just get the prev if any, * if it's a format, get the current text node out of the format and return @@ -7377,6 +7420,8 @@ evas_textblock_cursor_format_next(Evas_Textblock_Cursor *cur) Evas_Object_Textblock_Node_Format *node; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); /* If the current node is a format node, just get the next if any, * if it's a text, get the current format node out of the text and return @@ -7413,6 +7458,8 @@ evas_textblock_cursor_format_prev(Evas_Textblock_Cursor *cur) { const Evas_Object_Textblock_Node_Format *node; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); node = evas_textblock_cursor_format_get(cur); if (!node) @@ -7456,6 +7503,8 @@ evas_textblock_cursor_word_start(Evas_Textblock_Cursor *cur) char *breaks; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); size_t len = eina_ustrbuf_length_get(cur->node->unicode); @@ -7514,6 +7563,8 @@ evas_textblock_cursor_word_end(Evas_Textblock_Cursor *cur) char *breaks; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); size_t len = eina_ustrbuf_length_get(cur->node->unicode); @@ -7565,6 +7616,8 @@ evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur) const Eina_Unicode *text; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); ind = cur->pos; @@ -7600,6 +7653,8 @@ EAPI Eina_Bool evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur) { if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); if (cur->pos != 0) @@ -7614,6 +7669,8 @@ EAPI void evas_textblock_cursor_paragraph_char_first(Evas_Textblock_Cursor *cur) { if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); cur->pos = 0; } @@ -7624,6 +7681,8 @@ evas_textblock_cursor_paragraph_char_last(Evas_Textblock_Cursor *cur) int ind; if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node); ind = eina_ustrbuf_length_get(cur->node->unicode); /* If it's not the last paragraph, go back one, because we want to point @@ -7645,6 +7704,8 @@ evas_textblock_cursor_line_char_first(Evas_Textblock_Cursor *cur) Evas_Object_Textblock_Item *it = NULL; if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); @@ -7679,6 +7740,8 @@ evas_textblock_cursor_line_char_last(Evas_Textblock_Cursor *cur) Evas_Object_Textblock_Item *it = NULL; if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); @@ -8150,6 +8213,8 @@ evas_textblock_cursor_pos_get(const Evas_Textblock_Cursor *cur) size_t npos = 0; if (!cur) return -1; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, 0); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); n = o->text_nodes; @@ -8168,6 +8233,8 @@ evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int _pos) size_t pos; if (!cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); if (_pos < 0) @@ -8213,6 +8280,8 @@ evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line) Evas_Object_Textblock_Item *it; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); @@ -8242,6 +8311,8 @@ evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Text if (!cur1) return 0; if (!cur2) return 0; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (cur1->obj != cur2->obj) return 0; if ((!cur1->node) || (!cur2->node)) return 0; if (cur1->node == cur2->node) @@ -8269,6 +8340,8 @@ evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Curs if (!cur) return; if (!cur_dest) return; if (cur->obj != cur_dest->obj) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); cur_dest->pos = cur->pos; cur_dest->node = cur->node; @@ -8521,6 +8594,8 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text) int len = 0; if (!cur) return 0; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); text = eina_unicode_utf8_to_unicode(_text, &len); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); @@ -8589,6 +8664,9 @@ evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *_text { int len; /*append is essentially prepend without advancing */ + if (!cur) return 0; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); len = evas_textblock_cursor_text_append(cur, _text); if (len == 0) return 0; cur->pos += len; /*Advance */ @@ -8768,6 +8846,8 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form Eina_Bool is_visible; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if ((!format) || (format[0] == 0)) return EINA_FALSE; Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); /* We should always have at least one text node */ @@ -8898,6 +8978,10 @@ EAPI Eina_Bool evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format) { Eina_Bool is_visible; + + if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); /* append is essentially prepend without advancing */ is_visible = evas_textblock_cursor_format_append(cur, format); if (is_visible) @@ -8917,6 +9001,8 @@ evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur) int chr, ind, ppos; if (!cur || !cur->node) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); n = cur->node; @@ -8994,6 +9080,8 @@ evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_C if (!cur1 || !cur1->node) return; if (!cur2 || !cur2->node) return; if (cur1->obj != cur2->obj) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur1->obj, MY_CLASS); if (evas_textblock_cursor_compare(cur1, cur2) > 0) { @@ -9092,6 +9180,8 @@ EAPI char * evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur) { if (!cur || !cur->node) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (evas_textblock_cursor_format_is_visible_get(cur)) { Eina_Strbuf *buf; @@ -9304,6 +9394,8 @@ evas_textblock_cursor_range_formats_get(const Evas_Textblock_Cursor *cur1, const if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); eo_obj = cur1->obj; TB_HEAD_RETURN(NULL); @@ -9365,6 +9457,8 @@ evas_textblock_cursor_range_formats_get(const Evas_Textblock_Cursor *cur1, const EAPI char * evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (format == EVAS_TEXTBLOCK_TEXT_MARKUP) return _evas_textblock_cursor_range_text_markup_get(cur1, cur2); else if (format == EVAS_TEXTBLOCK_TEXT_PLAIN) @@ -9378,6 +9472,8 @@ evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur) { Evas_Textblock_Cursor cur1, cur2; if (!cur) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, NULL); if (cur->node->utf8) { @@ -9398,6 +9494,8 @@ evas_textblock_cursor_paragraph_text_length_get(const Evas_Textblock_Cursor *cur { int len; if (!cur) return -1; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, -1); len = eina_ustrbuf_length_get(cur->node->unicode); @@ -9411,6 +9509,8 @@ EAPI const Evas_Object_Textblock_Node_Format * evas_textblock_cursor_format_get(const Evas_Textblock_Cursor *cur) { if (!cur) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, NULL); return _evas_textblock_cursor_node_format_at_pos_get(cur); } @@ -9459,6 +9559,8 @@ EAPI void evas_textblock_cursor_at_format_set(Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Format *fmt) { if (!fmt || !cur) return; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); cur->node = fmt->text_node; cur->pos = _evas_textblock_node_format_pos_get(fmt); } @@ -9469,6 +9571,8 @@ evas_textblock_cursor_format_is_visible_get(const Evas_Textblock_Cursor *cur) const Eina_Unicode *text; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_NULL_CHECK(cur->node, EINA_FALSE); if (!evas_textblock_cursor_is_format(cur)) return EINA_FALSE; text = eina_ustrbuf_string_get(cur->node->unicode); @@ -9499,6 +9603,8 @@ EAPI Eina_Bool evas_textblock_cursor_geometry_bidi_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2, Evas_Textblock_Cursor_Type ctype) { if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -9681,6 +9787,8 @@ evas_textblock_cursor_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord { int ret = -1; if (!cur) return -1; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -9869,6 +9977,7 @@ evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C { if (!cur) return -1; Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); return _evas_textblock_cursor_char_pen_geometry_common_get( ENFN->font_char_coords_get, cur, cx, cy, cw, ch); } @@ -9878,6 +9987,7 @@ evas_textblock_cursor_pen_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Co { if (!cur) return -1; Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); return _evas_textblock_cursor_char_pen_geometry_common_get( ENFN->font_pen_coords_get, cur, cx, cy, cw, ch); } @@ -9890,6 +10000,8 @@ evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C int x, y, w, h; if (!cur) return -1; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -9921,6 +10033,7 @@ evas_textblock_cursor_visible_range_get(Evas_Textblock_Cursor *start, Evas_Textb Evas_Coord cy, ch; Evas_Object *eo_obj = start->obj; Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); TB_HEAD_RETURN(EINA_FALSE); eo_e = evas_object_evas_get(eo_obj); Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS); @@ -9941,6 +10054,8 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, E Evas_Object_Textblock_Item *it = NULL; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -10055,6 +10170,8 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) Evas_Object_Textblock_Line *ln; if (!cur) return -1; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -10446,6 +10563,8 @@ evas_textblock_cursor_range_simple_geometry_get(const Evas_Textblock_Cursor *cur if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur1->obj, MY_CLASS); _relayout_if_needed(cur1->obj, o); @@ -10539,6 +10658,8 @@ evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, cons if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; if (cur1->obj != cur2->obj) return NULL; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur1->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur1->obj, MY_CLASS); _relayout_if_needed(cur1->obj, o); @@ -10611,6 +10732,8 @@ evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord x, y, w, h; if (!cur || !evas_textblock_cursor_format_is_visible_get(cur)) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); Evas_Textblock_Data *o = eo_data_scope_get(cur->obj, MY_CLASS); _relayout_if_needed(cur->obj, o); @@ -10637,6 +10760,8 @@ evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur) Eina_Bool ret = EINA_FALSE; Evas_Textblock_Cursor cur2; if (!cur) return EINA_FALSE; + Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); cur2.obj = cur->obj; evas_textblock_cursor_copy(cur, &cur2); @@ -10655,6 +10780,8 @@ _evas_textblock_line_number_geometry_get(Eo *eo_obj, Evas_Textblock_Data *o, int Evas_Object_Textblock_Line *ln; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _relayout_if_needed(eo_obj, o); ln = _find_layout_line_num(eo_obj, line); @@ -10678,6 +10805,8 @@ _evas_textblock_clear(Eo *eo_obj, Evas_Textblock_Data *o) Eina_List *l; Evas_Textblock_Cursor *cur; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (o->paragraphs) { _paragraphs_free(eo_obj, o->paragraphs); @@ -10712,6 +10841,8 @@ evas_object_textblock_clear(Evas_Object *eo_obj) EOLIAN static void _evas_textblock_size_formatted_get(Eo *eo_obj, Evas_Textblock_Data *o, Evas_Coord *w, Evas_Coord *h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _relayout_if_needed(eo_obj, o); if (w) *w = o->formatted.w; @@ -10949,6 +11080,8 @@ _size_native_calc_paragraph_size(const Evas_Object *eo_obj, EOLIAN static void _evas_textblock_size_native_get(Eo *eo_obj, Evas_Textblock_Data *o, Evas_Coord *w, Evas_Coord *h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!o->native.valid) { Evas_Coord wmax = 0, hmax = 0; @@ -10981,6 +11114,8 @@ _evas_textblock_size_native_get(Eo *eo_obj, Evas_Textblock_Data *o, Evas_Coord * EOLIAN static void _evas_textblock_style_insets_get(Eo *eo_obj, Evas_Textblock_Data *o, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); _relayout_if_needed(eo_obj, o); if (l) *l = o->style_pad.l; diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c index 443e736d14..122e8e7c2c 100644 --- a/src/lib/evas/canvas/evas_object_textgrid.c +++ b/src/lib/evas/canvas/evas_object_textgrid.c @@ -1079,11 +1079,13 @@ EOLIAN static void _evas_textgrid_size_set(Eo *eo_obj, Evas_Textgrid_Data *o, int w, int h) { int i; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((h <= 0) || (w <= 0)) return; if ((o->cur.w == w) && (o->cur.h == h)) return; + evas_object_async_block(obj); evas_object_textgrid_rows_clear(eo_obj); if (o->cur.rows) { @@ -1113,7 +1115,6 @@ _evas_textgrid_size_set(Eo *eo_obj, Evas_Textgrid_Data *o, int w, int h) o->cur.h = h; o->changed = 1; o->core_change = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1127,6 +1128,7 @@ _evas_textgrid_size_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, int *w, i EOLIAN static void _evas_textgrid_efl_text_properties_font_source_set(Eo *eo_obj, Evas_Textgrid_Data *o, const char *font_source) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); if ((!font_source) || (!*font_source)) return; @@ -1134,10 +1136,10 @@ _evas_textgrid_efl_text_properties_font_source_set(Eo *eo_obj, Evas_Textgrid_Dat if ((o->cur.font_source) && (font_source) && (!strcmp(o->cur.font_source, font_source))) return; + evas_object_async_block(obj); eina_stringshare_replace(&o->cur.font_source, font_source); o->changed = 1; o->core_change = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1159,6 +1161,7 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, Evas_Textgrid_Data *o, c if ((!font_name) || (!*font_name) || (font_size <= 0)) return; + evas_object_async_block(obj); font_description = evas_font_desc_new(); evas_font_name_parse(font_description, font_name); if (o->cur.font_description && @@ -1303,6 +1306,7 @@ _evas_textgrid_palette_set(Eo *eo_obj, Evas_Textgrid_Data *o, Evas_Textgrid_Pale Eina_Array *palette; Evas_Object_Textgrid_Color *color, *c; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); int count, i; if ((idx < 0) || (idx > 255)) return; @@ -1327,6 +1331,7 @@ _evas_textgrid_palette_set(Eo *eo_obj, Evas_Textgrid_Data *o, Evas_Textgrid_Pale ERR("Evas only handles pre multiplied colors!"); } + evas_object_async_block(obj); switch (pal) { case EVAS_TEXTGRID_PALETTE_STANDARD: @@ -1380,7 +1385,6 @@ _evas_textgrid_palette_set(Eo *eo_obj, Evas_Textgrid_Data *o, Evas_Textgrid_Pale o->changed = 1; o->pal_change = 1; evas_object_textgrid_rows_clear(eo_obj); - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } @@ -1445,6 +1449,8 @@ EOLIAN static Evas_Textgrid_Cell* _evas_textgrid_cellrow_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, int y) { Evas_Textgrid_Cell *ret; + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); + evas_object_async_block(obj); if ((y < 0) || (y >= o->cur.h)) ret = NULL; ret = o->cur.cells + (y * o->cur.w); @@ -1455,11 +1461,13 @@ _evas_textgrid_cellrow_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, int y) EOLIAN static void _evas_textgrid_update_add(Eo *eo_obj, Evas_Textgrid_Data *o, int x, int y, int w, int h) { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); int i, x2; RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, o->cur.w, o->cur.h); if ((w <= 0) || (h <= 0)) return; + evas_object_async_block(obj); x2 = x + w - 1; for (i = 0; i < h; i++) { @@ -1479,7 +1487,6 @@ _evas_textgrid_update_add(Eo *eo_obj, Evas_Textgrid_Data *o, int x, int y, int w } o->row_change = 1; o->changed = 1; - Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); evas_object_change(eo_obj, obj); } diff --git a/src/lib/evas/canvas/evas_out.c b/src/lib/evas/canvas/evas_out.c index 27f459e37c..ce00eb3fde 100644 --- a/src/lib/evas/canvas/evas_out.c +++ b/src/lib/evas/canvas/evas_out.c @@ -31,6 +31,7 @@ _evas_out_eo_base_constructor(Eo *eo_obj, Evas_Out_Data *eo_dat) eo_do(eo_obj, eo_parent = eo_parent_get()); e = eo_data_scope_get(eo_parent, EVAS_CANVAS_CLASS); + evas_canvas_async_block(e); eo_do_super(eo_obj, MY_CLASS, eo_constructor()); @@ -56,7 +57,8 @@ _evas_out_eo_base_destructor(Eo *eo_obj, Evas_Out_Data *eo_dat) eo_do(eo_obj, eo_parent = eo_parent_get()); e = eo_data_scope_get(eo_parent, EVAS_CANVAS_CLASS); - if (!e) return ; + evas_canvas_async_block(e); + if (!e) return; // XXX: need to free output and context one they get allocated one day // e->engine.func->context_free(eo_dat->output, eo_dat->context); // e->engine.func->output_free(eo_dat->output); @@ -66,8 +68,13 @@ _evas_out_eo_base_destructor(Eo *eo_obj, Evas_Out_Data *eo_dat) } EOLIAN static void -_evas_out_view_set(Eo *eo_e EINA_UNUSED, Evas_Out_Data *eo_dat, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +_evas_out_view_set(Eo *eo_e, Evas_Out_Data *eo_dat, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { + Eo *eo_parent = NULL; + Evas_Public_Data *e; + eo_do(eo_e, eo_parent = eo_parent_get()); + e = eo_data_scope_get(eo_parent, EVAS_CANVAS_CLASS); + evas_canvas_async_block(e); eo_dat->x = x; eo_dat->y = y; eo_dat->w = w; @@ -86,8 +93,13 @@ _evas_out_view_get(Eo *eo_e EINA_UNUSED, Evas_Out_Data *eo_dat, Evas_Coord *x, E } EOLIAN static Eina_Bool -_evas_out_engine_info_set(Eo *eo_e EINA_UNUSED, Evas_Out_Data *eo_dat, Evas_Engine_Info *info) +_evas_out_engine_info_set(Eo *eo_e, Evas_Out_Data *eo_dat, Evas_Engine_Info *info) { + Eo *eo_parent = NULL; + Evas_Public_Data *e; + eo_do(eo_e, eo_parent = eo_parent_get()); + e = eo_data_scope_get(eo_parent, EVAS_CANVAS_CLASS); + evas_canvas_async_block(e); if (eo_dat->info != info) return EINA_FALSE; // XXX: handle setting of engine info here diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 1d2db2a5f3..b88c224931 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -159,6 +159,7 @@ _evas_canvas_damage_rectangle_add(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int { Eina_Rectangle *r; + evas_canvas_async_block(e); NEW_RECT(r, x, y, w, h); if (!r) return; e->damages = eina_list_append(e->damages, r); @@ -170,6 +171,7 @@ _evas_canvas_obscured_rectangle_add(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, i { Eina_Rectangle *r; + evas_canvas_async_block(e); NEW_RECT(r, x, y, w, h); if (!r) return; e->obscures = eina_list_append(e->obscures, r); @@ -180,6 +182,7 @@ _evas_canvas_obscured_clear(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { Eina_Rectangle *r; + evas_canvas_async_block(e); EINA_LIST_FREE(e->obscures, r) { eina_rectangle_free(r); @@ -2716,6 +2719,7 @@ _evas_canvas_render_async(Eo *eo_e, Evas_Public_Data *e) { static int render_2 = -1; + evas_canvas_async_block(e); if (render_2 == -1) { if (getenv("EVAS_RENDER2")) render_2 = 1; @@ -2759,10 +2763,12 @@ evas_render_updates_internal_wait(Evas *eo_e, return ret; } + EOLIAN Eina_List* _evas_canvas_render_updates(Eo *eo_e, Evas_Public_Data *e) { if (!e->changed) return NULL; + evas_canvas_async_block(e); return evas_render_updates_internal_wait(eo_e, 1, 1); } @@ -2770,12 +2776,14 @@ EOLIAN void _evas_canvas_render(Eo *eo_e, Evas_Public_Data *e) { if (!e->changed) return; + evas_canvas_async_block(e); evas_render_updates_internal_wait(eo_e, 0, 1); } EOLIAN void -_evas_canvas_norender(Eo *eo_e, Evas_Public_Data *_pd EINA_UNUSED) +_evas_canvas_norender(Eo *eo_e, Evas_Public_Data *e) { + evas_canvas_async_block(e); // if (!e->changed) return; evas_render_updates_internal_wait(eo_e, 0, 0); } @@ -2785,6 +2793,7 @@ _evas_canvas_render_idle_flush(Eo *eo_e, Evas_Public_Data *e) { static int render_2 = -1; + evas_canvas_async_block(e); if (render_2 == -1) { if (getenv("EVAS_RENDER2")) render_2 = 1; @@ -2823,6 +2832,7 @@ _evas_canvas_sync(Eo *eo_e, Evas_Public_Data *e) { static int render_2 = -1; + evas_canvas_async_block(e); if (render_2 == -1) { if (getenv("EVAS_RENDER2")) render_2 = 1; @@ -2861,6 +2871,7 @@ _evas_canvas_render_dump(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { static int render_2 = -1; + evas_canvas_async_block(e); if (render_2 == -1) { if (getenv("EVAS_RENDER2")) render_2 = 1; diff --git a/src/lib/evas/canvas/evas_stack.c b/src/lib/evas/canvas/evas_stack.c index 5335acfb2e..78fa9dc7cc 100644 --- a/src/lib/evas/canvas/evas_stack.c +++ b/src/lib/evas/canvas/evas_stack.c @@ -40,6 +40,7 @@ evas_object_below_get_internal(const Evas_Object_Protected_Data *obj) EOLIAN void _evas_object_raise(Eo *eo_obj, Evas_Object_Protected_Data *obj) { + evas_object_async_block(obj); if (evas_object_intercept_call_raise(eo_obj, obj)) return; if (!((EINA_INLIST_GET(obj))->next)) @@ -86,6 +87,7 @@ _evas_object_raise(Eo *eo_obj, Evas_Object_Protected_Data *obj) EOLIAN void _evas_object_lower(Eo *eo_obj, Evas_Object_Protected_Data *obj) { + evas_object_async_block(obj); if (evas_object_intercept_call_lower(eo_obj, obj)) return; if (!((EINA_INLIST_GET(obj))->prev)) @@ -133,6 +135,7 @@ _evas_object_lower(Eo *eo_obj, Evas_Object_Protected_Data *obj) EOLIAN void _evas_object_stack_above(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object *eo_above) { + evas_object_async_block(obj); if (!eo_above) { evas_object_raise(eo_obj); @@ -208,6 +211,7 @@ _evas_object_stack_above(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Objec EOLIAN void _evas_object_stack_below(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object *eo_below) { + evas_object_async_block(obj); if (!eo_below) { evas_object_lower(eo_obj); diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index cfd318279b..3426d15fec 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -367,4 +367,24 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) EINA_COW_STATE_WRITE_END(obj, state_write, cur); } +static inline void +evas_object_async_block(Evas_Object_Protected_Data *obj) +{ + if ((obj) && (obj->layer)) + { + eina_lock_take(&(obj->layer->evas->lock_objects)); + eina_lock_release(&(obj->layer->evas->lock_objects)); + } +} + +static inline void +evas_canvas_async_block(Evas_Public_Data *e) +{ + if (e) + { + eina_lock_take(&(e->lock_objects)); + eina_lock_release(&(e->lock_objects)); + } +} + #endif diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index ceab19d960..5f69b22d41 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -719,6 +719,9 @@ struct _Evas_Public_Data Eina_Hash *name_hash; + // locking so we can implement async rendering threads + Eina_Lock lock_objects; + int output_validity; int walking_list;