typedef struct _tdm_private_client_voutput {
tdm_private_client_output base;
struct wl_tdm_voutput *wl_voutput;
+
+ struct
+ {
+ int count;
+ tdm_client_output_mode *modes;
+ } available_modes;
+
uint32_t msg;
} tdm_private_client_voutput;
private_voutput->base.private_client = private_client;
- snprintf(private_voutput->base.name, TDM_NAME_LEN, "%s", name);
private_voutput->wl_voutput = wl_tdm_create_voutput((struct wl_tdm *)wrapper, private_voutput->base.name);
wl_proxy_wrapper_destroy(wrapper);
if (!private_voutput->wl_voutput) {
if (!private_voutput)
return;
+ wl_tdm_voutput_destroy(private_voutput->wl_voutput);
+
free(private_voutput);
}
tdm_error
tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_client_output_mode *modes, int count)
{
+ tdm_private_client_voutput *private_voutput;
+
TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
- TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
- TDM_RETURN_VAL_IF_FAIL(count > 0, TDM_ERROR_INVALID_PARAMETER);
+
+ if ((count > 0) && (modes == NULL))
+ return TDM_ERROR_INVALID_PARAMETER;
+
+ private_voutput = (tdm_private_client_voutput *)voutput;
+
+ if (private_voutput->base.connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
+ return TDM_ERROR_BAD_REQUEST;
+
+ if (private_voutput->available_modes.modes)
+ free(private_voutput->available_modes.modes);
+
+ private_voutput->available_modes.count = count;
+
+ if (count != 0)
+ {
+ private_voutput->available_modes.modes = calloc(count, sizeof(tdm_client_output_mode));
+ memcpy(private_voutput->available_modes.modes, modes, sizeof(tdm_client_output_mode) * count);
+ }
return TDM_ERROR_NONE;
}
tdm_error
tdm_client_output_connect(tdm_client_output *output)
{
+ tdm_private_client_output *private_output;
+ tdm_private_client_voutput *private_voutput;
+ tdm_client_output_mode *modes;
+ int i;
+
TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+ private_output = (tdm_private_client_output *)output;
+ private_voutput = (tdm_private_client_voutput *)output;
+
+ TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_CONNECTED,
+ TDM_ERROR_BAD_REQUEST);
+
+ private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+
+ modes = private_voutput->available_modes.modes;
+ for (i = 0; i < private_voutput->available_modes.count; i++)
+ {
+ wl_tdm_voutput_set_available_modes(private_voutput->wl_voutput, i,
+ modes[i].clock, modes[i].hdisplay,
+ modes[i].hsync_start, modes[i].hsync_end,
+ modes[i].htotal, modes[i].hskew,
+ modes[i].vdisplay, modes[i].vsync_start,
+ modes[i].vsync_end, modes[i].vtotal,
+ modes[i].vscan, modes[i].vrefresh,
+ modes[i].flags, modes[i].type,
+ modes[i].name);
+ }
+
+ wl_tdm_voutput_connect(private_voutput->wl_voutput);
+
return TDM_ERROR_NONE;
}
tdm_error
tdm_client_output_disconnect(tdm_client_output *output)
{
+ tdm_private_client_voutput *private_voutput;
+ tdm_private_client_output *private_output;
+
TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ private_output = (tdm_private_client_output *)output;
+ private_voutput = (tdm_private_client_voutput *)output;
+
+ TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_DISCONNECTED,
+ TDM_ERROR_BAD_REQUEST);
+
+ private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+ wl_tdm_voutput_disconnect(private_voutput->wl_voutput);
+
return TDM_ERROR_NONE;
}