diff options
Diffstat (limited to 'libraries/edje/src/lib/edje_program.c')
-rw-r--r-- | libraries/edje/src/lib/edje_program.c | 86 |
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 | ||
1038 | struct _Edje_Program_Data | 1047 | struct _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 | |||
1086 | void | 1074 | void |
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); |