diff --git a/src/bin/e_error.c b/src/bin/e_error.c index ea24a01bc..1dce0707f 100644 --- a/src/bin/e_error.c +++ b/src/bin/e_error.c @@ -14,6 +14,7 @@ static void _e_error_message_show_x(char *txt); static void _e_error_cb_ok_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_error_cb_ok_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_error_edje_cb_ok_up(void *data, Evas_Object *obj, const char *emission, const char *source); static void _e_error_cb_job_ecore_evas_free(void *data); /* local subsystem globals */ @@ -52,11 +53,12 @@ e_error_gui_set(int on) void e_error_message_manager_show(E_Manager *man, char *title, char *txt) { - Ecore_Evas *ee; - Evas *e; - int error_w, error_h; - Evas_List *l, *shapelist = NULL; - Evas_Coord maxw, maxh; + Ecore_Evas *ee; + Evas *e; + Evas_Object *o; + int error_w, error_h; + Evas_List *l, *shapelist = NULL; + Evas_Coord maxw, maxh; error_w = 400; error_h = 200; @@ -72,11 +74,19 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) e_path_evas_append(path_fonts, e); e_pointer_ecore_evas_set(ee); + o = edje_object_add(e); + if (!edje_object_file_set(o, + /* FIXME: "default.eet" needs to come from conf */ + e_path_find(path_themes, "default.eet"), + "error/main")) + { - Evas_Object *o; Evas_Coord tw, th; char *newstr; + if (o) + evas_object_del(o); + maxw = 0; maxh = 0; @@ -118,12 +128,12 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) { char *p; Evas_Coord y; - + y = 16 + 64 + 16; for (p = newstr; p;) { char *pp; - + pp = strchr(p, '\n'); if (pp) *pp = 0; o = evas_object_text_add(e); @@ -134,7 +144,7 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) evas_object_move(o, 16 + 1, y + 1); evas_object_pass_events_set(o, 1); evas_object_show(o); - + o = evas_object_text_add(e); evas_object_color_set(o, 0, 0, 0, 255); evas_object_text_font_set(o, "Vera", 10); @@ -143,7 +153,7 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) evas_object_move(o, 16, y); evas_object_pass_events_set(o, 1); evas_object_show(o); - + if ((16 + tw + 16) > maxw) maxw = 16 + tw + 16; y += th; if (pp) p = pp + 1; @@ -152,11 +162,11 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) free(newstr); maxh = y; } - + maxh += 16 + 32 + 16; error_w = maxw; error_h = maxh; - + if (error_w > man->w) error_w = man->w; if (error_h > man->h) error_h = man->h; @@ -215,6 +225,77 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) } ecore_evas_data_set(ee, "shapes", shapelist); + o = evas_object_rectangle_add(e); + evas_object_name_set(o, "allocated"); + } + else + { + char format[1024]; + Evas_Object *text; + int x, y, w, h, nw, nh; + + evas_object_move(o, 0, 0); + evas_object_resize(o, error_w, error_h); + edje_object_signal_callback_add(o, "close", "", + _e_error_edje_cb_ok_up, ee); + evas_object_show(o); + + edje_object_part_text_set(o, "title", title); + + snprintf(format, sizeof(format), "source='%s' font='%s' size=%d wrap=word", + e_path_find(path_themes, "default.eet"), + "fonts/Edje Vera", 10); + text = evas_object_textblock_add(e); + evas_object_color_set(text, 0, 0, 0, 255); + evas_object_textblock_format_insert(text, format); + { + char *pp, *newstr, *p; + newstr = strdup(txt); + p = newstr; + while (p) + { + pp = strchr(p, '\n'); + if (pp) *pp = 0; + evas_object_textblock_text_insert(text, p); + if (pp) + { + p = pp + 1; + evas_object_textblock_format_insert(text, "\n"); + } + else + p = NULL; + } + free(newstr); + } + edje_object_part_swallow(o, "text", text); + evas_object_show(text); + + edje_object_part_geometry_get(o, "text", &x, &y, &w, &h); + evas_object_textblock_format_size_get(text, &nw, &nh); + /* FIXME: How to handle the width of the text? */ + error_h += (nh - h); + + evas_object_move(o, 0, 0); + evas_object_resize(o, error_w, error_h); + evas_object_show(o); + + ecore_evas_move(ee, (man->w - error_w) / 2, (man->h - error_h) / 2); + ecore_evas_resize(ee, error_w, error_h); + + for (l = man->containers; l; l = l->next) + { + E_Container *con; + E_Container_Shape *es; + + con = l->data; + es = e_container_shape_add(con); + e_container_shape_move(es, (man->w - error_w) / 2, (man->h - error_h) / 2); + e_container_shape_resize(es, error_w, error_h); + e_container_shape_show(es); + shapelist = evas_list_append(shapelist, es); + } + ecore_evas_data_set(ee, "shapes", shapelist); + o = evas_object_rectangle_add(e); evas_object_name_set(o, "allocated"); } @@ -259,6 +340,21 @@ _e_error_cb_ok_up(void *data, Evas *e, Evas_Object *obj, void *event_info) } } +static void +_e_error_edje_cb_ok_up(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Ecore_Evas *ee; + Evas_Object *o; + + ee = data; + o = evas_object_name_find(ecore_evas_get(ee), "allocated"); + if (o) + { + evas_object_del(o); + ecore_job_add(_e_error_cb_job_ecore_evas_free, ee); + } +} + static void _e_error_cb_job_ecore_evas_free(void *data) {