if (e_hwc_window_is_video(ec->hwc_window)) return;
e_hwc_window_constraints_reset(ec->hwc_window);
-
- e_hwc_window_free(ec->hwc_window);
}
static Eina_Bool
hwc_window->ec = NULL;
hwc_window->is_deleted = EINA_TRUE;
+ /* if delfn is called, ec_delfn should be set null
+ * before we get here */
+ if (hwc_window->ec_delfn)
+ {
+ e_object_delfn_del(E_OBJECT(ec), hwc_window->ec_delfn);
+ hwc_window->ec_delfn = NULL;
+ }
+
if (hwc_window->queue)
{
e_hwc_window_queue_user_unset(hwc_window->queue, hwc_window);
e_object_del(E_OBJECT(hwc_window));
}
+static void
+_e_hwc_window_cb_ec_free(void *data, void *obj)
+{
+ E_Client *ec = (E_Client *)obj;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ if (ec->hwc_window)
+ {
+ /* if delfn is called, ec_delfn should be set null */
+ ec->hwc_window->ec_delfn = NULL;
+ e_hwc_window_free(ec->hwc_window);
+ }
+}
+
EINTERN E_Hwc_Window *
e_hwc_window_new(E_Hwc *hwc, E_Client *ec, E_Hwc_Window_State state)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, NULL);
hwc_window->hwc = hwc;
- hwc_window->ec = ec;
hwc_window->zpos = E_HWC_WINDOW_ZPOS_NONE;
hwc_window->render_target = EINA_TRUE;
hwc_window->device_state_available = EINA_TRUE;
hwc_window->is_cursor = EINA_TRUE;
/* set the hwc window to the e client */
+ hwc_window->ec = ec;
+ hwc_window->ec_delfn = e_object_delfn_add(E_OBJECT(ec),
+ _e_hwc_window_cb_ec_free,
+ NULL);
ec->hwc_window = hwc_window;
hwc->hwc_windows = eina_list_append(hwc->hwc_windows, hwc_window);
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
pointer = e_pointer_get(ec);
if (!pointer) return EINA_TRUE;
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
hwc = hwc_window->hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
if (!e_client_video_info_get(ec, &vinfo))
{
e_hwc_window_info_update(E_Hwc_Window *hwc_window)
{
tdm_hwc_window_info hwc_win_info = {0};
+ E_Client *ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
if (hwc_window->is_deleted) return EINA_FALSE;
- if (e_hwc_window_is_cursor(hwc_window))
+ if (hwc_window->is_target)
{
- if (!_e_hwc_window_cursor_info_get(hwc_window, &hwc_win_info))
+ if (!_e_hwc_window_target_info_get(hwc_window, &hwc_win_info))
{
- EHWERR("fail to _e_hwc_window_cursor_info_get",
+ EHWERR("fail to _e_hwc_window_target_info_get",
hwc_window->ec, hwc_window->hwc, hwc_window);
return EINA_FALSE;
}
}
- else if (e_hwc_window_is_video(hwc_window))
+ else
{
- if (!_e_hwc_window_video_info_get(hwc_window, &hwc_win_info))
+ ec = hwc_window->ec;
+ if (!ec) return EINA_FALSE;
+
+ if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
+
+ if (e_hwc_window_is_cursor(hwc_window))
{
- EHWERR("fail to _e_hwc_window_video_info_get",
- hwc_window->ec, hwc_window->hwc, hwc_window);
- return EINA_FALSE;
+ if (!_e_hwc_window_cursor_info_get(hwc_window, &hwc_win_info))
+ {
+ EHWERR("fail to _e_hwc_window_cursor_info_get",
+ hwc_window->ec, hwc_window->hwc, hwc_window);
+ return EINA_FALSE;
+ }
}
- }
- else if (hwc_window->is_target)
- {
- if (!_e_hwc_window_target_info_get(hwc_window, &hwc_win_info))
+ else if (e_hwc_window_is_video(hwc_window))
{
- EHWERR("fail to _e_hwc_window_target_info_get",
- hwc_window->ec, hwc_window->hwc, hwc_window);
- return EINA_FALSE;
+ if (!_e_hwc_window_video_info_get(hwc_window, &hwc_win_info))
+ {
+ EHWERR("fail to _e_hwc_window_video_info_get",
+ hwc_window->ec, hwc_window->hwc, hwc_window);
+ return EINA_FALSE;
+ }
}
- }
- else
- {
- if (!_e_hwc_window_info_get(hwc_window, &hwc_win_info))
+ else
{
- EHWERR("fail to _e_hwc_window_info_get",
- hwc_window->ec, hwc_window->hwc, hwc_window);
- return EINA_FALSE;
+ if (!_e_hwc_window_info_get(hwc_window, &hwc_win_info))
+ {
+ EHWERR("fail to _e_hwc_window_info_get",
+ hwc_window->ec, hwc_window->hwc, hwc_window);
+ return EINA_FALSE;
+ }
}
}
tdm_hwc_window *thwc_window = NULL;
tdm_error error = TDM_ERROR_NONE;
E_Hwc_Window_Queue_Buffer *queue_buffer = NULL, *queue_buffer2 = NULL;
+ E_Client *ec = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
return EINA_TRUE;
}
- if (hwc_window->is_deleted)
+ ec = hwc_window->ec;
+
+ if ((hwc_window->is_deleted) || (!ec) || e_object_is_del(E_OBJECT(ec)))
{
tsurface = NULL;
if (!hwc_window->buffer.tsurface) return EINA_FALSE;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
- if (hwc_window->is_deleted)
+ ec = hwc_window->ec;
+
+ if ((hwc_window->is_deleted) || (!ec) || e_object_is_del(E_OBJECT(ec)))
{
restriction = E_HWC_WINDOW_RESTRICTION_DELETED;
available = EINA_FALSE;
goto finish;
}
- ec = hwc_window->ec;
- EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
-
if (ec->comp_override > 0)
{
restriction = E_HWC_WINDOW_RESTRICTION_OVERRIDE;
tbm_surface_h tsurface =NULL;
E_Client *ec = NULL;
+ if (hwc_window->is_deleted) return;
+
ec = hwc_window->ec;
- EINA_SAFETY_ON_NULL_RETURN(ec);
+ if (!ec) return;
+
+ if (e_object_is_del(E_OBJECT(ec))) return;
recover_buffer = _e_hwc_window_comp_wl_buffer_get(hwc_window);
if (!recover_buffer)
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+ if (hwc_window->is_deleted) return EINA_FALSE;
+
ec = hwc_window->ec;
- EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ if (!ec) return EINA_FALSE;
+
+ if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
if (hwc_window->render_target == set) return EINA_TRUE;
if (hwc_window->is_deleted) return EINA_TRUE;
ec = hwc_window->ec;
- EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ if (!ec) return EINA_TRUE;
+
+ if (e_object_is_del(E_OBJECT(ec))) return EINA_TRUE;
if (hwc_window->is_cursor)
pointer = e_pointer_get(hwc_window->ec);
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
if (force)
{
if (hwc_window->is_deleted) return EINA_TRUE;
ec = hwc_window->ec;
- EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ if (!ec) return EINA_TRUE;
+
+ if (e_object_is_del(E_OBJECT(ec))) return EINA_TRUE;
if (hwc_window->is_cursor)
pointer = e_pointer_get(hwc_window->ec);