*format = private_voutput->available_formats.formats[i];
}
wl_tdm_voutput_set_available_formats(private_voutput->wl_voutput, &array);
+ wl_array_release(&array);
+}
+
+void
+_tdm_client_voutput_send_available_modes(tdm_private_client_voutput *private_voutput)
+{
+ tdm_client_output_mode *modes, *mode;
+ struct wl_array array;
+ int i, size;
+
+ modes = private_voutput->available_modes.modes;
+ size = sizeof(tdm_client_output_mode);
+
+ wl_array_init(&array);
+ for (i = 0; i < private_voutput->available_modes.count; i++) {
+ mode = wl_array_add(&array, size);
+ memcpy(mode, &modes[i], size);
+ }
+ wl_tdm_voutput_set_available_modes(private_voutput->wl_voutput, &array);
wl_array_release(&array);
}
{
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->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);
- }
-
+ _tdm_client_voutput_send_available_modes(private_voutput);
_tdm_client_voutput_send_available_formats(private_voutput);
wl_tdm_voutput_set_physical_size(private_voutput->wl_voutput, private_voutput->mmwidth, private_voutput->mmheight);
<request name="destroy" type="destructor"/>
<request name="set_available_modes">
- <arg name="index" type="uint" summary=""/>
- <arg name="clock" type="uint" summary=""/>
- <arg name="hdisplay" type="uint" summary=""/>
- <arg name="hsync_start" type="uint" summary=""/>
- <arg name="hsync_end" type="uint" summary=""/>
- <arg name="htotal" type="uint" summary=""/>
- <arg name="hskew" type="uint" summary=""/>
- <arg name="vdisplay" type="uint" summary=""/>
- <arg name="vsync_start" type="uint" summary=""/>
- <arg name="vsync_end" type="uint" summary=""/>
- <arg name="vtotal" type="uint" summary=""/>
- <arg name="vscan" type="uint" summary=""/>
- <arg name="vrefresh" type="uint" summary=""/>
- <arg name="flags" type="uint" summary=""/>
- <arg name="type" type="uint" summary=""/>
- <arg name="name" type="string" summary=""/>
+ <arg name="modes" type="array"/>
</request>
<request name="set_available_formats">
static void
_tdm_voutput_cb_set_available_modes(struct wl_client *client,
struct wl_resource *resource,
- uint32_t index,
- uint32_t clock,
- uint32_t hdisplay,
- uint32_t hsync_start,
- uint32_t hsync_end,
- uint32_t htotal,
- uint32_t hskew,
- uint32_t vdisplay,
- uint32_t vsync_start,
- uint32_t vsync_end,
- uint32_t vtotal,
- uint32_t vscan,
- uint32_t vrefresh,
- uint32_t flags,
- uint32_t type,
- const char *name)
+ struct wl_array *modes)
{
tdm_server_voutput_info *voutput_info;
- tdm_output_mode *tmp_modes, *old_modes;
- tdm_output_mode *new_mode;
- int count, len;
+ tdm_output_mode *mode;
+ int size, count = 0, i = 0;
voutput_info = wl_resource_get_user_data(resource);
- count = voutput_info->available_modes.count;
- old_modes = voutput_info->available_modes.modes;
- if (index >= count) {
- if (count > 0) {
- tmp_modes = malloc(count * sizeof(*tmp_modes));
- memcpy(tmp_modes, old_modes, count * sizeof(tdm_output_mode));
- }
+ voutput_info->available_modes.count = 0;
+ if (voutput_info->available_modes.modes)
+ free(voutput_info->available_modes.modes);
- voutput_info->available_modes.count = index + 1;
- voutput_info->available_modes.modes =
- realloc(voutput_info->available_modes.modes,
- sizeof(tdm_output_mode) * (index + 1));
+ wl_array_for_each(mode, modes)
+ count++;
+ size = sizeof(tdm_output_mode);
- if (count > 0) {
- memcpy(voutput_info->available_modes.modes, tmp_modes, count * sizeof(tdm_output_mode));
- free(tmp_modes);
- }
- }
+ voutput_info->available_modes.modes = malloc(count * size);
+ voutput_info->available_modes.count = count;
- new_mode = &voutput_info->available_modes.modes[index];
- new_mode->clock = clock;
- new_mode->hdisplay = hdisplay;
- new_mode->hsync_start = hsync_start;
- new_mode->hsync_end = hsync_end;
- new_mode->htotal = htotal;
- new_mode->hskew= hskew;
- new_mode->vdisplay= vdisplay;
- new_mode->vsync_start= vsync_start;
- new_mode->vsync_end = vsync_end;
- new_mode->vtotal = vtotal;
- new_mode->vscan = vscan;
- new_mode->vrefresh = vrefresh;
- new_mode->flags = flags;
- new_mode->type = type;
-
- len = strlen(name);
- strncpy(new_mode->name, name, len);
- new_mode->name[len] = '\0';
+ wl_array_for_each(mode, modes)
+ memcpy(&voutput_info->available_modes.modes[i++], mode, size);
}
static void