struct
{
int count;
+ tbm_format *formats;
+ } available_formats;
+
+ struct
+ {
+ int count;
tdm_client_output_mode *modes;
} available_modes;
if (private_voutput->available_modes.modes)
free(private_voutput->available_modes.modes);
+ if (private_voutput->available_formats.formats)
+ free(private_voutput->available_formats.formats);
+
wl_tdm_voutput_destroy(private_voutput->wl_voutput);
free(private_voutput);
}
tdm_error
+tdm_client_voutput_set_available_formats(tdm_client_voutput *voutput, const tbm_format *formats, const int count)
+{
+ tdm_private_client_voutput *private_voutput;
+
+ TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ if ((count > 0) && (formats == 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_formats.formats)
+ free(private_voutput->available_formats.formats);
+
+ private_voutput->available_formats.count = count;
+
+ if (count != 0)
+ {
+ private_voutput->available_formats.formats = calloc(count, sizeof(tbm_format));
+ memcpy(private_voutput->available_formats.formats, formats, sizeof(tbm_format) * count);
+ }
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error
tdm_client_voutput_set_physical_size(tdm_client_voutput *voutput, unsigned int mmWidth, unsigned int mmHeight)
{
tdm_private_client_voutput *private_voutput;
return TDM_ERROR_NONE;
}
+void
+_tdm_client_voutput_send_available_formats(tdm_private_client_voutput *private_voutput)
+{
+ tbm_format *format;
+ struct wl_array array;
+ int i, size;
+
+ size = sizeof(tbm_format);
+ wl_array_init(&array);
+ for (i = 0; i < private_voutput->available_formats.count; i++) {
+ format = wl_array_add(&array, size);
+ *format = private_voutput->available_formats.formats[i];
+ }
+ wl_tdm_voutput_set_available_formats(private_voutput->wl_voutput, &array);
+ wl_array_release(&array);
+}
+
tdm_error
tdm_client_output_connect(tdm_client_output *output)
{
modes[i].flags, modes[i].type,
modes[i].name);
}
+
+ _tdm_client_voutput_send_available_formats(private_voutput);
+
wl_tdm_voutput_set_physical_size(private_voutput->wl_voutput, private_voutput->mmwidth, private_voutput->mmheight);
wl_tdm_voutput_connect(private_voutput->wl_voutput);
tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_client_output_mode *modes, int count);
tdm_error
+tdm_client_voutput_set_available_formats(tdm_client_voutput *voutput, const tbm_format *formats, const int count);
+
+tdm_error
tdm_client_voutput_set_physical_size(tdm_client_voutput *voutput, unsigned int mmWidth, unsigned int mmHeight);
tdm_error
static tdm_client *client;
static tdm_client_voutput *voutput;
const int MODE_COUNT = 2;
+ const int FORMAT_COUNT = 2;
private:
static pid_t server_pid;
}
}
+
TEST_F(TDMVirtualOutput, SetAvailableModes)
{
tdm_error ret;
ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
}
+TEST_F(TDMVirtualOutput, SetAvailableFormats)
+{
+ const int nformats = 2;
+ tdm_error ret;
+ tbm_format formats[nformats];
+
+ formats[0] = TBM_FORMAT_ARGB8888;
+ formats[1] = TBM_FORMAT_XRGB8888;
+
+ ret = tdm_client_voutput_set_available_formats(this->voutput, formats, nformats);
+ ASSERT_EQ(ret, TDM_ERROR_NONE);
+}
+
TEST_F(TDMVirtualOutput, SetPhysicalSize)
{
tdm_error ret;
TEST_F(TDMVirtualOutput, Connect)
{
+ const int nformats = 2;
tdm_error ret;
tdm_client_output *output;
unsigned int mmWidth = 300, mmHeight = 150;
tdm_client_output_mode modes[this->MODE_COUNT];
+ tbm_format formats[nformats];
int count = this->MODE_COUNT;
output = tdm_client_voutput_get_client_output(this->voutput, &ret);
ret = tdm_client_voutput_set_available_modes(this->voutput, modes, count);
ASSERT_EQ(ret, TDM_ERROR_NONE);
+ formats[0] = TBM_FORMAT_ARGB8888;
+ formats[1] = TBM_FORMAT_XRGB8888;
+ ret = tdm_client_voutput_set_available_formats(this->voutput, formats, nformats);
+ ASSERT_EQ(ret, TDM_ERROR_NONE);
+
ret = tdm_client_output_connect(output);
ASSERT_EQ(ret, TDM_ERROR_NONE);
<arg name="name" type="string" summary=""/>
</request>
+ <request name="set_available_formats">
+ <arg name="formats" type="array"/>
+ </request>
+
<request name="set_physical_size">
<arg name="mmwidth" type="uint" summary=""/>
<arg name="mmheight" type="uint" summary=""/>
int count;
tdm_output_mode *modes;
} available_modes;
+ struct
+ {
+ int count;
+ tbm_format *formats;
+ } available_formats;
unsigned int mmwidth;
unsigned int mmheight;
}
static void
+_tdm_voutput_cb_set_available_formats(struct wl_client *client,
+ struct wl_resource *resource,
+ struct wl_array *formats)
+{
+ tdm_server_voutput_info *voutput_info;
+ tbm_format *f;
+ int count = 0, i = 0;
+
+ voutput_info = wl_resource_get_user_data(resource);
+
+ voutput_info->available_formats.count = 0;
+ if (voutput_info->available_formats.formats)
+ free(voutput_info->available_formats.formats);
+
+ wl_array_for_each(f, formats)
+ count++;
+
+ voutput_info->available_formats.formats = malloc(count * sizeof(tbm_format));
+ voutput_info->available_formats.count = count;
+
+ wl_array_for_each(f, formats)
+ voutput_info->available_formats.formats[i++] = *f;
+}
+
+static void
_tdm_voutput_cb_set_physical_size(struct wl_client *client, struct wl_resource *resource,
unsigned int mmwidth, unsigned int mmheight)
{
static const struct wl_tdm_voutput_interface tdm_voutput_implementation = {
_tdm_voutput_cb_destroy,
_tdm_voutput_cb_set_available_modes,
+ _tdm_voutput_cb_set_available_formats,
_tdm_voutput_cb_set_physical_size,
_tdm_voutput_cb_connect,
_tdm_voutput_cb_disconnect