void
e_background_free(E_Background *bg)
{
- IF_FREE(bg->image);
- if ((bg->evas) && (bg->obj))
- evas_del_object(bg->evas, bg->obj);
- FREE(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 *
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();
+ bg->file = strdup(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); bl->file = strdup(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, &(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_Object o;
- int iw, ih;
-
+ Evas_List l;
+ int ww, hh, count;
+
if (bg->evas) return;
- /* FIXME: boring for now - just a scaled image */
bg->evas = evas;
- bg->obj = evas_add_image_from_file(bg->evas, bg->image);
- evas_set_layer(bg->evas, bg->obj, 0);
- evas_move(bg->evas, bg->obj, 0, 0);
- evas_resize(bg->evas, bg->obj, bg->geom.w, bg->geom.h);
- evas_set_image_fill(bg->evas, bg->obj, 0, 0, bg->geom.w, bg->geom.h);
- evas_show(bg->evas, bg->obj);
- o = evas_add_image_from_file(bg->evas, PACKAGE_DATA_DIR"/data/images/e_logo.png");
- evas_get_image_size(bg->evas, o, &iw, &ih);
- evas_move(bg->evas, o, (bg->geom.w - iw) / 2, (bg->geom.h - ih) / 2);
- evas_show(bg->evas, o);
+ 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 (evas_get_image_alpha(bg->evas, bl->obj))
+ {
+ 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);
+ }
+ }
+ 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);
+ }
+ }
+ }
}
typedef struct _E_Icon E_Icon;
typedef struct _E_Shelf E_Shelf;
typedef struct _E_Background E_Background;
+typedef struct _E_Background_Layer E_Background_Layer;
typedef struct _E_Menu E_Menu;
typedef struct _E_Menu_Item E_Menu_Item;
typedef struct _E_Build_Menu E_Build_Menu;
int disabled;
int visible;
int just_selected;
+ int just_executed;
} state;
struct {
} state;
};
+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;
+};
+
struct _E_Background
{
OBJ_PROPERTIES;
Evas evas;
+ char *file;
+
struct {
int sx, sy;
int w, h;
} geom;
- /* FIXME: REALLY boring for now - just a scaled image - temporoary */
- char *image;
- Evas_Object obj;
+ Evas_List layers;
+
+ Evas_Object base_obj;
};
struct _E_Menu
void e_keys_grab(char *key, Ev_Key_Modifiers mods, int anymod);
void e_keys_ungrab(char *key, Ev_Key_Modifiers mods, int anymod);
void e_keys_init(void);
+
E_Background *e_background_new(void);
void e_background_realize(E_Background *bg, Evas evas);
void e_background_free(E_Background *bg);
+
void e_view_realize(E_View *v);
void e_view_update(E_View *v);
-void e_icon_set_xy(E_Icon *icon, int x, int y);
-void e_icon_update(E_Icon *icon);
-void e_icon_show(E_Icon *icon);
-void e_icon_get_xy(E_Icon *icon, int *x, int *y);
-void e_icon_set_xy(E_Icon *icon, int x, int y);
-E_Icon *e_icon_new(void);
-void e_icon_set_filename(E_Icon *icon, char *file);
-void e_icon_pre_show(E_Icon *icon);
-void e_icon_realize(E_Icon *icon);
-void e_icon_unrealize(E_Icon *icon);
-void e_shelf_del_icon(E_Shelf *sh, E_Icon *icon);
-void e_shelf_add_icon(E_Shelf *sh, E_Icon *icon);
-void e_shelf_move_by(E_Shelf *sh, int dx, int dy);
-void e_shelf_resize_by(E_Shelf *sh, int dw, int dh);
-void e_shelf_realize(E_Shelf *sh);
-void e_ipc_init(void);
-void e_pack_object_init(void);
void e_view_update_selection(E_View *v, int x, int y);
void e_view_update(E_View *v);
void e_view_scroll(E_View *v, int dx, int dy);
void e_view_add_icon(E_View *v, E_Icon *icon);
E_Icon *e_view_find_icon_by_file(E_View *v, char *file);
void e_view_del_icon(E_View *v, E_Icon *icon);
+
+void e_ipc_init(void);
+
+void e_pack_object_init(void);
v->size.w = 400;
v->size.h = 300;
v->options.back_pixmap = 0;
- v->bg = e_background_new();
- v->bg->image = strdup(PACKAGE_DATA_DIR"/data/images/bg.jpg");
+ /* FIXME: load bg here */
+ {
+ char buf[4096];
+
+ sprintf(buf, "%s/default.bg.db", e_config_get("backgrounds"));
+ v->bg = e_background_load(buf);
+ }
sprintf(buf, "%s/%s", ic->view->dir, ic->file);
printf("new dir >%s<\n", buf);
v->dir = strdup(buf);
if (v->options.back_pixmap) e_view_update(v);
b = e_border_adopt(v->win.base, 1);
}
+ e_view_icon_deselect(ic);
}
static void
if (e->double_click)
{
e_view_icon_exec(ic);
+ ic->state.just_executed = 1;
}
else
{
}
if (_b == 1)
{
- if ((e->mods & mulit_select_mod))
+ if (ic->state.just_executed)
{
- if ((ic->state.selected) && (!ic->state.just_selected))
- e_view_icon_deselect(ic);
-/* e_view_icon_invert_selection(ic);*/
+ ic->state.just_executed = 0;
}
else
{
- e_view_deselect_all_except(ic);
- e_view_icon_select(ic);
+ if ((e->mods & mulit_select_mod))
+ {
+ if ((ic->state.selected) && (!ic->state.just_selected))
+ e_view_icon_deselect(ic);
+/* e_view_icon_invert_selection(ic);*/
+ }
+ else
+ {
+ e_view_deselect_all_except(ic);
+ e_view_icon_select(ic);
+ }
}
ic->state.just_selected = 0;
}
}
if (v->bg)
{
- v->bg->geom.w = v->size.w;
- v->bg->geom.h = v->size.h;
- evas_resize(v->bg->evas, v->bg->obj, v->bg->geom.w, v->bg->geom.h);
- evas_set_image_fill(v->bg->evas, v->bg->obj, 0, 0, v->bg->geom.w, v->bg->geom.h);
+ e_background_set_size(v->bg, v->size.w, v->size.h);
}
evas_set_output_viewport(v->evas, 0, 0, v->size.w, v->size.h);
evas_set_output_size(v->evas, v->size.w, v->size.h);
+ e_view_arrange(v);
}
}
}
{
Ev_Window_Delete *e;
Evas_List l;
- Evas_List to_free = NULL;
e = ev->event;
for (l = views; l; l = l->next)
v = l->data;
if (e->win == v->win.base)
{
- to_free = evas_list_append(to_free, v);
+ OBJ_DO_FREE(v);
+ return;
}
}
- for (l = to_free; l; l = l->next)
- {
- E_View *v;
-
- v = l->data;
- OBJ_DO_FREE(v);
- }
- if (to_free) evas_list_free(to_free);
}
static void
}
if (v->bg)
{
- v->bg->geom.w = v->size.w;
- v->bg->geom.h = v->size.h;
e_background_realize(v->bg, v->evas);
+ e_background_set_size(v->bg, v->size.w, v->size.h);
}
v->obj_bg = evas_add_rectangle(v->evas);
evas_callback_add(v->evas, v->obj_bg, CALLBACK_MOUSE_DOWN, e_bg_down_cb, v);