From 0c61d73deba7dbccd1efeb78cb81c5bf10d1a267 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 6 Mar 2025 18:52:39 +0900 Subject: [PATCH] e_policy: Flush buffer of e_client when client is unmap state Change-Id: I8fc4248b06a7395e518fd40870486354ff3ec608 --- src/bin/core/e_client.c | 15 +++++++++++++++ src/bin/core/e_client_intern.h | 2 ++ src/bin/displaymgr/e_hwc_window.c | 4 +--- src/bin/displaymgr/e_hwc_window_queue.c | 12 +++--------- src/bin/server/e_comp_wl.c | 8 ++------ src/bin/windowmgr/e_policy.c | 3 +-- src/bin/windowmgr/e_policy_visibility.c | 2 +- 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/bin/core/e_client.c b/src/bin/core/e_client.c index 7c80f73199..d2a746d5a2 100644 --- a/src/bin/core/e_client.c +++ b/src/bin/core/e_client.c @@ -8840,3 +8840,18 @@ e_client_subsurface_data_try_get(E_Client *ec) { return ec->comp_data ? ec->comp_data->sub.data : NULL; } + +EINTERN Eina_Bool +e_client_buffer_flush_enabled_get(E_Client *ec) +{ + if (!ec) return EINA_FALSE; + if (!ec->comp_data) return EINA_FALSE; + if (!ec->exp_iconify.buffer_flush) return EINA_FALSE; + if (e_view_client_visible_get(e_client_view_get(ec))) return EINA_FALSE; + if (ec->is_cursor) return EINA_FALSE; + + if (e_policy_visibility_client_is_iconic(ec)) return EINA_TRUE; + if (!ec->comp_data->mapped) return EINA_TRUE; + + return EINA_FALSE; +} diff --git a/src/bin/core/e_client_intern.h b/src/bin/core/e_client_intern.h index c5db9373d6..654520dad9 100644 --- a/src/bin/core/e_client_intern.h +++ b/src/bin/core/e_client_intern.h @@ -274,4 +274,6 @@ int e_client_virtual_touch_finger_get(E_Client *ec); void e_client_virtual_touch_threshold_set(E_Client *ec, int threshold); int e_client_virtual_touch_threshold_get(E_Client *ec); +EINTERN Eina_Bool e_client_buffer_flush_enabled_get(E_Client *ec); + #endif diff --git a/src/bin/displaymgr/e_hwc_window.c b/src/bin/displaymgr/e_hwc_window.c index 4da34ff3d7..f7b2bf16b3 100644 --- a/src/bin/displaymgr/e_hwc_window.c +++ b/src/bin/displaymgr/e_hwc_window.c @@ -2741,9 +2741,7 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window, Eina_Bool *clear_attach) comp_wl_buffer = _e_hwc_window_comp_wl_buffer_get(hwc_window); if ((!comp_wl_buffer) && - (!e_view_client_visible_get(e_client_view_get(ec))) && - (ec->exp_iconify.buffer_flush) && - (e_policy_visibility_client_is_iconic(ec))) + (e_client_buffer_flush_enabled_get(ec))) return EINA_FALSE; if (!comp_wl_buffer) diff --git a/src/bin/displaymgr/e_hwc_window_queue.c b/src/bin/displaymgr/e_hwc_window_queue.c index a6cf7ee98e..f57784dde3 100644 --- a/src/bin/displaymgr/e_hwc_window_queue.c +++ b/src/bin/displaymgr/e_hwc_window_queue.c @@ -1374,9 +1374,7 @@ _e_hwc_window_queue_copy_thread_run_end_cb(void *data, Ecore_Thread *thread) if (!(ec = copy_thread_data->hwc_window->ec)) goto end; if (!e_client_cdata_get(ec)) goto end; - if ((!e_view_client_visible_get(e_client_view_get(ec))) && - (ec->exp_iconify.buffer_flush) && - (e_policy_visibility_client_is_iconic(ec))) + if (e_client_buffer_flush_enabled_get(ec)) goto end; comp_buffer = _comp_wl_buffer_get(ec); @@ -1594,9 +1592,7 @@ _e_hwc_window_queue_prepare_unset(E_Hwc_Window_Queue *queue) if (!hwc_window->ec) return; - if ((!e_view_client_visible_get(e_client_view_get(hwc_window->ec))) && - (hwc_window->ec->exp_iconify.buffer_flush) && - (e_policy_visibility_client_is_iconic(hwc_window->ec))) + if (e_client_buffer_flush_enabled_get(hwc_window->ec)) return; _e_hwc_window_queue_copy_thread_check_and_run(hwc_window); @@ -1700,9 +1696,7 @@ _e_hwc_window_queue_cb_buffer_change(void *data, E_Client *ec) hwc_window = ec->hwc_window; if (!hwc_window) return; - if ((!e_view_client_visible_get(e_client_view_get(ec))) && - (ec->exp_iconify.buffer_flush) && - (e_policy_visibility_client_is_iconic(ec))) + if (e_client_buffer_flush_enabled_get(hwc_window->ec)) return; _e_hwc_window_queue_copy_thread_check_and_run(hwc_window); diff --git a/src/bin/server/e_comp_wl.c b/src/bin/server/e_comp_wl.c index ca5b2b9189..a566aeeefa 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -3237,12 +3237,8 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state) wl_signal_emit(&cdata->state_commit_signal, &cdata->surface); - if (buffer && - ec->exp_iconify.buffer_flush && - e_policy_visibility_client_is_iconic(ec)) - { - e_pixmap_buffer_clear(ec->pixmap, EINA_FALSE); - } + if ((buffer) && (e_client_buffer_flush_enabled_get(ec))) + e_pixmap_buffer_clear(ec->pixmap, EINA_FALSE); } static void diff --git a/src/bin/windowmgr/e_policy.c b/src/bin/windowmgr/e_policy.c index c9d17aae02..58f7b99729 100644 --- a/src/bin/windowmgr/e_policy.c +++ b/src/bin/windowmgr/e_policy.c @@ -2192,8 +2192,7 @@ _e_policy_client_pixmap_buffer_clear(E_Policy_Client *policy_client, Eina_Bool o E_Pixmap *pixmap = ec->pixmap; E_Surface *surface; - /* if not only free, client should be iconic state */ - if (!only_free && !e_policy_visibility_client_is_iconic(ec)) return; + if ((!only_free) && (!e_client_buffer_flush_enabled_get(ec))) return; E_Tizen_Surface_Shm *surface_shm; E_Tizen_Surface_Shm_Flusher *surface_shm_flusher; diff --git a/src/bin/windowmgr/e_policy_visibility.c b/src/bin/windowmgr/e_policy_visibility.c index 64cac39334..1dbe02262e 100644 --- a/src/bin/windowmgr/e_policy_visibility.c +++ b/src/bin/windowmgr/e_policy_visibility.c @@ -1124,7 +1124,7 @@ _e_vis_client_cb_hide(struct wl_listener *listener, void *data) VS_DBG(ec, "\tUPDATE ICONIC STATE: %s", STATE_STR(vc)); vc->prepare_emitted = 0; - if (ec->iconic && ec->exp_iconify.buffer_flush) + if (e_client_buffer_flush_enabled_get(ec)) e_pixmap_buffer_clear(ec->pixmap, EINA_FALSE); } -- 2.34.1