e_comp: Delay rendering and displaying until first evas object is shown 45/317145/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 2 Dec 2024 02:22:21 +0000 (11:22 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 26 Dec 2024 04:19:10 +0000 (13:19 +0900)
if canvas_render_delay_after_boot is set, rendering and displaying
are delayed until first evas object is shown.

Change-Id: I34321def1edb2782c35e94e9935531baf449b6b3

src/bin/compmgr/e_comp.c
src/bin/compmgr/e_comp_intern.h
src/bin/compmgr/e_comp_object.c
src/bin/server/e_compositor.c

index 8a4d2ab43750ff81425c4515451ab8598f03a6b8..a5109dfc3084e7f93984c4afd5862bf5ef451db3 100644 (file)
@@ -269,6 +269,23 @@ _e_comp_screensaver_off(void *data EINA_UNUSED, int type EINA_UNUSED, void *even
 
 //////////////////////////////////////////////////////////////////////////
 
+EINTERN void
+e_comp_canvas_render_delayed_unset(E_Comp *comp)
+{
+   E_Comp_Config *comp_conf;
+
+   EINA_SAFETY_ON_NULL_RETURN(comp);
+
+   comp_conf = e_comp_config_get();
+   if (!comp_conf) return;
+   if (!comp_conf->canvas_render_delay_after_boot) return;
+   if (!comp->canvas_render_delayed) return;
+
+   ELOGF("COMP", "Begin canvas update for the first time after boot", NULL);
+
+   comp->canvas_render_delayed = EINA_FALSE;
+}
+
 EINTERN Eina_Bool
 e_comp_init(void)
 {
index e129876fa1d4d0bc9f3d9705c4dfb471f2985f6a..31e6c8aab1e7c32516ae0012452d06da5d890969 100644 (file)
@@ -65,4 +65,6 @@ EINTERN E_Client     *e_comp_launchscrn_ec_find_by_pid(pid_t pid);
 EINTERN void          e_comp_launchscrn_ec_remove(E_Client *ec);
 EINTERN void          e_comp_launchscrn_ec_add(E_Client *ec);
 
+EINTERN void          e_comp_canvas_render_delayed_unset(E_Comp *comp);
+
 #endif
index 22ea3ad72682eb245af4d533160a1125cf79bc87..d65c5878c20de19cd490f1ce39d523888a3742f4 100644 (file)
@@ -2010,6 +2010,8 @@ _e_comp_intercept_show_helper(E_Comp_Object *cw, E_Comp *comp)
         ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
         evas_object_show(cw->smart_obj);
 
+        e_comp_canvas_render_delayed_unset(e_comp_get());
+
         if (!ec->iconic)
           e_client_focus_defer_set(ec);
 
@@ -2111,6 +2113,8 @@ _e_comp_intercept_show_helper(E_Comp_Object *cw, E_Comp *comp)
              ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
              evas_object_show(cw->smart_obj);
 
+             e_comp_canvas_render_delayed_unset(e_comp_get());
+
              /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
                 it is rendered in idle callback without native surface and
                 compositor shows an empty frame if other objects aren't shown
index cf6b70045475b86dbd95ff89172da3bf513d2f6f..3ce250d3e9cba04e45f39c963345b3482a7c4096 100644 (file)
@@ -1356,7 +1356,6 @@ static void
 _e_surface_commit_pre(E_Surface *surface)
 {
    E_Client *ec = surface->ec;
-   E_Comp_Config *comp_conf = NULL;
 
    if (!surface->base.first_commit)
      surface->base.first_commit = EINA_TRUE;
@@ -1365,19 +1364,7 @@ _e_surface_commit_pre(E_Surface *surface)
      {
         if (surface->base.shell.surface && surface->base.pending.new_attach &&
             !ec->internal && !e_comp_wl_subsurface_check(ec) && !ec->remote_surface.provider)
-          {
-             E_Comp *comp;
-             ELOGF("COMP", "Current unmapped. COMMIT. pixmap_usable:%d", ec, e_pixmap_usable_get(ec->pixmap));
-
-             // no canvas update before client's commit request, begin rendering after 1st commit
-             comp_conf = e_comp_config_get();
-             comp = e_comp_get();
-             if (comp_conf && comp_conf->canvas_render_delay_after_boot && comp->canvas_render_delayed)
-               {
-                  ELOGF("COMP", "Begin canvas update for the first time after boot", ec);
-                  comp->canvas_render_delayed = EINA_FALSE;
-               }
-          }
+          ELOGF("COMP", "Current unmapped. COMMIT. pixmap_usable:%d", ec, e_pixmap_usable_get(ec->pixmap));
      }
 
    e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_BEFORE_SURFACE_COMMIT, ec);