layer: support to remove the commit handler 59/117759/1
authorBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 09:43:18 +0000 (18:43 +0900)
committerBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 09:43:18 +0000 (18:43 +0900)
Change-Id: I732e0ffbe44b47d195fcec3ecbff3b2221e6de09

include/tdm.h
src/tdm_layer.c
src/tdm_private.h

index 3d17d4b..63700a7 100644 (file)
@@ -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.
index 070e485..a0ce0c0 100644 (file)
@@ -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)
 {
index 13e0610..2a92f24 100644 (file)
@@ -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);