virtual: add set_available_mode & set_phsycal_size function
[platform/core/uifw/libtdm.git] / backends / virtual / tdm_virtual_display.c
index 9bf7363..2288a72 100644 (file)
@@ -28,7 +28,7 @@ struct _tdm_virtual_output_data {
        tdm_virtual_data *virtual_data;
 
        uint32_t pipe;
-       tdm_output_mode *output_mode;
+       tdm_output_mode *output_modes;
        int mode_count;
        tdm_output_type connector_type;
        struct list_head layer_list;
@@ -122,14 +122,14 @@ _tdm_virtual_display_wait_vblank(tdm_virtual_output_data *output_data, int inter
        unsigned int ms;
 
        RETURN_VAL_IF_FAIL(output_data->timer != NULL, TDM_ERROR_OPERATION_FAILED);
-       RETURN_VAL_IF_FAIL(output_data->output_mode->vrefresh > 0, TDM_ERROR_OPERATION_FAILED);
+       RETURN_VAL_IF_FAIL(output_data->current_mode->vrefresh > 0, TDM_ERROR_OPERATION_FAILED);
 
        if (output_data->timer_waiting) {
                LIST_ADDTAIL(&event_data->link, &output_data->timer_event_list);
                return TDM_ERROR_NONE;
        }
 
-       ms = ((double)1000.0 / output_data->output_mode->vrefresh) * interval;
+       ms = ((double)1000.0 / output_data->current_mode->vrefresh) * interval;
 
        ret = tdm_event_loop_source_timer_update(output_data->timer, ms);
        if (ret != TDM_ERROR_NONE)
@@ -214,7 +214,7 @@ tdm_virtual_display_destroy_output_list(tdm_virtual_data *virtual_data)
                if (o->timer)
                        tdm_event_loop_source_remove(o->timer);
 
-               free(o->output_mode);
+               free(o->output_modes);
                free(o);
        }
 }
@@ -241,29 +241,29 @@ tdm_virtual_display_create_output_list(tdm_virtual_data *virtual_data)
        output_data->connector_type = TDM_OUTPUT_TYPE_Unknown;
        output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
 
-       output_data->output_mode = calloc(1, sizeof(tdm_output_mode));
-       if (!output_data->output_mode) {
+       output_data->output_modes = calloc(1, sizeof(tdm_output_mode));
+       if (!output_data->output_modes) {
                TDM_ERR("alloc failed");
                free(output_data);
                ret = TDM_ERROR_OUT_OF_MEMORY;
                goto failed_create;
        }
 
-       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;
+       snprintf(output_data->output_modes->name, TDM_NAME_LEN, "640x480");
+       output_data->output_modes->vrefresh = 30;
+       output_data->output_modes->clock = 25200;
+       output_data->output_modes->hdisplay = 640;
+       output_data->output_modes->hsync_start = 656;
+       output_data->output_modes->hsync_end = 752;
+       output_data->output_modes->htotal = 800;
+       output_data->output_modes->hskew = 0;
+       output_data->output_modes->vdisplay = 480;
+       output_data->output_modes->vsync_start = 490;
+       output_data->output_modes->vsync_end = 492;
+       output_data->output_modes->vtotal = 525;
+       output_data->output_modes->vscan = 0;
+       output_data->output_modes->flags = 0;
+       output_data->output_modes->type = 0;
 
        output_data->timer = tdm_event_loop_add_timer_handler(virtual_data->dpy,
                                                                                                                  _tdm_virtual_display_cb_timeout,
@@ -390,28 +390,28 @@ virtual_display_output_create(tdm_backend_data *bdata, const char *name, tdm_err
        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) {
+       output_data->output_modes = calloc(1, sizeof(tdm_output_mode));
+       if (!output_data->output_modes) {
                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;
+       snprintf(output_data->output_modes->name, TDM_NAME_LEN, "640x480");
+       output_data->output_modes->vrefresh = 30;
+       output_data->output_modes->clock = 25200;
+       output_data->output_modes->hdisplay = 640;
+       output_data->output_modes->hsync_start = 656;
+       output_data->output_modes->hsync_end = 752;
+       output_data->output_modes->htotal = 800;
+       output_data->output_modes->hskew = 0;
+       output_data->output_modes->vdisplay = 480;
+       output_data->output_modes->vsync_start = 490;
+       output_data->output_modes->vsync_end = 492;
+       output_data->output_modes->vtotal = 525;
+       output_data->output_modes->vscan = 0;
+       output_data->output_modes->flags = 0;
+       output_data->output_modes->type = 0;
 
        output_data->mode_count = 1;
 #endif
@@ -449,7 +449,7 @@ virtual_display_output_create(tdm_backend_data *bdata, const char *name, tdm_err
 
 create_fail:
        if (layer_data) free(layer_data);
-       if (output_data->output_mode) free(output_data->output_mode);
+       if (output_data->output_modes) free(output_data->output_modes);
        free(output_data);
 
        *error = ret;
@@ -474,8 +474,11 @@ virtual_display_output_destroy(tdm_backend_data *bdata, tdm_output *output)
                }
        }
 
-       if (find)
+       if (find) {
+               if (output_data->output_modes)
+                       free(output_data->output_modes);
                tdm_backend_unregister_output(virtual_data->dpy, output);
+       }
        else
                return TDM_ERROR_INVALID_PARAMETER;
 
@@ -510,7 +513,7 @@ virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps)
                        goto failed_get;
                }
 
-               *caps->modes = *output_data->output_mode;
+               *caps->modes = *output_data->output_modes;
        }
 
        caps->mmWidth = output_data->mmwidth;
@@ -685,6 +688,46 @@ virtual_output_get_mode(tdm_output *output, const tdm_output_mode **mode)
 }
 
 tdm_error
+virtual_output_set_available_mode(tdm_output *output, const tdm_output_mode *modes, int count)
+{
+       tdm_virtual_output_data *output_data = output;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(modes, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(count > 0, TDM_ERROR_INVALID_PARAMETER);
+
+       /* set available mode only permittied disconnect status */
+       RETURN_VAL_IF_FAIL(output_data->status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED, TDM_ERROR_BUSY);
+
+       if (output_data->output_modes)
+               free(output_data->output_modes);
+       output_data->output_modes = NULL;
+
+       output_data->output_modes = calloc(1, count * sizeof(tdm_output_mode));
+       RETURN_VAL_IF_FAIL(output_data->output_modes != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
+       memcpy(output_data->output_modes, modes, count * sizeof(tdm_output_mode));
+       output_data->mode_count = count;
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+virtual_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight)
+{
+       tdm_virtual_output_data *output_data = output;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(mmwidth != 0, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(mmheight != 0, TDM_ERROR_INVALID_PARAMETER);
+
+       output_data->mmwidth = mmwidth;
+       output_data->mmheight = mmheight;
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
 virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
 {
        tdm_virtual_layer_data *layer_data = layer;