From 0d6c44e3e3c3344da49b5d822fe8c95a35ff1e5e 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 | 16 ++++++++++++++++ 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, 26 insertions(+), 21 deletions(-) diff --git a/src/bin/core/e_client.c b/src/bin/core/e_client.c index c6fde138f4..04b8801cc6 100644 --- a/src/bin/core/e_client.c +++ b/src/bin/core/e_client.c @@ -24,6 +24,7 @@ #include "e_comp_canvas_intern.h" #include "e_hwc_window_intern.h" #include "e_canvas_intern.h" +#include "e_policy_visibility_intern.h" #define PRI(ec) ((E_Client_Private *)e_object_data_get(E_OBJECT(ec))) @@ -8832,3 +8833,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 048fc3b4d5..b7319772bd 100644 --- a/src/bin/core/e_client_intern.h +++ b/src/bin/core/e_client_intern.h @@ -287,4 +287,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 af6bebe4f0..ebad2c35bd 100644 --- a/src/bin/displaymgr/e_hwc_window.c +++ b/src/bin/displaymgr/e_hwc_window.c @@ -2822,9 +2822,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 81f6087b3b..af6251221c 100644 --- a/src/bin/displaymgr/e_hwc_window_queue.c +++ b/src/bin/displaymgr/e_hwc_window_queue.c @@ -1375,9 +1375,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); @@ -1595,9 +1593,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); @@ -1701,9 +1697,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 175cfd9f39..5044071754 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -3006,12 +3006,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); buffer = e_surface_buffer_try_get(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 7bfc3c0ca3..37953b3fb4 100644 --- a/src/bin/windowmgr/e_policy.c +++ b/src/bin/windowmgr/e_policy.c @@ -2184,8 +2184,7 @@ _e_policy_client_pixmap_buffer_clear(E_Policy_Client *policy_client, Eina_Bool o E_Tizen_Surface_Shm *surface_shm; E_Tizen_Surface_Shm_Flusher *surface_shm_flusher = NULL; - /* 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; surface_shm = (E_Tizen_Surface_Shm *)e_server_feature_handle_get(E_SERVER_FEATURE_TIZEN_SURFACE_SHM); if (surface_shm) diff --git a/src/bin/windowmgr/e_policy_visibility.c b/src/bin/windowmgr/e_policy_visibility.c index a3f99b81e1..77b7928a9c 100644 --- a/src/bin/windowmgr/e_policy_visibility.c +++ b/src/bin/windowmgr/e_policy_visibility.c @@ -1129,7 +1129,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