X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=backends%2Fvirtual%2Ftdm_virtual_display.c;h=9bf73635f6fc3570f8da92d467e66d159f1abdff;hb=7e1f4f71006d85a16303b0b70e5b9d0e45b7e9ec;hp=185f10d78824fa61111e6512e4f52de2c2fe17cf;hpb=eca0e8c8a3a8b1a4b27823a87a35f81044f10a77;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/backends/virtual/tdm_virtual_display.c b/backends/virtual/tdm_virtual_display.c index 185f10d..9bf7363 100644 --- a/backends/virtual/tdm_virtual_display.c +++ b/backends/virtual/tdm_virtual_display.c @@ -29,6 +29,7 @@ struct _tdm_virtual_output_data { uint32_t pipe; tdm_output_mode *output_mode; + int mode_count; tdm_output_type connector_type; struct list_head layer_list; tdm_virtual_layer_data *primary_layer; @@ -45,6 +46,11 @@ struct _tdm_virtual_output_data { tdm_event_loop_source *timer; unsigned int timer_waiting; struct list_head timer_event_list; + + unsigned int mmwidth; + unsigned int mmheight; + + char name[TDM_NAME_LEN]; /**< The output name */ }; struct _tdm_virtual_layer_data { @@ -233,7 +239,7 @@ tdm_virtual_display_create_output_list(tdm_virtual_data *virtual_data) output_data->virtual_data = virtual_data; output_data->pipe = 0; output_data->connector_type = TDM_OUTPUT_TYPE_Unknown; - output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED; + output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; output_data->output_mode = calloc(1, sizeof(tdm_output_mode)); if (!output_data->output_mode) { @@ -351,6 +357,131 @@ virtual_display_handle_events(tdm_backend_data *bdata) return TDM_ERROR_NONE; } +tdm_output * +virtual_display_output_create(tdm_backend_data *bdata, const char *name, tdm_error *error) +{ + tdm_virtual_data *virtual_data = bdata; + tdm_virtual_output_data *output_data = NULL; + tdm_virtual_layer_data *layer_data = NULL; + tdm_error ret; + + if (!virtual_data || !name) { + TDM_ERR("invalid parameter"); + *error = TDM_ERROR_INVALID_PARAMETER; + return NULL; + } + + output_data = calloc(1, sizeof(tdm_virtual_output_data)); + if (!output_data) { + TDM_ERR("alloc failed"); + *error = TDM_ERROR_OUT_OF_MEMORY; + return NULL; + } + + LIST_INITHEAD(&output_data->layer_list); + + output_data->virtual_data = virtual_data; + output_data->pipe = 0; + output_data->connector_type = TDM_OUTPUT_TYPE_Unknown; + output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; + + if (name) + snprintf(output_data->name, TDM_NAME_LEN, "%s", name); + else + snprintf(output_data->name, TDM_NAME_LEN, "unknown"); +#if 0 + output_data->output_mode = calloc(1, sizeof(tdm_output_mode)); + if (!output_data->output_mode) { + TDM_ERR("alloc failed"); + ret = TDM_ERROR_OUT_OF_MEMORY; + goto create_fail; + } + + snprintf(output_data->output_mode->name, TDM_NAME_LEN, "640x480"); + output_data->output_mode->vrefresh = 30; + output_data->output_mode->clock = 25200; + output_data->output_mode->hdisplay = 640; + output_data->output_mode->hsync_start = 656; + output_data->output_mode->hsync_end = 752; + output_data->output_mode->htotal = 800; + output_data->output_mode->hskew = 0; + output_data->output_mode->vdisplay = 480; + output_data->output_mode->vsync_start = 490; + output_data->output_mode->vsync_end = 492; + output_data->output_mode->vtotal = 525; + output_data->output_mode->vscan = 0; + output_data->output_mode->flags = 0; + output_data->output_mode->type = 0; + + output_data->mode_count = 1; +#endif + output_data->timer = tdm_event_loop_add_timer_handler(virtual_data->dpy, + _tdm_virtual_display_cb_timeout, + output_data, + &ret); + if (!output_data->timer) goto create_fail; + + LIST_INITHEAD(&output_data->timer_event_list); + + /* The TDM virtual backend output support only one layer. */ + layer_data = calloc(1, sizeof(tdm_virtual_layer_data)); + if (!layer_data) { + TDM_ERR("alloc failed"); + ret = TDM_ERROR_OUT_OF_MEMORY; + goto create_fail; + } + + layer_data->virtual_data = virtual_data; + layer_data->output_data = output_data; + layer_data->zpos = 0; + + layer_data->capabilities = TDM_LAYER_CAPABILITY_PRIMARY | TDM_LAYER_CAPABILITY_GRAPHIC; + output_data->primary_layer = layer_data; + + LIST_ADDTAIL(&layer_data->link, &output_data->layer_list); + + ret = tdm_backend_register_output(virtual_data->dpy, output_data); + GOTO_IF_FAIL(ret == TDM_ERROR_NONE, create_fail); + + *error = TDM_ERROR_NONE; + + return output_data; + +create_fail: + if (layer_data) free(layer_data); + if (output_data->output_mode) free(output_data->output_mode); + free(output_data); + + *error = ret; + + return NULL; +} + +tdm_error +virtual_display_output_destroy(tdm_backend_data *bdata, tdm_output *output) +{ + tdm_virtual_data *virtual_data = bdata; + tdm_virtual_output_data *o, *output_data = output; + int find = 0; + + RETURN_VAL_IF_FAIL(virtual_data, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER); + + LIST_FOR_EACH_ENTRY(o, &virtual_data->output_list, link) { + if (o == output_data) { + find = 1; + break; + } + } + + if (find) + tdm_backend_unregister_output(virtual_data->dpy, output); + else + return TDM_ERROR_INVALID_PARAMETER; + + return TDM_ERROR_NONE; +} + tdm_error virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps) { @@ -364,24 +495,26 @@ virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps) snprintf(caps->maker, TDM_NAME_LEN, "virtual"); snprintf(caps->model, TDM_NAME_LEN, "virtual"); - snprintf(caps->name, TDM_NAME_LEN, "virtual"); + snprintf(caps->name, TDM_NAME_LEN, "%s", output_data->name); caps->status = output_data->status; caps->type = output_data->connector_type; caps->type_id = 0; - caps->mode_count = 1; - caps->modes = calloc(1, sizeof(tdm_output_mode)); - if (!caps->modes) { - ret = TDM_ERROR_OUT_OF_MEMORY; - TDM_ERR("alloc failed\n"); - goto failed_get; - } + caps->mode_count = output_data->mode_count; + if (output_data->mode_count != 0) { + caps->modes = calloc(output_data->mode_count, sizeof(tdm_output_mode)); + if (!caps->modes) { + ret = TDM_ERROR_OUT_OF_MEMORY; + TDM_ERR("alloc failed\n"); + goto failed_get; + } - *caps->modes = *output_data->output_mode; + *caps->modes = *output_data->output_mode; + } - caps->mmWidth = 640; - caps->mmHeight = 480; + caps->mmWidth = output_data->mmwidth; + caps->mmHeight =output_data->mmheight; caps->subpixel = 1; caps->min_w = -1;