void *user_data);
/**
+ * @brief Remove the user vblank handler
+ * @param[in] output A output object
+ * @param[in] func A user vblank handler
+ * @param[in] user_data The user data
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ */
+tdm_error
+tdm_output_remove_vblank_handler(tdm_output *output, tdm_output_vblank_handler func, void *user_data);
+
+/**
+ * @brief Remove the user commit handler
+ * @param[in] output A output 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_output_remove_commit_handler(tdm_output *output, tdm_output_commit_handler func, void *user_data);
+
+/**
* @brief Set one of available modes of a output object
* @param[in] output A output object
* @param[in] mode A output mode
return ret;
}
+INTERN void
+tdm_output_remove_vblank_handler_internal(tdm_output *output, tdm_output_vblank_handler func, void *user_data)
+{
+ tdm_private_output *private_output = (tdm_private_output*)output;
+ tdm_private_vblank_handler *v = NULL;
+
+ TDM_RETURN_IF_FAIL(private_output != NULL);
+
+ LIST_FOR_EACH_ENTRY(v, &private_output->vblank_handler_list, link) {
+ if (v->func == func && v->user_data == user_data) {
+ /* only set func & user_data to NULL. It will be freed when an event occurs */
+ v->func = NULL;
+ v->user_data = NULL;
+ break;
+ }
+ }
+}
+
+INTERN void
+tdm_output_remove_commit_handler_internal(tdm_output *output, tdm_output_commit_handler func, void *user_data)
+{
+ tdm_private_output *private_output = (tdm_private_output*)output;
+ tdm_private_output_commit_handler *c = NULL;
+
+ TDM_RETURN_IF_FAIL(private_output != NULL);
+
+ LIST_FOR_EACH_ENTRY(c, &private_output->output_commit_handler_list, link) {
+ if (c->func == func && c->user_data == user_data) {
+ /* only set func & user_data to NULL. It will be freed when an event occurs */
+ c->func = NULL;
+ c->user_data = NULL;
+ break;
+ }
+ }
+}
+
+EXTERN tdm_error
+tdm_output_remove_vblank_handler(tdm_output *output, tdm_output_vblank_handler func, void *user_data)
+{
+ OUTPUT_FUNC_ENTRY();
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ tdm_output_remove_vblank_handler_internal(output, func, user_data);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
+
+EXTERN tdm_error
+tdm_output_remove_commit_handler(tdm_output *output, tdm_output_commit_handler func, void *user_data)
+{
+ OUTPUT_FUNC_ENTRY();
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ tdm_output_remove_commit_handler_internal(output, func, user_data);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
+
INTERN tdm_error
tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
{
tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value);
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_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer);
void