E_Comp_Image_Filter image_filter;
Eina_Bool set_mouse_callbacks;
- int render_update_lock;
- E_Comp_Wl_Buffer_Ref render_update_lock_buffer_ref;
+ struct
+ {
+ int lock;
+ E_Comp_Wl_Buffer_Ref buffer_ref;
+ Eina_Bool pending_move_set;
+ int pending_move_x, pending_move_y;
+ Eina_Bool pending_resize_set;
+ int pending_resize_w, pending_resize_h;
+ } render_update_lock;
} E_Comp_Object;
typedef struct _E_Input_Rect_Data
E_Comp_Object *cw = data;
int ix, iy, fx, fy;
+ if (cw->render_update_lock.lock)
+ {
+ cw->render_update_lock.pending_move_x = x;
+ cw->render_update_lock.pending_move_y = y;
+ cw->render_update_lock.pending_move_set = EINA_TRUE;
+ return;
+ }
+
if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
(e_pixmap_usable_get(cw->ec->pixmap)) &&
(cw->external_content))
E_Comp_Object *cw = data;
int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
+ if (cw->render_update_lock.lock)
+ {
+ cw->render_update_lock.pending_resize_w = w;
+ cw->render_update_lock.pending_resize_h = h;
+ cw->render_update_lock.pending_resize_set = EINA_TRUE;
+ return;
+ }
+
if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
{
e_client_size_set(cw->ec, w, h);
cw->tbm_surface = NULL;
}
- if (cw->render_update_lock_buffer_ref.buffer)
+ if (cw->render_update_lock.buffer_ref.buffer)
{
ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
- cw->ec, cw->render_update_lock);
- e_comp_wl_buffer_reference(&cw->render_update_lock_buffer_ref, NULL);
+ cw->ec, cw->render_update_lock.lock);
+ e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
}
e_comp_object_render_update_del(cw->smart_obj);
API_ENTRY;
if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
- if (cw->render_update_lock) return;
+ if (cw->render_update_lock.lock) return;
if (e_object_is_del(E_OBJECT(cw->ec)))
CRI("CAN'T RENDER A DELETED CLIENT!!! ec:%p", cw->ec);
if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+ if (cw->render_update_lock.lock) return;
+
if (cw->ec->pixmap)
e_pixmap_clear(cw->ec->pixmap);
if (cw->native)
EINA_SAFETY_ON_NULL_RETURN(cw->ec);
if (cw->ec->input_only) return;
if (cw->external_content) return;
+ if (cw->render_update_lock.lock) return;
set = !!set;
memset(&ns, 0, sizeof(Evas_Native_Surface));
API_ENTRY;
if (cw->external_content) return;
if (!cw->redirected) return;
+ if (cw->render_update_lock.lock)
+ {
+ ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
+ return;
+ }
/* only actually dirty if pixmap is available */
if (!e_pixmap_resource_get(cw->ec->pixmap))
{
/* if comp object is not redirected state, comp object should not be set by newly committed data
because image size of comp object is 1x1 and it should not be shown on canvas */
if (!cw->redirected) return EINA_TRUE;
+ if (cw->render_update_lock.lock)
+ {
+ ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
+ return EINA_TRUE;
+ }
e_comp_object_render_update_del(obj);
if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
{
API_ENTRY EINA_FALSE;
- cw->render_update_lock++;
-
- if (cw->render_update_lock == 1)
+ if (cw->render_update_lock.lock == 0)
{
- e_comp_wl_buffer_reference(&cw->render_update_lock_buffer_ref,
+ _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
+ e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref,
e_pixmap_resource_get(cw->ec->pixmap));
e_comp_object_render_update_del(obj);
- _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
ELOGF("COMP", "Render update lock enabled", cw->ec);
}
+ cw->render_update_lock.lock++;
+
return EINA_TRUE;
}
{
API_ENTRY;
- if (cw->render_update_lock == 0)
+ if (cw->render_update_lock.lock == 0)
return;
- cw->render_update_lock--;
+ cw->render_update_lock.lock--;
- if (cw->render_update_lock == 0)
+ if (cw->render_update_lock.lock == 0)
{
- e_comp_wl_buffer_reference(&cw->render_update_lock_buffer_ref, NULL);
- e_comp_object_render_update_add(obj);
+
+ if (cw->render_update_lock.pending_move_set)
+ {
+ evas_object_move(obj,
+ cw->render_update_lock.pending_move_x,
+ cw->render_update_lock.pending_move_y);
+ cw->render_update_lock.pending_move_x = 0;
+ cw->render_update_lock.pending_move_y = 0;
+ cw->render_update_lock.pending_move_set = EINA_FALSE;
+ }
+
+ if (cw->render_update_lock.pending_resize_set)
+ {
+ evas_object_resize(obj,
+ cw->render_update_lock.pending_resize_w,
+ cw->render_update_lock.pending_resize_h);
+ cw->render_update_lock.pending_resize_w = 0;
+ cw->render_update_lock.pending_resize_h = 0;
+ cw->render_update_lock.pending_resize_set = EINA_FALSE;
+ }
+
+ e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
+
+ if ((cw->ec->exp_iconify.buffer_flush) &&
+ (e_policy_visibility_client_is_iconic(cw->ec)) &&
+ (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
+ e_comp_object_clear(obj);
+ else
+ e_comp_object_render_update_add(obj);
+
ELOGF("COMP", "Render update lock disabled", cw->ec);
}
}
{
API_ENTRY EINA_FALSE;
- if (cw->render_update_lock > 0)
+ if (cw->render_update_lock.lock > 0)
return EINA_TRUE;
return EINA_FALSE;