svn update: 48945 (latest:48959)
[framework/uifw/elementary.git] / src / edje_externals / elm.c
1 #include "Elementary.h"
2 #include "private.h"
3
4 int _elm_log_dom = -1;
5
6 void
7 external_signal(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *signal, const char *source)
8 {
9    printf("External Signal received: '%s' '%s'\n", signal, source);
10 }
11
12 const char *
13 external_translate(void *data __UNUSED__, const char *orig)
14 {
15    // in future, mark all params as translatable and use dgettext()
16    // with "elementary" text domain here.
17    return orig;
18 }
19
20 typedef struct {
21    const char *emission;
22    const char *source;
23    Evas_Object *edje;
24 } Elm_External_Signals_Proxy_Context;
25
26 static void
27 _external_signal_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
28 {
29    Elm_External_Signals_Proxy_Context *ctxt = data;
30    free(ctxt);
31 }
32
33 static void
34 _external_signal_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
35 {
36    Elm_External_Signals_Proxy_Context *ctxt = data;
37    // TODO: Is it worth to check Evas_Smart_Cb_Description and do something
38    // TODO: with event_info given its description?
39    edje_object_signal_emit(ctxt->edje, ctxt->emission, ctxt->source);
40 }
41
42 void
43 external_signals_proxy(Evas_Object *obj, Evas_Object *edje, const char *part_name)
44 {
45    const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
46    unsigned int cls_count, inst_count, total;
47    Elm_External_Signals_Proxy_Context *ctxt;
48
49    evas_object_smart_callbacks_descriptions_get
50      (obj, &cls_descs, &cls_count, &inst_descs, &inst_count);
51
52    total = cls_count + inst_count;
53    if (!total) return;
54    ctxt = malloc(sizeof(Elm_External_Signals_Proxy_Context) * total);
55    if (!ctxt) return;
56    evas_object_event_callback_add
57      (obj, EVAS_CALLBACK_DEL, _external_signal_proxy_free_cb, ctxt);
58
59    for (; cls_count > 0; cls_count--,  cls_descs++, ctxt++)
60      {
61         const Evas_Smart_Cb_Description *d = *cls_descs;
62         ctxt->emission = d->name;
63         ctxt->source = part_name;
64         ctxt->edje = edje;
65         evas_object_smart_callback_add
66           (obj, d->name, _external_signal_proxy_cb, ctxt);
67      }
68
69    for (; inst_count > 0; inst_count--,  inst_descs++, ctxt++)
70      {
71         const Evas_Smart_Cb_Description *d = *inst_descs;
72         ctxt->emission = d->name;
73         ctxt->source = part_name;
74         ctxt->edje = edje;
75         evas_object_smart_callback_add
76           (obj, d->name, _external_signal_proxy_cb, ctxt);
77      }
78 }
79
80 void *
81 external_common_params_parse_internal(size_t params_size, void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
82 {
83    Elm_Params *p;
84    const Eina_List *l;
85    Edje_External_Param *param;
86
87    if (params_size < sizeof(Elm_Params))
88      return NULL;
89
90    p = calloc(1, params_size);
91    if (!p)
92      return NULL;
93
94    EINA_LIST_FOREACH(params, l, param)
95      {
96         if (!strcmp(param->name, "label"))
97           p->label = param->s;
98      }
99    return p;
100 }
101
102 Evas_Object *
103 external_common_param_icon_get(Evas_Object *obj, const Edje_External_Param *p)
104 {
105    Evas_Object *edje, *parent_widget, *icon;
106    const char *file;
107
108    if ((!p) || (!p->s) || (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING))
109        return NULL;
110
111    edje = evas_object_smart_parent_get(obj);
112    edje_object_file_get(edje, &file, NULL);
113
114    parent_widget = elm_widget_parent_widget_get(obj);
115    if (!parent_widget)
116      parent_widget = edje;
117    icon = elm_icon_add(parent_widget);
118
119    if (elm_icon_file_set(icon, file, p->s))
120      return icon;
121    if (elm_icon_standard_set(icon, p->s))
122      return icon;
123
124    evas_object_del(icon);
125    return NULL;
126 }
127
128 void
129 external_common_icon_param_parse(Evas_Object **icon, Evas_Object *obj, const Eina_List *params)
130 {
131    Edje_External_Param *p = edje_external_param_find(params, "icon");
132    *icon = external_common_param_icon_get(obj, p);
133 }
134
135 Evas_Object *
136 external_common_param_edje_object_get(Evas_Object *obj, const Edje_External_Param *p)
137 {
138    Evas_Object *edje, *parent_widget, *ret;
139    const char *file;
140
141    if ((!p) || (!p->s) || (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING))
142        return NULL;
143
144    edje = evas_object_smart_parent_get(obj);
145    edje_object_file_get(edje, &file, NULL);
146
147    parent_widget = elm_widget_parent_widget_get(obj);
148    if (!parent_widget)
149      parent_widget = edje;
150
151    ret = edje_object_add(evas_object_evas_get(parent_widget));
152
153    if (edje_object_file_set(ret, file, p->s))
154      return ret;
155
156    evas_object_del(ret);
157    return NULL;
158 }
159
160 void
161 external_common_params_free(void *params)
162 {
163    Elm_Params *p = params;
164    free(p);
165 };
166
167 #define DEFINE_TYPE(type_name) \
168   extern const Edje_External_Type external_##type_name##_type;
169 #include "modules.inc"
170 #undef DEFINE_TYPE
171
172 static Edje_External_Type_Info elm_external_types[] =
173 {
174 #define DEFINE_TYPE(type_name)              \
175   {"elm/"#type_name, &external_##type_name##_type},
176 #include "modules.inc"
177 #undef DEFINE_TYPE
178    {NULL, NULL}
179 };
180
181 static Eina_Bool
182 elm_mod_init(void)
183 {
184    int argc = 0;
185    char **argv = NULL;
186
187    ecore_app_args_get(&argc, &argv);
188    elm_init(argc, argv);
189
190    _elm_log_dom = eina_log_domain_register("elm-externals", EINA_COLOR_LIGHTBLUE);
191    edje_external_type_array_register(elm_external_types);
192    return EINA_TRUE;
193 }
194
195 static void
196 elm_mod_shutdown(void)
197 {
198    edje_external_type_array_unregister(elm_external_types);
199
200    eina_log_domain_unregister(_elm_log_dom);
201    _elm_log_dom = -1;
202
203    elm_shutdown();
204 }
205
206 EINA_MODULE_INIT(elm_mod_init);
207 EINA_MODULE_SHUTDOWN(elm_mod_shutdown);