e_desk: make e_desk's smart object be configuable. 33/104333/3
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 13 Dec 2016 03:48:52 +0000 (12:48 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 13 Dec 2016 11:06:20 +0000 (03:06 -0800)
Change-Id: Ieb4b6ae2ffe411a1a47bdf72eb83ae923f58333d

src/bin/e_config.c
src/bin/e_config.h
src/bin/e_desk.c
src/bin/services/e_service_quickpanel.c

index c9a7217396b2b8f59c8901861cfff9b116727a1f..ca5eae0f78c2f2ee68182bc8979151e96a470222 100644 (file)
@@ -263,6 +263,7 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, comp_canvas_bg.opmode, INT);
    E_CONFIG_VAL(D, T, delayed_load_idle_count, INT);
    E_CONFIG_VAL(D, T, use_buffer_flush, UCHAR);
+   E_CONFIG_VAL(D, T, use_desk_smart_obj, UCHAR);
    E_CONFIG_LIST(D, T, sock_accesses, _e_config_socket_access_edd);
    E_CONFIG_LIST(D, T, aux_hint_supported, _e_config_aux_hint_supported_edd);
    E_CONFIG_VAL(D, T, use_module_srv.qp, UCHAR);
@@ -454,6 +455,7 @@ e_config_load(void)
    E_CONFIG_LIMIT(e_config->comp_canvas_bg.opmode, 0, 11);
    E_CONFIG_LIMIT(e_config->delayed_load_idle_count, 0, 100);
    E_CONFIG_LIMIT(e_config->use_buffer_flush, 0, 1);
+   E_CONFIG_LIMIT(e_config->use_desk_smart_obj, 0, 1);
    E_CONFIG_LIMIT(e_config->use_module_srv.qp, 0, 1);
    E_CONFIG_LIMIT(e_config->launchscreen_timeout, 7.0, 100.0);
 }
index 7865191b1ffcf62fc3172b3288790bb4fc7067b0..3baacf0efb3d4ab6de666ded44796cb07cd4183f 100644 (file)
@@ -157,6 +157,7 @@ struct _E_Config
    } comp_canvas_bg;
    int delayed_load_idle_count;
    Eina_Bool use_buffer_flush;
+   Eina_Bool use_desk_smart_obj;
    Eina_List *sock_accesses;
    Eina_List *aux_hint_supported;
    struct
index f66e8e693bcdae1af2cfc06171fd8e72f2b5d64d..2d9bef5c375064b6e8fb62f38d2c0b33d0a25c5e 100644 (file)
@@ -38,6 +38,7 @@ static void      _e_desk_show_begin(E_Desk *desk, int dx, int dy);
 static void      _e_desk_hide_begin(E_Desk *desk, int dx, int dy);
 static void      _e_desk_event_desk_window_profile_change_free(void *data, void *ev);
 
+static void      _e_desk_smart_init(E_Desk *desk);
 static void      _e_desk_smart_add(Evas_Object *obj);
 static void      _e_desk_smart_del(Evas_Object *obj);
 static void      _e_desk_smart_client_add(Evas_Object *obj, E_Client *ec);
@@ -94,17 +95,25 @@ e_desk_new(E_Zone *zone, int x, int y)
    desk = E_OBJECT_ALLOC(E_Desk, E_DESK_TYPE, _e_desk_free);
    if (!desk) return NULL;
 
-   desk->smart_obj = evas_object_smart_add(e_comp->evas, _e_desk_smart_class_new());
-   e_desk_geometry_set(desk, zone->x, zone->y, zone->w, zone->h);
-
-   /* FIXME indicator object won't be work, if remove this code.
-    * I have no idea why this code is necessary, so I just let it be. */
-   e_desk_zoom_set(desk, 1.0, 1.0, 0, 0);
-
    desk->zone = zone;
    desk->x = x;
    desk->y = y;
 
+   if (!e_config->use_desk_smart_obj)
+     {
+        /* need to set geometry of desk even if disable the smart object,
+         * because 'E_Client' can be reconfigured base on desk.geom as a member
+         * of desk. the reason why this is necessary is all of 'E_Client' is not
+         * members of the smart object so far.
+         */
+        EINA_RECTANGLE_SET(&desk->geom, zone->x, zone->y, zone->w, zone->h);
+     }
+   else
+     {
+        /* init smart object */
+        _e_desk_smart_init(desk);
+     }
+
    /* Get current desktop's name */
    EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
      {
@@ -279,7 +288,8 @@ e_desk_show(E_Desk *desk)
              dy = desk->y - desk2->y;
           }
         _e_desk_hide_begin(desk2, dx, dy);
-        evas_object_hide(desk2->smart_obj);
+        if (desk2->smart_obj)
+          evas_object_hide(desk2->smart_obj);
      }
 
    desk->zone->desk_x_prev = desk->zone->desk_x_current;
@@ -303,7 +313,8 @@ e_desk_show(E_Desk *desk)
    if (desk->zone->bg_object) was_zone = 1;
 #endif
    _e_desk_show_begin(desk, dx, dy);
-   evas_object_show(desk->smart_obj);
+   if (desk->smart_obj)
+     evas_object_show(desk->smart_obj);
 
 #ifndef ENABLE_QUICK_INIT
    if (was_zone)
@@ -725,6 +736,9 @@ e_desks_count(void)
 E_API void
 e_desk_client_add(E_Desk *desk, E_Client *ec)
 {
+   if (!e_config->use_desk_smart_obj)
+     return;
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -737,6 +751,9 @@ e_desk_client_add(E_Desk *desk, E_Client *ec)
 E_API void
 e_desk_client_del(E_Desk *desk, E_Client *ec)
 {
+   if (!e_config->use_desk_smart_obj)
+     return;
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -754,6 +771,12 @@ e_desk_geometry_set(E_Desk *desk, int x, int y, int w, int h)
    Eina_List *l;
    int cx, cy, dx, dy;
 
+   if (!e_config->use_desk_smart_obj)
+     {
+        DBG("Do nothing, Desk Smart Object is disabled");
+        return;
+     }
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -792,6 +815,12 @@ e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy)
    E_Client *ec;
    Eina_List *l;
 
+   if (!e_config->use_desk_smart_obj)
+     {
+        DBG("Do nothing, Desk Smart Object is disabled");
+        return;
+     }
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -829,6 +858,12 @@ e_desk_zoom_unset(E_Desk *desk)
    E_Client *ec;
    Eina_List *l;
 
+   if (!e_config->use_desk_smart_obj)
+     {
+        DBG("Do nothing, Desk Smart Object is disabled");
+        return;
+     }
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -858,6 +893,9 @@ e_desk_zoom_unset(E_Desk *desk)
 E_API void
 e_desk_smart_member_add(E_Desk *desk, Evas_Object *obj)
 {
+   if (!e_config->use_desk_smart_obj)
+     return;
+
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
@@ -867,13 +905,16 @@ e_desk_smart_member_add(E_Desk *desk, Evas_Object *obj)
 E_API void
 e_desk_smart_member_del(Evas_Object *obj)
 {
+   if (!e_config->use_desk_smart_obj)
+     return;
+
    evas_object_smart_member_del(obj);
 }
 
 static void
 _e_desk_free(E_Desk *desk)
 {
-   evas_object_del(desk->smart_obj);
+   E_FREE_FUNC(desk->smart_obj, evas_object_del);
    eina_stringshare_del(desk->name);
    desk->name = NULL;
    free(desk);
@@ -1036,6 +1077,24 @@ _e_desk_hide_begin(E_Desk *desk, int dx, int dy)
      }
 }
 
+static void
+_e_desk_smart_init(E_Desk *desk)
+{
+   E_Zone *zone;
+
+   zone = desk->zone;
+
+   if (!e_config->use_desk_smart_obj)
+     return;
+
+   desk->smart_obj = evas_object_smart_add(e_comp->evas, _e_desk_smart_class_new());
+   e_desk_geometry_set(desk, zone->x, zone->y, zone->w, zone->h);
+
+   /* FIXME indicator object won't be work, if remove this code.
+    * I have no idea why this code is necessary, so I just let it be. */
+   e_desk_zoom_set(desk, 1.0, 1.0, 0, 0);
+}
+
 static Eina_Bool
 _e_desk_smart_client_cb_resize(void *data, int type, void *event)
 {
@@ -1082,11 +1141,37 @@ _e_desk_smart_del(Evas_Object *obj)
    evas_object_smart_data_set(obj, NULL);
 }
 
+static void
+_e_desk_smart_member_add(Evas_Object *obj, Evas_Object *child)
+{
+   E_Client *ec;
+
+   _e_desk_parent_sc->member_add(obj, child);
+
+   ec = evas_object_data_get(child, "E_Client");
+   if (ec)
+     _e_desk_smart_client_add(obj, ec);
+}
+
+static void
+_e_desk_smart_member_del(Evas_Object *obj, Evas_Object *child)
+{
+   E_Client *ec;
+
+   _e_desk_parent_sc->member_del(obj, child);
+
+   ec = evas_object_data_get(child, "E_Client");
+   if (ec)
+     _e_desk_smart_client_del(obj, ec);
+}
+
 static void
 _e_desk_smart_set_user(Evas_Smart_Class *sc)
 {
    sc->add = _e_desk_smart_add;
    sc->del = _e_desk_smart_del;
+   sc->member_add = _e_desk_smart_member_add;
+   sc->member_del = _e_desk_smart_member_del;
 }
 
 static void
@@ -1112,7 +1197,7 @@ _e_desk_smart_client_del(Evas_Object *obj, E_Client *ec)
    if (!eina_list_data_find(sd->clients, ec))
      return;
 
-   evas_object_map_enable_set(ec->frame, EINA_FALSE);
+   _e_desk_client_zoom(ec, 1.0, 1.0, 0, 0);
    sd->clients = eina_list_remove(sd->clients, ec);
    evas_object_smart_changed(obj);
 }
index 47ae5447a95ba13bf311f8810b2e0fed995ebdcc..60377417176a234ff5b0edcc7a4c06d14f2c382b 100644 (file)
@@ -163,7 +163,6 @@ _mover_intercept_show(void *data, Evas_Object *obj)
    e_comp_object_dirty(ec->frame);
    e_comp_object_render(ec->frame);
 
-   e_desk_client_del(ec->desk, ec);
    e_layout_pack(md->qp_layout_obj, ec->frame);
 
   // create base_clip
@@ -193,6 +192,7 @@ _mover_intercept_show(void *data, Evas_Object *obj)
    evas_object_clip_set(md->handler_mirror_obj, md->handler_clip);
 
    evas_object_show(obj);
+
    e_desk_smart_member_add(ec->desk, obj);
 }
 
@@ -261,11 +261,14 @@ _mover_smart_del(Evas_Object *obj)
     * if remove this evas_object_map_enable_set() passing false and true,
     * we can see the afterimage of move object.
     * to avoid this probelm, we need it. */
-   evas_object_map_enable_set(ec->desk->smart_obj, EINA_FALSE);
-   evas_object_map_enable_set(ec->desk->smart_obj, EINA_TRUE);
+   if (ec->desk->smart_obj)
+     {
+        evas_object_map_enable_set(ec->desk->smart_obj, EINA_FALSE);
+        evas_object_map_enable_set(ec->desk->smart_obj, EINA_TRUE);
+     }
 
    e_layout_unpack(ec->frame);
-   e_desk_client_add(ec->desk, ec);
+   e_desk_smart_member_add(ec->desk, ec->frame);
 
    free(md);
    evas_object_hide(obj);