-static tdm_error
-_tdm_output_dpms_changed_timeout(void *user_data)
-{
- tdm_private_output *private_output = user_data;
- tdm_value value;
-
- value.u32 = private_output->current_dpms_value;
- tdm_output_call_change_handler_internal(private_output,
- &private_output->change_handler_list_sub,
- TDM_OUTPUT_CHANGE_DPMS,
- value, 0);
-
- return TDM_ERROR_NONE;
-}
-
-static tdm_error
-tdm_output_call_dpms_change_handler(tdm_output *output)
-{
- tdm_private_output *private_output = (tdm_private_output*)output;
- tdm_value value;
-
- /** Use timer to call the output change callback of the sub-thread.
- * The output change callback of tdm_server and tdm_vblank was called
- * in the main thread. And it made the multi thread issue. If we use
- * the timer, we can call the sub-thread's output change callback in
- * sub-thread.
- */
- if (!private_output->dpms_changed_timer) {
- private_output->dpms_changed_timer =
- tdm_event_loop_add_timer_handler(private_output->private_display,
- _tdm_output_dpms_changed_timeout, private_output, NULL);
- if (!private_output->dpms_changed_timer) {
- /* LCOV_EXCL_START */
- TDM_ERR("can't create dpms timer!!");
- return TDM_ERROR_OUT_OF_MEMORY;
- /* LCOV_EXCL_STOP */
- }
- }
-
- value.u32 = private_output->current_dpms_value;
- tdm_output_call_change_handler_internal(private_output,
- &private_output->change_handler_list_main,
- TDM_OUTPUT_CHANGE_DPMS,
- value, 0);
-
- if (!LIST_IS_EMPTY(&private_output->change_handler_list_sub)) {
- tdm_error ret = tdm_event_loop_source_timer_update(private_output->dpms_changed_timer, 1);
- if (ret != TDM_ERROR_NONE)
- TDM_NEVER_GET_HERE();
- }
-
- return TDM_ERROR_NONE;
-}
-
-/* LCOV_EXCL_START */
-INTERN void
-tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_data)
-{
- tdm_private_display *private_display;
- tdm_private_output *private_output = user_data;
- tdm_value value;
-
- TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
- TDM_RETURN_IF_FAIL(private_output);
-
- private_display = private_output->private_display;
-
- if (!tdm_thread_in_display_thread(syscall(SYS_gettid))) {
- tdm_thread_cb_output_dpms output_dpms;
- tdm_error ret;
-
- _tdm_output_update(output_backend, user_data);
-
- output_dpms.base.type = TDM_THREAD_CB_OUTPUT_DPMS;
- output_dpms.base.length = sizeof output_dpms;
- output_dpms.output_stamp = private_output->stamp;
- output_dpms.dpms = dpms;
- output_dpms.user_data = user_data;
-
- value.u32 = dpms;
- tdm_output_call_change_handler_internal(private_output,
- &private_output->change_handler_list_sub,
- TDM_OUTPUT_CHANGE_DPMS,
- value, 0);
-
- ret = tdm_thread_send_cb(private_display->private_loop, &output_dpms.base);
- TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
-
- return;
- }
-
- private_output->current_dpms_value = dpms;
- private_output->waiting_dpms_change = 0;
-
- TDM_INFO("output(%d) dpms async '%s' done", private_output->pipe, tdm_dpms_str(dpms));
-
- value.u32 = dpms;
- tdm_output_call_change_handler_internal(private_output,
- &private_output->change_handler_list_main,
- TDM_OUTPUT_CHANGE_DPMS,
- value, 0);
-}
-/* LCOV_EXCL_STOP */
-