efl_ui_win: added signal for effect start and done
authorJuyeon Lee <juyeonne.lee@samsung.com>
Fri, 10 Nov 2017 05:15:28 +0000 (14:15 +0900)
committerJiyoun Park <jy0703.park@samsung.com>
Tue, 19 Dec 2017 05:34:13 +0000 (14:34 +0900)
Change-Id: Ie97f810e4a246c089013fbd17628920f789b3a62

src/bin/elementary/test_win_state.c
src/lib/elementary/efl_ui_win.c
src/lib/elementary/efl_ui_win.eo
src/lib/elementary/elm_win.h

index b4d084e..b08ea7a 100644 (file)
@@ -305,6 +305,31 @@ _bt_pressed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
    fflush(stdout);
 }
 
+static void
+_win_effect_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   const char *type_name;
+   Efl_Ui_Win_Effect_Type type = (Efl_Ui_Win_Effect_Type)(event_info);
+
+   switch (type)
+     {
+      case EFL_UI_WIN_EFFECT_TYPE_SHOW:
+         type_name = eina_stringshare_add("SHOW");
+         break;
+      case EFL_UI_WIN_EFFECT_TYPE_HIDE:
+         type_name = eina_stringshare_add("HIDE");
+         break;
+      case EFL_UI_WIN_EFFECT_TYPE_RESTACK:
+         type_name = eina_stringshare_add("RESTACK");
+         break;
+      default:
+         type_name = eina_stringshare_add("UNKNOWN");
+     }
+
+   printf("EFFECT: %s %s\n", type_name, (char *)data);
+   eina_stringshare_del(type_name);
+}
+
 void
 test_win_state(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -337,6 +362,8 @@ test_win_state(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event
    evas_object_smart_callback_add(win, "focus,in", _win_state_focus_cb, "focus,in");
    evas_object_smart_callback_add(win, "delete,request", _win_state_print_cb, "delete,request");
    evas_object_smart_callback_add(win, "wm,rotation,changed", _win_state_print_cb, "wm,rotation,changed");
+   evas_object_smart_callback_add(win, "effect,started", _win_effect_cb, "effect,started");
+   evas_object_smart_callback_add(win, "effect,done", _win_effect_cb, "effect,done");
    elm_win_autodel_set(win, EINA_TRUE);
 
    bg = elm_bg_add(win);
index db5fae0..df76348 100644 (file)
@@ -102,6 +102,10 @@ struct _Efl_Ui_Win_Data
       Ecore_Wl2_Window *win;
       Ecore_Event_Handler *configure_handler;
       Eina_Bool opaque_dirty : 1;
+      //TIZEN_ONLY(20171110): added signal for effect start and done
+      Ecore_Event_Handler *effect_start_handler;
+      Ecore_Event_Handler *effect_end_handler;
+      //
    } wl;
 #endif
 #ifdef HAVE_ELEMENTARY_COCOA
@@ -323,6 +327,10 @@ static const char SIG_INDICATOR_PROP_CHANGED[] = "indicator,prop,changed";
 static const char SIG_ROTATION_CHANGED[] = "rotation,changed";
 static const char SIG_PROFILE_CHANGED[] = "profile,changed";
 static const char SIG_WM_ROTATION_CHANGED[] = "wm,rotation,changed";
+//TIZEN_ONLY(20171110): added signal for effect start and done
+static const char SIG_EFFECT_STARTED[] = "effect,started";
+static const char SIG_EFFECT_DONE[] = "effect,done";
+//
 
 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_DELETE_REQUEST, ""},
@@ -345,6 +353,8 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_WM_ROTATION_CHANGED, ""},
    {SIG_WIDGET_FOCUSED, ""}, /**< handled by elm_widget */
    {SIG_WIDGET_UNFOCUSED, ""}, /**< handled by elm_widget */
+   {SIG_EFFECT_STARTED, ""},
+   {SIG_EFFECT_DONE, ""},
    {NULL, NULL}
 };
 
@@ -2860,6 +2870,10 @@ _efl_ui_win_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Win_Data *sd)
    if (sd->pointer.obj) evas_object_del(sd->pointer.obj);
    if (sd->pointer.ee) ecore_evas_free(sd->pointer.ee);
    sd->pointer.surf = NULL;
+   //TIZEN_ONLY(20171110): added signal for effect start and done
+   ecore_event_handler_del(sd->wl.effect_start_handler);
+   ecore_event_handler_del(sd->wl.effect_end_handler);
+   //
 #endif
 #ifdef HAVE_ELEMENTARY_WIN32
    ecore_event_handler_del(sd->win32.key_down_handler);
@@ -4301,6 +4315,41 @@ _elm_win_frame_pre_render(void *data, Evas *e EINA_UNUSED, void *ev EINA_UNUSED)
      _elm_win_opaque_update(sd, EINA_FALSE);
    sd->wl.opaque_dirty = 0;
 }
+
+//TIZEN_ONLY(20171110): added signal for effect start and done
+static Eina_Bool
+_elm_win_wl_effect_start(void *data, int type EINA_UNUSED, void *event)
+{
+   ELM_WIN_DATA_GET(data, sd);
+   Ecore_Wl2_Event_Effect_Start *e = event;
+
+   if (!sd->wl.win) return ECORE_CALLBACK_PASS_ON;
+
+   if ((ecore_wl2_window_id_get(sd->wl.win) != e->win))
+     return ECORE_CALLBACK_PASS_ON;
+
+   evas_object_smart_callback_call(data, SIG_EFFECT_STARTED, (void*)e->type);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_elm_win_wl_effect_end(void *data, int type EINA_UNUSED, void *event)
+{
+   ELM_WIN_DATA_GET(data, sd);
+   Ecore_Wl2_Event_Effect_Start *e = event;
+   unsigned int eff_type;
+
+   if (!sd->wl.win) return ECORE_CALLBACK_PASS_ON;
+
+   if ((ecore_wl2_window_id_get(sd->wl.win) != e->win))
+     return ECORE_CALLBACK_PASS_ON;
+
+     evas_object_smart_callback_call(data, SIG_EFFECT_DONE, (void*)e->type);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+//
 #endif
 
 static inline void
@@ -5191,6 +5240,20 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Efl_U
             (ECORE_X_EVENT_WINDOW_PROPERTY, _elm_win_property_change, obj);
      }
 #endif
+#ifdef HAVE_ELEMENTARY_WL2
+      else if ((engine) &&
+               ((!strcmp(engine, ELM_WAYLAND_SHM)) ||
+                (!strcmp(engine, ELM_WAYLAND_EGL))))
+        {
+           //TIZEN_ONLY(20171110): added signal for effect start and done
+           sd->wl.effect_start_handler = ecore_event_handler_add
+              (ECORE_WL2_EVENT_EFFECT_START, _elm_win_wl_effect_start, obj);
+           sd->wl.effect_end_handler = ecore_event_handler_add
+              (ECORE_WL2_EVENT_EFFECT_END, _elm_win_wl_effect_end, obj);
+           //
+        }
+#endif
+
    else if ((engine) && (!strncmp(engine, "shot:", 5)))
      _shot_init(sd);
 
index b39fcbb..359b333 100644 (file)
@@ -157,6 +157,24 @@ enum Efl.Ui.Win.Move_Resize_Mode
    right = (1 << 4)    [[Start resizing window to the right]]
 }
 
+//TIZEN_ONLY(20171110): added signal for effect start and done
+enum Efl.Ui.Win.Effect.Type
+{
+   [[List of window effect.
+
+     These list indicates types of window effect. When the effect started or
+     done, the Elm_Win is notified with type information of window effect.
+   ]]
+
+   legacy: efl_ui_win_effect_type;
+
+   unknown = 0,
+   show,
+   hide,
+   restack
+}
+//
+
 class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Efl.Canvas.Pointer, Efl.Access.Window,
                Efl.Access.Component, Efl.Access.Widget.Action,
                Efl.Content, Efl.Input.State, Efl.Input.Interface, Efl.Screen,
index 7720b98..d8abdbe 100644 (file)
@@ -91,6 +91,8 @@
  * @li "focused" : When the win has received focus. (since 1.8)
  * @li "unfocused" : When the win has lost focus. (since 1.8)
  * @li "theme,changed" - The theme was changed. (since 1.13)
+ * @li "effect,started" - window effect has been started.
+ * @li "effect,done" - window effect has been done.
  *
  * Note that calling evas_object_show() after window contents creation is
  * recommended. It will trigger evas_smart_objects_calculate() and some backend