summaryrefslogtreecommitdiff
path: root/src/lib/ecore
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ecore')
-rw-r--r--src/lib/ecore/Ecore.h4
-rw-r--r--src/lib/ecore/Ecore_Common.h12
-rw-r--r--src/lib/ecore/Efl_Core.h4
-rw-r--r--src/lib/ecore/ecore.c4
-rw-r--r--src/lib/ecore/ecore_app.c6
-rw-r--r--src/lib/ecore/ecore_events.c150
-rw-r--r--src/lib/ecore/ecore_exe_posix.c25
-rw-r--r--src/lib/ecore/ecore_exe_ps3.c20
-rw-r--r--src/lib/ecore/ecore_getopt.c4
-rw-r--r--src/lib/ecore/ecore_pipe.c8
-rw-r--r--src/lib/ecore/ecore_private.h17
-rw-r--r--src/lib/ecore/ecore_time.c6
-rw-r--r--src/lib/ecore/ecore_timer.c74
-rw-r--r--src/lib/ecore/efl_accelerate_interpolator.c16
-rw-r--r--src/lib/ecore/efl_accelerate_interpolator.eo18
-rw-r--r--src/lib/ecore/efl_boolean_model.c16
-rw-r--r--src/lib/ecore/efl_boolean_model.eo6
-rw-r--r--src/lib/ecore/efl_bounce_interpolator.c40
-rw-r--r--src/lib/ecore/efl_bounce_interpolator.eo28
-rw-r--r--src/lib/ecore/efl_composite_model.c2
-rw-r--r--src/lib/ecore/efl_core_command_line.eo2
-rw-r--r--src/lib/ecore/efl_core_env.eo2
-rw-r--r--src/lib/ecore/efl_cubic_bezier_interpolator.c50
-rw-r--r--src/lib/ecore/efl_cubic_bezier_interpolator.eo30
-rw-r--r--src/lib/ecore/efl_decelerate_interpolator.c16
-rw-r--r--src/lib/ecore/efl_decelerate_interpolator.eo18
-rw-r--r--src/lib/ecore/efl_divisor_interpolator.c39
-rw-r--r--src/lib/ecore/efl_divisor_interpolator.eo20
-rw-r--r--src/lib/ecore/efl_exe.c17
-rw-r--r--src/lib/ecore/efl_filter_model.c24
-rw-r--r--src/lib/ecore/efl_linear_interpolator.eo7
-rw-r--r--src/lib/ecore/efl_loop.c22
-rw-r--r--src/lib/ecore/efl_loop_message_handler.c12
-rw-r--r--src/lib/ecore/efl_loop_timer.eo4
-rw-r--r--src/lib/ecore/efl_sinusoidal_interpolator.c16
-rw-r--r--src/lib/ecore/efl_sinusoidal_interpolator.eo17
-rw-r--r--src/lib/ecore/efl_spring_interpolator.c44
-rw-r--r--src/lib/ecore/efl_spring_interpolator.eo28
-rw-r--r--src/lib/ecore/meson.build6
39 files changed, 400 insertions, 434 deletions
diff --git a/src/lib/ecore/Ecore.h b/src/lib/ecore/Ecore.h
index cfc6dd7..7818faf 100644
--- a/src/lib/ecore/Ecore.h
+++ b/src/lib/ecore/Ecore.h
@@ -315,9 +315,7 @@
315# include <sys/siginfo.h> 315# include <sys/siginfo.h>
316#else 316#else
317# include <sys/time.h> 317# include <sys/time.h>
318# if !defined (EXOTIC_NO_SIGNAL) 318# include <signal.h>
319# include <signal.h>
320# endif
321#endif 319#endif
322 320
323#include <sys/types.h> 321#include <sys/types.h>
diff --git a/src/lib/ecore/Ecore_Common.h b/src/lib/ecore/Ecore_Common.h
index 8f1a99b..443a058 100644
--- a/src/lib/ecore/Ecore_Common.h
+++ b/src/lib/ecore/Ecore_Common.h
@@ -611,7 +611,7 @@ struct _Ecore_Event_Signal_User
611 int number; /**< The signal number. Either 1 or 2 */ 611 int number; /**< The signal number. Either 1 or 2 */
612 void *ext_data; /**< Extension data - not used */ 612 void *ext_data; /**< Extension data - not used */
613 613
614#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 614#if !defined (_WIN32) && !defined (__lv2ppu__)
615 siginfo_t data; /**< Signal info */ 615 siginfo_t data; /**< Signal info */
616#endif 616#endif
617}; 617};
@@ -624,7 +624,7 @@ struct _Ecore_Event_Signal_Hup
624{ 624{
625 void *ext_data; /**< Extension data - not used */ 625 void *ext_data; /**< Extension data - not used */
626 626
627#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 627#if !defined (_WIN32) && !defined (__lv2ppu__)
628 siginfo_t data; /**< Signal info */ 628 siginfo_t data; /**< Signal info */
629#endif 629#endif
630}; 630};
@@ -640,7 +640,7 @@ struct _Ecore_Event_Signal_Exit
640 Eina_Bool terminate : 1; /**< Set if the exit request was a terminate signal */ 640 Eina_Bool terminate : 1; /**< Set if the exit request was a terminate signal */
641 void *ext_data; /**< Extension data - not used */ 641 void *ext_data; /**< Extension data - not used */
642 642
643#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 643#if !defined (_WIN32) && !defined (__lv2ppu__)
644 siginfo_t data; /**< Signal info */ 644 siginfo_t data; /**< Signal info */
645#endif 645#endif
646}; 646};
@@ -653,7 +653,7 @@ struct _Ecore_Event_Signal_Power
653{ 653{
654 void *ext_data; /**< Extension data - not used */ 654 void *ext_data; /**< Extension data - not used */
655 655
656#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 656#if !defined (_WIN32) && !defined (__lv2ppu__)
657 siginfo_t data; /**< Signal info */ 657 siginfo_t data; /**< Signal info */
658#endif 658#endif
659}; 659};
@@ -666,7 +666,7 @@ struct _Ecore_Event_Signal_Realtime
666{ 666{
667 int num; /**< The realtime signal's number */ 667 int num; /**< The realtime signal's number */
668 668
669#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 669#if !defined (_WIN32) && !defined (__lv2ppu__)
670 siginfo_t data; /**< Signal info */ 670 siginfo_t data; /**< Signal info */
671#endif 671#endif
672}; 672};
@@ -1071,7 +1071,7 @@ struct _Ecore_Exe_Event_Del
1071 Eina_Bool exited : 1; /**< Set to 1 if the process exited of its own accord */ 1071 Eina_Bool exited : 1; /**< Set to 1 if the process exited of its own accord */
1072 Eina_Bool signalled : 1; /**< Set to 1 if the process exited due to uncaught signal */ 1072 Eina_Bool signalled : 1; /**< Set to 1 if the process exited due to uncaught signal */
1073 void *ext_data; /**< Extension data - not used */ 1073 void *ext_data; /**< Extension data - not used */
1074#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL) 1074#if !defined (_WIN32) && !defined (__lv2ppu__)
1075 siginfo_t data; /**< Signal info */ 1075 siginfo_t data; /**< Signal info */
1076#endif 1076#endif
1077}; 1077};
diff --git a/src/lib/ecore/Efl_Core.h b/src/lib/ecore/Efl_Core.h
index c735b33..0178299 100644
--- a/src/lib/ecore/Efl_Core.h
+++ b/src/lib/ecore/Efl_Core.h
@@ -45,9 +45,7 @@
45# include <sys/siginfo.h> 45# include <sys/siginfo.h>
46#else 46#else
47# include <sys/time.h> 47# include <sys/time.h>
48# if !defined (EXOTIC_NO_SIGNAL) 48# include <signal.h>
49# include <signal.h>
50# endif
51#endif 49#endif
52 50
53#include <sys/types.h> 51#include <sys/types.h>
diff --git a/src/lib/ecore/ecore.c b/src/lib/ecore/ecore.c
index b2ca8aa..3110c5e 100644
--- a/src/lib/ecore/ecore.c
+++ b/src/lib/ecore/ecore.c
@@ -275,9 +275,7 @@ ecore_init(void)
275 if (!_ecore_event_init()) goto shutdown_event; 275 if (!_ecore_event_init()) goto shutdown_event;
276 276
277 _ecore_signal_init(); 277 _ecore_signal_init();
278#ifndef HAVE_EXOTIC
279 _ecore_exe_init(); 278 _ecore_exe_init();
280#endif
281 _ecore_thread_init(); 279 _ecore_thread_init();
282 _ecore_job_init(); 280 _ecore_job_init();
283 _ecore_time_init(); 281 _ecore_time_init();
@@ -434,9 +432,7 @@ ecore_shutdown(void)
434 eina_lock_free(&_thread_feedback_mutex); 432 eina_lock_free(&_thread_feedback_mutex);
435 eina_lock_free(&_thread_id_lock); 433 eina_lock_free(&_thread_id_lock);
436 434
437#ifndef HAVE_EXOTIC
438 _ecore_exe_shutdown(); 435 _ecore_exe_shutdown();
439#endif
440 _ecore_event_shutdown(); 436 _ecore_event_shutdown();
441 _ecore_main_shutdown(); 437 _ecore_main_shutdown();
442 _ecore_signal_shutdown(); 438 _ecore_signal_shutdown();
diff --git a/src/lib/ecore/ecore_app.c b/src/lib/ecore/ecore_app.c
index a3d5deb..605f046 100644
--- a/src/lib/ecore/ecore_app.c
+++ b/src/lib/ecore/ecore_app.c
@@ -17,8 +17,10 @@ ecore_app_args_set(int argc,
17{ 17{
18 EINA_MAIN_LOOP_CHECK_RETURN; 18 EINA_MAIN_LOOP_CHECK_RETURN;
19 19
20 if ((argc < 1) || 20 if ((argc < 1) || (!argv))
21 (!argv)) return; 21 {
22 if (argc || argv) return;
23 }
22 app_argc = argc; 24 app_argc = argc;
23 app_argv = (char **)argv; 25 app_argv = (char **)argv;
24} 26}
diff --git a/src/lib/ecore/ecore_events.c b/src/lib/ecore/ecore_events.c
index 76de86b..b0a6607 100644
--- a/src/lib/ecore/ecore_events.c
+++ b/src/lib/ecore/ecore_events.c
@@ -7,21 +7,6 @@
7#include "Ecore.h" 7#include "Ecore.h"
8#include "ecore_private.h" 8#include "ecore_private.h"
9 9
10typedef struct _Ecore_Future_Schedule_Entry
11{
12 Eina_Future_Schedule_Entry base;
13 Eina_Future_Scheduler_Cb cb;
14 Eina_Future *future;
15 Eina_Value value;
16} Ecore_Future_Schedule_Entry;
17
18//////
19// XXX: still using legacy ecore events
20static Eina_Bool shutting_down = EINA_FALSE;
21static Eina_Mempool *mp_future_schedule_entry = NULL;
22//
23//////
24
25static Ecore_Event_Message_Handler *_event_msg_handler = NULL; 10static Ecore_Event_Message_Handler *_event_msg_handler = NULL;
26 11
27EAPI Ecore_Event_Handler * 12EAPI Ecore_Event_Handler *
@@ -126,106 +111,6 @@ ecore_event_current_event_get(void)
126 return ecore_event_message_handler_current_event_get(_event_msg_handler); 111 return ecore_event_message_handler_current_event_get(_event_msg_handler);
127} 112}
128 113
129static void _future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED);
130static void _event_del_cb(void *data, const Efl_Event *ev);
131
132EFL_CALLBACKS_ARRAY_DEFINE(ecore_future_callbacks,
133 { EFL_LOOP_EVENT_IDLE_ENTER, _future_dispatch_cb },
134 { EFL_LOOP_EVENT_IDLE, _future_dispatch_cb },
135 { EFL_EVENT_DEL, _event_del_cb });
136
137static void
138_future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED)
139{
140 Efl_Loop_Future_Scheduler *loopsched = data;
141 Eina_List *entries = loopsched->future_entries;
142 Ecore_Future_Schedule_Entry *entry;
143
144 loopsched->future_entries = NULL;
145 efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched);
146
147 EINA_LIST_FREE(entries, entry)
148 {
149 entry->cb(entry->future, entry->value);
150 eina_mempool_free(mp_future_schedule_entry, entry);
151 }
152}
153
154static void
155_event_del_cb(void *data, const Efl_Event *ev EINA_UNUSED)
156{
157 Efl_Loop_Future_Scheduler *loopsched = data;
158 Eina_List *entries = loopsched->future_entries;
159 Ecore_Future_Schedule_Entry *entry;
160
161 loopsched->future_entries = NULL;
162 efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched);
163
164 EINA_LIST_FREE(entries, entry)
165 {
166 eina_future_cancel(entry->future);
167 eina_value_flush(&entry->value);
168 eina_mempool_free(mp_future_schedule_entry, entry);
169 }
170}
171
172static Eina_Future_Schedule_Entry *
173ecore_future_schedule(Eina_Future_Scheduler *sched,
174 Eina_Future_Scheduler_Cb cb,
175 Eina_Future *future,
176 Eina_Value value)
177{
178 Efl_Loop_Future_Scheduler *loopsched = (Efl_Loop_Future_Scheduler *)sched;
179 Ecore_Future_Schedule_Entry *entry;
180
181 entry = eina_mempool_malloc(mp_future_schedule_entry, sizeof(*entry));
182 EINA_SAFETY_ON_NULL_RETURN_VAL(entry, NULL);
183 entry->base.scheduler = sched;
184 entry->cb = cb;
185 entry->future = future;
186 entry->value = value;
187
188 if (!loopsched->future_entries)
189 efl_event_callback_array_add((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched);
190
191 loopsched->future_entries = eina_list_append(loopsched->future_entries, entry);
192 return &entry->base;
193}
194
195static void
196ecore_future_recall(Eina_Future_Schedule_Entry *s_entry)
197{
198 Ecore_Future_Schedule_Entry *entry = (Ecore_Future_Schedule_Entry *)s_entry;
199 Efl_Loop_Future_Scheduler *loopsched;
200 Eina_List *lookup;
201
202 if (shutting_down) return;
203
204 loopsched = (Efl_Loop_Future_Scheduler *) entry->base.scheduler;
205
206 lookup = eina_list_data_find_list(loopsched->future_entries, entry);
207 if (!lookup) return;
208
209 loopsched->future_entries = eina_list_remove_list(loopsched->future_entries, lookup);
210 if (!loopsched->future_entries)
211 efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched);
212
213 eina_value_flush(&entry->value);
214 eina_mempool_free(mp_future_schedule_entry, entry);
215
216}
217
218static Eina_Future_Scheduler ecore_future_scheduler = {
219 .schedule = ecore_future_schedule,
220 .recall = ecore_future_recall,
221};
222
223Eina_Future_Scheduler *
224_ecore_event_future_scheduler_get(void)
225{
226 return &ecore_future_scheduler;
227}
228
229Eina_Bool 114Eina_Bool
230_ecore_event_init(void) 115_ecore_event_init(void)
231{ 116{
@@ -267,47 +152,12 @@ _ecore_event_init(void)
267 // ECORE_EVENT_COUNT 11 152 // ECORE_EVENT_COUNT 11
268 // no need to do as it was a count, nto an event 153 // no need to do as it was a count, nto an event
269 154
270 //////
271 // XXX: ecore future still using legacy...
272 shutting_down = EINA_FALSE;
273// ECORE_EV_FUTURE_ID = ecore_event_type_new();
274// future_handler = ecore_event_handler_add(ECORE_EV_FUTURE_ID, ecore_future_dispatched, NULL);
275// EINA_SAFETY_ON_NULL_GOTO(future_handler, err_handler);
276 //FIXME: Is 512 too high?
277 if (!mp_future_schedule_entry)
278 {
279 mp_future_schedule_entry = eina_mempool_add
280 (choice, "Ecore_Future_Event", NULL,
281 sizeof(Ecore_Future_Schedule_Entry), 512);
282 EINA_SAFETY_ON_NULL_GOTO(mp_future_schedule_entry, err_pool);
283 }
284 //
285 //////
286
287 return EINA_TRUE; 155 return EINA_TRUE;
288
289 err_pool:
290// XXX:
291// ecore_event_handler_del(future_handler);
292// future_handler = NULL;
293// err_handler:
294// ECORE_EV_FUTURE_ID = -1;
295 return EINA_FALSE;
296} 156}
297 157
298void 158void
299_ecore_event_shutdown(void) 159_ecore_event_shutdown(void)
300{ 160{
301 shutting_down = EINA_TRUE;
302
303 //////
304 // XXX: ecore future still using legacy...
305// ecore_event_handler_del(future_handler);
306// future_handler = NULL;
307// ECORE_EV_FUTURE_ID = -1;
308 //
309 //////
310
311 efl_loop_message_handler_message_clear(_event_msg_handler); 161 efl_loop_message_handler_message_clear(_event_msg_handler);
312 _event_msg_handler = NULL; 162 _event_msg_handler = NULL;
313} 163}
diff --git a/src/lib/ecore/ecore_exe_posix.c b/src/lib/ecore/ecore_exe_posix.c
index 6a0cc3b..07f1058 100644
--- a/src/lib/ecore/ecore_exe_posix.c
+++ b/src/lib/ecore/ecore_exe_posix.c
@@ -16,6 +16,8 @@
16 16
17#ifdef HAVE_PRCTL 17#ifdef HAVE_PRCTL
18# include <sys/prctl.h> 18# include <sys/prctl.h>
19#elif defined(HAVE_PROCCTL)
20# include <sys/procctl.h>
19#endif 21#endif
20 22
21#ifdef HAVE_SYS_WAIT_H 23#ifdef HAVE_SYS_WAIT_H
@@ -364,23 +366,14 @@ _impl_ecore_exe_efl_object_finalize(Eo *obj, Ecore_Exe_Data *exe)
364 E_NO_ERRNO(result, close(statusPipe[0]), ok); 366 E_NO_ERRNO(result, close(statusPipe[0]), ok);
365 E_IF_NO_ERRNO(result, eina_file_close_on_exec(statusPipe[1], EINA_TRUE), ok) /* close on exec shows success */ 367 E_IF_NO_ERRNO(result, eina_file_close_on_exec(statusPipe[1], EINA_TRUE), ok) /* close on exec shows success */
366 { 368 {
369 int except[2] = { 0, -1 };
370
371 except[0] = statusPipe[1];
372 eina_file_close_from(3, except);
367 /* Run the actual command. */ 373 /* Run the actual command. */
368 _ecore_exe_exec_it(exe_cmd, flags); /* no return */ 374 _ecore_exe_exec_it(exe_cmd, flags); /* no return */
369 } 375 }
370 } 376 }
371
372 /* Something went 'orribly wrong. */
373 vfork_exec_errno = errno;
374
375 /* Close the pipes. */
376 if (flags & ECORE_EXE_PIPE_ERROR)
377 E_NO_ERRNO(result, close(errorPipe[1]), ok);
378 if (flags & ECORE_EXE_PIPE_READ)
379 E_NO_ERRNO(result, close(readPipe[1]), ok);
380 if (flags & ECORE_EXE_PIPE_WRITE)
381 E_NO_ERRNO(result, close(writePipe[0]), ok);
382 E_NO_ERRNO(result, close(statusPipe[1]), ok);
383
384 _exit(-1); 377 _exit(-1);
385 } 378 }
386 else /* parent */ 379 else /* parent */
@@ -1009,6 +1002,12 @@ _ecore_exe_exec_it(const char *exe_cmd,
1009 { 1002 {
1010 prctl(PR_SET_PDEATHSIG, SIGTERM); 1003 prctl(PR_SET_PDEATHSIG, SIGTERM);
1011 } 1004 }
1005#elif defined(HAVE_PROCCTL)
1006 if ((flags & ECORE_EXE_TERM_WITH_PARENT))
1007 {
1008 int sig = SIGTERM;
1009 procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig);
1010 }
1012#endif 1011#endif
1013 1012
1014 if (!(flags & ECORE_EXE_NOT_LEADER)) setsid(); 1013 if (!(flags & ECORE_EXE_NOT_LEADER)) setsid();
diff --git a/src/lib/ecore/ecore_exe_ps3.c b/src/lib/ecore/ecore_exe_ps3.c
deleted file mode 100644
index 1ef1e81..0000000
--- a/src/lib/ecore/ecore_exe_ps3.c
+++ /dev/null
@@ -1,20 +0,0 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef HAVE_ESCAPE
6# include <Escape.h>
7#endif
8
9#include "Ecore.h"
10#include "ecore_private.h"
11
12void
13_ecore_exe_init(void)
14{
15}
16
17void
18_ecore_exe_shutdown(void)
19{
20}
diff --git a/src/lib/ecore/ecore_getopt.c b/src/lib/ecore/ecore_getopt.c
index f81df25..8dc1981 100644
--- a/src/lib/ecore/ecore_getopt.c
+++ b/src/lib/ecore/ecore_getopt.c
@@ -26,10 +26,6 @@
26 26
27#define _(x) dgettext("ecore", x) 27#define _(x) dgettext("ecore", x)
28 28
29#ifdef HAVE_EXOTIC
30# include <Exotic.h>
31#endif
32
33#include "Ecore.h" 29#include "Ecore.h"
34#include "Ecore_Getopt.h" 30#include "Ecore_Getopt.h"
35 31
diff --git a/src/lib/ecore/ecore_pipe.c b/src/lib/ecore/ecore_pipe.c
index d352853..4023bfa 100644
--- a/src/lib/ecore/ecore_pipe.c
+++ b/src/lib/ecore/ecore_pipe.c
@@ -26,14 +26,6 @@
26# endif 26# endif
27#endif 27#endif
28 28
29#ifdef HAVE_ESCAPE
30# include <Escape.h>
31#endif
32
33#ifdef HAVE_EXOTIC
34# include <Exotic.h>
35#endif
36
37/* 29/*
38 * On Windows, pipe() is implemented with sockets. 30 * On Windows, pipe() is implemented with sockets.
39 * Contrary to Linux, Windows uses different functions 31 * Contrary to Linux, Windows uses different functions
diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h
index de3b47b..e60c191 100644
--- a/src/lib/ecore/ecore_private.h
+++ b/src/lib/ecore/ecore_private.h
@@ -88,7 +88,6 @@ typedef struct _Ecore_Factorized_Idle Ecore_Factorized_Idle;
88typedef struct _Efl_Loop_Promise_Simple_Data Efl_Loop_Promise_Simple_Data; 88typedef struct _Efl_Loop_Promise_Simple_Data Efl_Loop_Promise_Simple_Data;
89 89
90typedef struct _Efl_Loop_Timer_Data Efl_Loop_Timer_Data; 90typedef struct _Efl_Loop_Timer_Data Efl_Loop_Timer_Data;
91typedef struct _Efl_Loop_Future_Scheduler Efl_Loop_Future_Scheduler;
92typedef struct _Efl_Loop_Data Efl_Loop_Data; 91typedef struct _Efl_Loop_Data Efl_Loop_Data;
93 92
94typedef struct _Efl_Task_Data Efl_Task_Data; 93typedef struct _Efl_Task_Data Efl_Task_Data;
@@ -104,21 +103,10 @@ struct _Message
104 Eina_Bool delete_me; 103 Eina_Bool delete_me;
105}; 104};
106 105
107struct _Efl_Loop_Future_Scheduler
108{
109 Eina_Future_Scheduler eina_future_scheduler;
110 const Eo *loop;
111 Efl_Loop_Data *loop_data;
112
113 Eina_List *future_entries;
114};
115
116struct _Efl_Loop_Data 106struct _Efl_Loop_Data
117{ 107{
118 double loop_time; 108 double loop_time;
119 109
120 Efl_Loop_Future_Scheduler future_scheduler;
121
122 Efl_Loop_Message_Handler *future_message_handler; 110 Efl_Loop_Message_Handler *future_message_handler;
123 111
124 Efl_Loop_Timer *poll_high; 112 Efl_Loop_Timer *poll_high;
@@ -147,6 +135,7 @@ struct _Efl_Loop_Data
147 Eina_List *thread_children; 135 Eina_List *thread_children;
148 136
149 Eina_Inlist *message_queue; 137 Eina_Inlist *message_queue;
138 Eina_Inlist *message_pending_queue;
150 unsigned int message_walking; 139 unsigned int message_walking;
151 140
152 unsigned int throttle; 141 unsigned int throttle;
@@ -314,8 +303,6 @@ void *_ecore_factorized_idle_del(Ecore_Idler *idler);
314void _ecore_factorized_idle_process(void *data, const Efl_Event *event); 303void _ecore_factorized_idle_process(void *data, const Efl_Event *event);
315void _ecore_factorized_idle_event_del(void *data, const Efl_Event *event); 304void _ecore_factorized_idle_event_del(void *data, const Efl_Event *event);
316 305
317Eina_Future_Scheduler *_ecore_event_future_scheduler_get(void);
318
319Eina_Bool _ecore_event_init(void); 306Eina_Bool _ecore_event_init(void);
320void _ecore_event_shutdown(void); 307void _ecore_event_shutdown(void);
321int _ecore_event_exist(void); 308int _ecore_event_exist(void);
@@ -369,7 +356,7 @@ _ecore_main_win32_handler_del(Eo *obj,
369void _ecore_main_content_clear(Eo *obj, Efl_Loop_Data *pd); 356void _ecore_main_content_clear(Eo *obj, Efl_Loop_Data *pd);
370void _ecore_main_shutdown(void); 357void _ecore_main_shutdown(void);
371 358
372#if defined (_WIN32) || defined (__lv2ppu__) || defined (HAVE_EXOTIC) 359#if defined (_WIN32) || defined (__lv2ppu__)
373static inline void _ecore_signal_shutdown(void) { } 360static inline void _ecore_signal_shutdown(void) { }
374 361
375static inline void _ecore_signal_init(void) { } 362static inline void _ecore_signal_init(void) { }
diff --git a/src/lib/ecore/ecore_time.c b/src/lib/ecore/ecore_time.c
index 31ffa71..f2afe0e 100644
--- a/src/lib/ecore/ecore_time.c
+++ b/src/lib/ecore/ecore_time.c
@@ -16,7 +16,7 @@
16#include "Ecore.h" 16#include "Ecore.h"
17#include "ecore_private.h" 17#include "ecore_private.h"
18 18
19#if defined (HAVE_CLOCK_GETTIME) || defined (EXOTIC_PROVIDE_CLOCK_GETTIME) 19#if defined (HAVE_CLOCK_GETTIME)
20static clockid_t _ecore_time_clock_id; 20static clockid_t _ecore_time_clock_id;
21static Eina_Bool _ecore_time_got_clock_id = EINA_FALSE; 21static Eina_Bool _ecore_time_got_clock_id = EINA_FALSE;
22#elif defined(__APPLE__) && defined(__MACH__) 22#elif defined(__APPLE__) && defined(__MACH__)
@@ -26,7 +26,7 @@ static double _ecore_time_clock_conversion = 1e-9;
26EAPI double 26EAPI double
27ecore_time_get(void) 27ecore_time_get(void)
28{ 28{
29#if defined (HAVE_CLOCK_GETTIME) || defined (EXOTIC_PROVIDE_CLOCK_GETTIME) 29#if defined (HAVE_CLOCK_GETTIME)
30 struct timespec t; 30 struct timespec t;
31 31
32 if (EINA_UNLIKELY(!_ecore_time_got_clock_id)) 32 if (EINA_UNLIKELY(!_ecore_time_got_clock_id))
@@ -82,7 +82,7 @@ ecore_loop_time_set(double t)
82void 82void
83_ecore_time_init(void) 83_ecore_time_init(void)
84{ 84{
85#if defined(HAVE_CLOCK_GETTIME) || defined(EXOTIC_PROVIDE_CLOCK_GETTIME) 85#if defined(HAVE_CLOCK_GETTIME)
86 struct timespec t; 86 struct timespec t;
87 87
88 if (_ecore_time_got_clock_id) return; 88 if (_ecore_time_got_clock_id) return;
diff --git a/src/lib/ecore/ecore_timer.c b/src/lib/ecore/ecore_timer.c
index 96b1a13..5713313 100644
--- a/src/lib/ecore/ecore_timer.c
+++ b/src/lib/ecore/ecore_timer.c
@@ -15,6 +15,17 @@
15 15
16#define ECORE_TIMER_CHECK(obj) if (!efl_isa((obj), MY_CLASS)) return 16#define ECORE_TIMER_CHECK(obj) if (!efl_isa((obj), MY_CLASS)) return
17 17
18#define EFL_LOOP_TIMER_DATA_GET(o, td) \
19 Efl_Loop_Timer_Data *td = efl_data_scope_safe_get(o, EFL_LOOP_TIMER_CLASS)
20
21#define EFL_LOOP_TIMER_DATA_GET_OR_RETURN(o, ptr, ...) \
22 EFL_LOOP_TIMER_DATA_GET(o, ptr); \
23 if (EINA_UNLIKELY(!ptr)) \
24 { \
25 ERR("No data for timer %p", o); \
26 return __VA_ARGS__; \
27 }
28
18struct _Ecore_Timer_Legacy 29struct _Ecore_Timer_Legacy
19{ 30{
20 Ecore_Task_Cb func; 31 Ecore_Task_Cb func;
@@ -24,7 +35,7 @@ struct _Ecore_Timer_Legacy
24 Eina_Bool inside_call : 1; 35 Eina_Bool inside_call : 1;
25 Eina_Bool delete_me : 1; 36 Eina_Bool delete_me : 1;
26}; 37};
27 38typedef struct _Ecore_Timer_Legacy Ecore_Timer_Legacy;
28struct _Efl_Loop_Timer_Data 39struct _Efl_Loop_Timer_Data
29{ 40{
30 EINA_INLIST; 41 EINA_INLIST;
@@ -32,6 +43,7 @@ struct _Efl_Loop_Timer_Data
32 Eo *object; 43 Eo *object;
33 Eo *loop; 44 Eo *loop;
34 Efl_Loop_Data *loop_data; 45 Efl_Loop_Data *loop_data;
46 Ecore_Timer_Legacy *legacy;
35 47
36 double in; 48 double in;
37 double at; 49 double at;
@@ -47,8 +59,6 @@ struct _Efl_Loop_Timer_Data
47 Eina_Bool finalized : 1; 59 Eina_Bool finalized : 1;
48}; 60};
49 61
50typedef struct _Ecore_Timer_Legacy Ecore_Timer_Legacy;
51
52static void _efl_loop_timer_util_delay(Efl_Loop_Timer_Data *timer, double add); 62static void _efl_loop_timer_util_delay(Efl_Loop_Timer_Data *timer, double add);
53static void _efl_loop_timer_util_instanciate(Efl_Loop_Data *loop, Efl_Loop_Timer_Data *timer); 63static void _efl_loop_timer_util_instanciate(Efl_Loop_Data *loop, Efl_Loop_Timer_Data *timer);
54static void _efl_loop_timer_set(Efl_Loop_Timer_Data *timer, double at, double in); 64static void _efl_loop_timer_set(Efl_Loop_Timer_Data *timer, double at, double in);
@@ -82,7 +92,8 @@ _check_timer_event_catcher_add(void *data, const Efl_Event *event)
82 if (array[i].desc == EFL_LOOP_TIMER_EVENT_TIMER_TICK) 92 if (array[i].desc == EFL_LOOP_TIMER_EVENT_TIMER_TICK)
83 { 93 {
84 if (timer->listening++ > 0) return; 94 if (timer->listening++ > 0) return;
85 _efl_loop_timer_util_instanciate(timer->loop_data, timer); 95 if (timer->finalized)
96 _efl_loop_timer_util_instanciate(timer->loop_data, timer);
86 // No need to walk more than once per array as you can not del 97 // No need to walk more than once per array as you can not del
87 // a partial array 98 // a partial array
88 return; 99 return;
@@ -155,12 +166,19 @@ static void
155_ecore_timer_legacy_tick(void *data, const Efl_Event *event) 166_ecore_timer_legacy_tick(void *data, const Efl_Event *event)
156{ 167{
157 Ecore_Timer_Legacy *legacy = data; 168 Ecore_Timer_Legacy *legacy = data;
169 Eina_Bool inside_call = legacy->inside_call;
158 170
159 legacy->inside_call = 1; 171 legacy->inside_call = 1;
160 if (!_ecore_call_task_cb(legacy->func, (void *)legacy->data) || 172 if (!_ecore_call_task_cb(legacy->func, (void *)legacy->data) || legacy->delete_me)
161 legacy->delete_me) 173 {
162 efl_del(event->object); 174 legacy->delete_me = EINA_TRUE;
163 else legacy->inside_call = 0; 175 /* cannot destroy timer if recursing */
176 if (!inside_call)
177 efl_del(event->object);
178 }
179 /* only unset flag if not currently recursing */
180 else if (!inside_call)
181 legacy->inside_call = 0;
164} 182}
165 183
166EFL_CALLBACKS_ARRAY_DEFINE(legacy_timer, 184EFL_CALLBACKS_ARRAY_DEFINE(legacy_timer,
@@ -185,8 +203,9 @@ ecore_timer_add(double in, Ecore_Task_Cb func, const void *data)
185 legacy->data = data; 203 legacy->data = data;
186 timer = efl_add(MY_CLASS, efl_main_loop_get(), 204 timer = efl_add(MY_CLASS, efl_main_loop_get(),
187 efl_event_callback_array_add(efl_added, legacy_timer(), legacy), 205 efl_event_callback_array_add(efl_added, legacy_timer(), legacy),
188 efl_key_data_set(efl_added, "_legacy", legacy),
189 efl_loop_timer_interval_set(efl_added, in)); 206 efl_loop_timer_interval_set(efl_added, in));
207 EFL_LOOP_TIMER_DATA_GET_OR_RETURN(timer, td, NULL);
208 td->legacy = legacy;
190 return timer; 209 return timer;
191} 210}
192 211
@@ -208,24 +227,24 @@ ecore_timer_loop_add(double in, Ecore_Task_Cb func, const void *data)
208 legacy->data = data; 227 legacy->data = data;
209 timer = efl_add(MY_CLASS, efl_main_loop_get(), 228 timer = efl_add(MY_CLASS, efl_main_loop_get(),
210 efl_event_callback_array_add(efl_added, legacy_timer(), legacy), 229 efl_event_callback_array_add(efl_added, legacy_timer(), legacy),
211 efl_key_data_set(efl_added, "_legacy", legacy),
212 efl_loop_timer_loop_reset(efl_added), 230 efl_loop_timer_loop_reset(efl_added),
213 efl_loop_timer_interval_set(efl_added, in)); 231 efl_loop_timer_interval_set(efl_added, in));
232 EFL_LOOP_TIMER_DATA_GET_OR_RETURN(timer, td, NULL);
233 td->legacy = legacy;
214 return timer; 234 return timer;
215} 235}
216 236
217EAPI void * 237EAPI void *
218ecore_timer_del(Ecore_Timer *timer) 238ecore_timer_del(Ecore_Timer *timer)
219{ 239{
220 Ecore_Timer_Legacy *legacy;
221 void *data; 240 void *data;
222 241
223 if (!timer) return NULL; 242 if (!timer) return NULL;
224 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); 243 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
225 244
226 legacy = efl_key_data_get(timer, "_legacy"); 245 EFL_LOOP_TIMER_DATA_GET(timer, td);
227 // If legacy == NULL, this means double free or something 246 // If legacy == NULL, this means double free or something
228 if (legacy == NULL) 247 if ((!td) || (!td->legacy))
229 { 248 {
230 // Just in case it is an Eo timer, but not a legacy one. 249 // Just in case it is an Eo timer, but not a legacy one.
231 ERR("You are trying to destroy a timer which seems dead already."); 250 ERR("You are trying to destroy a timer which seems dead already.");
@@ -233,8 +252,8 @@ ecore_timer_del(Ecore_Timer *timer)
233 return NULL; 252 return NULL;
234 } 253 }
235 254
236 data = (void *)legacy->data; 255 data = (void *)td->legacy->data;
237 if (legacy->inside_call) legacy->delete_me = EINA_TRUE; 256 if (td->legacy->inside_call) td->legacy->delete_me = EINA_TRUE;
238 else efl_del(timer); 257 else efl_del(timer);
239 return data; 258 return data;
240} 259}
@@ -471,8 +490,12 @@ _efl_loop_timer_efl_object_parent_set(Eo *obj, Efl_Loop_Timer_Data *pd, Efl_Obje
471 // Remove the timer from all possible pending list 490 // Remove the timer from all possible pending list
472 first = eina_inlist_first(EINA_INLIST_GET(pd)); 491 first = eina_inlist_first(EINA_INLIST_GET(pd));
473 if (first == pd->loop_data->timers) 492 if (first == pd->loop_data->timers)
474 pd->loop_data->timers = eina_inlist_remove 493 {
475 (pd->loop_data->timers, EINA_INLIST_GET(pd)); 494 /* if this timer is currently being processed, update the pointer here so it is not lost */
495 if (pd == pd->loop_data->timer_current)
496 pd->loop_data->timer_current = (Efl_Loop_Timer_Data*)EINA_INLIST_GET(pd)->next;
497 pd->loop_data->timers = eina_inlist_remove(pd->loop_data->timers, EINA_INLIST_GET(pd));
498 }
476 else if (first == pd->loop_data->suspended) 499 else if (first == pd->loop_data->suspended)
477 pd->loop_data->suspended = eina_inlist_remove 500 pd->loop_data->suspended = eina_inlist_remove
478 (pd->loop_data->suspended, EINA_INLIST_GET(pd)); 501 (pd->loop_data->suspended, EINA_INLIST_GET(pd));
@@ -565,7 +588,8 @@ _efl_loop_timer_next_get(Eo *obj, Efl_Loop_Data *pd)
565static inline void 588static inline void
566_efl_loop_timer_reschedule(Efl_Loop_Timer_Data *timer, double when) 589_efl_loop_timer_reschedule(Efl_Loop_Timer_Data *timer, double when)
567{ 590{
568 if (timer->frozen || efl_invalidated_get(timer->object)) return; 591 if (timer->frozen || efl_invalidated_get(timer->object) ||
592 (timer->legacy && timer->legacy->delete_me)) return;
569 593
570 if (timer->loop_data && 594 if (timer->loop_data &&
571 (EINA_INLIST_GET(timer)->next || EINA_INLIST_GET(timer)->prev)) 595 (EINA_INLIST_GET(timer)->next || EINA_INLIST_GET(timer)->prev))
@@ -641,14 +665,24 @@ _efl_loop_timer_expired_call(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd, double when
641 665
642 efl_ref(timer->object); 666 efl_ref(timer->object);
643 eina_evlog("+timer", timer, 0.0, NULL); 667 eina_evlog("+timer", timer, 0.0, NULL);
668 /* this can remove timer from its inlist in the legacy codepath */
644 efl_event_callback_call(timer->object, EFL_LOOP_TIMER_EVENT_TIMER_TICK, NULL); 669 efl_event_callback_call(timer->object, EFL_LOOP_TIMER_EVENT_TIMER_TICK, NULL);
645 eina_evlog("-timer", timer, 0.0, NULL); 670 eina_evlog("-timer", timer, 0.0, NULL);
646 671
647 // may have changed in recursive main loops 672 // may have changed in recursive main loops
648 // this current timer can not die yet as we hold a reference on it 673 // this current timer can not die yet as we hold a reference on it
674 /* this is tricky: the current timer cannot be deleted, but it CAN be removed from its inlist,
675 * thus breaking timer processing
676 */
649 if (pd->timer_current) 677 if (pd->timer_current)
650 pd->timer_current = (Efl_Loop_Timer_Data *) 678 {
651 EINA_INLIST_GET(pd->timer_current)->next; 679 if (pd->timer_current == timer)
680 pd->timer_current = (Efl_Loop_Timer_Data *)EINA_INLIST_GET(pd->timer_current)->next;
681 /* assume this has otherwise been modified either due to recursive mainloop processing or
682 * the timer being removed from its inlist and carefully updating pd->timer_current in the
683 * process as only the most elite of engineers would think to do
684 */
685 }
652 _efl_loop_timer_reschedule(timer, when); 686 _efl_loop_timer_reschedule(timer, when);
653 efl_unref(timer->object); 687 efl_unref(timer->object);
654 } 688 }
diff --git a/src/lib/ecore/efl_accelerate_interpolator.c b/src/lib/ecore/efl_accelerate_interpolator.c
index 917c032..b2e1032 100644
--- a/src/lib/ecore/efl_accelerate_interpolator.c
+++ b/src/lib/ecore/efl_accelerate_interpolator.c
@@ -11,7 +11,7 @@ typedef struct _Efl_Accelerate_Interpolator_Data Efl_Accelerate_Interpolator_Dat
11 11
12struct _Efl_Accelerate_Interpolator_Data 12struct _Efl_Accelerate_Interpolator_Data
13{ 13{
14 double factor; 14 double slope;
15}; 15};
16 16
17EOLIAN static double 17EOLIAN static double
@@ -23,22 +23,22 @@ _efl_accelerate_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUSED
23 return progress; 23 return progress;
24 24
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_ACCELERATE_FACTOR, 25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_ACCELERATE_FACTOR,
26 pd->factor, 0); 26 pd->slope, 0);
27} 27}
28 28
29EOLIAN static void 29EOLIAN static void
30_efl_accelerate_interpolator_factor_set(Eo *eo_obj EINA_UNUSED, 30_efl_accelerate_interpolator_slope_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Accelerate_Interpolator_Data *pd, 31 Efl_Accelerate_Interpolator_Data *pd,
32 double factor) 32 double slope)
33{ 33{
34 pd->factor = factor; 34 pd->slope = slope;
35} 35}
36 36
37EOLIAN static double 37EOLIAN static double
38_efl_accelerate_interpolator_factor_get(const Eo *eo_obj EINA_UNUSED, 38_efl_accelerate_interpolator_slope_get(const Eo *eo_obj EINA_UNUSED,
39 Efl_Accelerate_Interpolator_Data *pd EINA_UNUSED) 39 Efl_Accelerate_Interpolator_Data *pd EINA_UNUSED)
40{ 40{
41 return pd->factor; 41 return pd->slope;
42} 42}
43 43
44EOLIAN static Efl_Object * 44EOLIAN static Efl_Object *
@@ -47,7 +47,7 @@ _efl_accelerate_interpolator_efl_object_constructor(Eo *eo_obj,
47{ 47{
48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
49 49
50 pd->factor = 1.0; 50 pd->slope = 1.0;
51 51
52 return eo_obj; 52 return eo_obj;
53} 53}
diff --git a/src/lib/ecore/efl_accelerate_interpolator.eo b/src/lib/ecore/efl_accelerate_interpolator.eo
index 9af3669..6245581 100644
--- a/src/lib/ecore/efl_accelerate_interpolator.eo
+++ b/src/lib/ecore/efl_accelerate_interpolator.eo
@@ -1,19 +1,25 @@
1class @beta Efl.Accelerate_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Accelerate_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl accelerate interpolator class 3 [[Accelerated interpolator. It starts slow and accelerates, stopping abruptly when
4 it reaches $[1.0].
4 5
5 output = 1 - sin(Pi / 2 + input * Pi / 2); 6 Internally it uses the first half of a sinus rise (from 0 to 0.5) and the steepness
7 can be customized.
8
9 @since 1.24
6 ]] 10 ]]
7 data: Efl_Accelerate_Interpolator_Data; 11 data: Efl_Accelerate_Interpolator_Data;
8 methods { 12 methods {
9 @property factor { 13 @property slope {
10 [[Factor property]] 14 [[Customize the acceleration effect.]]
11 set { 15 set {
12 } 16 }
13 get { 17 get {
14 } 18 }
15 values { 19 values {
16 factor: double; [[Factor of the interpolation function.]] 20 slope: double; [[How steep is the effect. $[0] performs a linear interpolation,
21 $[1] corresponds to a sinus function and higher numbers produce
22 an increasingly steep effect.]]
17 } 23 }
18 } 24 }
19 } 25 }
diff --git a/src/lib/ecore/efl_boolean_model.c b/src/lib/ecore/efl_boolean_model.c
index 3eaad88..9e61ce3 100644
--- a/src/lib/ecore/efl_boolean_model.c
+++ b/src/lib/ecore/efl_boolean_model.c
@@ -258,11 +258,11 @@ _child_removed(void *data, const Efl_Event *event)
258 Eina_Iterator *it; 258 Eina_Iterator *it;
259 Eina_Array updated; 259 Eina_Array updated;
260 260
261 if (!pd->parent) return; 261 if (!pd->values) return;
262 262
263 eina_array_step_set(&updated, sizeof (Eina_Array), 8); 263 eina_array_step_set(&updated, sizeof (Eina_Array), 8);
264 264
265 it = eina_hash_iterator_data_new(pd->parent->values); 265 it = eina_hash_iterator_data_new(pd->values);
266 EINA_ITERATOR_FOREACH(it, v) 266 EINA_ITERATOR_FOREACH(it, v)
267 { 267 {
268 Efl_Boolean_Model_Storage_Range *lookup; 268 Efl_Boolean_Model_Storage_Range *lookup;
@@ -276,14 +276,14 @@ _child_removed(void *data, const Efl_Event *event)
276 { 276 {
277 unsigned char lower_mask = (((unsigned char)1) << (ev->index & 0x7)) - 1; 277 unsigned char lower_mask = (((unsigned char)1) << (ev->index & 0x7)) - 1;
278 unsigned char upper_mask = (~(((unsigned char)1) << (ev->index & 0x7))) & (~lower_mask); 278 unsigned char upper_mask = (~(((unsigned char)1) << (ev->index & 0x7))) & (~lower_mask);
279 unsigned char offset = (ev->index - lookup->offset) >> 3; 279 uint16_t offset = (ev->index - lookup->offset) >> 3;
280 uint16_t byte_length = lookup->length >> 3; 280 uint16_t byte_length = lookup->length >> 3;
281 281
282 // Manually shift all the byte in the buffer 282 // Manually shift all the byte in the buffer
283 while (offset < byte_length) 283 while (offset < byte_length)
284 { 284 {
285 lookup->buffer[offset] = (lookup->buffer[offset] & upper_mask) | 285 lookup->buffer[offset] = ((lookup->buffer[offset] & upper_mask) >> 1) |
286 ((lookup->buffer[offset] & lower_mask) << 1); 286 (lookup->buffer[offset] & lower_mask);
287 if (offset + 1 < byte_length) 287 if (offset + 1 < byte_length)
288 lookup->buffer[offset] |= lookup->buffer[offset + 1] & 0x1; 288 lookup->buffer[offset] |= lookup->buffer[offset + 1] & 0x1;
289 289
@@ -406,8 +406,8 @@ struct _Eina_Iterator_Boolean
406 Efl_Boolean_Model_Storage_Range *sr; 406 Efl_Boolean_Model_Storage_Range *sr;
407 Eina_Iterator *infix; 407 Eina_Iterator *infix;
408 408
409 uint64_t index; 409 unsigned int index;
410 uint64_t total; 410 unsigned int total;
411 411
412 Eina_Bool request; 412 Eina_Bool request;
413}; 413};
@@ -423,7 +423,7 @@ _efl_boolean_model_iterator_storage_index_find(Eina_Iterator_Boolean *it)
423 423
424 while (offset < it->sr->length) 424 while (offset < it->sr->length)
425 { 425 {
426 uint64_t upidx; 426 unsigned int upidx;
427 427
428 upidx = offset >> 3; 428 upidx = offset >> 3;
429 429
diff --git a/src/lib/ecore/efl_boolean_model.eo b/src/lib/ecore/efl_boolean_model.eo
index 48eab60..8222e30 100644
--- a/src/lib/ecore/efl_boolean_model.eo
+++ b/src/lib/ecore/efl_boolean_model.eo
@@ -11,13 +11,13 @@ class @beta Efl.Boolean_Model extends Efl.Composite_Model
11 params { 11 params {
12 @in name: string; [[The name of the new boolean property.]] 12 @in name: string; [[The name of the new boolean property.]]
13 @in default_value: bool; [[Default value for new boolean property.]] 13 @in default_value: bool; [[Default value for new boolean property.]]
14 } 14 }
15 } 15 }
16 boolean_del { 16 boolean_del {
17 [[Deletes an existing named boolean property.]] 17 [[Deletes an existing named boolean property.]]
18 params { 18 params {
19 @in name: string; [[Name of the property to be deleted.]] 19 @in name: string; [[Name of the property to be deleted.]]
20 } 20 }
21 } 21 }
22 boolean_iterator_get { 22 boolean_iterator_get {
23 [[Gets an iterator that will quickly find all the indices with the requested value for a specific property.]] 23 [[Gets an iterator that will quickly find all the indices with the requested value for a specific property.]]
@@ -25,7 +25,7 @@ class @beta Efl.Boolean_Model extends Efl.Composite_Model
25 @in name: string; [[The name of the property to examine.]] 25 @in name: string; [[The name of the property to examine.]]
26 @in request: bool; [[The value to look for.]] 26 @in request: bool; [[The value to look for.]]
27 } 27 }
28 return: iterator<ptr(uint64)>; [[The iterator that is valid until any change is made on the model.]] 28 return: iterator<uint64> @move; [[The iterator that is valid until any change is made on the model.]]
29 } 29 }
30 } 30 }
31 implements { 31 implements {
diff --git a/src/lib/ecore/efl_bounce_interpolator.c b/src/lib/ecore/efl_bounce_interpolator.c
index 7565019..11703b8 100644
--- a/src/lib/ecore/efl_bounce_interpolator.c
+++ b/src/lib/ecore/efl_bounce_interpolator.c
@@ -11,7 +11,8 @@ typedef struct _Efl_Bounce_Interpolator_Data Efl_Bounce_Interpolator_Data;
11 11
12struct _Efl_Bounce_Interpolator_Data 12struct _Efl_Bounce_Interpolator_Data
13{ 13{
14 double factor[2]; 14 double rigidness;
15 int bounces;
15}; 16};
16 17
17EOLIAN static double 18EOLIAN static double
@@ -23,28 +24,37 @@ _efl_bounce_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUSED,
23 return progress; 24 return progress;
24 25
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_BOUNCE, 26 return ecore_animator_pos_map(progress, ECORE_POS_MAP_BOUNCE,
26 pd->factor[0], pd->factor[1]); 27 pd->rigidness, (double)pd->bounces);
27} 28}
28 29
29EOLIAN static void 30EOLIAN static void
30_efl_bounce_interpolator_factors_set(Eo *eo_obj EINA_UNUSED, 31_efl_bounce_interpolator_rigidness_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Bounce_Interpolator_Data *pd, 32 Efl_Bounce_Interpolator_Data *pd,
32 double factor1, double factor2) 33 double rigidness)
33{ 34{
34 pd->factor[0] = factor1; 35 pd->rigidness = rigidness;
35 pd->factor[1] = factor2; 36}
37
38EOLIAN static double
39_efl_bounce_interpolator_rigidness_get(const Eo *eo_obj EINA_UNUSED,
40 Efl_Bounce_Interpolator_Data *pd)
41{
42 return pd->rigidness;
36} 43}
37 44
38EOLIAN static void 45EOLIAN static void
39_efl_bounce_interpolator_factors_get(const Eo *eo_obj EINA_UNUSED, 46_efl_bounce_interpolator_bounces_set(Eo *eo_obj EINA_UNUSED,
40 Efl_Bounce_Interpolator_Data *pd, 47 Efl_Bounce_Interpolator_Data *pd,
41 double *factor1, double *factor2) 48 int bounces)
42{ 49{
43 if (factor1) 50 pd->bounces = bounces;
44 *factor1 = pd->factor[0]; 51}
45 52
46 if (factor2) 53EOLIAN static int
47 *factor2 = pd->factor[1]; 54_efl_bounce_interpolator_bounces_get(const Eo *eo_obj EINA_UNUSED,
55 Efl_Bounce_Interpolator_Data *pd)
56{
57 return pd->bounces;
48} 58}
49 59
50EOLIAN static Efl_Object * 60EOLIAN static Efl_Object *
@@ -53,8 +63,8 @@ _efl_bounce_interpolator_efl_object_constructor(Eo *eo_obj,
53{ 63{
54 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 64 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
55 65
56 pd->factor[0] = 1.0; 66 pd->rigidness = 1.0;
57 pd->factor[1] = 1.0; 67 pd->bounces = 1;
58 68
59 return eo_obj; 69 return eo_obj;
60} 70}
diff --git a/src/lib/ecore/efl_bounce_interpolator.eo b/src/lib/ecore/efl_bounce_interpolator.eo
index d6b1147..e35b60c 100644
--- a/src/lib/ecore/efl_bounce_interpolator.eo
+++ b/src/lib/ecore/efl_bounce_interpolator.eo
@@ -1,17 +1,33 @@
1class @beta Efl.Bounce_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Bounce_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl bounce interpolator class]] 3 [[Bouncing interpolator. The value quickly reaches $[1.0] and then bounces back
4 a number of times before stopping at $[1.0].
5
6 The number of bounces and how far it goes back on every bounce can be customized.
7
8 @since 1.24
9 ]]
4 data: Efl_Bounce_Interpolator_Data; 10 data: Efl_Bounce_Interpolator_Data;
5 methods { 11 methods {
6 @property factors { 12 @property bounces {
7 [[Factors property]] 13 [[Customize the number of bounces.]]
8 set { 14 set {
9 } 15 }
10 get { 16 get {
11 } 17 }
12 values { 18 values {
13 factor1: double; [[First factor of the interpolation function.]] 19 bounces: int; [[Number of bounces before stopping.]]
14 factor2: double; [[Second factor of the interpolation function.]] 20 }
21 }
22 @property rigidness {
23 [[Customize the rigidness.]]
24 set {
25 }
26 get {
27 }
28 values {
29 rigidness: double; [[How much energy is lost on every bounce.
30 Higher numbers result in smaller bounces (lesser bounciness).]]
15 } 31 }
16 } 32 }
17 } 33 }
diff --git a/src/lib/ecore/efl_composite_model.c b/src/lib/ecore/efl_composite_model.c
index b3896bc..ad0c62b 100644
--- a/src/lib/ecore/efl_composite_model.c
+++ b/src/lib/ecore/efl_composite_model.c
@@ -481,7 +481,7 @@ _efl_composite_model_efl_model_child_del(Eo *obj EINA_UNUSED,
481 Efl_Composite_Model_Data *pd, 481 Efl_Composite_Model_Data *pd,
482 Efl_Object *child) 482 Efl_Object *child)
483{ 483{
484 efl_model_child_del(pd->source, child); 484 efl_model_child_del(pd->source, efl_ui_view_model_get(child));
485} 485}
486 486
487static void 487static void
diff --git a/src/lib/ecore/efl_core_command_line.eo b/src/lib/ecore/efl_core_command_line.eo
index 6eec372..24849be 100644
--- a/src/lib/ecore/efl_core_command_line.eo
+++ b/src/lib/ecore/efl_core_command_line.eo
@@ -50,7 +50,7 @@ mixin @beta Efl.Core.Command_Line requires Efl.Object {
50 } 50 }
51 command_access { 51 command_access {
52 [[ Get the accessor which enables access to each argument that got passed to this object. ]] 52 [[ Get the accessor which enables access to each argument that got passed to this object. ]]
53 return : accessor<stringshare>; 53 return : accessor<stringshare> @move;
54 } 54 }
55 @property command_array { 55 @property command_array {
56 [[ Use an array to fill this object 56 [[ Use an array to fill this object
diff --git a/src/lib/ecore/efl_core_env.eo b/src/lib/ecore/efl_core_env.eo
index 593a3a3..c17e0a1 100644
--- a/src/lib/ecore/efl_core_env.eo
+++ b/src/lib/ecore/efl_core_env.eo
@@ -47,7 +47,7 @@ class @beta Efl.Core.Env extends Efl.Object implements Efl.Duplicate {
47 47
48 } 48 }
49 values { 49 values {
50 iter : iterator<string>; 50 iter : iterator<string> @move;
51 } 51 }
52 } 52 }
53 } 53 }
diff --git a/src/lib/ecore/efl_cubic_bezier_interpolator.c b/src/lib/ecore/efl_cubic_bezier_interpolator.c
index 8b9b376..2413714 100644
--- a/src/lib/ecore/efl_cubic_bezier_interpolator.c
+++ b/src/lib/ecore/efl_cubic_bezier_interpolator.c
@@ -11,7 +11,7 @@ typedef struct _Efl_Cubic_Bezier_Interpolator_Data Efl_Cubic_Bezier_Interpolator
11 11
12struct _Efl_Cubic_Bezier_Interpolator_Data 12struct _Efl_Cubic_Bezier_Interpolator_Data
13{ 13{
14 double factor[4]; 14 double control_points[4];
15}; 15};
16 16
17EOLIAN static double 17EOLIAN static double
@@ -23,38 +23,36 @@ _efl_cubic_bezier_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUS
23 return progress; 23 return progress;
24 24
25 return ecore_animator_pos_map_n(progress, ECORE_POS_MAP_CUBIC_BEZIER, 4, 25 return ecore_animator_pos_map_n(progress, ECORE_POS_MAP_CUBIC_BEZIER, 4,
26 pd->factor); 26 pd->control_points);
27} 27}
28 28
29EOLIAN static void 29EOLIAN static void
30_efl_cubic_bezier_interpolator_factors_set(Eo *eo_obj EINA_UNUSED, 30_efl_cubic_bezier_interpolator_control_points_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Cubic_Bezier_Interpolator_Data *pd, 31 Efl_Cubic_Bezier_Interpolator_Data *pd,
32 double factor1, double factor2, 32 Eina_Vector2 p1, Eina_Vector2 p2)
33 double factor3, double factor4)
34{ 33{
35 pd->factor[0] = factor1; 34 pd->control_points[0] = p1.x;
36 pd->factor[1] = factor2; 35 pd->control_points[1] = p1.y;
37 pd->factor[2] = factor3; 36 pd->control_points[2] = p2.x;
38 pd->factor[3] = factor4; 37 pd->control_points[3] = p2.y;
39} 38}
40 39
41EOLIAN static void 40EOLIAN static void
42_efl_cubic_bezier_interpolator_factors_get(const Eo *eo_obj EINA_UNUSED, 41_efl_cubic_bezier_interpolator_control_points_get(const Eo *eo_obj EINA_UNUSED,
43 Efl_Cubic_Bezier_Interpolator_Data *pd, 42 Efl_Cubic_Bezier_Interpolator_Data *pd,
44 double *factor1, double *factor2, 43 Eina_Vector2 *p1, Eina_Vector2 *p2)
45 double *factor3, double *factor4)
46{ 44{
47 if (factor1) 45 if (p1)
48 *factor1 = pd->factor[0]; 46 {
47 p1->x = pd->control_points[0];
48 p1->y = pd->control_points[1];
49 }
49 50
50 if (factor2) 51 if (p2)
51 *factor2 = pd->factor[1]; 52 {
52 53 p2->x = pd->control_points[2];
53 if (factor3) 54 p2->y = pd->control_points[3];
54 *factor3 = pd->factor[2]; 55 }
55
56 if (factor4)
57 *factor4 = pd->factor[3];
58} 56}
59 57
60EOLIAN static Efl_Object * 58EOLIAN static Efl_Object *
@@ -63,10 +61,10 @@ _efl_cubic_bezier_interpolator_efl_object_constructor(Eo *eo_obj,
63{ 61{
64 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 62 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
65 63
66 pd->factor[0] = 1.0; 64 pd->control_points[0] = 1.0;
67 pd->factor[1] = 1.0; 65 pd->control_points[1] = 1.0;
68 pd->factor[2] = 1.0; 66 pd->control_points[2] = 1.0;
69 pd->factor[3] = 1.0; 67 pd->control_points[3] = 1.0;
70 68
71 return eo_obj; 69 return eo_obj;
72} 70}
diff --git a/src/lib/ecore/efl_cubic_bezier_interpolator.eo b/src/lib/ecore/efl_cubic_bezier_interpolator.eo
index c6dd144..4c67204 100644
--- a/src/lib/ecore/efl_cubic_bezier_interpolator.eo
+++ b/src/lib/ecore/efl_cubic_bezier_interpolator.eo
@@ -1,19 +1,33 @@
1class @beta Efl.Cubic_Bezier_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Cubic_Bezier_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl cubic_bezier interpolator class]] 3 [[Cubic Bezier interpolator. It starts slow, then moves quickly and then slows down
4 again before stopping.
5
6 The exact shape of the mapping curve can be modified through the @.control_points
7 property.
8
9 @since 1.24
10 ]]
4 data: Efl_Cubic_Bezier_Interpolator_Data; 11 data: Efl_Cubic_Bezier_Interpolator_Data;
5 methods { 12 methods {
6 @property factors { 13 @property control_points {
7 [[Factors property]] 14 [[Cubic Bezier curves are described by 4 2D control points
15 (https://en.wikipedia.org/wiki/B%C3%A9zier_curve).
16 For each control point, the X coordinate is an input value and the Y coordinate is the
17 corresponding output value.
18 The first one, P0, is set to $[(0,0)]: The input $[0.0] is mapped to the $[0.0] output.
19 The last one, P3, is set to $[(1,1)]: The input $[1.0] is mapped to the $[1.0] output.
20 The other two control points can be set through this property and control the shape of
21 the curve. Note that the control points do not need to be in the $[0...1] range, and
22 neither do the output values of the curve.
23 ]]
8 set { 24 set {
9 } 25 }
10 get { 26 get {
11 } 27 }
12 values { 28 values {
13 factor1: double; [[First factor of the interpolation function.]] 29 p1: Eina.Vector2; [[P1 control point.]]
14 factor2: double; [[Second factor of the interpolation function.]] 30 p2: Eina.Vector2; [[P2 control point.]]
15 factor3: double; [[Third factor of the interpolation function.]]
16 factor4: double; [[Fourth factor of the interpolation function.]]
17 } 31 }
18 } 32 }
19 } 33 }
diff --git a/src/lib/ecore/efl_decelerate_interpolator.c b/src/lib/ecore/efl_decelerate_interpolator.c
index 575ac22..9a8494d 100644
--- a/src/lib/ecore/efl_decelerate_interpolator.c
+++ b/src/lib/ecore/efl_decelerate_interpolator.c
@@ -11,7 +11,7 @@ typedef struct _Efl_Decelerate_Interpolator_Data Efl_Decelerate_Interpolator_Dat
11 11
12struct _Efl_Decelerate_Interpolator_Data 12struct _Efl_Decelerate_Interpolator_Data
13{ 13{
14 double factor; 14 double slope;
15}; 15};
16 16
17EOLIAN static double 17EOLIAN static double
@@ -23,22 +23,22 @@ _efl_decelerate_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUSED
23 return progress; 23 return progress;
24 24
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_DECELERATE_FACTOR, 25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_DECELERATE_FACTOR,
26 pd->factor, 0); 26 pd->slope, 0);
27} 27}
28 28
29EOLIAN static void 29EOLIAN static void
30_efl_decelerate_interpolator_factor_set(Eo *eo_obj EINA_UNUSED, 30_efl_decelerate_interpolator_slope_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Decelerate_Interpolator_Data *pd, 31 Efl_Decelerate_Interpolator_Data *pd,
32 double factor) 32 double slope)
33{ 33{
34 pd->factor = factor; 34 pd->slope = slope;
35} 35}
36 36
37EOLIAN static double 37EOLIAN static double
38_efl_decelerate_interpolator_factor_get(const Eo *eo_obj EINA_UNUSED, 38_efl_decelerate_interpolator_slope_get(const Eo *eo_obj EINA_UNUSED,
39 Efl_Decelerate_Interpolator_Data *pd EINA_UNUSED) 39 Efl_Decelerate_Interpolator_Data *pd EINA_UNUSED)
40{ 40{
41 return pd->factor; 41 return pd->slope;
42} 42}
43 43
44EOLIAN static Efl_Object * 44EOLIAN static Efl_Object *
@@ -47,7 +47,7 @@ _efl_decelerate_interpolator_efl_object_constructor(Eo *eo_obj,
47{ 47{
48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
49 49
50 pd->factor = 1.0; 50 pd->slope = 1.0;
51 51
52 return eo_obj; 52 return eo_obj;
53} 53}
diff --git a/src/lib/ecore/efl_decelerate_interpolator.eo b/src/lib/ecore/efl_decelerate_interpolator.eo
index 802d409..bbda6cf 100644
--- a/src/lib/ecore/efl_decelerate_interpolator.eo
+++ b/src/lib/ecore/efl_decelerate_interpolator.eo
@@ -1,19 +1,25 @@
1class @beta Efl.Decelerate_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Decelerate_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl decelerate interpolator class 3 [[Decelerated interpolator. It starts fast and decelerates, stopping smoothly when
4 it reaches $[1.0].
4 5
5 output = sin(input * Pi / 2); 6 Internally it uses the second half of a sinus rise (from 0.5 to 1.0) and the steepness
7 can be customized through the @.slope property.
8
9 @since 1.24
6 ]] 10 ]]
7 data: Efl_Decelerate_Interpolator_Data; 11 data: Efl_Decelerate_Interpolator_Data;
8 methods { 12 methods {
9 @property factor { 13 @property slope {
10 [[Factor property]] 14 [[Customize the deceleration effect.]]
11 set { 15 set {
12 } 16 }
13 get { 17 get {
14 } 18 }
15 values { 19 values {
16 factor: double; [[Factor of the interpolation function.]] 20 slope: double; [[How steep is the effect. $[0] performs a linear interpolation,
21 $[1] corresponds to a sinus function and higher numbers produce
22 an increasingly steep effect.]]
17 } 23 }
18 } 24 }
19 } 25 }
diff --git a/src/lib/ecore/efl_divisor_interpolator.c b/src/lib/ecore/efl_divisor_interpolator.c
index 3cbc12b..2d96764 100644
--- a/src/lib/ecore/efl_divisor_interpolator.c
+++ b/src/lib/ecore/efl_divisor_interpolator.c
@@ -11,7 +11,8 @@ typedef struct _Efl_Divisor_Interpolator_Data Efl_Divisor_Interpolator_Data;
11 11
12struct _Efl_Divisor_Interpolator_Data 12struct _Efl_Divisor_Interpolator_Data
13{ 13{
14 double factor[2]; 14 double divisor;
15 int power;
15}; 16};
16 17
17EOLIAN static double 18EOLIAN static double
@@ -23,28 +24,36 @@ _efl_divisor_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUSED,
23 return progress; 24 return progress;
24 25
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_DIVISOR_INTERP, 26 return ecore_animator_pos_map(progress, ECORE_POS_MAP_DIVISOR_INTERP,
26 pd->factor[0], pd->factor[1]); 27 pd->divisor, (double)pd->power);
27} 28}
28 29
29EOLIAN static void 30EOLIAN static void
30_efl_divisor_interpolator_factors_set(Eo *eo_obj EINA_UNUSED, 31_efl_divisor_interpolator_divisor_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Divisor_Interpolator_Data *pd, 32 Efl_Divisor_Interpolator_Data *pd,
32 double factor1, double factor2) 33 double divisor)
33{ 34{
34 pd->factor[0] = factor1; 35 pd->divisor = divisor;
35 pd->factor[1] = factor2;
36} 36}
37 37
38EOLIAN static double
39_efl_divisor_interpolator_divisor_get(const Eo *eo_obj EINA_UNUSED,
40 Efl_Divisor_Interpolator_Data *pd)
41{
42 return pd->divisor;
43}
38EOLIAN static void 44EOLIAN static void
39_efl_divisor_interpolator_factors_get(const Eo *eo_obj EINA_UNUSED, 45_efl_divisor_interpolator_power_set(Eo *eo_obj EINA_UNUSED,
40 Efl_Divisor_Interpolator_Data *pd, 46 Efl_Divisor_Interpolator_Data *pd,
41 double *factor1, double *factor2) 47 int power)
42{ 48{
43 if (factor1) 49 pd->power = power;
44 *factor1 = pd->factor[0]; 50}
45 51
46 if (factor2) 52EOLIAN static int
47 *factor2 = pd->factor[1]; 53_efl_divisor_interpolator_power_get(const Eo *eo_obj EINA_UNUSED,
54 Efl_Divisor_Interpolator_Data *pd)
55{
56 return pd->power;
48} 57}
49 58
50EOLIAN static Efl_Object * 59EOLIAN static Efl_Object *
@@ -53,8 +62,8 @@ _efl_divisor_interpolator_efl_object_constructor(Eo *eo_obj,
53{ 62{
54 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 63 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
55 64
56 pd->factor[0] = 1.0; 65 pd->divisor = 1.0;
57 pd->factor[1] = 1.0; 66 pd->power = 1;
58 67
59 return eo_obj; 68 return eo_obj;
60} 69}
diff --git a/src/lib/ecore/efl_divisor_interpolator.eo b/src/lib/ecore/efl_divisor_interpolator.eo
index 848c44b..09b0ed6 100644
--- a/src/lib/ecore/efl_divisor_interpolator.eo
+++ b/src/lib/ecore/efl_divisor_interpolator.eo
@@ -1,17 +1,27 @@
1class @beta Efl.Divisor_Interpolator extends Efl.Object implements Efl.Interpolator 1class @beta Efl.Divisor_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl divisor interpolator class]] 3 [[Divisor interpolator.
4 ]]
4 data: Efl_Divisor_Interpolator_Data; 5 data: Efl_Divisor_Interpolator_Data;
5 methods { 6 methods {
6 @property factors { 7 @property divisor {
7 [[Factors property]] 8 [[Customize divisor factor.]]
8 set { 9 set {
9 } 10 }
10 get { 11 get {
11 } 12 }
12 values { 13 values {
13 factor1: double; [[First factor of the interpolation function.]] 14 divisor: double; [[Divisor.]]
14 factor2: double; [[Second factor of the interpolation function.]] 15 }
16 }
17 @property power {
18 [[Customize power factor.]]
19 set {
20 }
21 get {
22 }
23 values {
24 power: int; [[Exponent.]]
15 } 25 }
16 } 26 }
17 } 27 }
diff --git a/src/lib/ecore/efl_exe.c b/src/lib/ecore/efl_exe.c
index f6ae3bf..b2c6341 100644
--- a/src/lib/ecore/efl_exe.c
+++ b/src/lib/ecore/efl_exe.c
@@ -25,8 +25,10 @@
25# include <sys/socket.h> 25# include <sys/socket.h>
26# ifdef HAVE_PRCTL 26# ifdef HAVE_PRCTL
27# include <sys/prctl.h> 27# include <sys/prctl.h>
28# elif defined(HAVE_PROCCTL)
29# include <sys/procctl.h>
28# endif 30# endif
29# ifdef HAVE_SYS_WAIT_H 31#ifdef HAVE_SYS_WAIT_H
30# include <sys/wait.h> 32# include <sys/wait.h>
31# endif 33# endif
32# ifndef HAVE_CLEARENV 34# ifndef HAVE_CLEARENV
@@ -150,7 +152,13 @@ _exec(const char *cmd, Efl_Exe_Flags flags, Efl_Task_Flags task_flags)
150# ifdef HAVE_PRCTL 152# ifdef HAVE_PRCTL
151 if (task_flags & EFL_TASK_FLAGS_EXIT_WITH_PARENT) 153 if (task_flags & EFL_TASK_FLAGS_EXIT_WITH_PARENT)
152 prctl(PR_SET_PDEATHSIG, SIGTERM); 154 prctl(PR_SET_PDEATHSIG, SIGTERM);
153# endif 155#elif defined(HAVE_PROCCTL)
156 if (task_flags & EFL_TASK_FLAGS_EXIT_WITH_PARENT)
157 {
158 int sig = SIGTERM;
159 procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig);
160 }
161#endif
154 162
155 if (flags & EFL_EXE_FLAGS_GROUP_LEADER) setsid(); 163 if (flags & EFL_EXE_FLAGS_GROUP_LEADER) setsid();
156 if (use_sh) // We have to use a shell to run this. 164 if (use_sh) // We have to use a shell to run this.
@@ -540,6 +548,11 @@ _efl_exe_efl_task_run(Eo *obj, Efl_Exe_Data *pd)
540 pd->env = NULL; 548 pd->env = NULL;
541 } 549 }
542 550
551 // close all fd's other than the first 3 (0, 1, 2) and exited write fd
552 int except[2] = { 0, -1 };
553 except[0] = pd->fd.exited_write;
554 eina_file_close_from(3, except);
555
543 // actually execute! 556 // actually execute!
544 _exec(cmd, pd->flags, td->flags); 557 _exec(cmd, pd->flags, td->flags);
545 // we couldn't exec... uh oh. HAAAAAAAALP! 558 // we couldn't exec... uh oh. HAAAAAAAALP!
diff --git a/src/lib/ecore/efl_filter_model.c b/src/lib/ecore/efl_filter_model.c
index a382b7b..cc18dca 100644
--- a/src/lib/ecore/efl_filter_model.c
+++ b/src/lib/ecore/efl_filter_model.c
@@ -11,8 +11,8 @@ struct _Efl_Filter_Model_Mapping
11{ 11{
12 EINA_RBTREE; 12 EINA_RBTREE;
13 13
14 uint64_t original; 14 unsigned int original;
15 uint64_t mapped; 15 unsigned int mapped;
16 16
17 EINA_REFCOUNT; 17 EINA_REFCOUNT;
18}; 18};
@@ -28,10 +28,10 @@ struct _Efl_Filter_Model_Data
28 void *data; 28 void *data;
29 EflFilterModel cb; 29 EflFilterModel cb;
30 Eina_Free_Cb free_cb; 30 Eina_Free_Cb free_cb;
31 uint64_t count; 31 unsigned int count;
32 } filter; 32 } filter;
33 33
34 uint64_t counted; 34 unsigned int counted;
35 Eina_Bool counting_started : 1; 35 Eina_Bool counting_started : 1;
36 Eina_Bool processed : 1; 36 Eina_Bool processed : 1;
37}; 37};
@@ -54,7 +54,7 @@ _filter_mapping_looking_cb(const Eina_Rbtree *node, const void *key,
54 int length EINA_UNUSED, void *data EINA_UNUSED) 54 int length EINA_UNUSED, void *data EINA_UNUSED)
55{ 55{
56 const Efl_Filter_Model_Mapping *n = (const Efl_Filter_Model_Mapping *) node; 56 const Efl_Filter_Model_Mapping *n = (const Efl_Filter_Model_Mapping *) node;
57 const uint64_t *k = key; 57 const unsigned int *k = key;
58 58
59 return n->mapped - *k; 59 return n->mapped - *k;
60} 60}
@@ -85,7 +85,7 @@ struct _Efl_Filter_Request
85 Efl_Filter_Model_Data *pd; 85 Efl_Filter_Model_Data *pd;
86 Efl_Model *parent; 86 Efl_Model *parent;
87 Efl_Model *child; 87 Efl_Model *child;
88 uint64_t index; 88 unsigned int index;
89}; 89};
90 90
91static Efl_Filter_Model * 91static Efl_Filter_Model *
@@ -243,7 +243,7 @@ _efl_filter_model_child_removed(void *data, const Efl_Event *event)
243 Efl_Filter_Model_Mapping *mapping; 243 Efl_Filter_Model_Mapping *mapping;
244 Efl_Filter_Model_Data *pd = data; 244 Efl_Filter_Model_Data *pd = data;
245 Efl_Model_Children_Event *ev = event->info; 245 Efl_Model_Children_Event *ev = event->info;
246 uint64_t removed = ev->index; 246 unsigned int removed = ev->index;
247 247
248 mapping = (void *)eina_rbtree_inline_lookup(pd->mapping, 248 mapping = (void *)eina_rbtree_inline_lookup(pd->mapping,
249 &removed, sizeof (uint64_t), 249 &removed, sizeof (uint64_t),
@@ -370,10 +370,10 @@ _efl_filter_model_efl_model_children_slice_get(Eo *obj, Efl_Filter_Model_Data *p
370 370
371 for (i = 0; i < count; i++) 371 for (i = 0; i < count; i++)
372 { 372 {
373 uint64_t lookup = start + i; 373 unsigned int lookup = start + i;
374 374
375 mapping[i] = (void *)eina_rbtree_inline_lookup(pd->mapping, 375 mapping[i] = (void *)eina_rbtree_inline_lookup(pd->mapping,
376 &lookup, sizeof (uint64_t), 376 &lookup, sizeof (unsigned int),
377 _filter_mapping_looking_cb, NULL); 377 _filter_mapping_looking_cb, NULL);
378 if (!mapping[i]) goto on_error; 378 if (!mapping[i]) goto on_error;
379 } 379 }
@@ -410,7 +410,7 @@ typedef struct _Efl_Filter_Model_Result Efl_Filter_Model_Result;
410struct _Efl_Filter_Model_Result 410struct _Efl_Filter_Model_Result
411{ 411{
412 Efl_Filter_Model_Data *pd; 412 Efl_Filter_Model_Data *pd;
413 uint64_t count; 413 unsigned int count;
414 Efl_Model *targets[1]; 414 Efl_Model *targets[1];
415}; 415};
416 416
@@ -422,7 +422,7 @@ _efl_filter_model_array_result_request(Eo *o EINA_UNUSED, void *data, const Eina
422 Efl_Filter_Model_Data *pd = req->pd; 422 Efl_Filter_Model_Data *pd = req->pd;
423 unsigned int i, len; 423 unsigned int i, len;
424 Eina_Value request = EINA_VALUE_EMPTY; 424 Eina_Value request = EINA_VALUE_EMPTY;
425 uint64_t pcount = pd->filter.count; 425 unsigned int pcount = pd->filter.count;
426 426
427 EINA_VALUE_ARRAY_FOREACH(&v, len, i, request) 427 EINA_VALUE_ARRAY_FOREACH(&v, len, i, request)
428 { 428 {
@@ -465,7 +465,7 @@ static void
465_efl_filter_model_array_result_free(Eo *o EINA_UNUSED, void *data, const Eina_Future *dead_future EINA_UNUSED) 465_efl_filter_model_array_result_free(Eo *o EINA_UNUSED, void *data, const Eina_Future *dead_future EINA_UNUSED)
466{ 466{
467 Efl_Filter_Model_Result *req = data; 467 Efl_Filter_Model_Result *req = data;
468 uint64_t i; 468 unsigned int i;
469 469
470 for (i = 0; i < req->count; i++) 470 for (i = 0; i < req->count; i++)
471 efl_unref(req->targets[i]); 471 efl_unref(req->targets[i]);
diff --git a/src/lib/ecore/efl_linear_interpolator.eo b/src/lib/ecore/efl_linear_interpolator.eo
index e22e980..27f43a9 100644
--- a/src/lib/ecore/efl_linear_interpolator.eo
+++ b/src/lib/ecore/efl_linear_interpolator.eo
@@ -1,6 +1,9 @@
1class @beta Efl.Linear_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Linear_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl linear interpolator class]] 3 [[Linear interpolation (pass-through). Input values are used unmodified as output.
4
5 @since 1.24
6 ]]
4 data: Efl_Linear_Interpolator_Data; 7 data: Efl_Linear_Interpolator_Data;
5 implements { 8 implements {
6 Efl.Interpolator.interpolate; 9 Efl.Interpolator.interpolate;
diff --git a/src/lib/ecore/efl_loop.c b/src/lib/ecore/efl_loop.c
index e40dbef..726a4b3 100644
--- a/src/lib/ecore/efl_loop.c
+++ b/src/lib/ecore/efl_loop.c
@@ -621,6 +621,14 @@ _efl_loop_message_process(Eo *obj, Efl_Loop_Data *pd)
621 } 621 }
622 else free(msg); 622 else free(msg);
623 } 623 }
624
625 while (pd->message_pending_queue)
626 {
627 msg = (Message *)pd->message_pending_queue;
628 pd->message_pending_queue = eina_inlist_remove(pd->message_pending_queue,
629 pd->message_pending_queue);
630 pd->message_queue = eina_inlist_append(pd->message_queue, EINA_INLIST_GET(msg));
631 }
624 } 632 }
625 return EINA_TRUE; 633 return EINA_TRUE;
626} 634}
@@ -655,6 +663,10 @@ _efl_loop_efl_task_end(Eo *obj, Efl_Loop_Data *pd EINA_UNUSED)
655 efl_loop_quit(obj, eina_value_int_init(0)); 663 efl_loop_quit(obj, eina_value_int_init(0));
656} 664}
657 665
666EFL_SCHEDULER_ARRAY_DEFINE(loop_scheduler,
667 EFL_LOOP_EVENT_IDLE_ENTER,
668 EFL_LOOP_EVENT_IDLE);
669
658EAPI Eina_Future_Scheduler * 670EAPI Eina_Future_Scheduler *
659efl_loop_future_scheduler_get(const Eo *obj) 671efl_loop_future_scheduler_get(const Eo *obj)
660{ 672{
@@ -667,15 +679,7 @@ efl_loop_future_scheduler_get(const Eo *obj)
667 Efl_Loop_Data *pd = efl_data_scope_get(obj, EFL_LOOP_CLASS); 679 Efl_Loop_Data *pd = efl_data_scope_get(obj, EFL_LOOP_CLASS);
668 680
669 if (!pd) return NULL; 681 if (!pd) return NULL;
670 if (!pd->future_scheduler.loop) 682 return efl_event_future_scheduler_get(obj, loop_scheduler());
671 {
672 Eina_Future_Scheduler *sched =
673 _ecore_event_future_scheduler_get();
674 pd->future_scheduler.eina_future_scheduler = *sched;
675 pd->future_scheduler.loop = obj;
676 pd->future_scheduler.loop_data = pd;
677 }
678 return &(pd->future_scheduler.eina_future_scheduler);
679 } 683 }
680 if (efl_isa(obj, EFL_LOOP_CONSUMER_CLASS)) 684 if (efl_isa(obj, EFL_LOOP_CONSUMER_CLASS))
681 return efl_loop_future_scheduler_get(efl_loop_get(obj)); 685 return efl_loop_future_scheduler_get(efl_loop_get(obj));
diff --git a/src/lib/ecore/efl_loop_message_handler.c b/src/lib/ecore/efl_loop_message_handler.c
index 05ecdbc..e243c17 100644
--- a/src/lib/ecore/efl_loop_message_handler.c
+++ b/src/lib/ecore/efl_loop_message_handler.c
@@ -54,8 +54,16 @@ _efl_loop_message_handler_message_send(Eo *obj, Efl_Loop_Message_Handler_Data *p
54 { 54 {
55 msg->handler = obj; 55 msg->handler = obj;
56 msg->message = message; 56 msg->message = message;
57 pd->loop_data->message_queue = eina_inlist_append 57 if (pd->loop_data->message_walking > 0)
58 (pd->loop_data->message_queue, EINA_INLIST_GET(msg)); 58 {
59 pd->loop_data->message_pending_queue = eina_inlist_append
60 (pd->loop_data->message_pending_queue, EINA_INLIST_GET(msg));
61 }
62 else
63 {
64 pd->loop_data->message_queue = eina_inlist_append
65 (pd->loop_data->message_queue, EINA_INLIST_GET(msg));
66 }
59 _efl_loop_message_send_info_set(message, EINA_INLIST_GET(msg), 67 _efl_loop_message_send_info_set(message, EINA_INLIST_GET(msg),
60 pd->loop, pd->loop_data); 68 pd->loop, pd->loop_data);
61 return; 69 return;
diff --git a/src/lib/ecore/efl_loop_timer.eo b/src/lib/ecore/efl_loop_timer.eo
index d726c1a..ebe5f47 100644
--- a/src/lib/ecore/efl_loop_timer.eo
+++ b/src/lib/ecore/efl_loop_timer.eo
@@ -26,7 +26,9 @@ class Efl.Loop_Timer extends Efl.Loop_Consumer
26 @property time_pending { 26 @property time_pending {
27 [[Pending time regarding a timer.]] 27 [[Pending time regarding a timer.]]
28 get { 28 get {
29 return: double; [[Pending time]] 29 }
30 values {
31 pending: double; [[Pending time]]
30 } 32 }
31 } 33 }
32 timer_reset { 34 timer_reset {
diff --git a/src/lib/ecore/efl_sinusoidal_interpolator.c b/src/lib/ecore/efl_sinusoidal_interpolator.c
index d36a776..3216ef9 100644
--- a/src/lib/ecore/efl_sinusoidal_interpolator.c
+++ b/src/lib/ecore/efl_sinusoidal_interpolator.c
@@ -11,7 +11,7 @@ typedef struct _Efl_Sinusoidal_Interpolator_Data Efl_Sinusoidal_Interpolator_Dat
11 11
12struct _Efl_Sinusoidal_Interpolator_Data 12struct _Efl_Sinusoidal_Interpolator_Data
13{ 13{
14 double factor; 14 double slope;
15}; 15};
16 16
17EOLIAN static double 17EOLIAN static double
@@ -23,22 +23,22 @@ _efl_sinusoidal_interpolator_efl_interpolator_interpolate(Eo *eo_obj EINA_UNUSED
23 return progress; 23 return progress;
24 24
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_SINUSOIDAL_FACTOR, 25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_SINUSOIDAL_FACTOR,
26 pd->factor, 0); 26 pd->slope, 0);
27} 27}
28 28
29EOLIAN static void 29EOLIAN static void
30_efl_sinusoidal_interpolator_factor_set(Eo *eo_obj EINA_UNUSED, 30_efl_sinusoidal_interpolator_slope_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Sinusoidal_Interpolator_Data *pd, 31 Efl_Sinusoidal_Interpolator_Data *pd,
32 double factor) 32 double slope)
33{ 33{
34 pd->factor = factor; 34 pd->slope = slope;
35} 35}
36 36
37EOLIAN static double 37EOLIAN static double
38_efl_sinusoidal_interpolator_factor_get(const Eo *eo_obj EINA_UNUSED, 38_efl_sinusoidal_interpolator_slope_get(const Eo *eo_obj EINA_UNUSED,
39 Efl_Sinusoidal_Interpolator_Data *pd EINA_UNUSED) 39 Efl_Sinusoidal_Interpolator_Data *pd EINA_UNUSED)
40{ 40{
41 return pd->factor; 41 return pd->slope;
42} 42}
43 43
44EOLIAN static Efl_Object * 44EOLIAN static Efl_Object *
@@ -47,7 +47,7 @@ _efl_sinusoidal_interpolator_efl_object_constructor(Eo *eo_obj,
47{ 47{
48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 48 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
49 49
50 pd->factor = 1.0; 50 pd->slope = 1.0;
51 51
52 return eo_obj; 52 return eo_obj;
53} 53}
diff --git a/src/lib/ecore/efl_sinusoidal_interpolator.eo b/src/lib/ecore/efl_sinusoidal_interpolator.eo
index e0701aa..c78f39e 100644
--- a/src/lib/ecore/efl_sinusoidal_interpolator.eo
+++ b/src/lib/ecore/efl_sinusoidal_interpolator.eo
@@ -1,19 +1,24 @@
1class @beta Efl.Sinusoidal_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Sinusoidal_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl sinusoidal interpolator class 3 [[Sinusoidal interpolator. It starts slow, then moves quickly and then slows down
4 again before stopping.
4 5
5 output = (1 - cos(input * Pi)) / 2; 6 How long it stays in the quick zone (the slope of the curve) can be customized.
7
8 @since 1.24
6 ]] 9 ]]
7 data: Efl_Sinusoidal_Interpolator_Data; 10 data: Efl_Sinusoidal_Interpolator_Data;
8 methods { 11 methods {
9 @property factor { 12 @property slope {
10 [[Factor property]] 13 [[Customize the sinusoidal effect.]]
11 set { 14 set {
12 } 15 }
13 get { 16 get {
14 } 17 }
15 values { 18 values {
16 factor: double; [[Factor of the interpolation function.]] 19 slope: double; [[How steep is the effect. $[0] performs a linear interpolation,
20 $[1] corresponds to a sinus function and higher numbers produce
21 an increasingly steep effect.]]
17 } 22 }
18 } 23 }
19 } 24 }
diff --git a/src/lib/ecore/efl_spring_interpolator.c b/src/lib/ecore/efl_spring_interpolator.c
index 183e54c..71611bf 100644
--- a/src/lib/ecore/efl_spring_interpolator.c
+++ b/src/lib/ecore/efl_spring_interpolator.c
@@ -11,40 +11,50 @@ typedef struct _Efl_Spring_Interpolator_Data Efl_Spring_Interpolator_Data;
11 11
12struct _Efl_Spring_Interpolator_Data 12struct _Efl_Spring_Interpolator_Data
13{ 13{
14 double factor[2]; 14 double decay;
15 int oscillations;
15}; 16};
16 17
17EOLIAN static double 18EOLIAN static double
18_efl_spring_interpolator_efl_interpolator_interpolate(Eo *obj EINA_UNUSED, 19_efl_spring_interpolator_efl_interpolator_interpolate(Eo *obj EINA_UNUSED,
19 Efl_Spring_Interpolator_Data *pd EINA_UNUSED, 20 Efl_Spring_Interpolator_Data *pd,
20 double progress) 21 double progress)
21{ 22{
22 if ((progress < 0.0) || (progress > 1.0)) 23 if ((progress < 0.0) || (progress > 1.0))
23 return progress; 24 return progress;
24 25
25 return ecore_animator_pos_map(progress, ECORE_POS_MAP_SPRING, 26 return ecore_animator_pos_map(progress, ECORE_POS_MAP_SPRING,
26 pd->factor[0], pd->factor[1]); 27 pd->decay, (double)pd->oscillations);
27} 28}
28 29
29EOLIAN static void 30EOLIAN static void
30_efl_spring_interpolator_factors_set(Eo *eo_obj EINA_UNUSED, 31_efl_spring_interpolator_decay_set(Eo *eo_obj EINA_UNUSED,
31 Efl_Spring_Interpolator_Data *pd, 32 Efl_Spring_Interpolator_Data *pd,
32 double factor1, double factor2) 33 double decay)
33{ 34{
34 pd->factor[0] = factor1; 35 pd->decay = decay;
35 pd->factor[1] = factor2; 36}
37
38EOLIAN static double
39_efl_spring_interpolator_decay_get(const Eo *eo_obj EINA_UNUSED,
40 Efl_Spring_Interpolator_Data *pd)
41{
42 return pd->decay;
36} 43}
37 44
38EOLIAN static void 45EOLIAN static void
39_efl_spring_interpolator_factors_get(const Eo *eo_obj EINA_UNUSED, 46_efl_spring_interpolator_oscillations_set(Eo *eo_obj EINA_UNUSED,
40 Efl_Spring_Interpolator_Data *pd, 47 Efl_Spring_Interpolator_Data *pd,
41 double *factor1, double *factor2) 48 int oscillations)
42{ 49{
43 if (factor1) 50 pd->oscillations = oscillations;
44 *factor1 = pd->factor[0]; 51}
45 52
46 if (factor2) 53EOLIAN static int
47 *factor2 = pd->factor[1]; 54_efl_spring_interpolator_oscillations_get(const Eo *eo_obj EINA_UNUSED,
55 Efl_Spring_Interpolator_Data *pd)
56{
57 return pd->oscillations;
48} 58}
49 59
50EOLIAN static Efl_Object * 60EOLIAN static Efl_Object *
@@ -53,8 +63,8 @@ _efl_spring_interpolator_efl_object_constructor(Eo *eo_obj,
53{ 63{
54 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); 64 eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
55 65
56 pd->factor[0] = 1.0; 66 pd->decay = 1.0;
57 pd->factor[1] = 1.0; 67 pd->oscillations = 1;
58 68
59 return eo_obj; 69 return eo_obj;
60} 70}
diff --git a/src/lib/ecore/efl_spring_interpolator.eo b/src/lib/ecore/efl_spring_interpolator.eo
index 5549046..dd9e196 100644
--- a/src/lib/ecore/efl_spring_interpolator.eo
+++ b/src/lib/ecore/efl_spring_interpolator.eo
@@ -1,17 +1,33 @@
1class @beta Efl.Spring_Interpolator extends Efl.Object implements Efl.Interpolator 1class Efl.Spring_Interpolator extends Efl.Object implements Efl.Interpolator
2{ 2{
3 [[Efl spring interpolator class]] 3 [[Spring interpolator. The value quickly reaches $[1.0] and then oscillates
4 around it a number of times before stopping (as if linked with a spring).
5
6 The number of oscillations and how quickly it stops can be customized.
7
8 @since 1.24
9 ]]
4 data: Efl_Spring_Interpolator_Data; 10 data: Efl_Spring_Interpolator_Data;
5 methods { 11 methods {
6 @property factors { 12 @property decay {
7 [[Factors property]] 13 [[Customize the decay factor.]]
8 set { 14 set {
9 } 15 }
10 get { 16 get {
11 } 17 }
12 values { 18 values {
13 factor1: double; [[First factor of the interpolation function.]] 19 decay: double; [[How quickly energy is lost.
14 factor2: double; [[Second factor of the interpolation function.]] 20 Higher numbers result in smaller oscillations.]]
21 }
22 }
23 @property oscillations {
24 [[Customize number of oscillations.]]
25 set {
26 }
27 get {
28 }
29 values {
30 oscillations: int; [[Number of oscillations before stopping.]]
15 } 31 }
16 } 32 }
17 } 33 }
diff --git a/src/lib/ecore/meson.build b/src/lib/ecore/meson.build
index 5e777ae..34c32e7 100644
--- a/src/lib/ecore/meson.build
+++ b/src/lib/ecore/meson.build
@@ -185,7 +185,11 @@ if get_option('glib') == true and sys_windows == false
185endif 185endif
186 186
187if get_option('g-mainloop') == true 187if get_option('g-mainloop') == true
188 config_h.set('USE_G_MAIN_LOOP', '1') 188 if get_option('glib') == false
189 error('g-mainloop enabled by glib not. Please enable with -Dglib=true')
190 else
191 config_h.set('USE_G_MAIN_LOOP', '1')
192 endif
189endif 193endif
190 194
191if get_option('systemd') == true 195if get_option('systemd') == true