enlightenment/src/bin/e_bg.c

230 lines
5.9 KiB
C

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
/* local subsystem functions */
static int _e_bg_animator(void *data);
/* local subsystem globals */
/* externally accessible functions */
void
e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition)
{
Evas_Object *o;
Evas_List *l;
int ok;
if (transition == E_BG_TRANSITION_START)
{
zone->bg_transition_mode = e_config->desktop_bg_start_transition;
zone->bg_transition_time = e_config->desktop_bg_start_transition_time;
}
else if (transition == E_BG_TRANSITION_DESK)
{
zone->bg_transition_mode = e_config->desktop_bg_desk_transition;
zone->bg_transition_time = e_config->desktop_bg_desk_transition_time;
}
else if (transition == E_BG_TRANSITION_CHANGE)
{
zone->bg_transition_mode = e_config->desktop_bg_change_transition;
zone->bg_transition_time = e_config->desktop_bg_change_transition_time;
}
if ((zone->bg_transition_mode == E_BG_TRANSITION_MODE_NONE) ||
(zone->bg_transition_time == 0.0))
transition = E_BG_TRANSITION_NONE;
if (zone->bg_transition_mode == E_BG_TRANSITION_MODE_RANDOM)
{
zone->bg_transition_mode =
(rand() % (E_BG_TRANSITION_MODE_LAST - E_BG_TRANSITION_MODE_RANDOM))
+ E_BG_TRANSITION_MODE_RANDOM + 1;
if (zone->bg_transition_mode <= E_BG_TRANSITION_MODE_RANDOM)
zone->bg_transition_mode = E_BG_TRANSITION_MODE_RANDOM + 1;
else if (zone->bg_transition_mode >= E_BG_TRANSITION_MODE_LAST)
zone->bg_transition_mode = E_BG_TRANSITION_MODE_LAST - 1;
}
if (transition == E_BG_TRANSITION_NONE)
{
if (zone->bg_object)
{
evas_object_del(zone->bg_object);
zone->bg_object = NULL;
}
}
if (transition != E_BG_TRANSITION_NONE)
{
if (zone->bg_object)
{
if (zone->prev_bg_object)
evas_object_del(zone->prev_bg_object);
zone->prev_bg_object = zone->bg_object;
zone->bg_object = NULL;
}
}
o = edje_object_add(zone->container->bg_evas);
zone->bg_object = o;
evas_object_data_set(o, "e_zone", zone);
evas_object_move(o, zone->x, zone->y);
evas_object_resize(o, zone->w, zone->h);
ok = 0;
for (l = e_config->desktop_backgrounds; l; l = l->next)
{
E_Config_Desktop_Background *cfbg;
E_Desk *desk;
cfbg = l->data;
if ((cfbg->container >= 0) &&
(zone->container->num != cfbg->container)) continue;
if ((cfbg->zone >= 0) &&
(zone->num != cfbg->zone)) continue;
if ((!cfbg->desk) || (strlen(cfbg->desk) == 0)) continue;
desk = e_desk_current_get(zone);
if (!desk) continue;
if (strcmp(cfbg->desk, desk->name)) continue;
ok = edje_object_file_set(o, cfbg->file,
"desktop/background");
break;
}
if (!ok)
{
if (!edje_object_file_set(o, e_config->desktop_default_background,
"desktop/background"))
e_theme_edje_object_set(o, "base/theme/background",
"desktop/background");
}
evas_object_layer_set(o, -1);
evas_object_lower(o);
evas_object_clip_set(o, zone->bg_clip_object);
evas_object_show(o);
if (zone->prev_bg_object)
{
const char *pfile = "", *pgroup = "", *file = "", *group = "";
edje_object_file_get(zone->prev_bg_object, &pfile, &pgroup);
edje_object_file_get(zone->bg_object, &file, &group);
if ((pfile) && (file) && (!strcmp(pfile, file)) &&
(pgroup) && (group) && (!strcmp(pgroup, group)))
{
evas_object_del(zone->prev_bg_object);
zone->prev_bg_object = NULL;
return;
}
}
if (transition != E_BG_TRANSITION_NONE)
{
if (!zone->bg_animator)
zone->bg_animator= ecore_animator_add(_e_bg_animator, zone);
zone->bg_set_time = ecore_time_get();
}
}
void
e_bg_add(int container, int zone, char *desk, char *file)
{
E_Config_Desktop_Background *cfbg;
e_bg_del(container, zone, desk);
cfbg = E_NEW(E_Config_Desktop_Background, 1);
cfbg->container = container;
cfbg->zone = zone;
cfbg->desk = strdup(desk);
cfbg->file = strdup(file);
e_config->desktop_backgrounds = evas_list_append(e_config->desktop_backgrounds, cfbg);
}
void
e_bg_del(int container, int zone, char *desk)
{
Evas_List *l;
for (l = e_config->desktop_backgrounds; l; l = l->next)
{
E_Config_Desktop_Background *cfbg;
cfbg = l->data;
if ((cfbg->container == container) && (cfbg->zone == zone) &&
(!strcmp(cfbg->desk, desk)))
{
e_config->desktop_backgrounds = evas_list_remove_list(e_config->desktop_backgrounds, l);
IF_FREE(cfbg->desk);
IF_FREE(cfbg->file);
free(cfbg);
break;
}
}
}
void
e_bg_update(void)
{
Evas_List *l, *ll;
E_Manager *man;
E_Container *con;
E_Zone *zone;
for (l = e_manager_list(); l; l = l->next)
{
man = l->data;
for (ll = man->containers; ll; ll = ll->next)
{
con = ll->data;
zone = e_zone_current_get(con);
e_zone_bg_reconfigure(zone);
}
}
}
/* local subsystem functions */
static int
_e_bg_animator(void *data)
{
E_Zone *zone;
double t;
int a;
zone = data;
/* t is an animating INDEX 0.0 - 1.0, it is used as a lookup into
* the effect. 1.0 == finished */
t = (ecore_time_get() - zone->bg_set_time) / zone->bg_transition_time;
if (t < 0.0) t = 0.0;
else if (t > 1.0) t = 1.0;
if (zone->bg_transition_mode == E_BG_TRANSITION_MODE_FADE)
{
a = (1.0 - t) * 255.0;
if (a < 0) a = 0;
else if (a > 255) a = 255;
evas_object_color_set(zone->prev_bg_object,
255, 255, 255, a);
}
else if (zone->bg_transition_mode == E_BG_TRANSITION_MODE_SINUSOUDAL_FADE)
{
double t2;
t2 = (1.0 - cos(t * M_PI)) / 2.0;
a = (1.0 - t2) * 255.0;
if (a < 0) a = 0;
else if (a > 255) a = 255;
evas_object_color_set(zone->prev_bg_object,
255, 255, 255, a);
}
/* if we still animate.. */
if (t < 1.0) return 1;
if (zone->prev_bg_object)
{
evas_object_del(zone->prev_bg_object);
zone->prev_bg_object = NULL;
}
zone->bg_animator = NULL;
return 0;
}