enlightenment/tools/e_setup.c

1201 lines
26 KiB
C

#include <Evas.h>
#include <Ebits.h>
#include <Ecore.h>
#include <Edb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <fnmatch.h>
#include <errno.h>
#include "../config.h"
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
/* stuff we want from e */
#define OBJ_PROPERTIES \
int references; \
void (*e_obj_free) (void *e_obj);
#define OBJ_INIT(_e_obj, _e_obj_free_func) \
{ \
_e_obj->references = 1; \
_e_obj->e_obj_free = (void *) _e_obj_free_func; \
}
#define OBJ_REF(_e_obj) _e_obj->references++
#define OBJ_UNREF(_e_obj) _e_obj->references--
#define OBJ_IF_FREE(_e_obj) if (_e_obj->references == 0)
#define OBJ_FREE(_e_obj) _e_obj->e_obj_free(_e_obj);
#define OBJ_DO_FREE(_e_obj) \
{ \
OBJ_UNREF(_e_obj); \
OBJ_IF_FREE(_e_obj) \
{ \
OBJ_FREE(_e_obj); \
} \
}
#define e_strdup(__dest, __var) \
{ \
if (!__var) __dest = NULL; \
else { \
__dest = malloc(strlen(__var) + 1); \
if (__dest) strcpy(__dest, __var); \
} }
typedef struct _E_Background E_Background;
typedef struct _E_Background_Layer E_Background_Layer;
struct _E_Background
{
OBJ_PROPERTIES;
Evas evas;
char *file;
struct {
int sx, sy;
int w, h;
} geom;
Evas_List layers;
Evas_Object base_obj;
};
struct _E_Background_Layer
{
int mode;
int type;
int inlined;
struct {
float x, y;
} scroll;
struct {
float x, y;
} pos;
struct {
float w, h;
struct {
int w, h;
} orig;
} size, fill;
char *color_class;
char *file;
double angle;
struct {
int r, g, b, a;
} fg, bg;
double x, y, w, h, fw, fh;
Evas_Object obj;
};
void e_background_free(E_Background *bg);
E_Background *e_background_new(void);
E_Background *e_background_load(char *file);
void e_background_realize(E_Background *bg, Evas evas);
void e_background_set_scroll(E_Background *bg, int sx, int sy);
void e_background_set_size(E_Background *bg, int w, int h);
void e_background_set_color_class(E_Background *bg, char *cc, int r, int g, int b, int a);
void
e_background_free(E_Background *bg)
{
Evas_List l;
if (bg->layers)
{
for (l = bg->layers; l; l = l->next)
{
E_Background_Layer *bl;
bl = l->data;
if (bl->color_class) FREE(bl->color_class);
if (bl->file) FREE(bl->file);
if (bl->obj) evas_del_object(bg->evas, bl->obj);
FREE(bl);
}
evas_list_free(bg->layers);
}
if (bg->file) FREE (bg->file);
if (bg->base_obj) evas_del_object(bg->evas, bg->base_obj);
FREE(bg);
}
E_Background *
e_background_new(void)
{
E_Background *bg;
bg = NEW(E_Background, 1);
ZERO(bg, E_Background, 1);
OBJ_INIT(bg, e_background_free);
return bg;
}
E_Background *
e_background_load(char *file)
{
E_Background *bg;
E_DB_File *db;
int i, num;
db = e_db_open_read(file);
if (!db) return NULL;
num = 0;
e_db_int_get(db, "/type/bg", &num);
if (num != 1)
{
e_db_close(db);
e_db_flush();
return NULL;
}
e_db_int_get(db, "/layers/count", &num);
bg = e_background_new();
e_strdup(bg->file, file);
for (i = 0; i < num; i++)
{
E_Background_Layer *bl;
char buf[4096];
bl = NEW(E_Background_Layer, 1);
ZERO(bl, E_Background_Layer, 1);
bg->layers = evas_list_append(bg->layers, bl);
sprintf(buf, "/layers/%i/type", i); e_db_int_get(db, buf, &(bl->type));
sprintf(buf, "/layers/%i/inlined", i); e_db_int_get(db, buf, &(bl->inlined));
sprintf(buf, "/layers/%i/color_class", i); bl->color_class = e_db_str_get(db, buf);
if (bl->inlined)
{
sprintf(buf, "%s:/layers/%i/image", file, i); e_strdup(bl->file, buf);
}
else
{
sprintf(buf, "/layers/%i/file", i); bl->file = e_db_str_get(db, buf);
}
sprintf(buf, "/layers/%i/scroll.x", i); e_db_float_get(db, buf, &(bl->scroll.x));
sprintf(buf, "/layers/%i/scroll.y", i); e_db_float_get(db, buf, &(bl->scroll.y));
sprintf(buf, "/layers/%i/pos.x", i); e_db_float_get(db, buf, &(bl->pos.x));
sprintf(buf, "/layers/%i/pos.y", i); e_db_float_get(db, buf, &(bl->pos.y));
sprintf(buf, "/layers/%i/size.w", i); e_db_float_get(db, buf, &(bl->size.w));
sprintf(buf, "/layers/%i/size.h", i); e_db_float_get(db, buf, &(bl->size.h));
sprintf(buf, "/layers/%i/size.orig.w", i); e_db_int_get(db, buf, &(bl->size.orig.w));
sprintf(buf, "/layers/%i/size.orig.h", i); e_db_int_get(db, buf, &(bl->size.orig.h));
sprintf(buf, "/layers/%i/fill.w", i); e_db_float_get(db, buf, &(bl->fill.w));
sprintf(buf, "/layers/%i/fill.h", i); e_db_float_get(db, buf, &(bl->fill.h));
sprintf(buf, "/layers/%i/fill.orig.w", i); e_db_int_get(db, buf, &(bl->fill.orig.w));
sprintf(buf, "/layers/%i/fill.orig.h", i); e_db_int_get(db, buf, &(bl->fill.orig.h));
sprintf(buf, "/layers/%i/angle", i); e_db_float_get(db, buf, (float*)&(bl->angle));
sprintf(buf, "/layers/%i/fg.r", i); e_db_int_get(db, buf, &(bl->fg.r));
sprintf(buf, "/layers/%i/fg.g", i); e_db_int_get(db, buf, &(bl->fg.g));
sprintf(buf, "/layers/%i/fg.b", i); e_db_int_get(db, buf, &(bl->fg.b));
sprintf(buf, "/layers/%i/fg.a", i); e_db_int_get(db, buf, &(bl->fg.a));
sprintf(buf, "/layers/%i/bg.r", i); e_db_int_get(db, buf, &(bl->bg.r));
sprintf(buf, "/layers/%i/bg.g", i); e_db_int_get(db, buf, &(bl->bg.g));
sprintf(buf, "/layers/%i/bg.b", i); e_db_int_get(db, buf, &(bl->bg.b));
sprintf(buf, "/layers/%i/bg.a", i); e_db_int_get(db, buf, &(bl->bg.a));
}
return bg;
}
void
e_background_realize(E_Background *bg, Evas evas)
{
Evas_List l;
int ww, hh, count;
if (bg->evas) return;
bg->evas = evas;
if (!bg->evas) return;
for (count = 0, l = bg->layers; l; l = l->next, count++)
{
E_Background_Layer *bl;
bl = l->data;
if (bl->type == 0) /* 0 == image */
{
bl->obj = evas_add_image_from_file(bg->evas, bl->file);
evas_set_layer(bg->evas, bl->obj, 0);
evas_show(bg->evas, bl->obj);
#if 0 /* dont need this... do we? */
if (evas_get_image_alpha(bg->evas, bl->obj))
{
printf("Adding rectangle to bg!\n");
bg->base_obj = evas_add_rectangle(bg->evas);
evas_lower(bg->evas, bg->base_obj);
evas_move(bg->evas, bg->base_obj, 0, 0);
evas_resize(bg->evas, bg->base_obj, 999999999, 999999999);
evas_set_color(bg->evas, bg->base_obj, 255, 255, 255, 255);
evas_show(bg->evas, bg->base_obj);
}
#endif
}
else if (bl->type == 1) /* 1 == gradient */
{
}
else if (bl->type == 2) /* 2 == solid */
{
}
}
ww = bg->geom.w;
hh = bg->geom.h;
bg->geom.w = 0;
bg->geom.h = 0;
e_background_set_size(bg, ww, hh);
}
void
e_background_set_scroll(E_Background *bg, int sx, int sy)
{
Evas_List l;
if ((bg->geom.sx == sx) && (bg->geom.sy == sy)) return;
bg->geom.sx = sx;
bg->geom.sy = sy;
if (!bg->evas) return;
for (l = bg->layers; l; l = l->next)
{
E_Background_Layer *bl;
bl = l->data;
if (bl->type == 0) /* 0 == image */
{
evas_set_image_fill(bg->evas, bl->obj,
(double)bg->geom.sx * bl->scroll.x,
(double)bg->geom.sy * bl->scroll.y,
bl->fw, bl->fh);
}
}
}
void
e_background_set_size(E_Background *bg, int w, int h)
{
Evas_List l;
if ((bg->geom.w == w) && (bg->geom.h == h)) return;
bg->geom.w = w;
bg->geom.h = h;
for (l = bg->layers; l; l = l->next)
{
E_Background_Layer *bl;
double x, y, w, h, fw, fh;
int iw, ih;
bl = l->data;
iw = 0;
ih = 0;
if (bg->evas) evas_get_image_size(bg->evas, bl->obj, &iw, &ih);
w = bl->size.w * (double)bg->geom.w;
h = bl->size.h * (double)bg->geom.h;
if (bl->size.orig.w) w = (double)iw * bl->size.w;
if (bl->size.orig.h) h = (double)ih * bl->size.h;
fw = bl->fill.w * w;
fh = bl->fill.h * h;
if (bl->fill.orig.w) fw = (double)iw * bl->fill.w;
if (bl->fill.orig.h) fh = (double)ih * bl->fill.h;
x = ((double)bg->geom.w - w + 1) * bl->pos.x;
y = ((double)bg->geom.h - h + 1) * bl->pos.y;
bl->x = x;
bl->y = y;
bl->w = w;
bl->h = h;
bl->fw = fw;
bl->fh = fh;
if (bg->evas)
{
evas_move(bg->evas, bl->obj, bl->x, bl->y);
evas_resize(bg->evas, bl->obj, bl->w, bl->h);
if (bl->type == 0) /* 0 == image */
{
evas_set_image_fill(bg->evas, bl->obj,
(double)bg->geom.sx * bl->scroll.x,
(double)bg->geom.sy * bl->scroll.y,
bl->fw, bl->fh);
}
else if (bl->type == 1) /* 1 == gradient */
{
evas_set_angle(bg->evas, bl->obj, bl->angle);
}
else if (bl->type == 2) /* 2 == solid */
{
}
}
}
}
void
e_background_set_color_class(E_Background *bg, char *cc, int r, int g, int b, int a)
{
Evas_List l;
for (l = bg->layers; l; l = l->next)
{
E_Background_Layer *bl;
bl = l->data;
if ((bl->color_class) && (cc) && (!strcmp(bl->color_class, cc)))
{
if (bg->evas)
{
if ((l == bg->layers) && (bg->base_obj))
evas_set_color(bg->evas, bl->obj, r, g, b, 255);
else
evas_set_color(bg->evas, bl->obj, r, g, b, a);
}
}
}
}
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
int
e_file_exists(char *file)
{
struct stat st;
if (stat(file, &st) < 0) return 0;
return 1;
}
int
e_file_is_dir(char *file)
{
struct stat st;
if (stat(file, &st) < 0) return 0;
if (S_ISDIR(st.st_mode)) return 1;
return 0;
}
char *
e_file_home(void)
{
static char *home = NULL;
if (home) return home;
home = getenv("HOME");
if (!home) home = getenv("TMPDIR");
if (!home) home = "/tmp";
return home;
}
static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
int
e_file_mkdir(char *dir)
{
if (mkdir(dir, default_mode) < 0) return 0;
return 1;
}
void
e_file_mkdirs(char *s)
{
char ss[PATH_MAX];
int i, ii;
i = 0;
ii = 0;
while (s[i])
{
ss[ii++] = s[i];
ss[ii] = 0;
if (s[i] == '/')
{
if (!e_file_exists(ss))
e_file_mkdir(ss);
else if (!e_file_is_dir(ss))
return;
}
i++;
}
}
int
e_file_cp(char *src, char *dst)
{
FILE *f1, *f2;
char buf[16384];
size_t num;
f1 = fopen(src, "rb");
if (!f1) return 0;
f2 = fopen(dst, "wb");
if (!f2)
{
fclose(f1);
return 0;
}
while ((num = fread(buf, 1, 16384, f1)) > 0) fwrite(buf, 1, num, f2);
fclose(f1);
fclose(f2);
return 1;
}
void
e_file_delete(char *s)
{
unlink(s);
}
void
e_file_rename(char *s, char *ss)
{
rename(s, ss);
}
int
e_glob_matches(char *str, char *glob)
{
if (!fnmatch(glob, str, 0)) return 1;
return 0;
}
char *
e_file_get_file(char *file)
{
char *p;
char *f;
p = strrchr(file, '/');
if (!p)
{
e_strdup(f, file);
return f;
}
e_strdup(f, &(p[1]));
return f;
}
char *
e_file_get_dir(char *file)
{
char *p;
char *f;
char buf[PATH_MAX];
strcpy(buf, file);
p = strrchr(buf, '/');
if (!p)
{
e_strdup(f, file);
return f;
}
*p = 0;
e_strdup(f, buf);
return f;
}
int
e_file_can_exec(struct stat *st)
{
static int have_uid = 0;
static uid_t uid = -1;
static gid_t gid = -1;
int ok;
if (!st) return 0;
ok = 0;
if (!have_uid) uid = getuid();
if (!have_uid) gid = getgid();
have_uid = 1;
if (st->st_uid == uid)
{
if (st->st_mode & S_IXUSR) ok = 1;
}
else if (st->st_gid == gid)
{
if (st->st_mode & S_IXGRP) ok = 1;
}
else
{
if (st->st_mode & S_IXOTH) ok = 1;
}
return ok;
}
char *
e_file_link(char *link)
{
char buf[PATH_MAX];
char *f;
int count;
if ((count = readlink(link, buf, sizeof(buf))) < 0) return NULL;
buf[count] = 0;
e_strdup(f, buf);
return f;
}
Evas_List
e_file_list_dir(char *dir)
{
DIR *dirp;
struct dirent *dp;
Evas_List list;
dirp = opendir(dir);
if (!dirp) return NULL;
list = NULL;
while ((dp = readdir(dirp)))
{
if ((strcmp(dp->d_name, ".")) &&
(strcmp(dp->d_name, "..")))
{
Evas_List l;
char *f;
/* insertion sort */
for (l = list; l; l = l->next)
{
if (strcmp(l->data, dp->d_name) > 0)
{
e_strdup(f, dp->d_name);
list = evas_list_prepend_relative(list, f, l->data);
break;
}
}
/* nowhwre to go? just append it */
e_strdup(f, dp->d_name);
if (!l) list = evas_list_append(list, f);
}
}
closedir(dirp);
return list;
}
/* */
/* */
/* */
typedef struct _text_zone Text_Zone;
struct _text_zone
{
double x, y;
Evas_Object clip;
Ebits_Object *bg;
struct {
double x, y, w, h;
} l;
struct {
double dx, dy;
int go;
} move;
Evas_List lines;
};
Window win_main;
Window win_evas;
Evas evas;
double scr_w, scr_h;
Evas_Object pointer;
/* our stuff */
void idle(void *data);
void window_expose(Ecore_Event * ev);
void mouse_move(Ecore_Event * ev);
void mouse_down(Ecore_Event * ev);
void mouse_up(Ecore_Event * ev);
void key_down(Ecore_Event * ev);
void setup(void);
Text_Zone *txz_new(double x, double y, char *text);
void txz_free(Text_Zone *txz);
void txz_show(Text_Zone *txz);
void txz_hide(Text_Zone *txz);
void txz_move(Text_Zone *txz, double x, double y);
void txz_text(Text_Zone *txz, char *text);
void animate_logo(int v, void *data);
void
idle(void *data)
{
evas_render(evas);
}
void
window_expose(Ecore_Event * ev)
{
Ecore_Event_Window_Expose *e;
e = (Ecore_Event_Window_Expose *)ev->event;
evas_update_rect(evas, e->x, e->y, e->w, e->h);
}
void
mouse_move(Ecore_Event * ev)
{
Ecore_Event_Mouse_Move *e;
e = (Ecore_Event_Mouse_Move *)ev->event;
evas_move(evas, pointer,
evas_screen_x_to_world(evas, e->x),
evas_screen_y_to_world(evas, e->y));
evas_event_move(evas, e->x, e->y);
}
void
mouse_down(Ecore_Event * ev)
{
Ecore_Event_Mouse_Down *e;
e = (Ecore_Event_Mouse_Down *)ev->event;
evas_event_button_down(evas, e->x, e->y, e->button);
}
void
mouse_up(Ecore_Event * ev)
{
Ecore_Event_Mouse_Up *e;
e = (Ecore_Event_Mouse_Up *)ev->event;
evas_event_button_up(evas, e->x, e->y, e->button);
}
void
key_down(Ecore_Event * ev)
{
Ecore_Event_Key_Down *e;
e = ev->event;
if (!strcmp(e->key, "Escape"))
{
exit(0);
}
}
void
setup(void)
{
int root_w, root_h;
E_Background *bg;
ecore_event_filter_handler_add(ECORE_EVENT_WINDOW_EXPOSE, window_expose);
ecore_event_filter_handler_add(ECORE_EVENT_MOUSE_MOVE, mouse_move);
ecore_event_filter_handler_add(ECORE_EVENT_MOUSE_DOWN, mouse_down);
ecore_event_filter_handler_add(ECORE_EVENT_MOUSE_UP, mouse_up);
ecore_event_filter_handler_add(ECORE_EVENT_KEY_DOWN, key_down);
ecore_event_filter_idle_handler_add(idle, NULL);
ecore_window_get_geometry(0, NULL, NULL, &root_w, &root_h);
win_main = ecore_window_override_new(0, 0, 0, root_w, root_h);
evas = evas_new_all(ecore_display_get(),
win_main,
0, 0, root_w, root_w,
RENDER_METHOD_ALPHA_SOFTWARE,
216, 1024 * 1024, 16 * 1024 * 1024,
PACKAGE_DATA_DIR"/data/fonts/");
bg = e_background_load(PACKAGE_DATA_DIR"/data/setup/setup.bg.db");
if (!bg)
{
/* FIXME: must detect this error better and tell user */
printf("ERROR: Enlightenment not installed properly\n");
exit(-1);
}
e_background_realize(bg, evas);
e_background_set_size(bg, root_w, root_h);
pointer = evas_add_image_from_file(evas, PACKAGE_DATA_DIR"/data/setup/pointer.png");
evas_set_pass_events(evas, pointer, 1);
evas_set_layer(evas, pointer, 1000000);
evas_show(evas, pointer);
win_evas = evas_get_window(evas);
ecore_window_set_events(win_evas, XEV_EXPOSE | XEV_BUTTON | XEV_MOUSE_MOVE | XEV_KEY);
ecore_set_blank_pointer(win_evas);
ecore_window_show(win_evas);
ecore_window_show(win_main);
ecore_keyboard_grab(win_evas);
{
Evas_Object o;
int w, h;
o = evas_add_image_from_file(evas, PACKAGE_DATA_DIR"/data/setup/logo.png");
evas_get_image_size(evas, o, &w, &h);
evas_move(evas, o, (root_w - w) / 2, -32);
evas_set_layer(evas, o, 20);
evas_show(evas, o);
evas_set_pass_events(evas, o, 1);
}
{
Text_Zone *txz;
txz = txz_new
((root_w - 512) / 2, 130,
"6c Enlightenment\n"
"3c \n"
"3c Welcome to Enlightenment 0.17 (pre-release). This is the setup\n"
"3c program. It will help you get a base configuration initialised\n"
"3c for your user and do some initial tweaks and system queries.\n"
"3c \n"
"3c Please be patient and read the dialogs carefully, as your answers\n"
"3c to questions posed will affect your initial setup of Enlightenment,\n"
"3c and so your initial impressions.\n"
"3c \n"
"3c N.B. - during pre-release stages, this setup program may come up\n"
"3c more than just once, as new setups need to be installed\n"
);
}
{
Evas_Object o;
o = evas_add_image_from_file(evas, PACKAGE_DATA_DIR"/data/setup/anim/e001.png");
evas_move(evas, o, root_w - 120, -15);
evas_set_layer(evas, o, 30);
evas_show(evas, o);
animate_logo(0, o);
evas_set_pass_events(evas, o, 1);
}
scr_w = root_w;
scr_h = root_h;
}
static void
_txz_cb_show(void *data)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
evas_show(evas, l->data);
}
evas_show(evas, txz->clip);
}
}
static void
_txz_cb_hide(void *data)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
evas_hide(evas, l->data);
}
evas_hide(evas, txz->clip);
}
}
static void
_txz_cb_move(void *data, double x, double y)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
txz->l.x = x;
txz->l.y = y;
txz_adjust_txt(txz);
}
static void
_txz_cb_resize(void *data, double w, double h)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
txz->l.w = w;
txz->l.h = h;
txz_adjust_txt(txz);
}
static void
_txz_cb_raise(void *data)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
evas_raise(evas, l->data);
}
}
}
static void
_txz_cb_lower(void *data)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
evas_lower(evas, l->data);
}
}
}
static void
_txz_cb_set_layer(void *data, int lay)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
evas_set_layer(evas, l->data, lay);
}
}
}
static void
_txz_cb_get_min_size(void *data, double *minw, double *minh)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
*minw = 0;
*minh = 0;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
double w, h;
evas_get_geometry(evas, l->data, NULL, NULL, &w, &h);
if (w > *minw) *minw = w;
*minh += h;
}
}
*minw += 8;
*minh += 8;
}
static void
_txz_cb_get_max_size(void *data, double *maxw, double *maxh)
{
Text_Zone *txz;
txz = (Text_Zone *)data;
*maxw = 0;
*maxh = 0;
{
Evas_List l;
for (l = txz->lines; l; l = l->next)
{
double w, h;
evas_get_geometry(evas, l->data, NULL, NULL, &w, &h);
if (w > *maxw) *maxw = w;
*maxh += h;
}
}
*maxw += 8;
*maxh += 8;
}
static void
_txz_cb_title_down(void *_data, Ebits_Object _o,
char *_c, int _b, int _x, int _y,
int _ox, int _oy, int _ow, int _oh)
{
Text_Zone *txz;
txz = _data;
txz->move.go = 1;
txz->move.dx = _x - txz->x;
txz->move.dy = _y - txz->y;
}
static void
_txz_cb_title_up(void *_data, Ebits_Object _o,
char *_c, int _b, int _x, int _y,
int _ox, int _oy, int _ow, int _oh)
{
Text_Zone *txz;
txz = _data;
txz->move.go = 0;
}
static void
_txz_cb_title_move(void *_data, Ebits_Object _o,
char *_c, int _b, int _x, int _y,
int _ox, int _oy, int _ow, int _oh)
{
Text_Zone *txz;
txz = _data;
if (txz->move.go)
{
txz_move(txz, _x - txz->move.dx, _y - txz->move.dy);
}
}
void
txz_adjust_txt(Text_Zone *txz)
{
Evas_List l;
double ypos;
ypos = txz->l.y + 4;
evas_move(evas, txz->clip, txz->l.x, txz->l.y);
evas_resize(evas, txz->clip, txz->l.w, txz->l.h);
for (l = txz->lines; l; l = l->next)
{
Evas_Object o;
double tw, th;
double x;
char align;
o = l->data;
align = (char)evas_get_data(evas, o, "align");
x = txz->l.x + 4;
tw = evas_get_text_width(evas, o);
th = evas_get_text_height(evas, o);
if (align == 'c') x = txz->l.x + 4 + ((txz->l.w - 8 - tw) / 2);
else if (align == 'r') x = txz->l.x + 4 + (txz->l.w - 8 - tw);
evas_move(evas, o, x, ypos);
ypos += th;
}
}
Text_Zone *
txz_new(double x, double y, char *text)
{
Text_Zone *txz;
txz = NEW(Text_Zone, 1);
ZERO(txz, Text_Zone, 1);
txz->x = 0;
txz->y = 0;
txz->clip = evas_add_rectangle(evas);
evas_set_color(evas, txz->clip, 255, 255, 255, 255);
txz->bg = ebits_load(PACKAGE_DATA_DIR"/data/setup/textzone.bits.db");
if (txz->bg)
{
ebits_add_to_evas(txz->bg, evas);
ebits_set_layer(txz->bg, 9);
ebits_set_named_bit_replace(txz->bg, "Contents",
_txz_cb_show,
_txz_cb_hide,
_txz_cb_move,
_txz_cb_resize,
_txz_cb_raise,
_txz_cb_lower,
_txz_cb_set_layer,
NULL,
NULL,
_txz_cb_get_min_size,
_txz_cb_get_max_size,
txz);
ebits_set_classed_bit_callback(txz->bg, "Title_Bar",
CALLBACK_MOUSE_DOWN,
_txz_cb_title_down,
txz);
ebits_set_classed_bit_callback(txz->bg, "Title_Bar",
CALLBACK_MOUSE_UP,
_txz_cb_title_up,
txz);
ebits_set_classed_bit_callback(txz->bg, "Title_Bar",
CALLBACK_MOUSE_MOVE,
_txz_cb_title_move,
txz);
}
txz_text(txz, text);
txz_move(txz, x, y);
txz_show(txz);
return txz;
}
void
txz_free(Text_Zone *txz)
{
Evas_List l;
if (txz->bg)
ebits_free(txz->bg);
evas_del_object(evas, txz->clip);
for (l = txz->lines; l; l = l->next)
evas_del_object(evas, (Evas_Object)l->data);
if (txz->lines) evas_list_free(txz->lines);
FREE(txz);
}
void
txz_show(Text_Zone *txz)
{
Evas_List l;
if (txz->bg)
ebits_show(txz->bg);
for (l = txz->lines; l; l = l->next)
evas_show(evas, (Evas_Object)l->data);
}
void
txz_hide(Text_Zone *txz)
{
Evas_List l;
if (txz->bg)
ebits_hide(txz->bg);
for (l = txz->lines; l; l = l->next)
evas_hide(evas, (Evas_Object)l->data);
}
void
txz_move(Text_Zone *txz, double x, double y)
{
Evas_List l;
txz->x = x;
txz->y = y;
if (txz->bg)
{
ebits_move(txz->bg, txz->x, txz->y);
}
}
void
txz_text(Text_Zone *txz, char *text)
{
char *p, *tok;
double ypos;
Evas_List l;
for (l = txz->lines; l; l = l->next)
evas_del_object(evas, (Evas_Object)l->data);
if (txz->lines) evas_list_free(txz->lines);
txz->lines = NULL;
p = text;
ypos = txz->y;
while ((p[0] != 0) && (tok = strchr(p, '\n')))
{
char line[4096], size[2], align[2], *str;
int sz;
double tw, th, hadv, vadv;
Evas_Object o;
strncpy(line, p, (tok - p));
line[tok - p] = 0;
size[0] = line[0];
size[1] = 0;
align[0] = line[1];
align[1] = 0;
str = &(line[3]);
sz = atoi(size);
sz = 4 + (sz * 2);
o = evas_add_text(evas, "nationff", sz, str);
evas_set_layer(evas, o, 9);
evas_set_color(evas, o, 0, 0, 0, 255);
txz->lines = evas_list_append(txz->lines, o);
tw = evas_get_text_width(evas, o);
th = evas_get_text_height(evas, o);
evas_text_get_advance(evas, o, &hadv, &vadv);
if (align[0] == 'l')
evas_move(evas, o, txz->x, ypos);
else if (align[0] == 'r')
evas_move(evas, o, txz->x + 512 - tw, ypos);
else
evas_move(evas, o, txz->x + ((512 - tw) / 2), ypos);
evas_set_clip(evas, o, txz->clip);
evas_put_data(evas, o, "align", (void *)align[0]);
ypos += th;
p = tok + 1;
}
if (txz->bg)
{
int minw, minh;
ebits_get_real_min_size(txz->bg, &minw, &minh);
ebits_resize(txz->bg, minw + 8, minh + 8);
ebits_hide(txz->bg);
ebits_show(txz->bg);
ebits_set_layer(txz->bg, 0);
ebits_set_layer(txz->bg, 9);
}
}
void
animate_logo(int v, void *data)
{
Evas_Object o;
double t;
static double start_t;
char buf[4096];
int frame;
o = (Evas_Object)data;
if (v == 0) start_t = ecore_get_time();
t = ecore_get_time() - start_t;
frame = (int)(t * 25);
frame = frame % 120;
frame++;
if (frame < 10) sprintf(buf, PACKAGE_DATA_DIR"/data/setup/anim/e00%i.png", frame);
else if (frame < 100) sprintf(buf, PACKAGE_DATA_DIR"/data/setup/anim/e0%i.png", frame);
else if (frame < 1000) sprintf(buf, PACKAGE_DATA_DIR"/data/setup/anim/e%i.png", frame);
evas_set_image_file(evas, o, buf);
ecore_add_event_timer("animate_logo", 0.01, animate_logo, 1, data);
}
int
main(int argc, char **argv)
{
ecore_display_init(NULL);
ecore_event_signal_init();
ecore_event_filter_init();
ecore_event_x_init();
setup();
ecore_event_loop();
}