static void _recalc(void *data) { ELM_LABEL_DATA_GET(data, sd); Evas_Coord minw = -1, minh = -1; Evas_Coord resw; evas_event_freeze(evas_object_evas_get(data)); evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, NULL); if (sd->wrap_w > resw) resw = sd->wrap_w; edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, resw, 0); /* This is a hack to workaround the way min size hints are treated. * If the minimum width is smaller than the restricted width, it means * the mininmum doesn't matter. */ if ((minw <= resw) && (minw != sd->wrap_w)) { Evas_Coord ominw = -1; evas_object_size_hint_min_get(data, &ominw, NULL); minw = ominw; } evas_object_size_hint_min_set(data, minw, minh); evas_event_thaw(evas_object_evas_get(data)); evas_event_thaw_eval(evas_object_evas_get(data)); }
static void _elm_label_smart_sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1; Evas_Coord resw, resh; ELM_LABEL_DATA_GET(obj, sd); if (sd->linewrap) { evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, &resh); if (resw == sd->lastw) return; sd->lastw = resw; _recalc(obj); } else { evas_event_freeze(evas_object_evas_get(obj)); evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, &resh); edje_object_size_min_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh); if (sd->wrap_w > 0 && minw > sd->wrap_w) minw = sd->wrap_w; evas_object_size_hint_min_set(obj, minw, minh); evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); } }
static void winchoosefile(char *prompt, char *buf, int len, int filter, Eina_Bool is_save) { Evas *evas = NULL; if ( frame != NULL ){ //simulate a modal dialog by disabling all events to the main window ecore_evas_get( frame ); disable_idlers(); evas_event_freeze(evas); } /*TODO: implement file name filtering */ Evas_Object *win, *fs, *bg, *vbox, *hbox, *bt; win = elm_win_add(NULL, "fileselector", ELM_WIN_BASIC); elm_win_title_set(win, prompt); bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bg); vbox = elm_box_add(win); elm_win_resize_object_add(win, vbox); evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(vbox); fs = elm_fileselector_add(win); elm_fileselector_is_save_set(fs, is_save); elm_fileselector_expandable_set(fs, EINA_FALSE); evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(vbox, fs); evas_object_show(fs); evas_object_smart_callback_add(fs, "done", my_fileselector_done, win); if (strlen(buf)) elm_fileselector_selected_set( fs, buf ); if (fileselect) elm_fileselector_path_set( fs, filepath ); else if (getenv("HOME")) elm_fileselector_path_set( fs, getenv("HOME") ); evas_object_resize(win, 400, 350); evas_object_show(win); evas_object_data_set(fs, "buffer", buf); elm_run(); if ( evas != NULL ){ //enable events to the main window enable_idlers(); evas_event_thaw(evas); } }
static int mpdclient_playlist_update(void *data) { mpd_Status * status; mpd_InfoEntity *entity; int i; mpd_sendCommandListOkBegin(conn); mpd_sendStatusCommand(conn); mpd_sendPlChangesCommand(conn, cur_playlist); mpd_sendCommandListEnd(conn); if((status = mpd_getStatus(conn))==NULL) { fprintf(stderr,"%s\n",conn->errorStr); mpd_closeConnection(conn); return 1; } cur_playlist = status->playlist; cur_song = status->songid; mpd_nextListOkCommand(conn); evas_event_freeze(evas); while((entity = mpd_getNextInfoEntity(conn))) { if(entity->type!=MPD_INFO_ENTITY_TYPE_SONG) { mpd_freeInfoEntity(entity); continue; } music_song_insert(entity->info.song); mpd_freeInfoEntity(entity); } for (i = status->playlistLength; i < music_song_count(); i++) { music_song_remove(i); } if (status->state == MPD_STATUS_STATE_PLAY || status->state == MPD_STATUS_STATE_PAUSE) { music_song_update(status->song, status->totalTime); } else { music_song_update(-1, 0); } layout_update(status->state == MPD_STATUS_STATE_PLAY, status->volume); evas_event_thaw(evas); mpd_finishCommand(conn); mpd_freeStatus(status); return 1; }
static void _eval(Evas_Object *obj) { Evas_Coord x, y, w, h, cvx, cvy, cvw, cvh; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; evas_event_freeze(evas_object_evas_get(obj)); evas_object_geometry_get(obj, &x, &y, &w, &h); if (w < 1) w = 1; if (h < 1) h = 1; evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh); if ((cvw < 1) || (cvh < 1)) return; // need some fuzz value thats beyond the current viewport // for now just make it the viewport * 3 in size (so 1 vp in each direction) /* cvx -= cvw; cvy -= cvh; cvw *= 3; cvh *= 3; */ if (ELM_RECTS_INTERSECT(x, y, w, h, cvx, cvy, cvw, cvh)) { if (!wd->content) { // DBG(" + %i %i %ix%i <> %i %i %ix%i", x, y, w, h, cvx, cvy, cvw, cvh); evas_object_smart_callback_call(obj, SIG_REALIZE, NULL); if (wd->content) { if (evas_object_smart_data_get(wd->content)) evas_object_smart_calculate(wd->content); } wd->last_calc_count = evas_smart_objects_calculate_count_get(evas_object_evas_get(obj)); } } else { if (wd->content) { if (wd->last_calc_count != evas_smart_objects_calculate_count_get(evas_object_evas_get(obj))) evas_object_smart_callback_call(obj, SIG_UNREALIZE, NULL); } } evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); }
/* * Populate the list of projections. * Note that this list is the same as the planet list - * its contents are replaced according to context. */ static void _fill_projection_ilist(Evas_Object *ilist, const char *value, E_Config_Dialog_Data *cfdata, int *store_item) { Evas *evas; int count = -1; evas = evas_object_evas_get(ilist); evas_event_freeze(evas); edje_freeze(); e_widget_ilist_freeze(ilist); e_widget_ilist_clear(ilist); _add_ilist_entry(ilist, "Ancient", "ancient", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Azimuthal", "azimuthal", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Bonne", "bonne", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Equal Area", "equalarea", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Gnomonic", "gnomonic", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Hemisphere", "hemisphere", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Icosagnomonic", "icosagnomonic", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Lambert", "lambert", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Mercator", "mercator", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Mollweide", "mollweide", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Orthographic", "orthographic", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Peters", "peters", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Polyconic", "polyconic", value, _cb_source, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Rectangular", "rectangular", value, _cb_source, cfdata, ++count, store_item); e_widget_ilist_go(ilist); e_widget_ilist_thaw(ilist); edje_thaw(); evas_event_thaw(evas); }
static Eina_Bool _elm_label_smart_theme(Evas_Object *obj) { Eina_Bool ret; ELM_LABEL_DATA_GET(obj, sd); evas_event_freeze(evas_object_evas_get(obj)); ret = ELM_WIDGET_CLASS(_elm_label_parent_sc)->theme(obj); if (!ret) goto end; _label_format_set(ELM_WIDGET_DATA(sd)->resize_obj, sd->format); _label_sliding_change(obj); end: evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); return ret; }
int e_syscon_show(E_Zone *zone, const char *defact) { Evas_Object *o, *o2; Evas_Coord mw, mh; int x, y, w, h, zx, zy, zw, zh; int iw, ih; Eina_List *l; double t; t = ecore_loop_time_get(); if (popup) { if ((t - show_time) > 0.5) { for (l = e_config->syscon.actions; l; l = l->next) { E_Config_Syscon_Action *sca; E_Action *a; if (!(sca = l->data)) continue; if (!sca->action) continue; a = e_action_find(sca->action); if (!a) continue; if (sca->is_main == 2) { a->func.go(NULL, sca->params); e_syscon_hide(); break; } } } return 0; } input_window = ecore_x_window_input_new(zone->container->win, zone->x, zone->y, zone->w, zone->h); ecore_x_window_show(input_window); if (!e_grabinput_get(input_window, 1, input_window)) { ecore_x_window_free(input_window); input_window = 0; return 0; } popup = e_popup_new(zone, 0, 0, 1, 1); if (!popup) { e_grabinput_release(input_window, input_window); ecore_x_window_free(input_window); input_window = 0; return 0; } evas_event_freeze(popup->evas); e_popup_layer_set(popup, E_LAYER_POPUP); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_KEY_DOWN, _cb_key_down, NULL)); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_MOUSE_BUTTON_DOWN, _cb_mouse_down, NULL)); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_MOUSE_BUTTON_UP, _cb_mouse_up, NULL)); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_MOUSE_MOVE, _cb_mouse_move, NULL)); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_MOUSE_WHEEL, _cb_mouse_wheel, NULL)); o = edje_object_add(popup->evas); o_bg = o; e_theme_edje_object_set(o, "base/theme/syscon", "e/widgets/syscon/main"); edje_object_part_text_set(o, "e.text.label", _("Cancel")); edje_object_signal_callback_add(o, "e,action,close", "", _cb_signal_close, NULL); edje_object_signal_callback_add(o, "e,action,syscon", "*", _cb_signal_syscon, NULL); act_count = 0; show_time = t; // main (default): // halt | suspend | desk_lock // secondary (default): // reboot | hibernate | logout // extra (example for illume): // home | close | kill o = e_flowlayout_add(popup->evas); o_flow_main = o; e_flowlayout_orientation_set(o, 1); e_flowlayout_flowdirection_set(o, 1, 1); e_flowlayout_homogenous_set(o, 1); o = e_flowlayout_add(popup->evas); o_flow_secondary = o; e_flowlayout_orientation_set(o, 1); e_flowlayout_flowdirection_set(o, 1, 1); e_flowlayout_homogenous_set(o, 1); o = e_flowlayout_add(popup->evas); o_flow_extra = o; e_flowlayout_orientation_set(o, 1); e_flowlayout_flowdirection_set(o, 1, 1); e_flowlayout_homogenous_set(o, 1); for (l = e_config->syscon.actions; l; l = l->next) { E_Config_Syscon_Action *sca; char buf[1024]; E_Action *a; int disabled; if (!(sca = l->data)) continue; if (!sca->action) continue; a = e_action_find(sca->action); if (!a) continue; disabled = 0; if ((!strcmp(sca->action, "logout")) && (!e_sys_action_possible_get(E_SYS_LOGOUT))) disabled = 1; else if ((!strcmp(sca->action, "halt")) && (!e_sys_action_possible_get(E_SYS_HALT))) disabled = 1; else if ((!strcmp(sca->action, "halt_now")) && (!e_sys_action_possible_get(E_SYS_HALT_NOW))) disabled = 1; else if ((!strcmp(sca->action, "reboot")) && (!e_sys_action_possible_get(E_SYS_REBOOT))) disabled = 1; else if ((!strcmp(sca->action, "suspend")) && (!e_sys_action_possible_get(E_SYS_SUSPEND))) disabled = 1; else if ((!strcmp(sca->action, "hibernate")) && (!e_sys_action_possible_get(E_SYS_HIBERNATE))) disabled = 1; o = edje_object_add(popup->evas); edje_object_signal_callback_add(o, "e,action,click", "", _cb_signal_action, sca); if (sca->button) { snprintf(buf, sizeof(buf), "e/widgets/syscon/item/%s", sca->button); e_theme_edje_object_set(o, "base/theme/widgets", buf); } else e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/syscon/item/button"); edje_object_part_text_set(o, "e.text.label", _(e_action_predef_label_get(sca->action, sca->params))); if (sca->icon) { o2 = e_icon_add(popup->evas); e_util_icon_theme_set(o2, sca->icon); edje_object_part_swallow(o, "e.swallow.icon", o2); evas_object_show(o2); if (disabled) edje_object_signal_emit(o2, "e,state,disabled", "e"); } if (disabled) edje_object_signal_emit(o, "e,state,disabled", "e"); if (sca->is_main) { e_flowlayout_pack_end(o_flow_main, o); iw = ih = e_config->syscon.main.icon_size * e_scale; } else { e_flowlayout_pack_end(o_flow_secondary, o); iw = ih = e_config->syscon.secondary.icon_size * e_scale; } edje_object_message_signal_process(o); edje_object_size_min_calc(o, &mw, &mh); if (mw > iw) iw = mw; if (mh > ih) ih = mh; e_flowlayout_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5, iw, ih, iw, ih); evas_object_show(o); } for (l = (Eina_List *)e_sys_con_extra_action_list_get(); l; l = l->next) { E_Sys_Con_Action *sca; char buf[1024]; sca = l->data; o = edje_object_add(popup->evas); edje_object_signal_callback_add(o, "e,action,click", "", _cb_signal_action_extra, sca); if (sca->button_name) { snprintf(buf, sizeof(buf), "e/widgets/syscon/item/%s", sca->button_name); e_theme_edje_object_set(o, "base/theme/widgets", buf); } else e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/syscon/item/button"); edje_object_part_text_set(o, "e.text.label", sca->label); if (sca->icon_group) { o2 = edje_object_add(popup->evas); e_util_edje_icon_set(o2, sca->icon_group); edje_object_part_swallow(o, "e.swallow.icon", o2); evas_object_show(o2); if (sca->disabled) edje_object_signal_emit(o2, "e,state,disabled", "e"); } if (sca->disabled) edje_object_signal_emit(o, "e,state,disabled", "e"); e_flowlayout_pack_end(o_flow_extra, o); iw = ih = e_config->syscon.extra.icon_size * e_scale; e_flowlayout_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5, iw, ih, iw, ih); evas_object_show(o); } e_flowlayout_fill_set(o_flow_main, 1); edje_object_part_swallow(o_bg, "e.swallow.main", o_flow_main); e_flowlayout_fill_set(o_flow_secondary, 1); edje_object_part_swallow(o_bg, "e.swallow.secondary", o_flow_secondary); e_flowlayout_fill_set(o_flow_extra, 1); edje_object_part_swallow(o_bg, "e.swallow.extra", o_flow_extra); e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); evas_object_resize(o_bg, zw, zh); edje_object_calc_force(o_bg); e_flowlayout_size_min_get(o_flow_main, &mw, &mh); edje_extern_object_min_size_set(o_flow_main, mw, mh); edje_object_part_swallow(o_bg, "e.swallow.main", o_flow_main); e_flowlayout_size_min_get(o_flow_secondary, &mw, &mh); edje_extern_object_min_size_set(o_flow_secondary, mw, mh); edje_object_part_swallow(o_bg, "e.swallow.secondary", o_flow_secondary); e_flowlayout_size_min_get(o_flow_extra, &mw, &mh); edje_extern_object_min_size_set(o_flow_extra, mw, mh); edje_object_part_swallow(o_bg, "e.swallow.extra", o_flow_extra); edje_object_size_min_calc(o_bg, &mw, &mh); w = mw; if (w > zw) w = zw; x = zx - zone->x + (zw - w) / 2; h = mh; if (h > zh) h = zh; y = zy - zone->y + (zh - h) / 2; e_popup_move_resize(popup, x, y, w, h); evas_object_move(o_bg, 0, 0); evas_object_resize(o_bg, w, h); evas_object_show(o_bg); e_popup_edje_bg_object_set(popup, o_bg); if (e_config->syscon.do_input) { deftimer = ecore_timer_add(e_config->syscon.timeout, _cb_timeout_defaction, NULL); if (defact) do_defact = eina_stringshare_add(defact); } evas_event_thaw(popup->evas); inevas = 0; e_popup_show(popup); return 1; }
/* * Populate the list of planets * Note that this list is the same as the projection list - * its contents are replaced according to context. */ static void _fill_planet_ilist(Evas_Object *ilist, const char *value, void(*callback)(void *data), E_Config_Dialog_Data *cfdata, int *store_item) { Evas *evas; int count = -1; evas = evas_object_evas_get(ilist); evas_event_freeze(evas); edje_freeze(); e_widget_ilist_freeze(ilist); e_widget_ilist_clear(ilist); _add_ilist_entry(ilist, "Sun", "sun", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Mercury", "mercury", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Venus", "venus", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Earth", "earth", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Moon", "moon", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Mars", "mars", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Phobos", "phobos", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Deimos", "deimos", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Jupiter", "jupiter", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Io", "io", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Europa", "europa", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Ganymede", "ganymede", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Callisto", "callisto", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Saturn", "saturn", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Mimas", "mimas", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Enceladus", "enceladus", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Tethys", "tethys", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Dione", "dione", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Rhea", "rhea", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Titan", "titan", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Hyperion", "hyperion", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Iapetus", "iapetus", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Phoebe", "phoebe", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Uranus", "uranus", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Miranda", "miranda", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Ariel", "ariel", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Umbriel", "umbriel", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Titania", "titania", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Oberon", "oberon", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Neptune", "neptune", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Triton", "triton", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Nereid", "nereid", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Pluto", "pluto", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, " Charon", "charon", value, callback, cfdata, ++count, store_item); _add_ilist_entry(ilist, "Random", "random", value, callback, cfdata, ++count, store_item); e_widget_ilist_go(ilist); e_widget_ilist_thaw(ilist); edje_thaw(); evas_event_thaw(evas); }
EINA_LIST_FREE(sources, rp) { /* XXX: curr_item and pack_it don't require to be NULL since * XXX: they are just used when source != NULL and type == BOX, * XXX: and they're always set in this case, but GCC fails to * XXX: notice that, so let's shut it up */ Edje_Pack_Element **curr_item = NULL; unsigned int item_count = 0; Edje_Pack_Element *pack_it = NULL; const char *source = NULL; switch (rp->part->type) { case EDJE_PART_TYPE_GROUP: source = rp->part->source; break; case EDJE_PART_TYPE_BOX: case EDJE_PART_TYPE_TABLE: if (rp->part->items) { curr_item = rp->part->items; item_count = rp->part->items_count; if (item_count > 0) { pack_it = *curr_item; source = pack_it->source; item_count--; curr_item++; } } break; default: /* This list should only be filled by group, box or table, nothing else. */ abort(); continue; } while (source) { Eina_List *l; Evas_Object *child_obj; const char *group_path_entry = eina_stringshare_add(source); const char *data; if (!group_path) { group_path = eina_list_append(NULL, eina_stringshare_add(group)); group_path_started = 1; } /* make sure that this group isn't already in the tree of parents */ EINA_LIST_FOREACH(group_path, l, data) { if (data == group_path_entry) { ERR("recursive loop group '%s' already included inside part '%s' of group '%s' from file '%s'", group_path_entry, rp->part->name, group, file); textblocks = eina_list_free(textblocks); externals = eina_list_free(externals); sources = eina_list_free(sources); _edje_thaw(ed); _edje_unblock(ed); _edje_unref(ed); _edje_file_del(ed); eina_stringshare_del(group_path_entry); if (group_path_started) { eina_stringshare_del(eina_list_data_get(group_path)); eina_list_free(group_path); } ed->load_error = EDJE_LOAD_ERROR_RECURSIVE_REFERENCE; evas_event_thaw(tev); evas_event_thaw_eval(tev); return 0; } } child_obj = edje_object_add(ed->base.evas); group_path = eina_list_append(group_path, group_path_entry); if (rp->part->type == EDJE_PART_TYPE_GROUP) { _edje_real_part_swallow(rp, child_obj, EINA_FALSE); } if (!_edje_object_file_set_internal(child_obj, file, source, rp->part->name, group_path)) { ERR("impossible to set part '%s' of group '%s' from file '%s' to '%s'", rp->part->name, group_path_entry, file, source); textblocks = eina_list_free(textblocks); externals = eina_list_free(externals); sources = eina_list_free(sources); _edje_thaw(ed); _edje_unblock(ed); _edje_unref(ed); _edje_file_del(ed); if (group_path_started) { while (group_path) { eina_stringshare_del(eina_list_data_get(group_path)); group_path = eina_list_remove_list(group_path, group_path); } } ed->load_error = edje_object_load_error_get(child_obj); evas_object_del(child_obj); evas_event_thaw(tev); evas_event_thaw_eval(tev); return 0; } group_path = eina_list_remove(group_path, group_path_entry); eina_stringshare_del(group_path_entry); edje_object_propagate_callback_add(child_obj, _cb_signal_repeat, obj); if (rp->part->type == EDJE_PART_TYPE_GROUP) { _edje_real_part_swallow(rp, child_obj, EINA_TRUE); _edje_subobj_register(ed, child_obj); source = NULL; } else { pack_it->parent = rp; _edje_object_pack_item_hints_set(child_obj, pack_it); if (pack_it->name) evas_object_name_set(child_obj, pack_it->name); if (rp->part->type == EDJE_PART_TYPE_BOX) { _edje_real_part_box_append(rp, child_obj); evas_object_data_set(child_obj, "\377 edje.box_item", pack_it); } else if (rp->part->type == EDJE_PART_TYPE_TABLE) { _edje_real_part_table_pack(rp, child_obj, pack_it->col, pack_it->row, pack_it->colspan, pack_it->rowspan); evas_object_data_set(child_obj, "\377 edje.table_item", pack_it); } _edje_subobj_register(ed, child_obj); evas_object_show(child_obj); rp->items = eina_list_append(rp->items, child_obj); if (item_count > 0) { pack_it = *curr_item; source = pack_it->source; curr_item++; item_count--; } else { source = NULL; curr_item = NULL; pack_it = NULL; } } } }
int _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, const char *parent, Eina_List *group_path) { Edje *ed; Evas *tev; Edje_Real_Part *rp; Eina_List *textblocks = NULL; Eina_List *sources = NULL; Eina_List *externals = NULL; Eina_List *old_swallows; unsigned int n; Eina_List *parts = NULL; int group_path_started = 0; ed = _edje_fetch(obj); if (!ed) return 0; if (!file) file = ""; if (!group) group = ""; if (((ed->path) && (!strcmp(file, ed->path))) && (ed->group) && (!strcmp(group, ed->group))) return 1; tev = evas_object_evas_get(obj); evas_event_freeze(tev); old_swallows = _edje_swallows_collect(ed); if (_edje_script_only(ed)) _edje_script_only_shutdown(ed); if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed); _edje_file_del(ed); eina_stringshare_replace(&ed->path, file); eina_stringshare_replace(&ed->group, group); ed->parent = eina_stringshare_add(parent); ed->load_error = EDJE_LOAD_ERROR_NONE; _edje_file_add(ed); ed->block_break = 0; if (ed->file && ed->file->external_dir) { unsigned int i; for (i = 0; i < ed->file->external_dir->entries_count; ++i) edje_module_load(ed->file->external_dir->entries[i].entry); } _edje_textblock_styles_add(ed); _edje_textblock_style_all_update(ed); ed->has_entries = EINA_FALSE; if (ed->collection) { if (ed->collection->prop.orientation != EDJE_ORIENTATION_AUTO) ed->is_rtl = (ed->collection->prop.orientation == EDJE_ORIENTATION_RTL); if (ed->collection->script_only) { ed->load_error = EDJE_LOAD_ERROR_NONE; _edje_script_only_init(ed); } else if (ed->collection->lua_script_only) { ed->load_error = EDJE_LOAD_ERROR_NONE; _edje_lua_script_only_init(ed); } else { unsigned int i; /* colorclass stuff */ for (i = 0; i < ed->collection->parts_count; ++i) { Edje_Part *ep; unsigned int k; ep = ed->collection->parts[i]; /* Register any color classes in this parts descriptions. */ if ((ep->default_desc) && (ep->default_desc->color_class)) _edje_color_class_member_add(ed, ep->default_desc->color_class); for (k = 0; k < ep->other.desc_count; k++) { Edje_Part_Description_Common *desc; desc = ep->other.desc[k]; if (desc->color_class) _edje_color_class_member_add(ed, desc->color_class); } } /* build real parts */ for (n = 0; n < ed->collection->parts_count; n++) { Edje_Part *ep; ep = ed->collection->parts[n]; rp = eina_mempool_malloc(_edje_real_part_mp, sizeof(Edje_Real_Part)); if (!rp) { /* FIXME: destroy all allocated ressource, need to have a common exit point */ ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; evas_event_thaw(tev); evas_event_thaw_eval(tev); return 0; } memset(rp, 0, sizeof (Edje_Real_Part)); if ((ep->dragable.x != 0) || (ep->dragable.y != 0)) { rp->drag = calloc(1, sizeof (Edje_Real_Part_Drag)); if (!rp->drag) { ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; eina_mempool_free(_edje_real_part_mp, rp); evas_event_thaw(tev); evas_event_thaw_eval(tev); return 0; } rp->drag->step.x = FROM_INT(ep->dragable.step_x); rp->drag->step.y = FROM_INT(ep->dragable.step_y); } rp->edje = ed; _edje_ref(rp->edje); rp->part = ep; parts = eina_list_append(parts, rp); rp->param1.description = _edje_part_description_find(ed, rp, "default", 0.0); rp->chosen_description = rp->param1.description; if (!rp->param1.description) ERR("no default part description!"); switch (ep->type) { case EDJE_PART_TYPE_RECTANGLE: rp->object = evas_object_rectangle_add(ed->base.evas); break; case EDJE_PART_TYPE_PROXY: case EDJE_PART_TYPE_IMAGE: rp->object = evas_object_image_add(ed->base.evas); break; case EDJE_PART_TYPE_TEXT: _edje_text_part_on_add(ed, rp); rp->object = evas_object_text_add(ed->base.evas); evas_object_text_font_source_set(rp->object, ed->path); break; case EDJE_PART_TYPE_GROUP: sources = eina_list_append(sources, rp); case EDJE_PART_TYPE_SWALLOW: case EDJE_PART_TYPE_EXTERNAL: if (ep->type == EDJE_PART_TYPE_EXTERNAL) externals = eina_list_append(externals, rp); rp->object = evas_object_rectangle_add(ed->base.evas); evas_object_color_set(rp->object, 0, 0, 0, 0); evas_object_pass_events_set(rp->object, 1); evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB); _edje_callbacks_focus_add(rp->object, ed, rp); break; case EDJE_PART_TYPE_TEXTBLOCK: textblocks = eina_list_append(textblocks, rp); rp->object = evas_object_textblock_add(ed->base.evas); break; case EDJE_PART_TYPE_BOX: sources = eina_list_append(sources, rp); rp->object = evas_object_box_add(ed->base.evas); rp->anim = _edje_box_layout_anim_new(rp->object); break; case EDJE_PART_TYPE_TABLE: sources = eina_list_append(sources, rp); rp->object = evas_object_table_add(ed->base.evas); break; case EDJE_PART_TYPE_GRADIENT: ERR("SPANK ! SPANK ! SPANK ! YOU ARE USING GRADIENT IN PART %s FROM GROUP %s INSIDE FILE %s !! THEY ARE NOW REMOVED !", ep->name, group, file); default: ERR("wrong part type %i!", ep->type); break; } if (rp->object) { evas_object_smart_member_add(rp->object, ed->obj); // evas_object_layer_set(rp->object, evas_object_layer_get(ed->obj)); if (ep->type != EDJE_PART_TYPE_SWALLOW && ep->type != EDJE_PART_TYPE_GROUP && ep->type != EDJE_PART_TYPE_EXTERNAL) { if (ep->mouse_events) { _edje_callbacks_add(rp->object, ed, rp); if (ep->repeat_events) evas_object_repeat_events_set(rp->object, 1); if (ep->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB) evas_object_pointer_mode_set(rp->object, ep->pointer_mode); } else { evas_object_pass_events_set(rp->object, 1); evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB); } if (ep->precise_is_inside) evas_object_precise_is_inside_set(rp->object, 1); } if (rp->part->clip_to_id < 0) evas_object_clip_set(rp->object, ed->base.clipper); } } if (n > 0) { Eina_List *l; ed->table_parts = malloc(sizeof(Edje_Real_Part *) * n); ed->table_parts_size = n; /* FIXME: check malloc return */ n = 0; EINA_LIST_FOREACH(parts, l, rp) { ed->table_parts[n] = rp; n++; } eina_list_free(parts); for (i = 0; i < ed->table_parts_size; i++) { rp = ed->table_parts[i]; if (rp->param1.description) /* FIXME: prevent rel to gone radient part to go wrong. You may be able to remove this when all theme are correctly rewritten. */ { if (rp->param1.description->rel1.id_x >= 0) rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size]; if (rp->param1.description->rel1.id_y >= 0) rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->rel1.id_y % ed->table_parts_size]; if (rp->param1.description->rel2.id_x >= 0) rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size]; if (rp->param1.description->rel2.id_y >= 0) rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->rel2.id_y % ed->table_parts_size]; } if (rp->part->clip_to_id >= 0) { rp->clip_to = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size]; if (rp->clip_to) { evas_object_pass_events_set(rp->clip_to->object, 1); evas_object_pointer_mode_set(rp->clip_to->object, EVAS_OBJECT_POINTER_MODE_NOGRAB); evas_object_clip_set(rp->object, rp->clip_to->object); } } if (rp->drag) { if (rp->part->dragable.confine_id >= 0) rp->drag->confine_to = ed->table_parts[rp->part->dragable.confine_id % ed->table_parts_size]; } /* replay events for dragable */ if (rp->part->dragable.event_id >= 0) { rp->events_to = ed->table_parts[rp->part->dragable.event_id % ed->table_parts_size]; /* events_to may be used only with dragable */ if (!rp->events_to->part->dragable.x && !rp->events_to->part->dragable.y) rp->events_to = NULL; } rp->swallow_params.min.w = 0; rp->swallow_params.min.h = 0; rp->swallow_params.max.w = -1; rp->swallow_params.max.h = -1; if (rp->part->type == EDJE_PART_TYPE_TEXT || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) { Edje_Part_Description_Text *text; text = (Edje_Part_Description_Text *) rp->param1.description; if (ed->file->feature_ver < 1) { text->text.id_source = -1; text->text.id_text_source = -1; } if (text->text.id_source >= 0) rp->text.source = ed->table_parts[text->text.id_source % ed->table_parts_size]; if (text->text.id_text_source >= 0) rp->text.text_source = ed->table_parts[text->text.id_text_source % ed->table_parts_size]; if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) { _edje_entry_real_part_init(rp); if (!ed->has_entries) ed->has_entries = EINA_TRUE; } } } } _edje_programs_patterns_init(ed); n = ed->collection->programs.fnmatch_count + ed->collection->programs.strcmp_count + ed->collection->programs.strncmp_count + ed->collection->programs.strrncmp_count + ed->collection->programs.nocmp_count; if (n > 0) { Edje_Program *pr; ed->table_programs = malloc(sizeof(Edje_Program *) * n); if (ed->table_programs) { ed->table_programs_size = n; #define EDJE_LOAD_BUILD_TABLE(Array, Ed, It, Tmp) \ for (It = 0; It < Ed->collection->programs.Array##_count; ++It) \ { \ Tmp = Ed->collection->programs.Array[It]; \ Ed->table_programs[Tmp->id] = Tmp; \ } EDJE_LOAD_BUILD_TABLE(fnmatch, ed, i, pr); EDJE_LOAD_BUILD_TABLE(strcmp, ed, i, pr); EDJE_LOAD_BUILD_TABLE(strncmp, ed, i, pr); EDJE_LOAD_BUILD_TABLE(strrncmp, ed, i, pr); EDJE_LOAD_BUILD_TABLE(nocmp, ed, i, pr); } } _edje_ref(ed); _edje_block(ed); _edje_freeze(ed); // if (ed->collection->script) _edje_embryo_script_init(ed); _edje_var_init(ed); for (i = 0; i < ed->table_parts_size; i++) { rp = ed->table_parts[i]; evas_object_show(rp->object); if (_edje_block_break(ed)) break; if (rp->drag) { if (rp->part->dragable.x < 0) rp->drag->val.x = FROM_DOUBLE(1.0); if (rp->part->dragable.y < 0) rp->drag->val.x = FROM_DOUBLE(1.0); _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y); } } ed->recalc_call = 1; ed->dirty = 1; #ifdef EDJE_CALC_CACHE ed->all_part_change = 1; #endif if ((evas_object_clipees_get(ed->base.clipper)) && (evas_object_visible_get(obj))) evas_object_show(ed->base.clipper); /* instantiate 'internal swallows' */ EINA_LIST_FREE(externals, rp) { Edje_Part_Description_External *external; Evas_Object *child_obj; external = (Edje_Part_Description_External *) rp->part->default_desc; child_obj = _edje_external_type_add(rp->part->source, evas_object_evas_get(ed->obj), ed->obj, external->external_params, rp->part->name); if (child_obj) { _edje_real_part_swallow(rp, child_obj, EINA_TRUE); rp->param1.external_params = _edje_external_params_parse(child_obj, external->external_params); _edje_external_recalc_apply(ed, rp, NULL, rp->chosen_description); } }