+ wl_tdm_vblank_send_stamp(vblank_info->resource, vblank_info->stamp);
+
+ if (tdm_ttrace_module & TDM_TTRACE_CLIENT_VBLANK) {
+ tdm_output *output = tdm_display_get_output(private_loop->dpy, tdm_ttrace_output, NULL);
+ if (output == output_info->output)
+ wl_tdm_vblank_send_ttrace(vblank_info->resource, 1);
+ }
+
+ return;
+}
+
+/* LCOV_EXCL_START */
+static void
+_tdm_server_output_cb_watch_output_changes(struct wl_client *client, struct wl_resource *resource, unsigned int enable)
+{
+ tdm_server_output_info *output_info = wl_resource_get_user_data(resource);
+
+ TDM_RETURN_IF_FAIL(output_info != NULL);
+
+ output_info->watch_output_changes = enable;
+}
+/* LCOV_EXCL_STOP */
+
+static void
+_tdm_server_output_cb_get_connection(struct wl_client *client, struct wl_resource *resource)
+{
+ tdm_server_output_info *output_info = wl_resource_get_user_data(resource);
+ tdm_output_conn_status status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+ tdm_error ret;
+
+ TDM_RETURN_IF_FAIL(output_info != NULL);
+
+ ret = tdm_output_get_conn_status(output_info->output, &status);
+ TDM_GOTO_IF_FAIL(ret != TDM_ERROR_NONE, failed);
+
+ wl_tdm_output_send_connection(output_info->resource, status, ret);
+
+ return;
+
+failed:
+ wl_tdm_output_send_connection(output_info->resource, TDM_OUTPUT_CONN_STATUS_DISCONNECTED, ret);
+}
+
+static void
+_tdm_server_output_cb_get_mode(struct wl_client *client, struct wl_resource *resource)
+{
+ tdm_server_output_info *output_info = wl_resource_get_user_data(resource);
+ tdm_output_conn_status status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+ tdm_error ret;
+
+ TDM_RETURN_IF_FAIL(output_info != NULL);
+
+ ret = tdm_output_get_conn_status(output_info->output, &status);
+ TDM_GOTO_IF_FAIL(ret != TDM_ERROR_NONE, failed);
+
+ if (status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED) {
+ const tdm_output_mode *mode = NULL;
+ unsigned int hdisplay, vdisplay, vrefresh;
+
+ ret = tdm_output_get_mode(output_info->output, &mode);
+ TDM_GOTO_IF_FAIL(ret != TDM_ERROR_NONE, failed);
+
+ hdisplay = (mode) ? mode->hdisplay : 0;
+ vdisplay = (mode) ? mode->vdisplay : 0;
+ vrefresh = (mode) ? mode->vrefresh : 0;
+
+ wl_tdm_output_send_mode(output_info->resource, hdisplay, vdisplay, vrefresh, ret);
+ } else {
+ wl_tdm_output_send_mode(output_info->resource, 0, 0, 0, TDM_ERROR_OUTPUT_DISCONNECTED);
+ }
+