From: Sung-Jin Park Date: Tue, 3 Sep 2019 02:20:55 +0000 (+0900) Subject: PUI & default-backend: add force argument to the control function of animation X-Git-Tag: accepted/tizen/5.5/unified/20200102.014046~23 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Flibpui.git;a=commitdiff_plain;h=1e703bbf812406ff31fb60e67e38f60d5e0027e4 PUI & default-backend: add force argument to the control function of animation As we use pui_ani_control() to stop/pause an animation, it's impossible to check whether the animation has been stopped from the user request or from the window stack changes. Thus we add _pui_ani_control_with_force() to pass force value when the animation must be paused from window stack changes. Change-Id: Ied104d13cd463c37191d20515383501d4f8333a8 Signed-off-by: Sung-Jin Park --- diff --git a/backends/bt/default_ani_connected.c b/backends/bt/default_ani_connected.c index ccc9bd1..cb2310f 100644 --- a/backends/bt/default_ani_connected.c +++ b/backends/bt/default_ani_connected.c @@ -173,7 +173,7 @@ _ani_connected_start(pui_ani_t *ani, int repeat) } pui_error -_ani_connected_stop(pui_ani_t *ani) +_ani_connected_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -184,10 +184,15 @@ _ani_connected_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/bt/default_ani_pairing.c b/backends/bt/default_ani_pairing.c index 3e59bc7..83a200d 100644 --- a/backends/bt/default_ani_pairing.c +++ b/backends/bt/default_ani_pairing.c @@ -165,7 +165,7 @@ _ani_pairing_start(pui_ani_t *ani, int repeat) } pui_error -_ani_pairing_stop(pui_ani_t *ani) +_ani_pairing_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -176,10 +176,14 @@ _ani_pairing_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); return e; } diff --git a/backends/default_backend.c b/backends/default_backend.c index d4015ff..bc13c94 100644 --- a/backends/default_backend.c +++ b/backends/default_backend.c @@ -178,7 +178,7 @@ _ani_start(pui_ani_t *ani, int repeat) } pui_error -_ani_stop(pui_ani_t *ani) +_ani_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -189,10 +189,14 @@ _ani_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); return e; } diff --git a/backends/notification/default_ani_alarm.c b/backends/notification/default_ani_alarm.c index 7017465..3a3f553 100644 --- a/backends/notification/default_ani_alarm.c +++ b/backends/notification/default_ani_alarm.c @@ -192,7 +192,7 @@ _ani_alarm_start(pui_ani_t *ani, int repeat) } pui_error -_ani_alarm_stop(pui_ani_t *ani) +_ani_alarm_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -203,10 +203,15 @@ _ani_alarm_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/notification/default_ani_emergency.c b/backends/notification/default_ani_emergency.c index b0fad94..2f58418 100644 --- a/backends/notification/default_ani_emergency.c +++ b/backends/notification/default_ani_emergency.c @@ -177,7 +177,7 @@ _ani_emergency_start(pui_ani_t *ani, int repeat) } pui_error -_ani_emergency_stop(pui_ani_t *ani) +_ani_emergency_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -188,10 +188,14 @@ _ani_emergency_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); return e; } diff --git a/backends/notification/default_ani_error.c b/backends/notification/default_ani_error.c index 9c4f022..2bece72 100644 --- a/backends/notification/default_ani_error.c +++ b/backends/notification/default_ani_error.c @@ -173,7 +173,7 @@ _ani_error_start(pui_ani_t *ani, int repeat) } pui_error -_ani_error_stop(pui_ani_t *ani) +_ani_error_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -184,10 +184,15 @@ _ani_error_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/notification/default_ani_networkerror.c b/backends/notification/default_ani_networkerror.c index 6295946..7295fa6 100644 --- a/backends/notification/default_ani_networkerror.c +++ b/backends/notification/default_ani_networkerror.c @@ -173,7 +173,7 @@ _ani_networkerror_start(pui_ani_t *ani, int repeat) } pui_error -_ani_networkerror_stop(pui_ani_t *ani) +_ani_networkerror_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -184,10 +184,15 @@ _ani_networkerror_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/notification/default_ani_normal.c b/backends/notification/default_ani_normal.c index a96d09e..fec9d41 100644 --- a/backends/notification/default_ani_normal.c +++ b/backends/notification/default_ani_normal.c @@ -177,7 +177,7 @@ _ani_normal_start(pui_ani_t *ani, int repeat) } pui_error -_ani_normal_stop(pui_ani_t *ani) +_ani_normal_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -188,10 +188,15 @@ _ani_normal_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/system/default_ani_easysetup.c b/backends/system/default_ani_easysetup.c index f4b611c..791300d 100644 --- a/backends/system/default_ani_easysetup.c +++ b/backends/system/default_ani_easysetup.c @@ -176,7 +176,7 @@ _ani_easysetup_start(pui_ani_t *ani, int repeat) } pui_error -_ani_easysetup_stop(pui_ani_t *ani) +_ani_easysetup_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -187,10 +187,15 @@ _ani_easysetup_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/system/default_ani_micoff.c b/backends/system/default_ani_micoff.c index 8ea4583..0d96ecb 100644 --- a/backends/system/default_ani_micoff.c +++ b/backends/system/default_ani_micoff.c @@ -159,7 +159,7 @@ _ani_micoff_start(pui_ani_t *ani, int repeat) } pui_error -_ani_micoff_stop(pui_ani_t *ani) +_ani_micoff_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -170,10 +170,15 @@ _ani_micoff_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/system/default_ani_swupdatedone.c b/backends/system/default_ani_swupdatedone.c index 139bf13..b1ee0d1 100644 --- a/backends/system/default_ani_swupdatedone.c +++ b/backends/system/default_ani_swupdatedone.c @@ -176,7 +176,7 @@ _ani_swupdatedone_start(pui_ani_t *ani, int repeat) } pui_error -_ani_swupdatedone_stop(pui_ani_t *ani) +_ani_swupdatedone_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -187,10 +187,15 @@ _ani_swupdatedone_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/system/default_ani_system_processing.c b/backends/system/default_ani_system_processing.c index 6778838..921c4eb 100644 --- a/backends/system/default_ani_system_processing.c +++ b/backends/system/default_ani_system_processing.c @@ -165,7 +165,7 @@ _ani_system_processing_start(pui_ani_t *ani, int repeat) } pui_error -_ani_system_processing_stop(pui_ani_t *ani) +_ani_system_processing_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -176,10 +176,15 @@ _ani_system_processing_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/voice/default_ani_listening.c b/backends/voice/default_ani_listening.c index 2ff9a84..6317550 100644 --- a/backends/voice/default_ani_listening.c +++ b/backends/voice/default_ani_listening.c @@ -189,7 +189,7 @@ _ani_listening_start(pui_ani_t *ani, int repeat) } pui_error -_ani_listening_stop(pui_ani_t *ani) +_ani_listening_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -200,10 +200,14 @@ _ani_listening_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); return e; } diff --git a/backends/voice/default_ani_processing.c b/backends/voice/default_ani_processing.c index 15f4957..25bc0c0 100644 --- a/backends/voice/default_ani_processing.c +++ b/backends/voice/default_ani_processing.c @@ -165,7 +165,7 @@ _ani_processing_start(pui_ani_t *ani, int repeat) } pui_error -_ani_processing_stop(pui_ani_t *ani) +_ani_processing_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -176,10 +176,15 @@ _ani_processing_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/voice/default_ani_speaking.c b/backends/voice/default_ani_speaking.c index af0bb47..99d564a 100644 --- a/backends/voice/default_ani_speaking.c +++ b/backends/voice/default_ani_speaking.c @@ -176,7 +176,7 @@ _ani_speaking_start(pui_ani_t *ani, int repeat) } pui_error -_ani_speaking_stop(pui_ani_t *ani) +_ani_speaking_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -187,10 +187,15 @@ _ani_speaking_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/voice/default_ani_streaming.c b/backends/voice/default_ani_streaming.c index 79b5e14..0d558d8 100644 --- a/backends/voice/default_ani_streaming.c +++ b/backends/voice/default_ani_streaming.c @@ -176,7 +176,7 @@ _ani_streaming_start(pui_ani_t *ani, int repeat) } pui_error -_ani_streaming_stop(pui_ani_t *ani) +_ani_streaming_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -187,10 +187,15 @@ _ani_streaming_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/backends/voice/default_ani_timeout.c b/backends/voice/default_ani_timeout.c index 4c0b4d4..bb26a39 100644 --- a/backends/voice/default_ani_timeout.c +++ b/backends/voice/default_ani_timeout.c @@ -176,7 +176,7 @@ _ani_timeout_start(pui_ani_t *ani, int repeat) } pui_error -_ani_timeout_stop(pui_ani_t *ani) +_ani_timeout_stop(pui_ani_t *ani, pui_bool force) { pui_int_error e = PUI_INT_ERROR_NONE; pui_backend_ani_data *ani_data = NULL; @@ -187,10 +187,15 @@ _ani_timeout_stop(pui_ani_t *ani) //TODO (void) info; - pui_info("... info->id: %s\n", info->id); + pui_info("... info->id: %s, force=%d\n", info->id, force); pui_backend_ani_remove_frame_cb(ani); - pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + + if (force) + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED); + else + pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED); + return e; } diff --git a/include/PUI_backend.h b/include/PUI_backend.h index e7ea4fb..d1e9210 100644 --- a/include/PUI_backend.h +++ b/include/PUI_backend.h @@ -44,7 +44,7 @@ typedef struct _pui_backend_ani_func pui_backend_ani_func; struct _pui_backend_ani_func { pui_error (*ani_start)(pui_ani_t *ani, int repeat); - pui_error (*ani_stop)(pui_ani_t *ani); + pui_error (*ani_stop)(pui_ani_t *ani, pui_bool force); void (*reserved1)(void); void (*reserved2)(void); diff --git a/src/PUI_ani.c b/src/PUI_ani.c index f229a1a..9ef7c0f 100644 --- a/src/PUI_ani.c +++ b/src/PUI_ani.c @@ -31,62 +31,6 @@ static int KEY_WL_BUFFER = 0xabcdbeaf; static int KEY_CLIENT = 0xdcbabeaf; -static Eina_Bool -_cb_visibility_change(void *data, int type EINA_UNUSED, void *event) -{ - pui_ani_h ani_h = (pui_ani_h)data; - pui_ani_t *ani = ani_h->ani; - pui_h ph = ani_h->pui_handle; - - Ecore_Wl2_Event_Window_Visibility_Change *ev; - PUI_Event_Animation_Status *e = NULL; - - ev = event; - - /* check if this is needed */ - ph->visibility = !(ev->fully_obscured); - - if (ev->fully_obscured) - { - if (ani->status == PUI_ANI_STATUS_RUNNING) - { - pui_info("animation(%s) will be stopped as it lost its priority !\n", ani->id); - - pui_ani_control(ani_h, PUI_ANI_CMD_STOP, 0); - } - } - else - { - if (ani->status == PUI_ANI_STATUS_STOPPED || ani->status == PUI_ANI_STATUS_PAUSED) - { - e = (PUI_Event_Animation_Status *)calloc(1, sizeof(PUI_Event_Animation_Status)); - - if (!e) - { - pui_err("Failed to allocate memory for PUI Event !\n"); - return ECORE_CALLBACK_PASS_ON; - } - - e->ani_h = ani_h; - e->win = ev->win; - e->status = ani->status; - - if (ani->status == PUI_ANI_STATUS_STOPPED) - { - pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_START event has been added.\n", ani_h->id); - ecore_event_add(PUI_EVENT_ANI_READY_TO_START, e, NULL, ani_h); - } - else if(ani->status == PUI_ANI_STATUS_PAUSED) - { - pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_RESUME event has been added.\n", ani_h->id); - ecore_event_add(PUI_EVENT_ANI_READY_TO_RESUME, e, NULL, ani_h); - } - } - } - - return ECORE_CALLBACK_PASS_ON; -} - static void _pui_ani_cb_frame_done(Ecore_Wl2_Window *win, uint32_t timestamp EINA_UNUSED, void *data) { @@ -285,44 +229,6 @@ pui_ani_update(pui_ani_h ani_h) return PUI_INT_ERROR_NONE; } -static void -_pui_ani_event_handlers_init(pui_ani_h ani_h) -{ - Ecore_Event_Handler *h = NULL; - - if (!ani_h) - { - pui_err("Invalid handle !\n"); - return; - } - - if (!ani_h->ecore_event_hdls) - ani_h->ecore_event_hdls = eina_array_new(1); - - h = ecore_event_handler_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, _cb_visibility_change, ani_h); - eina_array_push(ani_h->ecore_event_hdls, h); - -} - -static void -_pui_ani_event_handlers_shutdown(pui_ani_h ani_h) -{ - if (!ani_h) - { - pui_err("Invalid handle !\n"); - return; - } - - if (ani_h->ecore_event_hdls) - { - while (eina_array_count(ani_h->ecore_event_hdls)) - ecore_event_handler_del(eina_array_pop(ani_h->ecore_event_hdls)); - - eina_array_free(ani_h->ecore_event_hdls); - ani_h->ecore_event_hdls = NULL; - } -} - static Eina_Bool _pui_ani_frame_cb(void *data) { @@ -544,8 +450,8 @@ pui_ani_status_get(pui_ani_t *ani) return ani->status; } -pui_error -pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat) +static pui_error +_pui_ani_control_with_force(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat, pui_bool force) { pui_int_error ei = PUI_INT_ERROR_NONE; pui_ani_t *ani = NULL; @@ -592,7 +498,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat) { pui_info("current_ani id=%s, status=%d\n", current_ani->id, current_ani->status); - ei = pui_ani_control(handle->current_ani_h, PUI_ANI_CMD_STOP, 0); + ei = _pui_ani_control_with_force(handle->current_ani_h, PUI_ANI_CMD_STOP, 0, force); if (ei != PUI_INT_ERROR_NONE) pui_info("Failed to stop running previous animation ! (id:%s)\n", current_ani->id); @@ -609,7 +515,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat) pui_err("Error on starting animation ! (id:%s, repeat:%d, status=%d))\n", ani->id, repeat, ani->status); if (ani->status != PUI_ANI_STATUS_RUNNING) - pui_ani_control(ani_h, PUI_ANI_CMD_STOP, 0); + _pui_ani_control_with_force(ani_h, PUI_ANI_CMD_STOP, 0, 0); return PUI_ERROR_INTERNAL; } @@ -618,7 +524,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat) } else//cmd == PUI_ANI_CMD_STOP { - ei = ani_func->ani_stop(ani); + ei = ani_func->ani_stop(ani, force); if (ei != PUI_INT_ERROR_NONE) { @@ -650,6 +556,101 @@ err: return PUI_ERROR_INTERNAL; } +pui_error +pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat) +{ + return _pui_ani_control_with_force(ani_h, cmd, repeat, 0); +} + +static Eina_Bool +_cb_visibility_change(void *data, int type EINA_UNUSED, void *event) +{ + pui_ani_h ani_h = (pui_ani_h)data; + pui_ani_t *ani = ani_h->ani; + pui_h ph = ani_h->pui_handle; + + Ecore_Wl2_Event_Window_Visibility_Change *ev; + PUI_Event_Animation_Status *e = NULL; + + ev = event; + + /* check if this is needed */ + ph->visibility = !(ev->fully_obscured); + + if (ev->fully_obscured) + { + if (ani->status == PUI_ANI_STATUS_RUNNING) + { + pui_info("animation(%s) will be stopped as it lost its priority !\n", ani->id); + + _pui_ani_control_with_force(ani_h, PUI_ANI_CMD_STOP, 0, 1); + } + } + else + { + if (ani->status == PUI_ANI_STATUS_PAUSED) + { + e = (PUI_Event_Animation_Status *)calloc(1, sizeof(PUI_Event_Animation_Status)); + + if (!e) + { + pui_err("Failed to allocate memory for PUI Event !\n"); + return ECORE_CALLBACK_PASS_ON; + } + + e->ani_h = ani_h; + e->win = ev->win; + e->status = ani->status; + + if(ani->status == PUI_ANI_STATUS_PAUSED) + { + pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_RESUME event has been added.\n", ani_h->id); + ecore_event_add(PUI_EVENT_ANI_READY_TO_RESUME, e, NULL, ani_h); + } + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static void +_pui_ani_event_handlers_init(pui_ani_h ani_h) +{ + Ecore_Event_Handler *h = NULL; + + if (!ani_h) + { + pui_err("Invalid handle !\n"); + return; + } + + if (!ani_h->ecore_event_hdls) + ani_h->ecore_event_hdls = eina_array_new(1); + + h = ecore_event_handler_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, _cb_visibility_change, ani_h); + eina_array_push(ani_h->ecore_event_hdls, h); + +} + +static void +_pui_ani_event_handlers_shutdown(pui_ani_h ani_h) +{ + if (!ani_h) + { + pui_err("Invalid handle !\n"); + return; + } + + if (ani_h->ecore_event_hdls) + { + while (eina_array_count(ani_h->ecore_event_hdls)) + ecore_event_handler_del(eina_array_pop(ani_h->ecore_event_hdls)); + + eina_array_free(ani_h->ecore_event_hdls); + ani_h->ecore_event_hdls = NULL; + } +} + pui_ani_h pui_ani_create(pui_h handle, pui_id id) {