+tdm_output_add_change_handler(tdm_output *output,
+ tdm_output_change_handler func,
+ void *user_data)
+{
+ tdm_private_change_handler *change_handler;
+ OUTPUT_FUNC_ENTRY();
+
+ TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ pthread_mutex_lock(&private_display->lock);
+
+ if (!private_output->regist_change_cb) {
+ _pthread_mutex_unlock(&private_display->lock);
+ TDM_DBG("failed: not implemented!!");
+ return TDM_ERROR_NOT_IMPLEMENTED;
+ }
+
+ change_handler = calloc(1, sizeof(tdm_private_change_handler));
+ if (!change_handler) {
+ TDM_ERR("failed: alloc memory");
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_OUT_OF_MEMORY;
+ }
+
+ LIST_ADD(&change_handler->link, &private_output->change_handler_list);
+ change_handler->private_output = private_output;
+ change_handler->func = func;
+ change_handler->user_data = user_data;
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
+
+EXTERN void
+tdm_output_remove_change_handler(tdm_output *output,
+ tdm_output_change_handler func,
+ void *user_data)
+{
+ tdm_private_display *private_display;
+ tdm_private_output *private_output;
+ tdm_private_change_handler *h = NULL, *hh = NULL;
+
+ TDM_RETURN_IF_FAIL(output != NULL);
+ TDM_RETURN_IF_FAIL(func != NULL);
+
+ private_output = (tdm_private_output*)output;
+ private_display = private_output->private_display;
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ LIST_FOR_EACH_ENTRY_SAFE(h, hh, &private_output->change_handler_list, link) {
+ if (h->func != func || h->user_data != user_data)
+ continue;
+
+ LIST_DEL(&h->link);
+ free(h);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return;
+ }
+
+ _pthread_mutex_unlock(&private_display->lock);
+}
+
+EXTERN tdm_error