aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/edje/src/lib/edje_program.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/edje/src/lib/edje_program.c')
-rw-r--r--libraries/edje/src/lib/edje_program.c86
1 files changed, 51 insertions, 35 deletions
diff --git a/libraries/edje/src/lib/edje_program.c b/libraries/edje/src/lib/edje_program.c
index d80c7c9..d631364 100644
--- a/libraries/edje/src/lib/edje_program.c
+++ b/libraries/edje/src/lib/edje_program.c
@@ -531,7 +531,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
531 } 531 }
532 532
533 if (rp->program) 533 if (rp->program)
534 _edje_program_end(ed, rp->program); 534 _edje_program_end(ed, rp->program);
535 _edje_part_description_apply(ed, rp, 535 _edje_part_description_apply(ed, rp,
536 rp->param1.description->state.name, 536 rp->param1.description->state.name,
537 rp->param1.description->state.value, 537 rp->param1.description->state.value,
@@ -570,7 +570,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
570 if (rp) 570 if (rp)
571 { 571 {
572 if (rp->program) 572 if (rp->program)
573 _edje_program_end(ed, rp->program); 573 _edje_program_end(ed, rp->program);
574 _edje_part_description_apply(ed, rp, 574 _edje_part_description_apply(ed, rp,
575 pr->state, 575 pr->state,
576 pr->value, 576 pr->value,
@@ -873,8 +873,11 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
873{ 873{
874 Edje_Message_Signal emsg; 874 Edje_Message_Signal emsg;
875 const char *sep; 875 const char *sep;
876 Eina_Bool broadcast;
876 877
878 if (!ed->collection) return;
877 if (ed->delete_me) return; 879 if (ed->delete_me) return;
880 broadcast = ed->collection->broadcast_signal;
878 881
879 sep = strchr(sig, EDJE_PART_PATH_SEPARATOR); 882 sep = strchr(sig, EDJE_PART_PATH_SEPARATOR);
880 883
@@ -958,6 +961,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
958 if (!ed2) goto end; 961 if (!ed2) goto end;
959 962
960 _edje_emit(ed2, newsig, src); 963 _edje_emit(ed2, newsig, src);
964 broadcast = EINA_FALSE;
961 break; 965 break;
962 966
963 case EDJE_PART_TYPE_EXTERNAL: 967 case EDJE_PART_TYPE_EXTERNAL:
@@ -976,6 +980,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
976 if (!ed2) goto end; 980 if (!ed2) goto end;
977 _edje_emit(ed2, newsig, src); 981 _edje_emit(ed2, newsig, src);
978 } 982 }
983 broadcast = EINA_FALSE;
979 break ; 984 break ;
980 985
981 case EDJE_PART_TYPE_BOX: 986 case EDJE_PART_TYPE_BOX:
@@ -988,6 +993,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
988 ed2 = _edje_fetch(child); 993 ed2 = _edje_fetch(child);
989 if (!ed2) goto end; 994 if (!ed2) goto end;
990 _edje_emit(ed2, newsig, src); 995 _edje_emit(ed2, newsig, src);
996 broadcast = EINA_FALSE;
991 } 997 }
992 break ; 998 break ;
993 999
@@ -1012,7 +1018,10 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
1012 emsg.data = NULL; 1018 emsg.data = NULL;
1013 } 1019 }
1014/* new sends code */ 1020/* new sends code */
1015 edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg); 1021 if (broadcast)
1022 edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1023 else
1024 _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1016/* old send code - use api now 1025/* old send code - use api now
1017 _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg); 1026 _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1018 EINA_LIST_FOREACH(ed->subobjs, l, obj) 1027 EINA_LIST_FOREACH(ed->subobjs, l, obj)
@@ -1037,12 +1046,8 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
1037 1046
1038struct _Edje_Program_Data 1047struct _Edje_Program_Data
1039{ 1048{
1040#ifdef EDJE_PROGRAM_CACHE
1041 Eina_List *matches; 1049 Eina_List *matches;
1042 int matched;
1043#endif
1044 Edje *ed; 1050 Edje *ed;
1045 const char *signal;
1046 const char *source; 1051 const char *source;
1047}; 1052};
1048 1053
@@ -1056,33 +1061,16 @@ static Eina_Bool _edje_glob_callback(Edje_Program *pr, void *dt)
1056 { 1061 {
1057 rp = _edje_real_part_get(data->ed, pr->filter.part ? pr->filter.part : data->source); 1062 rp = _edje_real_part_get(data->ed, pr->filter.part ? pr->filter.part : data->source);
1058 if (rp) 1063 if (rp)
1059 exec = (rp->chosen_description->state.name == pr->filter.state); 1064 exec = (rp->chosen_description->state.name == pr->filter.state);
1060 } 1065 }
1061 1066
1062#ifdef EDJE_PROGRAM_CACHE 1067 pr->exec = exec;
1063 data->matched++;
1064#endif
1065
1066 if (exec)
1067 _edje_program_run(data->ed, pr, 0, data->signal, data->source);
1068 1068
1069 if (_edje_block_break(data->ed))
1070 {
1071#ifdef EDJE_PROGRAM_CACHE
1072 eina_list_free(data->matches);
1073 data->matches = NULL;
1074#endif
1075 return EINA_TRUE;
1076 }
1077
1078#ifdef EDJE_PROGRAM_CACHE
1079 data->matches = eina_list_append(data->matches, pr); 1069 data->matches = eina_list_append(data->matches, pr);
1080#endif
1081 1070
1082 return EINA_FALSE; 1071 return EINA_FALSE;
1083} 1072}
1084 1073
1085
1086void 1074void
1087_edje_callbacks_patterns_clean(Edje *ed) 1075_edje_callbacks_patterns_clean(Edje *ed)
1088{ 1076{
@@ -1127,7 +1115,7 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1127 1115
1128 if (ed->collection && ed->L) 1116 if (ed->collection && ed->L)
1129 _edje_lua2_script_func_signal(ed, sig, src); 1117 _edje_lua2_script_func_signal(ed, sig, src);
1130 1118
1131 if (ed->collection) 1119 if (ed->collection)
1132 { 1120 {
1133#ifdef EDJE_PROGRAM_CACHE 1121#ifdef EDJE_PROGRAM_CACHE
@@ -1156,11 +1144,11 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1156 1144
1157 if (eina_hash_find(ec->prog_cache.no_matches, tmps)) 1145 if (eina_hash_find(ec->prog_cache.no_matches, tmps))
1158 { 1146 {
1159 done = 1; 1147 done = 1;
1160 } 1148 }
1161 else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps))) 1149 else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps)))
1162 { 1150 {
1163 EINA_LIST_FOREACH(matches, l, pr) 1151 EINA_LIST_FOREACH(matches, l, pr)
1164 { 1152 {
1165 Eina_Bool exec = EINA_TRUE; 1153 Eina_Bool exec = EINA_TRUE;
1166 1154
@@ -1169,10 +1157,12 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1169 Edje_Real_Part *rp; 1157 Edje_Real_Part *rp;
1170 1158
1171 rp = _edje_real_part_get(ed, pr->filter.part ? pr->filter.part : src); 1159 rp = _edje_real_part_get(ed, pr->filter.part ? pr->filter.part : src);
1172 if (rp) 1160 if (rp && !rp->program)
1173 exec = (rp->chosen_description->state.name == pr->filter.state); 1161 exec = (rp->chosen_description->state.name == pr->filter.state);
1174 } 1162 }
1175 1163
1164 pr->exec = exec;
1165#if 0
1176 if (exec) 1166 if (exec)
1177 { 1167 {
1178 _edje_program_run(ed, pr, 0, sig, src); 1168 _edje_program_run(ed, pr, 0, sig, src);
@@ -1181,7 +1171,19 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1181 goto break_prog; 1171 goto break_prog;
1182 } 1172 }
1183 } 1173 }
1174#endif
1184 } 1175 }
1176
1177 EINA_LIST_FOREACH(matches, l, pr)
1178 if (pr->exec)
1179 {
1180 _edje_program_run(ed, pr, 0, sig, src);
1181 if (_edje_block_break(ed))
1182 {
1183 goto break_prog;
1184 }
1185 }
1186
1185 done = 1; 1187 done = 1;
1186 } 1188 }
1187 } 1189 }
@@ -1192,11 +1194,8 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1192 1194
1193 data.ed = ed; 1195 data.ed = ed;
1194 data.source = src; 1196 data.source = src;
1195 data.signal = sig;
1196#ifdef EDJE_PROGRAM_CACHE
1197 data.matched = 0;
1198 data.matches = NULL; 1197 data.matches = NULL;
1199#endif 1198
1200 if (ed->table_programs_size > 0) 1199 if (ed->table_programs_size > 0)
1201 { 1200 {
1202 const Eina_List *match; 1201 const Eina_List *match;
@@ -1218,12 +1217,29 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1218 ed->patterns.programs.exact_match); 1217 ed->patterns.programs.exact_match);
1219 EINA_LIST_FOREACH(match, l, pr) 1218 EINA_LIST_FOREACH(match, l, pr)
1220 _edje_glob_callback(pr, &data); 1219 _edje_glob_callback(pr, &data);
1220
1221#ifdef EDJE_PROGRAM_CACHE
1222 EINA_LIST_FOREACH(data.matches, l, pr)
1223#else
1224 EINA_LIST_FREE(data.matches, pr)
1225#endif
1226 {
1227 if (pr->exec)
1228 _edje_program_run(ed, pr, 0, sig, src);
1229
1230 if (_edje_block_break(ed))
1231 {
1232 eina_list_free(data.matches);
1233 data.matches = NULL;
1234 goto break_prog;
1235 }
1236 }
1221 } 1237 }
1222 1238
1223#ifdef EDJE_PROGRAM_CACHE 1239#ifdef EDJE_PROGRAM_CACHE
1224 if (tmps) 1240 if (tmps)
1225 { 1241 {
1226 if (data.matched == 0) 1242 if (data.matches == NULL)
1227 { 1243 {
1228 if (!ec->prog_cache.no_matches) 1244 if (!ec->prog_cache.no_matches)
1229 ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL); 1245 ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL);