virtual:add virtual output create/destroy
[platform/core/uifw/libtdm.git] / backends / virtual / tdm_virtual_display.c
index 185f10d..9bf7363 100644 (file)
@@ -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;