+static void
+_flip_content_front_set(Evas_Object *obj, Evas_Object *content)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ int i;
+
+ if (wd->front.content == content) return;
+ if (wd->front.content) evas_object_del(wd->front.content);
+ wd->front.content = content;
+ if (content)
+ {
+ elm_widget_sub_object_add(obj, content);
+ evas_object_smart_member_add(content, obj);
+ evas_object_clip_set(content, wd->front.clip);
+ evas_object_event_callback_add(content,
+ EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ _sizing_eval(obj);
+ }
+
+ // force calc to contents are the right size before transition
+ evas_smart_objects_calculate(evas_object_evas_get(obj));
+ flip_show_hide(obj);
+ _configure(obj);
+ if (wd->intmode != ELM_FLIP_INTERACTION_NONE)
+ {
+ for (i = 0; i < 4; i++) evas_object_raise(wd->event[i]);
+ }
+}
+
+static void
+_flip_content_back_set(Evas_Object *obj, Evas_Object *content)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ int i;
+ if (wd->back.content == content) return;
+ if (wd->back.content) evas_object_del(wd->back.content);
+ wd->back.content = content;
+ if (content)
+ {
+ elm_widget_sub_object_add(obj, content);
+ evas_object_smart_member_add(content, obj);
+ evas_object_clip_set(content, wd->back.clip);
+ evas_object_event_callback_add(content,
+ EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ _sizing_eval(obj);
+ }
+
+ // force calc to contents are the right size before transition
+ evas_smart_objects_calculate(evas_object_evas_get(obj));
+ flip_show_hide(obj);
+ _configure(obj);
+ if (wd->intmode != ELM_FLIP_INTERACTION_NONE)
+ {
+ for (i = 0; i < 4; i++) evas_object_raise(wd->event[i]);
+ }
+}
+
+static Evas_Object *
+_content_front_unset(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if ((!wd) || (!wd->front.content)) return NULL;
+
+ Evas_Object *content = wd->front.content;
+ evas_object_clip_unset(content);
+ elm_widget_sub_object_del(obj, content);
+ evas_object_event_callback_del_full(content,
+ EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ evas_object_smart_member_del(content);
+ wd->front.content = NULL;
+ return content;
+}
+
+static Evas_Object *
+_content_back_unset(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if ((!wd) || (!wd->back.content)) return NULL;
+
+ Evas_Object *content = wd->back.content;
+ evas_object_clip_unset(content);
+ elm_widget_sub_object_del(obj, content);
+ evas_object_event_callback_del_full(content,
+ EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ evas_object_smart_member_del(content);
+ wd->back.content = NULL;
+ return content;
+}
+
+static void
+_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+
+ if (!part || !strcmp(part, "front"))
+ _flip_content_front_set(obj, content);
+ else if (!strcmp(part, "back"))
+ _flip_content_back_set(obj, content);
+}
+
+static Evas_Object *
+_content_get_hook(const Evas_Object *obj, const char *part)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return NULL;
+
+ if (!part || !strcmp(part, "front"))
+ return wd->front.content;
+ else if (!strcmp(part, "back"))
+ return wd->back.content;
+
+ return NULL;
+}
+
+static Evas_Object *
+_content_unset_hook(Evas_Object *obj, const char *part)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+
+ if (!part || !strcmp(part, "front"))
+ return _content_front_unset(obj);
+ else if (!strcmp(part, "back"))
+ return _content_back_unset(obj);
+
+ return NULL;
+}
+