e_tizen_launch_effect: Add input blocker rect during splash launching 10/325610/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 11 Jun 2025 05:18:05 +0000 (14:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 12 Jun 2025 10:49:11 +0000 (19:49 +0900)
Change-Id: I340e64f9a134d5a866a237172beb3f0b2cc9ffdc

src/bin/server/e_tizen_launch_effect.c

index 9ba647959567a5b27ea96c5c9b14526ae734a4b0..ace132a382dc72ffc36992f52f9e78b711463960 100644 (file)
@@ -13,6 +13,7 @@
 #include "e_view_client_intern.h"
 #include "e_comp_canvas_intern.h"
 #include "e_config_intern.h"
+#include "e_view_rect.h"
 
 #include <tizen-launch-server-protocol.h>
 
@@ -58,6 +59,7 @@ struct _E_Tizen_Launch_Effect_Splash
    E_Pixmap                  *ep;               /* pixmap for launch screen client */
    E_Client                  *ec;               /* client for launch screen image */
    Ecore_Timer               *timeout;          /* launch screen image hide timer */
+   E_View_Rect               *input_blocker_rect; /* input consumer of launch screen */
 
    Eina_Bool                  valid;            /* validation check */
    Eina_Bool                  replaced;
@@ -68,6 +70,7 @@ struct _E_Tizen_Launch_Effect_Splash
    Eina_Bool                  set_view_listener;
    struct wl_listener view_destroy_listener;
    struct wl_listener view_hide_listener;
+   struct wl_listener view_show_listener;
 };
 
 typedef enum _Launch_Img_File_type
@@ -90,6 +93,9 @@ static Eina_List *hooks_ec = NULL;
 #define SPLASH_GROUP_NAME "effect"
 #define SPLASH_CONFIG_CUSTOM_EFFECT_CALLEE "_CUSTOM_EFFECT_CALLEE_"
 
+static E_View_Rect *_tzlaunch_input_blocker_create(E_Tizen_Launch_Effect_Splash *splash);
+static void _tzlaunch_input_blocker_destroy(E_Tizen_Launch_Effect_Splash *splash);
+
 static void
 _e_tizen_launch_effect_type_unset(uint32_t pid)
 {
@@ -135,6 +141,7 @@ _launch_splash_view_unset(E_Tizen_Launch_Effect_Splash *tzlaunch_splash)
 
    if (tzlaunch_splash->set_view_listener)
      {
+        e_view_event_listener_del(tzlaunch_splash->view, E_VIEW_SHOW, &tzlaunch_splash->view_show_listener);
         e_view_event_listener_del(tzlaunch_splash->view, E_VIEW_HIDE, &tzlaunch_splash->view_hide_listener);
         e_view_event_listener_del(tzlaunch_splash->view, E_VIEW_DESTROY, &tzlaunch_splash->view_destroy_listener);
         tzlaunch_splash->set_view_listener = EINA_FALSE;
@@ -169,6 +176,13 @@ _launch_splash_off(E_Tizen_Launch_Effect_Splash *tzlaunch_splash)
          "Launchscreen hide | pid %d, replaced:%d, tzlaunch_pixmap:%p, ec_pixmap:%p",
          ec, tzlaunch_splash->pid, tzlaunch_splash->replaced, tzlaunch_splash->ep, ec->pixmap);
 
+   if (tzlaunch_splash->input_blocker_rect)
+     {
+        _tzlaunch_input_blocker_destroy(tzlaunch_splash);
+        ELOGF("TZPOL", "Remove input blocker for launchscreen", ec);
+        tzlaunch_splash->input_blocker_rect = NULL;
+     }
+
    if ((ec->pixmap) &&
        (ec->pixmap == tzlaunch_splash->ep))
      {
@@ -261,6 +275,23 @@ _launchscreen_splash_cb_view_hide(struct wl_listener *listener, void *data)
    tzlaunch_splash = wl_container_of(listener, tzlaunch_splash, view_hide_listener);
 }
 
+static void
+_launchscreen_splash_cb_view_show(struct wl_listener *listener, void *data)
+{
+   E_Tizen_Launch_Effect_Splash *tzlaunch_splash;
+   E_View *input_blocker_view;
+
+   tzlaunch_splash = wl_container_of(listener, tzlaunch_splash, view_show_listener);
+
+   if (tzlaunch_splash->input_blocker_rect)
+     {
+        input_blocker_view = e_view_rect_view_get(tzlaunch_splash->input_blocker_rect);
+        ELOGF("TZPOL", "Raise input blocker for launchscreen", tzlaunch_splash->ec);
+        e_view_show(input_blocker_view);
+        e_view_raise_to_top(input_blocker_view);
+     }
+}
+
 static Eina_Bool
 _launchscreen_splash_timeout(void *data)
 {
@@ -321,6 +352,7 @@ _launchscreen_splash_setup(E_Tizen_Launch_Effect_Splash *splash,
 
    view_client = e_client_view_get(ec);
    parent_view_tree = e_view_parent_get(e_view_client_view_get(view_client));
+   e_comp_size_get(&comp_w, &comp_h);
 
    if (splash->type == LAUNCH_IMG_FILE_TYPE_IMAGE)
       {
@@ -340,7 +372,6 @@ _launchscreen_splash_setup(E_Tizen_Launch_Effect_Splash *splash,
              return EINA_FALSE;
           }
 
-        e_comp_size_get(&comp_w, &comp_h);
         e_view_image_fill_set(splash->view_image, 0, 0, comp_w, comp_h);
         e_view_image_filled_set(splash->view_image, EINA_TRUE);
 
@@ -380,8 +411,6 @@ _launchscreen_splash_setup(E_Tizen_Launch_Effect_Splash *splash,
              return EINA_FALSE;
           }
 
-        e_comp_size_get(&comp_w, &comp_h);
-
         e_view_edje_geometry_set(splash->view_edje, 0, 0, comp_w, comp_h);
 
         if (depth == 32)
@@ -402,6 +431,15 @@ _launchscreen_splash_setup(E_Tizen_Launch_Effect_Splash *splash,
        ELOGF("TZPOL", "Launchscreen setup | set external_view_edje(%p)", ec, splash->view_edje);
       }
 
+   if (splash->input_blocker_rect)
+     {
+        ELOGF("TZPOL", "Setup input blocker for launchscreen", ec);
+        e_view_position_set(e_view_rect_view_get(splash->input_blocker_rect), 0, 0);
+        e_view_rect_size_set(splash->input_blocker_rect, comp_w, comp_h);
+        e_view_freeze_events_set(e_view_rect_view_get(splash->input_blocker_rect), EINA_TRUE);
+        e_view_show(e_view_rect_view_get(splash->input_blocker_rect));
+     }
+
    /* Post job of setup content_type */
 
    //Parse extra config
@@ -448,6 +486,9 @@ _launchscreen_splash_setup(E_Tizen_Launch_Effect_Splash *splash,
         splash->view_hide_listener.notify = _launchscreen_splash_cb_view_hide;
         e_view_event_listener_add(splash->view, E_VIEW_HIDE, &splash->view_hide_listener);
 
+        splash->view_show_listener.notify = _launchscreen_splash_cb_view_show;
+        e_view_event_listener_add(splash->view, E_VIEW_SHOW, &splash->view_show_listener);
+
         splash->set_view_listener = EINA_TRUE;
      }
 
@@ -672,6 +713,42 @@ static const struct tizen_launch_splash_interface _tzlaunch_splash_iface =
    _tzlaunch_splash_iface_cb_launch_v2,
 };
 
+static E_View_Rect *
+_tzlaunch_input_blocker_create(E_Tizen_Launch_Effect_Splash *splash)
+{
+   E_Client *ec;
+   E_View_Rect *input_blocker_rect;
+   E_View *input_blocker_view;
+   const int color[4] = {0, 0, 0, 0};
+
+   ec = splash->ec;
+
+   input_blocker_rect = e_view_rect_create(e_view_parent_get(e_view_client_view_get(e_client_view_get(ec))), ec->w, ec->h, color);
+   input_blocker_view = e_view_rect_view_get(input_blocker_rect);
+   e_view_name_set(input_blocker_view, "splash->input_blocker_rect");
+   e_view_position_set(input_blocker_view, ec->x, ec->y);
+   e_view_client_member_add(e_client_view_get(ec), input_blocker_view);
+
+   return input_blocker_rect;
+}
+
+static void
+_tzlaunch_input_blocker_destroy(E_Tizen_Launch_Effect_Splash *splash)
+{
+   E_Client *ec;
+   E_View *input_blocker_view;
+
+   if (!splash || !splash->input_blocker_rect) return;
+
+   ec = splash->ec;
+   input_blocker_view = e_view_rect_view_get(splash->input_blocker_rect);
+
+   e_view_hide(input_blocker_view);
+   e_view_destroy(input_blocker_view);
+
+   return;
+}
+
 static E_Tizen_Launch_Effect_Splash *
 _tzlaunch_splash_add(struct wl_resource *res_tzlaunch_effect, struct wl_resource *res_tzlaunch_splash)
 {
@@ -699,6 +776,9 @@ _tzlaunch_splash_add(struct wl_resource *res_tzlaunch_effect, struct wl_resource
    e_client_icccm_name_set(tzlaunch_splash->ec, "Launchscreen");
    tzlaunch_splash->ec->ignored = EINA_TRUE;
 
+   tzlaunch_splash->input_blocker_rect = _tzlaunch_input_blocker_create(tzlaunch_splash);
+   ELOGF("TZPOL", "Create input blocker for launchscreen", tzlaunch_splash->ec);
+
    e_comp_launchscrn_ec_add(tzlaunch_splash->ec);
 
    return tzlaunch_splash;
@@ -706,6 +786,8 @@ error:
    if (tzlaunch_splash)
      {
         ERR("Could not initialize launchscreen client");
+        if (tzlaunch_splash->input_blocker_rect)
+          _tzlaunch_input_blocker_destroy(tzlaunch_splash);
         if (tzlaunch_splash->ep)
           e_pixmap_win_id_del(tzlaunch_splash->ep);
         if (tzlaunch_splash->ec)