1 #include "Elementary.h"
4 int _elm_ext_log_dom = -1;
6 static int init_count = 0;
9 external_elm_init(void)
15 DBG("elm_real_init\n");
16 if (init_count > 1) return;
17 ecore_app_args_get(&argc, &argv);
22 external_elm_shutdown(void)
25 DBG("elm_real_shutdown\n");
26 if (init_count > 0) return;
31 _external_obj_del(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
33 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
35 external_elm_shutdown();
40 external_signal(void *data __UNUSED__, Evas_Object *obj, const char *signal, const char *source)
42 char *_signal = strdup(signal);
46 while((*p!='\0') && (*p!=']'))
50 if((*p=='\0') || (*(p+1)!=':'))
52 ERR("Invalid External Signal received: '%s' '%s'\n", signal, source);
58 p+=2; //jump ']' and ':'
60 Edje_External_Type *type = evas_object_data_get(obj, "Edje_External_Type");
61 if (!type->content_get)
63 ERR("external type '%s' from module '%s' does not provide content_get()",
64 type->module_name, type->module);
69 content = type->content_get(type->data, obj, _signal);
72 edje_object_signal_emit(content, signal + (p - _signal), source);
74 external_signal(void *data __UNUSED__, Evas_Object *obj, const char *sig, const char *source)
76 char *_signal = strdup(sig);
80 while((*p!='\0') && (*p!=']'))
84 if((*p=='\0') || (*(p+1)!=':'))
86 ERR("Invalid External Signal received: '%s' '%s'\n", sig, source);
92 p+=2; //jump ']' and ':'
94 Edje_External_Type *type = evas_object_data_get(obj, "Edje_External_Type");
95 if (!type->content_get)
97 ERR("external type '%s' from module '%s' does not provide content_get()",
98 type->module_name, type->module);
103 content = type->content_get(type->data, obj, _signal);
106 edje_object_signal_emit(content, sig + (p - _signal), source);
107 >>>>>>> remotes/origin/upstream
111 external_translate(void *data __UNUSED__, const char *orig)
113 // in future, mark all params as translatable and use dgettext()
114 // with "elementary" text domain here.
119 const char *emission;
122 } Elm_External_Signals_Proxy_Context;
125 _external_signal_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
127 Elm_External_Signals_Proxy_Context *ctxt = data;
132 _external_signal_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
134 Elm_External_Signals_Proxy_Context *ctxt = data;
135 // TODO: Is it worth to check Evas_Smart_Cb_Description and do something
136 // TODO: with event_info given its description?
137 edje_object_signal_emit(ctxt->edje, ctxt->emission, ctxt->source);
141 external_common_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
143 if (!strcmp(param->name, "style"))
145 if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
147 param->s = elm_object_style_get(obj);
151 else if (!strcmp(param->name, "disabled"))
153 if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
155 param->i = elm_object_disabled_get(obj);
163 external_common_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
165 if (!strcmp(param->name, "style"))
167 if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
169 elm_object_style_set(obj, param->s);
173 else if (!strcmp(param->name, "disabled"))
175 if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
177 elm_object_disabled_set(obj, param->i);
185 external_signals_proxy(Evas_Object *obj, Evas_Object *edje, const char *part_name)
187 const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
188 unsigned int cls_count, inst_count, total;
189 Elm_External_Signals_Proxy_Context *ctxt;
191 evas_object_smart_callbacks_descriptions_get
192 (obj, &cls_descs, &cls_count, &inst_descs, &inst_count);
194 total = cls_count + inst_count;
196 ctxt = malloc(sizeof(Elm_External_Signals_Proxy_Context) * total);
198 evas_object_event_callback_add
199 (obj, EVAS_CALLBACK_FREE, _external_signal_proxy_free_cb, ctxt);
201 for (; cls_count > 0; cls_count--, cls_descs++, ctxt++)
203 const Evas_Smart_Cb_Description *d = *cls_descs;
204 ctxt->emission = d->name;
205 ctxt->source = part_name;
207 evas_object_smart_callback_add
208 (obj, d->name, _external_signal_proxy_cb, ctxt);
211 for (; inst_count > 0; inst_count--, inst_descs++, ctxt++)
213 const Evas_Smart_Cb_Description *d = *inst_descs;
214 ctxt->emission = d->name;
215 ctxt->source = part_name;
217 evas_object_smart_callback_add
218 (obj, d->name, _external_signal_proxy_cb, ctxt);
220 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
221 _external_obj_del, NULL);
225 external_common_params_parse(void *mem, void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
229 Edje_External_Param *param;
232 EINA_LIST_FOREACH(params, l, param)
234 if (!strcmp(param->name, "style"))
235 p->style = eina_stringshare_add(param->s);
236 else if (!strcmp(param->name, "disabled"))
238 p->disabled = param->i;
239 p->disabled_exists = EINA_TRUE;
245 external_common_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
248 if (to_params) p = to_params;
249 else if (from_params) p = from_params;
253 elm_object_style_set(obj, p->style);
254 if (p->disabled_exists)
255 elm_object_disabled_set(obj, p->disabled);
259 external_common_param_icon_get(Evas_Object *obj, const Edje_External_Param *p)
261 Evas_Object *edje, *parent_widget, *icon;
264 if ((!p) || (!p->s) || (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING))
267 edje = evas_object_smart_parent_get(obj);
268 edje_object_file_get(edje, &file, NULL);
270 parent_widget = elm_widget_parent_widget_get(obj);
272 parent_widget = edje;
273 icon = elm_icon_add(parent_widget);
275 if (elm_icon_file_set(icon, file, p->s))
277 if (elm_icon_standard_set(icon, p->s))
280 evas_object_del(icon);
285 external_common_icon_param_parse(Evas_Object **icon, Evas_Object *obj, const Eina_List *params)
287 Edje_External_Param *p = edje_external_param_find(params, "icon");
288 *icon = external_common_param_icon_get(obj, p);
292 external_common_param_edje_object_get(Evas_Object *obj, const Edje_External_Param *p)
294 Evas_Object *edje, *parent_widget, *ret;
297 if ((!p) || (!p->s) || (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING))
300 edje = evas_object_smart_parent_get(obj);
301 edje_object_file_get(edje, &file, NULL);
303 parent_widget = elm_widget_parent_widget_get(obj);
305 parent_widget = edje;
307 ret = edje_object_add(evas_object_evas_get(parent_widget));
309 if (edje_object_file_set(ret, file, p->s))
312 evas_object_del(ret);
317 external_common_params_free(void *params)
319 Elm_Params *p = params;
321 eina_stringshare_del(p->style);
324 #define DEFINE_TYPE(type_name) \
325 extern const Edje_External_Type external_##type_name##_type;
326 #include "modules.inc"
329 static Edje_External_Type_Info elm_external_types[] =
331 #define DEFINE_TYPE(type_name) \
332 {"elm/"#type_name, &external_##type_name##_type},
333 #include "modules.inc"
341 _elm_ext_log_dom = eina_log_domain_register("elm-externals", EINA_COLOR_LIGHTBLUE);
342 edje_external_type_array_register(elm_external_types);
347 elm_mod_shutdown(void)
349 edje_external_type_array_unregister(elm_external_types);
350 if (_elm_ext_log_dom >= 0) eina_log_domain_unregister(_elm_ext_log_dom);
351 _elm_ext_log_dom = -1;
354 EINA_MODULE_INIT(elm_mod_init);
355 EINA_MODULE_SHUTDOWN(elm_mod_shutdown);