Hello everyone,
attached is a patch that allows to have additional deskflip animations
registered by modules. Could someone please review it? Suggestions are
welcome :)

Best Regards,
Hannes
Index: src/bin/e_config.h
===================================================================
--- src/bin/e_config.h	(revision 40555)
+++ src/bin/e_config.h	(working copy)
@@ -35,7 +35,7 @@
 /* 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 E_CONFIG_FILE_GENERATION 0x0133
+#define E_CONFIG_FILE_GENERATION 0x0134
 #define E_CONFIG_FILE_VERSION    ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION)
 
 #define E_EVAS_ENGINE_DEFAULT         0
@@ -275,7 +275,8 @@
    Eina_Bool   desk_flip_pan_bg;
    double      desk_flip_pan_x_axis_factor;
    double      desk_flip_pan_y_axis_factor;
-   
+   const char *desk_flip_animation;
+  
    const char *wallpaper_import_last_dev; // INTERNAL
    const char *wallpaper_import_last_path; // INTERNAL
 
Index: src/bin/e_config.c
===================================================================
--- src/bin/e_config.c	(revision 40555)
+++ src/bin/e_config.c	(working copy)
@@ -625,6 +625,7 @@
    E_CONFIG_VAL(D, T, desk_flip_pan_bg, UCHAR);
    E_CONFIG_VAL(D, T, desk_flip_pan_x_axis_factor, DOUBLE);
    E_CONFIG_VAL(D, T, desk_flip_pan_y_axis_factor, DOUBLE);
+   E_CONFIG_VAL(D, T, desk_flip_animation, STR);
    
    E_CONFIG_VAL(D, T, wallpaper_import_last_dev, STR);
    E_CONFIG_VAL(D, T, wallpaper_import_last_path, STR);
@@ -924,6 +925,10 @@
         COPYVAL(desk_flip_pan_y_axis_factor);
         IFCFGEND;
 
+	IFCFG(0x0134);
+        COPYVAL(desk_flip_animation);
+        IFCFGEND;
+
         e_config->config_version = E_CONFIG_FILE_VERSION;   
         _e_config_free(tcfg);
      }
@@ -1672,6 +1677,7 @@
    if (ecf->wallpaper_import_last_path) eina_stringshare_del(ecf->wallpaper_import_last_path);
    if (ecf->theme_default_border_style) eina_stringshare_del(ecf->theme_default_border_style);
    if (ecf->desklock_custom_desklock_cmd) eina_stringshare_del(ecf->desklock_custom_desklock_cmd);
+   if (ecf->desk_flip_animation) eina_stringshare_del(ecf->desk_flip_animation);
    EINA_LIST_FREE(ecf->syscon.actions, sca)
      {
         if (sca->action) eina_stringshare_del(sca->action);
Index: src/bin/e_desk.h
===================================================================
--- src/bin/e_desk.h	(revision 40555)
+++ src/bin/e_desk.h	(working copy)
@@ -9,7 +9,7 @@
 typedef struct _E_Event_Desk_After_Show E_Event_Desk_After_Show;
 typedef struct _E_Event_Desk_DeskShow E_Event_Desk_DeskShow;
 typedef struct _E_Event_Desk_Name_Change E_Event_Desk_Name_Change;
-
+typedef struct _E_Desk_Animation E_Desk_Animation;
 #else
 #ifndef E_DESK_H
 #define E_DESK_H
@@ -32,6 +32,13 @@
    Ecore_Animator      *animator;
 };
 
+struct _E_Desk_Animation 
+{
+   const char *name;
+   const char *label;
+   void (*func) (E_Desk *show, E_Desk *hide);
+};
+
 struct _E_Event_Desk_Show
 {
    E_Desk   *desk;
@@ -73,6 +80,10 @@
 EAPI void         e_desk_col_add(E_Zone *zone);
 EAPI void         e_desk_col_remove(E_Zone *zone);
 
+EAPI void         e_desk_animation_register(E_Desk_Animation *anim);
+EAPI void         e_desk_animation_unregister(E_Desk_Animation *anim);
+EAPI Eina_List   *e_desk_animation_list(void);
+
 extern EAPI int E_EVENT_DESK_SHOW;
 extern EAPI int E_EVENT_DESK_BEFORE_SHOW;
 extern EAPI int E_EVENT_DESK_AFTER_SHOW;
Index: src/bin/e_desk.c
===================================================================
--- src/bin/e_desk.c	(revision 40555)
+++ src/bin/e_desk.c	(working copy)
@@ -14,13 +14,20 @@
 static void _e_border_event_desk_after_show_free(void *data, void *ev);
 static void _e_border_event_desk_deskshow_free(void *data, void *ev);
 static void _e_border_event_desk_name_change_free(void *data, void *ev);
-static void _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy);
-static void _e_desk_show_end(E_Desk *desk);
-static int _e_desk_show_animator(void *data);
-static void _e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy);
-static void _e_desk_hide_end(E_Desk *desk);
-static int _e_desk_hide_animator(void *data);
 
+static void _e_desk_anim_none(E_Desk *desk, E_Desk *last);
+static void _e_desk_anim_pane(E_Desk *desk, E_Desk *last);
+static void _e_desk_anim_zoom(E_Desk *desk, E_Desk *last);
+static void _e_desk_anim_show_end(E_Desk *desk);
+static int  _e_desk_anim_show_animator(void *data);
+static void _e_desk_anim_hide_end(E_Desk *desk);
+static int  _e_desk_anim_hide_animator(void *data);
+
+static E_Desk_Animation *anim_none;
+static E_Desk_Animation *anim_zoom;
+static E_Desk_Animation *anim_pane;
+static Eina_List *animations = NULL;
+
 EAPI int E_EVENT_DESK_SHOW = 0;
 EAPI int E_EVENT_DESK_BEFORE_SHOW = 0;
 EAPI int E_EVENT_DESK_AFTER_SHOW = 0;
@@ -35,15 +42,62 @@
    E_EVENT_DESK_AFTER_SHOW = ecore_event_type_new();
    E_EVENT_DESK_DESKSHOW = ecore_event_type_new();
    E_EVENT_DESK_NAME_CHANGE = ecore_event_type_new();
+
+   anim_none = calloc(1, sizeof(E_Desk_Animation));
+   anim_none->name = "none";
+   anim_none->label = _("Off");
+   anim_none->func = &_e_desk_anim_none;
+   e_desk_animation_register(anim_none);
+
+   anim_pane = calloc(1, sizeof(E_Desk_Animation));
+   anim_pane->name = "pane";
+   anim_pane->label = _("Pane");
+   anim_pane->func = &_e_desk_anim_pane;
+   e_desk_animation_register(anim_pane);
+
+   anim_zoom = calloc(1, sizeof(E_Desk_Animation));
+   anim_zoom->name = "zoom";
+   anim_zoom->label = _("Zoom");
+   anim_zoom->func = &_e_desk_anim_zoom;
+   e_desk_animation_register(anim_zoom);
+
+   if (!e_config->desk_flip_animation)
+     e_config->desk_flip_animation = eina_stringshare_add("none");
+
    return 1;
 }
 
 EAPI int
 e_desk_shutdown(void)
 {
+   e_desk_animation_unregister(anim_none);
+   e_desk_animation_unregister(anim_zoom);
+   e_desk_animation_unregister(anim_pane);
+   free(anim_none);
+   free(anim_zoom);
+   free(anim_pane);
    return 1;
 }
 
+EAPI void
+e_desk_animation_register(E_Desk_Animation *anim)
+{
+   if (!eina_list_data_find(animations, anim))
+     animations = eina_list_append(animations, anim);
+}
+
+EAPI void
+e_desk_animation_unregister(E_Desk_Animation *anim)
+{
+   animations = eina_list_remove(animations, anim);
+}
+
+EAPI Eina_List *
+e_desk_animation_list(void)
+{
+   return animations;
+}
+
 EAPI E_Desk *
 e_desk_new(E_Zone *zone, int x, int y)
 {
@@ -203,14 +257,26 @@
 EAPI void
 e_desk_show(E_Desk *desk)
 {
-   E_Border_List *bl;
-   E_Border *bd;
    E_Event_Desk_Show *ev;
    E_Event_Desk_Before_Show *eev;
    E_Event_Desk_After_Show *eeev;
    Eina_List *l;
    int was_zone = 0, x, y, dx = 0, dy = 0, prev_x = 0, prev_y = 0;
+   E_Desk_Animation *anim = NULL;
+   E_Desk *last = NULL;
 
+   if (e_config->desk_flip_animation)
+     {
+	printf("find anim %s\n", e_config->desk_flip_animation);
+	
+	EINA_LIST_FOREACH(animations, l, anim)
+	  {
+	     if (!strcmp(anim->name, e_config->desk_flip_animation))
+	       break;
+	     anim = NULL;
+	  }
+     }
+   
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
    if (desk->visible) return;
@@ -236,9 +302,7 @@
 		  prev_y = desk2->y;
 		  dx = desk->x - desk2->x;
 		  dy = desk->y - desk2->y;
-		  if (e_config->desk_flip_animate_mode > 0)
-		    _e_desk_hide_begin(desk2, e_config->desk_flip_animate_mode, 
-				       dx, dy);
+		  if (anim) last = desk2;		  
 		  break;
 	       }
 	  }
@@ -249,27 +313,12 @@
    desk->visible = 1;
 
    if (desk->zone->bg_object) was_zone = 1;
-   if (e_config->desk_flip_animate_mode == 0)
-     {
-	bl = e_container_border_list_first(desk->zone->container);
-	while ((bd = e_container_border_list_next(bl)))
-	  {
-	     if ((bd->desk->zone == desk->zone) && (!bd->iconic))
-	       {
-		  if ((bd->desk == desk) || (bd->sticky))
-                    e_border_show(bd);
-		  else if (bd->moving)
-		    e_border_desk_set(bd, desk);
-		  else
-                    e_border_hide(bd, 2);
-	       }
-	  }
-	e_container_border_list_free(bl);
-     }
 
-   if (e_config->desk_flip_animate_mode > 0)
-     _e_desk_show_begin(desk, e_config->desk_flip_animate_mode, dx, dy);
-
+   if (anim)
+     anim->func(desk, last);
+   else
+     _e_desk_anim_none(desk, last);
+   
    if (e_config->focus_last_focused_per_desktop)
      e_desk_last_focused_focus(desk);
 
@@ -323,7 +372,8 @@
 	  e_shelf_hide(es);
      }
 
-   if (e_config->desk_flip_animate_mode == 0)
+   // XXX is this event needed for anything?
+   if (!strcmp(anim->name, "none"))
      {
 	eeev = E_NEW(E_Event_Desk_After_Show, 1);
 	eeev->desk = e_desk_current_get(desk->zone);
@@ -331,7 +381,6 @@
 	ecore_event_add(E_EVENT_DESK_AFTER_SHOW, eeev, 
 			_e_border_event_desk_after_show_free, NULL);
      }
-
 }
 
 EAPI void
@@ -584,80 +633,198 @@
 }
 
 static void
-_e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
+_e_desk_anim_none(E_Desk *desk, E_Desk *last)
 {
    E_Border_List *bl;
    E_Border *bd;
-   double t;
 
-   t = ecore_loop_time_get();
    bl = e_container_border_list_first(desk->zone->container);
    while ((bd = e_container_border_list_next(bl)))
      {
 	if ((bd->desk->zone == desk->zone) && (!bd->iconic))
 	  {
+	     if ((bd->desk == desk) || (bd->sticky))
+	       e_border_show(bd);
+	     else if (bd->moving)
+	       e_border_desk_set(bd, desk);
+	     else
+	       e_border_hide(bd, 2);
+	  }
+     }
+   e_container_border_list_free(bl);
+}   
+
+static void
+_e_desk_anim_pane(E_Desk *desk, E_Desk *last)
+{
+   E_Border_List *bl;
+   E_Border *bd;
+   double t;
+   int dx = 0, dy = 0;
+   if (last)
+     {
+	dx = desk->x - last->x;
+	dy = desk->y - last->y;
+     }
+   
+   t = ecore_loop_time_get();
+   bl = e_container_border_list_first(desk->zone->container);
+   while ((bd = e_container_border_list_next(bl)))
+     {
+	if (bd->iconic) continue;
+
+	if (bd->desk->zone == desk->zone)
+	  {
 	     if (bd->moving)
 	       {
 		  bd->fx.start.t = t;
 		  bd->fx.start.x = 0;
 		  bd->fx.start.y = 0;
-		  e_border_desk_set(bd, desk);
-		  e_border_show(bd);
+
+		  if (bd->desk == desk)
+		    {
+		       e_border_desk_set(bd, desk);
+		       e_border_show(bd);
+		    }
 	       }
-	     else if ((bd->desk == desk) && (!bd->sticky))
+	     else if ((!bd->sticky) && ((bd->desk == desk) || (bd->desk == last)))
 	       {
 		  bd->fx.start.t = t;
-		  if (mode == 1)
+		  if (bd->desk == desk)
 		    {
 		       bd->fx.start.x = bd->zone->w * dx;
 		       bd->fx.start.y = bd->zone->h * dy;
 		    }
-		  else if (mode == 2)
+		  else
 		    {
-		       int mx, my, bx, by;
-		       double fx, fy, ang, rad, len, lmax;
+		       bd->fx.start.x = bd->zone->w * -dx;
+		       bd->fx.start.y = bd->zone->h * -dy;
+		    }
+		  
+		  if (bd->fx.start.x < 0)
+		    bd->fx.start.x -= bd->zone->x;
+		  else
+		    bd->fx.start.x += bd->zone->container->w -
+		                     (bd->zone->x + bd->zone->w);
+		  if (bd->fx.start.y < 0)
+		    bd->fx.start.y -= bd->zone->y;
+		  else
+		    bd->fx.start.y += bd->zone->container->h -
+		                     (bd->zone->y + bd->zone->h);
 
-		       mx = bd->zone->x + (bd->zone->w / 2);
-		       my = bd->zone->y + (bd->zone->h / 2);
+		  if (bd->desk == desk)
+		    {
+		       e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
+		       e_border_show(bd);
+		    }
+		  else
+		    e_border_fx_offset(bd, 0, 0);		  
+	       }
+	  }
+     }
+   e_container_border_list_free(bl);
+   if (desk->animator) ecore_animator_del(desk->animator);
+   desk->animator = ecore_animator_add(_e_desk_anim_show_animator, desk);
+   if (last)
+     {
+	if (last->animator) ecore_animator_del(last->animator);
+	last->animator = ecore_animator_add(_e_desk_anim_hide_animator, last);
+     }
+}
 
-		       bx = bd->x + (bd->w / 2) - mx;
-		       by = bd->y + (bd->h / 2) - my;
-		       if (bx == 0) bx = 1;
-		       if (by == 0) by = 1;
-		       fx = (double)bx / (double)(bd->zone->w / 2);
-		       fy = (double)by / (double)(bd->zone->h / 2);
-		       ang = atan(fy / fx);
-		       if (fx < 0.0)
-			 ang = M_PI + ang;
-		       len = sqrt((bx * bx) + (by * by));
-		       lmax = sqrt(((bd->zone->w / 2) * (bd->zone->w / 2)) +
-				   ((bd->zone->h / 2) * (bd->zone->h / 2)));
-		       rad = sqrt((bd->w * bd->w) + (bd->h * bd->h)) / 2.0;
-		       bx = cos(ang) * (lmax - len + rad);
-		       by = sin(ang) * (lmax - len + rad);
-		       bd->fx.start.x = bx;
-		       bd->fx.start.y = by;
+static void
+_e_desk_anim_zoom(E_Desk *desk, E_Desk *last)
+{
+   E_Border_List *bl;
+   E_Border *bd;
+   double t;
+   int dx = 0, dy = 0, mx, my, bx, by;
+   double fx, fy, ang, rad, len, lmax;
+
+   if (last)
+     {
+	dx = desk->x - last->x;
+	dy = desk->y - last->y;
+     }
+   
+   t = ecore_loop_time_get();
+   bl = e_container_border_list_first(desk->zone->container);
+   while ((bd = e_container_border_list_next(bl)))
+     {
+	if (bd->iconic) continue;
+
+	if (bd->desk->zone == desk->zone)
+	  {
+	     if (bd->moving)
+	       {
+		  bd->fx.start.t = t;
+		  bd->fx.start.x = 0;
+		  bd->fx.start.y = 0;
+
+		  if (bd->desk == desk)
+		    {
+		       e_border_desk_set(bd, desk);
+		       e_border_show(bd);
 		    }
+	       }
+	     else if ((!bd->sticky) && ((bd->desk == desk) || (bd->desk == last)))
+	       {
+		  mx = bd->zone->x + (bd->zone->w / 2);
+		  my = bd->zone->y + (bd->zone->h / 2);
+
+		  bx = bd->x + (bd->w / 2) - mx;
+		  by = bd->y + (bd->h / 2) - my;
+		  if (bx == 0) bx = 1;
+		  if (by == 0) by = 1;
+		  fx = (double)bx / (double)(bd->zone->w / 2);
+		  fy = (double)by / (double)(bd->zone->h / 2);
+		  ang = atan(fy / fx);
+		  if (fx < 0.0)
+		    ang = M_PI + ang;
+		  len = sqrt((bx * bx) + (by * by));
+		  lmax = sqrt(((bd->zone->w / 2) * (bd->zone->w / 2)) +
+			      ((bd->zone->h / 2) * (bd->zone->h / 2)));
+		  rad = sqrt((bd->w * bd->w) + (bd->h * bd->h)) / 2.0;
+		  bx = cos(ang) * (lmax - len + rad);
+		  by = sin(ang) * (lmax - len + rad);
+
+		  bd->fx.start.t = t;		  
+		  bd->fx.start.x = bx;
+		  bd->fx.start.y = by;
+
 		  if (bd->fx.start.x < 0)
 		    bd->fx.start.x -= bd->zone->x;
 		  else
-		    bd->fx.start.x += bd->zone->container->w - (bd->zone->x + bd->zone->w);
+		    bd->fx.start.x += bd->zone->container->w -
+		                     (bd->zone->x + bd->zone->w); 
 		  if (bd->fx.start.y < 0)
 		    bd->fx.start.y -= bd->zone->y;
 		  else
-		    bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
-		  e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
-		  e_border_show(bd);
+		    bd->fx.start.y += bd->zone->container->h -
+		                     (bd->zone->y + bd->zone->h);
+
+		  if (bd->desk == desk)
+		    {
+		       e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
+		       e_border_show(bd);
+		    }
+		  else
+		    e_border_fx_offset(bd, 0, 0);
 	       }
 	  }
      }
    e_container_border_list_free(bl);
    if (desk->animator) ecore_animator_del(desk->animator);
-   desk->animator = ecore_animator_add(_e_desk_show_animator, desk);
+   desk->animator = ecore_animator_add(_e_desk_anim_show_animator, desk);
+   if (last)
+     {
+	if (last->animator) ecore_animator_del(last->animator);
+	last->animator = ecore_animator_add(_e_desk_anim_hide_animator, last);
+     }
 }
 
 static void
-_e_desk_show_end(E_Desk *desk)
+_e_desk_anim_show_end(E_Desk *desk)
 {
    E_Event_Desk_After_Show *ev;
    E_Border_List *bl;
@@ -684,13 +851,13 @@
 }
 
 static int
-_e_desk_show_animator(void *data)
+_e_desk_anim_show_animator(void *data)
 {
    E_Desk *desk;
    E_Border_List *bl;
    E_Border *bd;
    double t, dt, spd;
-
+   
    desk = data;
    t = ecore_loop_time_get();
    dt = -1.0;
@@ -718,89 +885,20 @@
    e_container_border_list_free(bl);
    if (dt <= 0.0)
      {
-	_e_desk_show_end(desk);
+	_e_desk_anim_show_end(desk);
 	desk->animator = NULL;
 	return 0;
      }
    return 1;
 }
 
-static void
-_e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy)
-{
-   E_Border_List *bl;
-   E_Border *bd;
-   double t;
 
-   t = ecore_loop_time_get();
-   bl = e_container_border_list_first(desk->zone->container);
-   while ((bd = e_container_border_list_next(bl)))
-     {
-	if ((bd->desk->zone == desk->zone) && (!bd->iconic))
-	  {
-	     if (bd->moving)
-	       {
-		  bd->fx.start.t = t;
-		  bd->fx.start.x = 0;
-		  bd->fx.start.y = 0;
-	       }
-	     else if ((bd->desk == desk) && (!bd->sticky))
-	       {
-		  bd->fx.start.t = t;
-		  if (mode == 1)
-		    {
-		       bd->fx.start.x = bd->zone->w * -dx;
-		       bd->fx.start.y = bd->zone->h * -dy;
-		    }
-		  else if (mode == 2)
-		    {
-		       int mx, my, bx, by;
-		       double fx, fy, ang, rad, len, lmax;
-
-		       mx = bd->zone->x + (bd->zone->w / 2);
-		       my = bd->zone->y + (bd->zone->h / 2);
-
-		       bx = bd->x + (bd->w / 2) - mx;
-		       by = bd->y + (bd->h / 2) - my;
-		       if (bx == 0) bx = 1;
-		       if (by == 0) by = 1;
-		       fx = (double)bx / (double)(bd->zone->w / 2);
-		       fy = (double)by / (double)(bd->zone->h / 2);
-		       ang = atan(fy / fx);
-		       if (fx < 0.0)
-			 ang = M_PI + ang;
-		       len = sqrt((bx * bx) + (by * by));
-		       lmax = sqrt(((bd->zone->w / 2) * (bd->zone->w / 2)) +
-				   ((bd->zone->h / 2) * (bd->zone->h / 2)));
-		       rad = sqrt((bd->w * bd->w) + (bd->h * bd->h)) / 2.0;
-		       bx = cos(ang) * (lmax - len + rad);
-		       by = sin(ang) * (lmax - len + rad);
-		       bd->fx.start.x = bx;
-		       bd->fx.start.y = by;
-		    }
-		  if (bd->fx.start.x < 0)
-		    bd->fx.start.x -= bd->zone->x;
-		  else
-		    bd->fx.start.x += bd->zone->container->w - (bd->zone->x + bd->zone->w);
-		  if (bd->fx.start.y < 0)
-		    bd->fx.start.y -= bd->zone->y;
-		  else
-		    bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
-		  e_border_fx_offset(bd, 0, 0);
-	       }
-	  }
-     }
-   e_container_border_list_free(bl);
-   if (desk->animator) ecore_animator_del(desk->animator);
-   desk->animator = ecore_animator_add(_e_desk_hide_animator, desk);
-}
-
 static void
-_e_desk_hide_end(E_Desk *desk)
+_e_desk_anim_hide_end(E_Desk *desk)
 {
    E_Border_List *bl;
    E_Border *bd;
-
+   
    bl = e_container_border_list_first(desk->zone->container);
    while ((bd = e_container_border_list_next(bl)))
      {
@@ -820,7 +918,7 @@
 }
 
 static int
-_e_desk_hide_animator(void *data)
+_e_desk_anim_hide_animator(void *data)
 {
    E_Desk *desk;
    E_Border_List *bl;
@@ -853,7 +951,7 @@
    e_container_border_list_free(bl);
    if ((dt < 0.0) || (dt >= 1.0))
      {
-	_e_desk_hide_end(desk);
+	_e_desk_anim_hide_end(desk);
 	desk->animator = NULL;
 	return 0;
      }
Index: src/modules/conf_desks/e_int_config_desks.c
===================================================================
--- src/modules/conf_desks/e_int_config_desks.c	(revision 40555)
+++ src/modules/conf_desks/e_int_config_desks.c	(working copy)
@@ -24,15 +24,16 @@
    int flip_animate;
    
    /*- ADVANCED -*/
+   int flip_animation_cur;
+   int flip_animation_sel;
    int edge_flip_dragging;
    int flip_wrap;
-   int flip_mode;
    int flip_interp;
    int flip_pan_bg;
    double flip_speed;
    double x_axis_pan;
    double y_axis_pan;
-
+  
    /*- GUI -*/
    Evas_Object *preview;
    Eina_List *flip_anim_list;
@@ -69,17 +70,31 @@
 static void
 _fill_data(E_Config_Dialog_Data *cfdata)
 {
+   E_Desk_Animation *anim;
+   Eina_List *l;
+   int i = 0;
+   
    cfdata->x = e_config->zone_desks_x_count;
    cfdata->y = e_config->zone_desks_y_count;
-   cfdata->flip_animate = e_config->desk_flip_animate_mode > 0;
+   cfdata->flip_animate = strcmp(e_config->desk_flip_animation, "none") != 0;
    cfdata->edge_flip_dragging = e_config->edge_flip_dragging;
    cfdata->flip_wrap = e_config->desk_flip_wrap;
-   cfdata->flip_mode = e_config->desk_flip_animate_mode;
    cfdata->flip_interp = e_config->desk_flip_animate_interpolation;
    cfdata->flip_pan_bg = e_config->desk_flip_pan_bg;
    cfdata->flip_speed = e_config->desk_flip_animate_time;
    cfdata->x_axis_pan = e_config->desk_flip_pan_x_axis_factor;
    cfdata->y_axis_pan = e_config->desk_flip_pan_y_axis_factor;
+
+   EINA_LIST_FOREACH(e_desk_animation_list(), l, anim)
+     {
+	if (!strcmp(anim->name, e_config->desk_flip_animation))
+	  {
+	     cfdata->flip_animation_sel = i;
+	     cfdata->flip_animation_cur = i;
+	     break;
+	  }
+	i++;
+     }
 }
 
 static void *
@@ -120,15 +135,16 @@
 
    if (cfdata->flip_animate)
      {
-	cfdata->flip_mode = 1;
-	e_config->desk_flip_animate_mode = 1;
+	eina_stringshare_del(e_config->desk_flip_animation);	
+	e_config->desk_flip_animation = eina_stringshare_add("pane");
+
 	e_config->desk_flip_animate_interpolation = 0;
 	e_config->desk_flip_animate_time  = 0.5;
      }
    else
      {
-	cfdata->flip_mode = 0;
-	e_config->desk_flip_animate_mode = 0;
+	eina_stringshare_del(e_config->desk_flip_animation);	
+	e_config->desk_flip_animation = eina_stringshare_add("none");
      }
 
    e_config_save_queue();
@@ -155,16 +171,14 @@
 
    if (cfdata->flip_animate)
      {
-	if ((cfdata->flip_mode != 1) ||
-	    (e_config->desk_flip_animate_mode != 1) ||
+	if ((strcmp(e_config->desk_flip_animation, "pane") != 0) ||
 	    (e_config->desk_flip_animate_interpolation != 0) ||
 	    (e_config->desk_flip_animate_time != 0.5))
 	  return 1;
      }
    else
      {
-	if ((cfdata->flip_mode != 0) ||
-	    (e_config->desk_flip_animate_mode != 0))
+	if (strcmp(e_config->desk_flip_animation, "none") != 0)
 	  return 1;
      }
 
@@ -179,13 +193,28 @@
    E_Manager *man;
    E_Container *con;
    E_Zone *zone;
-
+   
    EINA_LIST_FOREACH(e_manager_list(), l, man)
      EINA_LIST_FOREACH(man->containers, ll, con)
        EINA_LIST_FOREACH(con->zones, lll, zone)
          e_zone_desk_count_set(zone, cfdata->x, cfdata->y);
 
-   e_config->desk_flip_animate_mode = cfdata->flip_mode;
+   if (cfdata->flip_animation_sel != cfdata->flip_animation_cur)
+     {
+	E_Desk_Animation *anim;
+	
+	if (e_config->desk_flip_animation)
+	  eina_stringshare_del(e_config->desk_flip_animation);
+
+	anim = eina_list_nth(e_desk_animation_list(), cfdata->flip_animation_sel);
+	if (anim)
+	  e_config->desk_flip_animation = eina_stringshare_add(anim->name);
+	else
+	  e_config->desk_flip_animation = eina_stringshare_add("none");
+
+	cfdata->flip_animation_cur = cfdata->flip_animation_sel;
+     }
+   
    e_config->desk_flip_animate_interpolation = cfdata->flip_interp;
    e_config->desk_flip_pan_bg = cfdata->flip_pan_bg;
    e_config->desk_flip_animate_time = cfdata->flip_speed;
@@ -206,7 +235,9 @@
    E_Manager *man;
    E_Container *con;
    E_Zone *zone;
-
+   E_Desk_Animation *anim;
+   int changed = 0;
+   
    EINA_LIST_FOREACH(e_manager_list(), l, man)
      EINA_LIST_FOREACH(man->containers, ll, con)
        EINA_LIST_FOREACH(con->zones, lll, zone)
@@ -216,8 +247,8 @@
 	    if ((x != cfdata->x) || (y != cfdata->y))
 	      return 1;
 	 }
-
-   return ((e_config->desk_flip_animate_mode != cfdata->flip_mode) ||
+   
+   return ((cfdata->flip_animation_cur != cfdata->flip_animation_sel) ||
 	   (e_config->desk_flip_animate_interpolation != cfdata->flip_interp) ||
 	   (e_config->desk_flip_pan_bg != cfdata->flip_pan_bg) ||
 	   (e_config->desk_flip_animate_time != cfdata->flip_speed) ||
@@ -270,6 +301,9 @@
    /* generate the core widget layout for an advanced dialog */
    Evas_Object *o, *ob, *of, *ot, *ott;
    E_Radio_Group *rg;
+   Eina_List *l;
+   E_Desk_Animation *anim;
+   int i = 0;
    
    o = e_widget_list_add(evas, 0, 0);
    ott = e_widget_table_add(evas, 0);
@@ -300,30 +334,41 @@
    e_widget_table_object_append(ott, of, 1, 0, 1, 1, 1, 0, 1, 0);
    
    of = e_widget_framelist_add(evas, _("Flip Animation"), 0);
-   rg = e_widget_radio_group_new(&(cfdata->flip_mode));
-   ob = e_widget_radio_add(evas, _("Off"), 0, rg);
-   e_widget_framelist_object_append(of, ob);
-   e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
-   ob = e_widget_radio_add(evas, _("Pane"), 1, rg);
-   e_widget_framelist_object_append(of, ob);
-   e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
-   ob = e_widget_radio_add(evas, _("Zoom"), 2, rg);
-   e_widget_framelist_object_append(of, ob);
-   e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
+   rg = e_widget_radio_group_new(&(cfdata->flip_animation_sel));
+   
+   EINA_LIST_FOREACH(e_desk_animation_list(), l, anim)
+     {
+   	ob = e_widget_radio_add(evas, anim->label, i, rg);
+   	e_widget_framelist_object_append(of, ob);
+   	e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
+   	i++;
+     }
+
+   /* ob = e_widget_radio_add(evas, _("Off"), i, rg);
+    * e_widget_framelist_object_append(of, ob);   
+    * e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata); */
+
+   /* ob = e_widget_radio_add(evas, _("Pane"), 1, rg);
+    * e_widget_framelist_object_append(of, ob);
+    * e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
+    * ob = e_widget_radio_add(evas, _("Zoom"), 2, rg);
+    * e_widget_framelist_object_append(of, ob);
+    * e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata); */
+
    ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 5.0, 0.05, 0, &(cfdata->flip_speed), NULL, 200);
-   e_widget_disabled_set(ob, !cfdata->flip_mode);
+   e_widget_disabled_set(ob, !cfdata->flip_animation_sel);
    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_check_add(evas, _("Background panning"), &(cfdata->flip_pan_bg));
-   e_widget_disabled_set(ob, !cfdata->flip_mode);
+   e_widget_disabled_set(ob, !cfdata->flip_animation_sel);
    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_slider_add(evas, 1, 0, _("%.2f X-axis pan factor"), 0.0, 1.0, 0.01, 0, &(cfdata->x_axis_pan), NULL, 200);
-   e_widget_disabled_set(ob, !cfdata->flip_mode);
+   e_widget_disabled_set(ob, !cfdata->flip_animation_sel);
    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_slider_add(evas, 1, 0, _("%.2f Y-axis pan factor"), 0.0, 1.0, 0.01, 0, &(cfdata->y_axis_pan), NULL, 200);
-   e_widget_disabled_set(ob, !cfdata->flip_mode);
+   e_widget_disabled_set(ob, !cfdata->flip_animation_sel);
    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
    e_widget_framelist_object_append(of, ob);
 
@@ -349,7 +394,7 @@
    Eina_List *list = cfdata->flip_anim_list;
    Eina_List *l;
    Evas_Object *o;
-
+   
    EINA_LIST_FOREACH(list, l, o)
-      e_widget_disabled_set(o, !cfdata->flip_mode);
+      e_widget_disabled_set(o, !cfdata->flip_animation_sel);
 }
------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to