From: Boram Park Date: Tue, 7 Mar 2017 09:43:18 +0000 (+0900) Subject: layer: support to remove the commit handler X-Git-Tag: accepted/tizen/3.0/common/20170308.133916~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a2d43b6b32d6246ec71bb611a69fbe0031196c89;p=platform%2Fcore%2Fuifw%2Flibtdm.git layer: support to remove the commit handler Change-Id: I732e0ffbe44b47d195fcec3ecbff3b2221e6de09 --- diff --git a/include/tdm.h b/include/tdm.h index 3d17d4b..63700a7 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -686,6 +686,16 @@ tdm_error tdm_layer_is_committing(tdm_layer *layer, unsigned int *committing); /** + * @brief Remove the user commit handler + * @param[in] layer A layer object + * @param[in] func A user commit handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_layer_remove_commit_handler(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data); + +/** * @brief Get a displaying TDM buffer from a layer object * @details A displaying TDM buffer is a current showing buffer on screen * that is set to layer object and applied output object of a layer object. diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 070e485..a0ce0c0 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -862,6 +862,50 @@ tdm_layer_is_committing(tdm_layer *layer, unsigned int *committing) return ret; } +INTERN void +tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data) +{ + tdm_private_layer *private_layer = (tdm_private_layer*)layer; + tdm_private_output *private_output = private_layer->private_output; + tdm_private_layer_commit_handler *lm = NULL, *lmm = NULL; + + TDM_RETURN_IF_FAIL(private_layer != NULL); + + LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->layer_commit_handler_list, link) { + if (lm->func == func && lm->user_data == user_data) { + LIST_DEL(&lm->link); + tdm_output_remove_commit_handler_internal(private_output, _tdm_layer_cb_output_commit, lm); + _tdm_layer_free_buffer(private_layer, lm->committed_buffer); + free(lm); + break; + } + } + + LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->pending_commit_handler_list, link) { + if (lm->func == func && lm->user_data == user_data) { + LIST_DEL(&lm->link); + tdm_output_remove_commit_handler_internal(private_output, _tdm_layer_cb_output_commit, lm); + _tdm_layer_free_buffer(private_layer, lm->committed_buffer); + free(lm); + break; + } + } +} + +EXTERN tdm_error +tdm_layer_remove_commit_handler(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data) +{ + LAYER_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + tdm_layer_remove_commit_handler_internal(layer, func, user_data); + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + EXTERN tbm_surface_h tdm_layer_get_displaying_buffer(tdm_layer *layer, tdm_error *error) { diff --git a/src/tdm_private.h b/src/tdm_private.h index 13e0610..2a92f24 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -431,6 +431,8 @@ void tdm_output_remove_vblank_handler_internal(tdm_output *output, tdm_output_vblank_handler func, void *user_data); void tdm_output_remove_commit_handler_internal(tdm_output *output, tdm_output_commit_handler func, void *user_data); +void +tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data); void tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer);