[SVN Merge] svn merged.
authorPrince Kr Dubey <prince.dubey@samsung.com>
Mon, 11 Oct 2010 13:52:13 +0000 (19:22 +0530)
committerPrince Kr Dubey <prince.dubey@samsung.com>
Mon, 11 Oct 2010 13:52:13 +0000 (19:22 +0530)
config/default/base.src
config/illume/base.src
config/standard/base.src
src/bin/test_flip.c
src/lib/Elementary.h.in
src/lib/elm_config.c
src/lib/elm_flip.c
src/lib/elm_mapbuf.c
src/lib/elm_priv.h
src/lib/elm_widget.c

index 9cd5c20..f305f68 100644 (file)
@@ -1,4 +1,5 @@
 group "Elm_Config" struct {
+  value "config_version" int: 65537;
   value "engine" int: 0;
   value "thumbscroll_enable" int: 1;
   value "thumbscroll_threshhold" int: 24;
index 9cd5c20..f305f68 100644 (file)
@@ -1,4 +1,5 @@
 group "Elm_Config" struct {
+  value "config_version" int: 65537;
   value "engine" int: 0;
   value "thumbscroll_enable" int: 1;
   value "thumbscroll_threshhold" int: 24;
index 4df5eda..f498b48 100644 (file)
@@ -1,4 +1,5 @@
 group "Elm_Config" struct {
+  value "config_version" int: 65537;
   value "engine" int: 0;
   value "thumbscroll_enable" int: 1;
   value "thumbscroll_threshhold" int: 4;
index 889b9e9..6ce92a3 100644 (file)
@@ -44,6 +44,18 @@ my_fl_6(void *data, Evas_Object *obj, void *event_info)
 }
 
 void
+my_fl_7(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *fl = data;
+   elm_flip_go(fl, ELM_FLIP_CUBE_UP);
+}
+void
+my_fl_8(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *fl = data;
+   elm_flip_go(fl, ELM_FLIP_CUBE_DOWN);
+}
+void
 test_flip(void *data, Evas_Object *obj, void *event_info)
 {
    Evas_Object *win, *bg, *bx, *bx2, *fl, *o, *bt, *ly;
@@ -138,6 +150,12 @@ test_flip(void *data, Evas_Object *obj, void *event_info)
    elm_box_pack_end(bx2, bt);
    evas_object_show(bt);
 
+   elm_box_pack_end(bx, bx2);
+   evas_object_show(bx2);
+   bx2 = elm_box_add(win);
+   elm_box_horizontal_set(bx2, 1);
+   evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
    bt = elm_button_add(win);
    elm_button_label_set(bt, "5");
    evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl);
@@ -153,6 +171,20 @@ test_flip(void *data, Evas_Object *obj, void *event_info)
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
    evas_object_show(bt);
+   bt = elm_button_add(win);
+   elm_button_label_set(bt, "7");
+   evas_object_smart_callback_add(bt, "clicked", my_fl_7, fl);
+   evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+   elm_box_pack_end(bx2, bt);
+   evas_object_show(bt);
+   bt = elm_button_add(win);
+   elm_button_label_set(bt, "8");
+   evas_object_smart_callback_add(bt, "clicked", my_fl_8, fl);
+   evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+   elm_box_pack_end(bx2, bt);
+   evas_object_show(bt);
    
    elm_box_pack_end(bx, bx2);
    evas_object_show(bx2);
@@ -321,8 +353,7 @@ test_flip2(void *data, Evas_Object *obj, void *event_info)
 void
 test_flip3(void *data, Evas_Object *obj, void *event_info)
 {
-   Evas_Object *win, *bg, *bx, *bx2, *bx3, *bx4, *bx5, *fl, *fl_f, *fl_b, *o,
-              *bt, *ly, *lb;
+   Evas_Object *win, *bg, *bx, *bx2, *fl, *fl_f, *fl_b, *o, *bt, *fr;
    char buf[PATH_MAX];
 
    win = elm_win_add(NULL, "flip flip", ELM_WIN_BASIC);
@@ -343,136 +374,81 @@ test_flip3(void *data, Evas_Object *obj, void *event_info)
    evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_box_pack_end(bx, fl);
+   evas_object_show(fl);
 
-   bx3 = elm_box_add(win);
-   evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx3);
+   fr = elm_frame_add(win);
+   elm_frame_label_set(fr, "Front");
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_flip_content_front_set(fl, fr);
+   evas_object_show(fr);
 
    fl_f = elm_flip_add(win);
    evas_object_size_hint_align_set(fl_f, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(fl_f, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-
-   bx5 = elm_box_add(win);
-   evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx5);
+   elm_frame_content_set(fr, fl_f);
+   evas_object_show(fl_f);
 
    o = elm_bg_add(win);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_01.jpg");
    elm_bg_file_set(o, buf, NULL);
+   elm_flip_content_front_set(fl_f, o);
    evas_object_show(o);
-   elm_box_pack_end(bx5, o);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Front Flip - Front");
-   evas_object_show(lb);
-   elm_box_pack_end(bx5, lb);
 
-   elm_flip_content_front_set(fl_f, bx5);
 
-   bx5 = elm_box_add(win);
-   evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx5);
 
    o = elm_bg_add(win);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_02.jpg");
    elm_bg_file_set(o, buf, NULL);
+   elm_flip_content_back_set(fl_f, o);
    evas_object_show(o);
-   elm_box_pack_end(bx5, o);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Front Flip - Back");
-   evas_object_show(lb);
-   elm_box_pack_end(bx5, lb);
+   fr = elm_frame_add(win);
+   elm_frame_label_set(fr, "Back");
 
-   elm_flip_content_back_set(fl_f, bx5);
 
-   evas_object_show(fl_f);
-   elm_box_pack_end(bx3, fl_f);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Main Flip - Front");
-   evas_object_show(lb);
-   elm_box_pack_end(bx3, lb);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_flip_content_back_set(fl, fr);
 
-   bx4 = elm_box_add(win);
-   evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx4);
+   evas_object_show(fr);
 
    fl_b = elm_flip_add(win);
    evas_object_size_hint_align_set(fl_b, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(fl_b, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-
-   bx5 = elm_box_add(win);
-   evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx5);
+   elm_frame_content_set(fr, fl_b);
+   evas_object_show(fl_b);
 
    o = elm_bg_add(win);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_03.jpg");
    elm_bg_file_set(o, buf, NULL);
+   elm_flip_content_front_set(fl_b, o);
    evas_object_show(o);
-   elm_box_pack_end(bx5, o);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Back Flip - Front");
-   evas_object_show(lb);
-   elm_box_pack_end(bx5, lb);
 
-   elm_flip_content_front_set(fl_b, bx5);
 
-   bx5 = elm_box_add(win);
-   evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx5);
 
    o = elm_bg_add(win);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_04.jpg");
    elm_bg_file_set(o, buf, NULL);
+   elm_flip_content_back_set(fl_b, o);
    evas_object_show(o);
-   elm_box_pack_end(bx5, o);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Back Flip - Back");
-   evas_object_show(lb);
-   elm_box_pack_end(bx5, lb);
 
-   elm_flip_content_back_set(fl_b, bx5);
 
-   evas_object_show(fl_b);
-   elm_box_pack_end(bx4, fl_b);
 
-   lb = elm_label_add(win);
-   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0);
-   elm_label_label_set(lb, "Main Flip - Back");
-   elm_box_pack_end(bx4, lb);
-   evas_object_show(lb);
 
-   elm_flip_content_front_set(fl, bx3);
-   elm_flip_content_back_set(fl, bx4);
 
-   evas_object_show(fl);
 
    bx2 = elm_box_add(win);
    elm_box_horizontal_set(bx2, 1);
@@ -481,7 +457,7 @@ test_flip3(void *data, Evas_Object *obj, void *event_info)
 
    bt = elm_button_add(win);
    elm_button_label_set(bt, "Main Flip");
-   evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl);
+   evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -489,7 +465,7 @@ test_flip3(void *data, Evas_Object *obj, void *event_info)
 
    bt = elm_button_add(win);
    elm_button_label_set(bt, "Front Flip");
-   evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl_f);
+   evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_f);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -497,7 +473,7 @@ test_flip3(void *data, Evas_Object *obj, void *event_info)
 
    bt = elm_button_add(win);
    elm_button_label_set(bt, "Back Flip");
-   evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl_b);
+   evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_b);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
index aace39d..45e5c6c 100644 (file)
@@ -1685,7 +1685,9 @@ extern "C" {
         ELM_FLIP_ROTATE_XZ_CENTER_AXIS,
         ELM_FLIP_ROTATE_YZ_CENTER_AXIS,
         ELM_FLIP_CUBE_LEFT,
-        ELM_FLIP_CUBE_RIGHT
+          ELM_FLIP_CUBE_RIGHT,
+          ELM_FLIP_CUBE_UP,
+          ELM_FLIP_CUBE_DOWN
      } Elm_Flip_Mode;
 
    EAPI Evas_Object *elm_flip_add(Evas_Object *parent);
index 6cc6c09..a18b4af 100644 (file)
@@ -18,7 +18,10 @@ static void _desc_shutdown(void);
 static void _profile_get(void);
 static void _config_free(void);
 static void _config_apply(void);
+static Elm_Config * _config_user_load(void);
+static Elm_Config * _config_system_load(void);
 static void _config_load(void);
+static void _config_update(void);
 static void _env_get(void);
 
 #ifdef HAVE_ELEMENTARY_X
@@ -85,6 +88,14 @@ _prop_config_get(void)
    config_data = eet_data_descriptor_decode(_config_edd, data, size);
    free(data);
    if (!config_data) return EINA_FALSE;
+ /* What do we do on version mismatch when someone changes the
+ * config in the rootwindow? */
+ /* Most obvious case, new version and we are still linked to
+ * whatever was there before, we just ignore until user restarts us */
+ if (config_data->config_version > ELM_CONFIG_VERSION)
+ return EINA_TRUE;
+/* What in the case the version is older? Do we even support those
+* cases or we only check for equality above? */
    _config_free();
    _elm_config = config_data;
    _config_apply();
@@ -149,7 +160,6 @@ _prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 
              val = ecore_x_window_prop_string_get(event->win,
                                                   event->atom);
-             eina_stringshare_replace(&_elm_config->theme, val);
              if (val)
                {
                   int changed = 0;
@@ -252,6 +262,7 @@ _desc_init(void)
         printf("EEEK! eet_data_descriptor_file_new() failed\n");
         return;
      }
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "config_version", config_version, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "engine", engine, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_enable", thumbscroll_enable, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_threshhold", thumbscroll_threshhold, EET_T_INT);
@@ -371,38 +382,74 @@ _config_apply(void)
    edje_autoperiod_allow_set(_elm_config->autoperiod_allow);
 }
 
-static void
-_config_load(void)
+static Elm_Config *
+_config_user_load(void)
 {
-   Eet_File *ef = NULL;
+   Elm_Config *cfg = NULL;
+   Eet_File *ef;
    char buf[PATH_MAX];
-   const char *home = NULL;
-   
+   const char *home;
+
    home = getenv("HOME");
-   if (!home) home = "/";
-   
-   // user config
-   snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home, _elm_profile);
+   if (!home) home = "";
+
+   snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home,
+            _elm_profile);
    ef = eet_open(buf, EET_FILE_MODE_READ);
    if (ef)
      {
-        _elm_config = eet_data_read(ef, _config_edd, "config");
+        cfg = eet_data_read(ef, _config_edd, "config");
         eet_close(ef);
      }
-   if (_elm_config) return;
-   
-   // system config
-   snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir, _elm_profile);
+   return cfg;
+}
+
+static Elm_Config *
+_config_system_load(void)
+{
+   Elm_Config *cfg = NULL;
+   Eet_File *ef;
+   char buf[PATH_MAX];
+
+   snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir,
+            _elm_profile);
    ef = eet_open(buf, EET_FILE_MODE_READ);
    if (ef)
      {
-        _elm_config = eet_data_read(ef, _config_edd, "config");
+        cfg = eet_data_read(ef, _config_edd, "config");
         eet_close(ef);
      }
+   return cfg;
+}
+
+
+static void
+_config_load(void)
+{
+   _elm_config = _config_user_load();
+   
+   
+   // user config
+   if (_elm_config)
+     {
+        if (_elm_config->config_version < ELM_CONFIG_VERSION)
+          _config_update();
+        return;
+     }
+
+   /* no user config, fallback for system. No need to check version for
+    * this one, if it's not the right one, someone screwed up at the time
+    * of installing it */
+   _elm_config = _config_system_load();
    if (_elm_config) return;
+   /* FIXME: config load could have failed because of a non-existent
+    * profile. Fallback to default before moving on */
 
    // config load fail - defaults
+   /* XXX: do these make sense? Only if it's valid to install the lib
+    * without the config, but do we want that? */
    _elm_config = ELM_NEW(Elm_Config);
+   _elm_config->config_version = ELM_CONFIG_VERSION;
    _elm_config->engine = ELM_SOFTWARE_X11;
    _elm_config->thumbscroll_enable = 1;
    _elm_config->thumbscroll_threshhold = 24;
@@ -424,9 +471,42 @@ _config_load(void)
    _elm_config->fps = 60.0;
    _elm_config->theme = eina_stringshare_add("default");
    _elm_config->modules = NULL;
-   _elm_config->input_panel_enable = 0;
-   _elm_config->autocapital_allow = 0;
-   _elm_config->autoperiod_allow = 0;
+}
+static void
+_config_update(void)
+{
+   Elm_Config *tcfg;
+   tcfg = _config_system_load();
+   if (!tcfg)
+     {
+        return;
+     }
+#define IFCFG(v) if ((_elm_config->config_version & 0xffff) < (v)) {
+#define IFCFGELSE } else {
+#define IFCFGEND }
+#define COPYVAL(x) do {_elm_config->x = tcfg->x;} while(0)
+#define COPYPTR(x) do {_elm_config->x = tcfg->x; tcfg->x = NULL; } while(0)
+#define COPYSTR(x) COPYPTR(x)
+
+   /* we also need to update for property changes in the root window
+    * if needed, but that will be dependant on new properties added
+    * with each version */
+
+   /* nothing here, just an example */
+   /*
+   IFCFG(0x0002);
+   COPYVAL(some_value);
+   IFCFGEND;
+   */
+
+#undef COPYSTR
+#undef COPYPTR
+#undef COPYVAL
+#undef IFCFGEND
+#undef IFCFGELSE
+#undef IFCFG
+
+   /* after updating user config, we must save */
 }
 
 static void
index 8ab10c5..9b7c206 100644 (file)
@@ -26,6 +26,7 @@ struct _Widget_Data
    Ecore_Animator *animator;
    double start, len;
    Elm_Flip_Mode mode;
+   Evas_Object *clip;
    struct {
       Evas_Object *content, *clip;
    } front, back;
@@ -115,6 +116,33 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
      }
 }
 
+static void
+flip_show_hide(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (elm_flip_front_get(obj))
+     {
+        if (wd->front.content)
+           evas_object_show(wd->front.clip);
+        else
+           evas_object_hide(wd->front.clip);
+        if (wd->back.content)
+           evas_object_hide(wd->back.clip);
+        else
+           evas_object_hide(wd->back.clip);
+     }
+   else
+     {
+        if (wd->front.content)
+           evas_object_hide(wd->front.clip);
+        else
+           evas_object_hide(wd->front.clip);
+        if (wd->back.content)
+           evas_object_show(wd->back.clip);
+        else
+           evas_object_hide(wd->back.clip);
+     }
+}
 static Eina_Bool
 _flip(Evas_Object *obj)
 {
@@ -223,7 +251,36 @@ _flip(Evas_Object *obj)
             evas_map_util_3d_rotate(mb, 0.0, deg, 0.0, cx, cy, w / 2);
           }
         break;
-    
+     case ELM_FLIP_CUBE_UP:
+        p = 1.0 - t;
+        p = 1.0 - (p * p);
+        deg = -90.0 * p;
+        if (wd->state)
+          {
+            evas_map_util_3d_rotate(mf, deg, 0.0, 0.0, cx, cy, h / 2);
+            evas_map_util_3d_rotate(mb, deg + 90, 0.0, 0.0, cx, cy, h / 2);
+          }
+        else
+          {
+            evas_map_util_3d_rotate(mf, deg + 90, 0.0, 0.0, cx, cy, h / 2);
+            evas_map_util_3d_rotate(mb, deg, 0.0, 0.0, cx, cy, h / 2);
+          }
+        break;
+     case ELM_FLIP_CUBE_DOWN:
+        p = 1.0 - t;
+        p = 1.0 - (p * p);
+        deg = 90.0 * p;
+        if (wd->state)
+          {
+            evas_map_util_3d_rotate(mf, deg, 0.0, 0.0, cx, cy, h / 2);
+            evas_map_util_3d_rotate(mb, deg - 90, 0.0, 0.0, cx, cy, h / 2);
+          }
+        else
+          {
+            evas_map_util_3d_rotate(mf, deg - 90, 0.0, 0.0, cx, cy, h / 2);
+            evas_map_util_3d_rotate(mb, deg, 0.0, 0.0, cx, cy, h / 2);
+          }
+        break;
      default:
         break;
      }
@@ -256,6 +313,11 @@ _flip(Evas_Object *obj)
      {
         evas_object_map_enable_set(wd->front.content, 0);
         evas_object_map_enable_set(wd->back.content, 0);
+// FIXME: hack around evas rendering bug (only fix makes evas bitch-slow
+        evas_object_resize(wd->front.content, 0, 0);
+        evas_object_resize(wd->back.content, 0, 0);
+        evas_smart_objects_calculate(evas_object_evas_get(obj));
+// FIXME: end hack
         wd->animator = NULL;
         wd->state = !wd->state;
         _configure(obj);
@@ -330,21 +392,32 @@ elm_flip_add(Evas_Object *parent)
    elm_widget_del_hook_set(obj, _del_hook);
    elm_widget_theme_hook_set(obj, _theme_hook);
 
+   wd->clip = evas_object_rectangle_add(e);
+   evas_object_color_set(wd->clip, 255, 255, 255, 255);
+   evas_object_move(wd->clip, -49999, -49999);
+   evas_object_resize(wd->clip, 99999, 99999);
+   elm_widget_sub_object_add(obj, wd->clip);
+   evas_object_clip_set(wd->clip, evas_object_clip_get(obj));
+   evas_object_smart_member_add(wd->clip, obj);
    wd->front.clip = evas_object_rectangle_add(e);
+   evas_object_static_clip_set(wd->front.clip, 1);
+   evas_object_data_set(wd->front.clip, "_elm_leaveme", obj);
    evas_object_color_set(wd->front.clip, 255, 255, 255, 255);
    evas_object_move(wd->front.clip, -49999, -49999);
    evas_object_resize(wd->front.clip, 99999, 99999);
-   elm_widget_sub_object_add(wd->front.clip, obj);
+   elm_widget_sub_object_add(obj, wd->front.clip);
    evas_object_smart_member_add(wd->front.clip, obj);
-   evas_object_clip_set(wd->front.clip, evas_object_clip_get(obj));
+   evas_object_clip_set(wd->front.clip, wd->clip);
    
    wd->back.clip = evas_object_rectangle_add(e);
+   evas_object_static_clip_set(wd->back.clip, 1);
+   evas_object_data_set(wd->back.clip, "_elm_leaveme", obj);
    evas_object_color_set(wd->back.clip, 255, 255, 255, 255);
    evas_object_move(wd->back.clip, -49999, -49999);
    evas_object_resize(wd->back.clip, 99999, 99999);
    elm_widget_sub_object_add(wd->back.clip, obj);
-   evas_object_smart_member_add(wd->back.clip, obj);
-   evas_object_clip_set(wd->back.clip, evas_object_clip_get(obj));
+   evas_object_smart_member_add(obj, wd->back.clip);
+   evas_object_clip_set(wd->back.clip, wd->clip);
 
    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, NULL);
@@ -387,11 +460,8 @@ elm_flip_content_front_set(Evas_Object *obj, Evas_Object *content)
                                        EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        _sizing_eval(obj);
-        if (!elm_flip_front_get(obj)) evas_object_hide(wd->front.clip);
-        else evas_object_show(wd->front.clip);
      }
-   else
-     evas_object_hide(wd->front.clip);     
+   flip_show_hide(obj);
    _configure(obj);
 }
 
@@ -426,11 +496,8 @@ elm_flip_content_back_set(Evas_Object *obj, Evas_Object *content)
                                        EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        _sizing_eval(obj);
-        if (elm_flip_front_get(obj)) evas_object_hide(wd->back.clip);
-        else evas_object_show(wd->back.clip);
      }
-   else
-     evas_object_hide(wd->back.clip);
+   flip_show_hide(obj);
    _configure(obj);
 }
 
@@ -525,7 +592,9 @@ elm_flip_go(Evas_Object *obj, Elm_Flip_Mode mode)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    if (!wd->animator) wd->animator = ecore_animator_add(_animate, obj);
+   flip_show_hide(obj);
    wd->mode = mode;
    wd->start = ecore_loop_time_get();
    wd->len = 0.5;
+   _flip(obj);
 }
index 6b6e34f..7e2d017 100644 (file)
@@ -115,10 +115,27 @@ _configure(Evas_Object *obj)
    if (!wd) return;
    if (wd->content)
      {
-        Evas_Coord x, y, w, h;
+        Evas_Coord x, y, w, h, x2, y2;
         
         evas_object_geometry_get(obj, &x, &y, &w, &h);
-        if (!wd->enabled) evas_object_move(wd->content, x, y);
+        evas_object_geometry_get(wd->content, &x2, &y2, NULL, NULL);
+        if ((x != x2) || (y != y2))
+          {
+             if (!wd->enabled)
+                evas_object_move(wd->content, x, y);
+             else
+               {
+                  
+                  Evas *e = evas_object_evas_get(obj);
+                  evas_smart_objects_calculate(e);
+                  evas_nochange_push(e);
+//                  printf("x--------------------\n");
+                  evas_object_move(wd->content, x, y);
+                  evas_smart_objects_calculate(e);
+//                  printf("y--------------------\n");
+                  evas_nochange_pop(e);
+               }
+          }
         evas_object_resize(wd->content, w, h);
         _mapbuf(obj);
      }
index 5bdbe68..330e39f 100644 (file)
@@ -77,8 +77,21 @@ struct _Elm_Drop_Data
    int                   len;
 };
 
+
+/* increment this whenever we change config enough that you need new
+ * defaults for elm to work.
+ */
+#define ELM_CONFIG_EPOCH           0x0001
+/* increment this whenever a new set of config values are added but the users
+ * config doesn't need to be wiped - simply new values need to be put in
+ */
+#define ELM_CONFIG_FILE_GENERATION 0x0001
+#define ELM_CONFIG_VERSION         ((ELM_CONFIG_EPOCH << 16) | ELM_CONFIG_FILE_GENERATION)
+
+
 struct _Elm_Config
 {
+   int config_version;
    int engine;
    int thumbscroll_enable;
    int thumbscroll_threshhold;
index f2383fd..656f67d 100644 (file)
@@ -1333,37 +1333,74 @@ _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
 static void
 _smart_show(Evas_Object *obj)
 {
+   Eina_List *list, *l;
+   Evas_Object *o;
    INTERNAL_ENTRY;
-   evas_object_show(sd->resize_obj);
+   list = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(list, l, o)
+     {
+        if (evas_object_data_get(o, "_elm_leaveme")) continue;
+        evas_object_show(o);
+     }
 }
 
 static void
 _smart_hide(Evas_Object *obj)
 {
+   Eina_List *list, *l;
+   Evas_Object *o;
    INTERNAL_ENTRY;
-   evas_object_hide(sd->resize_obj);
+   list = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(list, l, o)
+     {
+        if (evas_object_data_get(o, "_elm_leaveme")) continue;
+        evas_object_hide(o);
+     }
    _if_focused_revert(obj);
 }
 
 static void
 _smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
 {
+   Eina_List *list, *l;
+   Evas_Object *o;
    INTERNAL_ENTRY;
-   evas_object_color_set(sd->resize_obj, r, g, b, a);
+   list = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(list, l, o)
+     {
+        if (evas_object_data_get(o, "_elm_leaveme")) continue;
+        evas_object_color_set(o, r, g, b, a);
+     }
 }
 
 static void
 _smart_clip_set(Evas_Object *obj, Evas_Object *clip)
 {
+   Eina_List *list, *l;
+   Evas_Object *o;
    INTERNAL_ENTRY;
-   evas_object_clip_set(sd->resize_obj, clip);
+   list = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(list, l, o)
+     {
+        if (evas_object_data_get(o, "_elm_leaveme")) continue;
+        evas_object_clip_set(o, clip);
+     }
 }
 
 static void
 _smart_clip_unset(Evas_Object *obj)
 {
+   Eina_List *list, *l;
+   Evas_Object *o;
    INTERNAL_ENTRY;
-   evas_object_clip_unset(sd->resize_obj);
+//   evas_object_clip_unset(sd->resize_obj);
+//   return;
+   list = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(list, l, o)
+     {
+        if (evas_object_data_get(o, "_elm_leaveme")) continue;
+        evas_object_clip_unset(o);
+     }
 }
 
 static void