1. fix perf dialog - to actually change fps

2. save icon theme config
3. add config for desk flip animation modes etc. etc.
4. desk flip animation!!! 2 main modes. might restructure this a bit tho
(separate out on/off from the mode as there may be many more modes later)


SVN revision: 25299
This commit is contained in:
Carsten Haitzler 2006-09-01 15:37:23 +00:00
parent 3ab8e8f86b
commit 818e75fb00
8 changed files with 391 additions and 143 deletions

View File

@ -827,7 +827,7 @@ e_border_fx_offset(E_Border *bd, int x, int y)
bd->y + bd->fx.y + bd->client_inset.t,
bd->client.w,
bd->client.h);
_e_border_move_update(bd);
if (bd->moving) _e_border_move_update(bd);
}
EAPI void
@ -2309,8 +2309,9 @@ e_border_idler_before(void)
bl = e_container_border_list_last(con);
while ((bd = e_container_border_list_prev(bl)))
{
if ((bd->changes.visible) && (bd->visible) &&
(!bd->new_client))
if ((bd->changes.visible) && (bd->visible) &&
(!bd->new_client) && (!bd->changes.pos) &&
(!bd->changes.size))
{
ecore_evas_show(bd->bg_ecore_evas);
ecore_x_window_show(bd->win);
@ -2343,6 +2344,13 @@ e_border_idler_before(void)
bd->changes.visible = 0;
}
if (bd->changed) _e_border_eval(bd);
if ((bd->changes.visible) && (bd->visible) &&
(!bd->new_client))
{
ecore_evas_show(bd->bg_ecore_evas);
ecore_x_window_show(bd->win);
bd->changes.visible = 0;
}
}
e_container_border_list_free(bl);
}

View File

@ -125,6 +125,10 @@ struct _E_Border
struct {
int x, y;
struct {
int x, y;
double t;
} start;
} fx;
struct {

View File

@ -473,6 +473,12 @@ e_config_init(void)
E_CONFIG_VAL(D, T, border_raise_on_focus, INT);
E_CONFIG_VAL(D, T, desk_flip_wrap, INT);
E_CONFIG_VAL(D, T, icon_theme, STR);
E_CONFIG_VAL(D, T, desk_flip_animate_mode, INT);
E_CONFIG_VAL(D, T, desk_flip_animate_interpolation, INT);
E_CONFIG_VAL(D, T, desk_flip_animate_time, DOUBLE);
E_CONFIG_VAL(D, T, wallpaper_import_last_dev, STR);
E_CONFIG_VAL(D, T, wallpaper_import_last_path, STR);
@ -1216,7 +1222,10 @@ e_config_init(void)
e_config->wallpaper_grad_c2_b = 255;
IFCFGEND;
IFCFG(0x0100);
IFCFG(0x0101);
e_config->desk_flip_animate_mode = 1;
e_config->desk_flip_animate_interpolation = 0;
e_config->desk_flip_animate_time = 0.2;
IFCFGEND;
#if 0 /* example of new config */

View File

@ -50,7 +50,7 @@ typedef Eet_Data_Descriptor E_Config_DD;
/* increment this whenever a new set of config values are added but the users
* config doesn't need top be wiped - simply new values need to be put in
*/
#define E_CONFIG_FILE_GENERATION 0x0100
#define E_CONFIG_FILE_GENERATION 0x0101
#define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION)
#define E_EVAS_ENGINE_DEFAULT 0
@ -236,6 +236,10 @@ struct _E_Config
const char *icon_theme; // GUI
int desk_flip_animate_mode;
int desk_flip_animate_interpolation;
double desk_flip_animate_time;
const char *wallpaper_import_last_dev; // INTERNAL
const char *wallpaper_import_last_path; // INTERNAL

View File

@ -13,6 +13,13 @@ static void _e_border_event_desk_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);
EAPI int E_EVENT_DESK_SHOW = 0;
EAPI int E_EVENT_DESK_DESKSHOW = 0;
EAPI int E_EVENT_DESK_NAME_CHANGE = 0;
@ -183,173 +190,75 @@ e_desk_name_update(void)
}
}
static void _e_desk_show_begin(E_Desk *desk);
static void _e_desk_show_end(E_Desk *desk);
static int _e_desk_show_animator(void *data);
static void
_e_desk_show_begin(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)))
{
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
{
if ((bd->desk == desk) && (!bd->sticky))
{
e_border_fx_offset(bd, -desk->zone->w, 0);
e_border_show(bd);
if (bd->want_fullscreen)
{
e_border_fullscreen(bd, e_config->fullscreen_policy);
bd->want_fullscreen = 0;
}
}
else if (bd->moving)
e_border_desk_set(bd, desk);
}
}
e_container_border_list_free(bl);
ecore_animator_add(_e_desk_show_animator, desk);
}
static void
_e_desk_show_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)))
{
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
{
if ((bd->desk == desk) && (!bd->sticky))
{
e_border_fx_offset(bd, 0, 0);
}
else if (bd->moving)
{
e_border_fx_offset(bd, 0, 0);
e_border_desk_set(bd, desk);
}
}
}
e_container_border_list_free(bl);
}
static int
_e_desk_show_animator(void *data)
{
E_Desk *desk;
E_Border_List *bl;
E_Border *bd;
int done = 1;
desk = data;
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)
{
}
else if ((bd->desk == desk) || (!bd->sticky))
{
e_border_fx_offset(bd, bd->fx.x + 20, 0);
if (bd->fx.x < 0)
done = 0;
}
}
}
e_container_border_list_free(bl);
if (done)
{
_e_desk_show_end(desk);
return 0;
}
return 1;
}
static void
_e_desk_hide_begin(E_Desk *desk)
{
}
static void
_e_desk_hide_end(E_Desk *desk)
{
}
static int
_e_desk_hide_animator(void *data)
{
}
EAPI void
e_desk_show(E_Desk *desk)
{
E_Border_List *bl;
E_Border *bd;
int was_zone = 0;
int x, y;
int x, y, dx = 0, dy = 0;
E_Event_Desk_Show *ev;
E_OBJECT_CHECK(desk);
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
if (desk->visible) return;
// _e_desk_show_begin(desk);
for (x = 0; x < desk->zone->desk_x_count; x++)
{
for (y = 0; y < desk->zone->desk_y_count; y++)
{
E_Desk *desk2;
desk2 = e_desk_at_xy_get(desk->zone,x, y);
desk2->visible = 0;
desk2 = e_desk_at_xy_get(desk->zone, x, y);
if (desk2->visible)
{
desk2->visible = 0;
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);
break;
}
}
}
desk->zone->desk_x_current = desk->x;
desk->zone->desk_y_current = desk->y;
desk->visible = 1;
bl = e_container_border_list_first(desk->zone->container);
if (desk->zone->bg_object) was_zone = 1;
while ((bd = e_container_border_list_next(bl)))
if (e_config->desk_flip_animate_mode == 0)
{
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
bl = e_container_border_list_first(desk->zone->container);
while ((bd = e_container_border_list_next(bl)))
{
if ((bd->desk == desk) || (bd->sticky))
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
{
e_border_show(bd);
if (bd->want_fullscreen)
if ((bd->desk == desk) || (bd->sticky))
{
e_border_fullscreen(bd, e_config->fullscreen_policy);
bd->want_fullscreen = 0;
e_border_show(bd);
if (bd->want_fullscreen)
{
e_border_fullscreen(bd, e_config->fullscreen_policy);
bd->want_fullscreen = 0;
}
}
else if (bd->moving)
e_border_desk_set(bd, desk);
else
{
if (bd->fullscreen)
bd->want_fullscreen = 1;
e_border_hide(bd, 2);
}
}
else if (bd->moving)
e_border_desk_set(bd, desk);
else
{
/* We have to remember that this border wants to become
* fullscreen when we go back to this desk.
*/
if (bd->fullscreen)
bd->want_fullscreen = 1;
e_border_hide(bd, 2);
}
}
e_container_border_list_free(bl);
}
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 (e_config->focus_last_focused_per_desktop)
e_desk_last_focused_focus(desk);
@ -362,7 +271,6 @@ e_desk_show(E_Desk *desk)
ev->desk = desk;
e_object_ref(E_OBJECT(desk));
ecore_event_add(E_EVENT_DESK_SHOW, ev, _e_border_event_desk_show_free, NULL);
}
EAPI void
@ -556,6 +464,7 @@ static void
_e_desk_free(E_Desk *desk)
{
if (desk->name) evas_stringshare_del(desk->name);
if (desk->animator) ecore_animator_del(desk->animator);
free(desk);
}
@ -588,3 +497,277 @@ _e_border_event_desk_name_change_free(void *data, void *event)
e_object_unref(E_OBJECT(ev->desk));
free(ev);
}
static void
_e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
{
E_Border_List *bl;
E_Border *bd;
double t;
t = ecore_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;
e_border_desk_set(bd, desk);
e_border_show(bd);
}
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;
}
e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
e_border_show(bd);
if (bd->want_fullscreen)
{
e_border_fullscreen(bd, e_config->fullscreen_policy);
bd->want_fullscreen = 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);
}
static void
_e_desk_show_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)))
{
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
{
if (bd->moving)
{
e_border_fx_offset(bd, 0, 0);
// e_border_desk_set(bd, desk);
}
else if ((bd->desk == desk) && (!bd->sticky))
{
e_border_fx_offset(bd, 0, 0);
}
}
}
e_container_border_list_free(bl);
}
static int
_e_desk_show_animator(void *data)
{
E_Desk *desk;
E_Border_List *bl;
E_Border *bd;
double t, dt, spd;
desk = data;
t = ecore_time_get();
dt = -1.0;
spd = e_config->desk_flip_animate_time;
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)
{
}
else if ((bd->desk == desk) && (!bd->sticky))
{
dt = (t - bd->fx.start.t) / spd;
if (dt > 1.0) dt = 1.0;
dt = 1.0 - dt;
dt *= dt; // decelerate - could be a better hack
e_border_fx_offset(bd,
((double)bd->fx.start.x * dt),
((double)bd->fx.start.y * dt));
}
}
}
e_container_border_list_free(bl);
if (dt <= 0.0)
{
_e_desk_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_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;
}
e_border_fx_offset(bd, 0, 0);
if (bd->want_fullscreen)
{
e_border_fullscreen(bd, e_config->fullscreen_policy);
bd->want_fullscreen = 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_Border_List *bl;
E_Border *bd;
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)
{
e_border_fx_offset(bd, 0, 0);
}
else if ((bd->desk == desk) && (!bd->sticky))
{
e_border_fx_offset(bd, 0, 0);
if (bd->fullscreen)
bd->want_fullscreen = 1;
e_border_hide(bd, 2);
}
}
}
e_container_border_list_free(bl);
}
static int
_e_desk_hide_animator(void *data)
{
E_Desk *desk;
E_Border_List *bl;
E_Border *bd;
double t, dt, spd;
desk = data;
t = ecore_time_get();
dt = -1.0;
spd = e_config->desk_flip_animate_time;
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)
{
}
else if ((bd->desk == desk) && (!bd->sticky))
{
dt = (t - bd->fx.start.t) / spd;
if (dt > 1.0) dt = 1.0;
// dt = 1.0 - dt;
dt *= dt; // decelerate - could be a better hack
// dt = 1.0 - dt;
e_border_fx_offset(bd,
((double)bd->fx.start.x * dt),
((double)bd->fx.start.y * dt));
}
}
}
e_container_border_list_free(bl);
if ((dt < 0.0) || (dt >= 1.0))
{
_e_desk_hide_end(desk);
desk->animator = NULL;
return 0;
}
return 1;
}

View File

@ -25,6 +25,8 @@ struct _E_Desk
unsigned int deskshow_toggle : 1;
Evas_Object *bg_object;
Ecore_Animator *animator;
};
struct _E_Event_Desk_Show

View File

@ -18,12 +18,16 @@ struct _E_Config_Dialog_Data
int x;
int y;
int edge_flip_basic;
int flip_animate;
/*- ADVANCED -*/
int edge_flip_moving;
int edge_flip_dragging;
double edge_flip_timeout;
int flip_wrap;
int flip_mode;
int flip_interp;
double flip_speed;
};
/* a nice easy setup function that does the dirty work */
@ -57,10 +61,14 @@ _fill_data(E_Config_Dialog_Data *cfdata)
cfdata->x = e_config->zone_desks_x_count;
cfdata->y = e_config->zone_desks_y_count;
cfdata->edge_flip_basic = e_config->edge_flip_moving || e_config->edge_flip_dragging;
cfdata->flip_animate = e_config->desk_flip_animate_mode > 0;
cfdata->edge_flip_moving = e_config->edge_flip_moving;
cfdata->edge_flip_dragging = e_config->edge_flip_dragging;
cfdata->edge_flip_timeout = e_config->edge_flip_timeout;
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_speed = e_config->desk_flip_animate_time;
}
static void *
@ -107,7 +115,13 @@ _basic_apply_data(E_Config_Dialog *cdd, E_Config_Dialog_Data *cfdata)
}
}
}
if (cfdata->flip_animate)
{
e_config->desk_flip_animate_mode = 1;
e_config->desk_flip_animate_interpolation = 0;
e_config->desk_flip_animate_time = 0.5;
}
e_config->edge_flip_dragging = cfdata->edge_flip_basic;
e_config->edge_flip_moving = cfdata->edge_flip_basic;
e_zone_update_flip_all();
@ -139,6 +153,10 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
}
}
e_config->desk_flip_animate_mode = cfdata->flip_mode;
e_config->desk_flip_animate_interpolation = cfdata->flip_interp;
e_config->desk_flip_animate_time = cfdata->flip_speed;
e_config->edge_flip_moving = cfdata->edge_flip_moving;
e_config->edge_flip_dragging = cfdata->edge_flip_dragging;
e_config->edge_flip_timeout = cfdata->edge_flip_timeout;
@ -168,9 +186,11 @@ _basic_create_widgets(E_Config_Dialog *cdd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_framelist_object_append(of, ot);
e_widget_list_object_append(o, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Desktop Mouse Flip"), 0);
of = e_widget_framelist_add(evas, _("Desktop Flip"), 0);
ob = e_widget_check_add(evas, _("Flip desktops when mouse at screen edge"), &(cfdata->edge_flip_basic));
e_widget_framelist_object_append(of, ob);
ob = e_widget_check_add(evas, _("Animated flip"), &(cfdata->flip_animate));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
@ -182,6 +202,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
{
/* generate the core widget layout for an advanced dialog */
Evas_Object *o, *ob, *of, *ot;
E_Radio_Group *rg;
o = e_widget_list_add(evas, 0, 0);
@ -214,5 +235,20 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_list_object_append(o, of, 1, 1, 0.5);
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);
ob = e_widget_radio_add(evas, _("Pane"), 1, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Zoom"), 2, rg);
e_widget_framelist_object_append(of, ob);
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_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o;
}

View File

@ -73,6 +73,7 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
if (cfdata->framerate <= 0.0) cfdata->framerate = 1.0;
e_config->framerate = cfdata->framerate;
edje_frametime_set(1.0 / e_config->framerate);
e_config_save_queue();
return 1;
}
@ -87,7 +88,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
of = e_widget_framelist_add(evas, _("General Settings"), 0);
ob = e_widget_label_add(evas, _("Framerate"));
e_widget_framelist_object_append(of, ob);
ob = e_widget_slider_add(evas, 1, 0, _("%1.0f fps"), 0.0, 200.0, 5.0, 0, &(cfdata->framerate), NULL, 150);
ob = e_widget_slider_add(evas, 1, 0, _("%1.0f fps"), 5.0, 200.0, 5.0, 0, &(cfdata->framerate), NULL, 150);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
@ -105,6 +106,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_config->image_cache = (cfdata->image_cache * 1024);
e_config->edje_cache = cfdata->edje_cache;
e_config->edje_collection_cache = cfdata->edje_collection_cache;
edje_frametime_set(1.0 / e_config->framerate);
e_config_save_queue();
return 1;
}
@ -119,7 +121,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
of = e_widget_framelist_add(evas, _("General Settings"), 0);
ob = e_widget_label_add(evas, _("Framerate"));
e_widget_framelist_object_append(of, ob);
ob = e_widget_slider_add(evas, 1, 0, _("%1.0f fps"), 0.0, 200.0, 5.0, 0, &(cfdata->framerate), NULL, 150);
ob = e_widget_slider_add(evas, 1, 0, _("%1.0f fps"), 5.0, 200.0, 5.0, 0, &(cfdata->framerate), NULL, 150);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);