virtual: implementations for virtual output
[platform/core/uifw/libtdm.git] / src / tdm_server.c
index 12896d5..d035a1d 100644 (file)
@@ -196,6 +196,8 @@ _tdm_server_cb_output_change(tdm_output *output, tdm_output_change_type type,
        tdm_server_output_info *output_info = user_data;
        struct wl_client *client;
        pid_t pid = 0;
+       tdm_output_conn_status status;
+       tdm_error ret = TDM_ERROR_NONE;
 
        TDM_RETURN_IF_FAIL(output_info != NULL);
 
@@ -209,13 +211,29 @@ _tdm_server_cb_output_change(tdm_output *output, tdm_output_change_type type,
                return;
        }
 
-       TDM_DBG("send the output changes: %d", (unsigned int)pid);
+       TDM_DBG("send the output changes: %d, type:%d, value:%d", (unsigned int)pid, type, value.u32);
 
        switch (type) {
        case TDM_OUTPUT_CHANGE_DPMS:
                wl_tdm_output_send_dpms(output_info->resource, value.u32, TDM_ERROR_NONE);
                break;
        case TDM_OUTPUT_CHANGE_CONNECTION:
+               status = value.u32;
+               if (status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED) {
+                       const tdm_output_mode *mode = NULL;
+                       unsigned int hdisplay, vdisplay, vrefresh;
+
+                       ret = tdm_output_get_mode(output_info->output, &mode);
+                       if (ret == TDM_ERROR_NONE) {
+                               hdisplay = (mode) ? mode->hdisplay : 0;
+                               vdisplay = (mode) ? mode->vdisplay : 0;
+                               vrefresh = (mode) ? mode->vrefresh : 0;
+
+                               wl_tdm_output_send_mode(output_info->resource, hdisplay, vdisplay, vrefresh, ret);
+                       } else {
+                               wl_tdm_output_send_mode(output_info->resource, 0, 0, 0, ret);
+                       }
+               }
                wl_tdm_output_send_connection(output_info->resource, value.u32, TDM_ERROR_NONE);
                break;
        default:
@@ -718,32 +736,99 @@ _tdm_voutput_cb_set_available_modes(struct wl_client *client,
                                                                        struct wl_resource *resource,
                                                                        struct wl_array *modes)
 {
-       /* TODO */
+       tdm_server_voutput_info *voutput_info;
+       tdm_output_mode *mode;
+       int size, count = 0, i = 0;
+
+       voutput_info = wl_resource_get_user_data(resource);
+
+       voutput_info->available_modes.count = 0;
+       if (voutput_info->available_modes.modes)
+               free(voutput_info->available_modes.modes);
+
+       wl_array_for_each(mode, modes)
+               count++;
+       size = sizeof(tdm_output_mode);
+
+       voutput_info->available_modes.modes = malloc(count * size);
+       voutput_info->available_modes.count = count;
+
+       wl_array_for_each(mode, modes)
+               memcpy(&voutput_info->available_modes.modes[i++], mode, size);
 }
 
 static void
 _tdm_voutput_cb_set_physical_size(struct wl_client *client, struct wl_resource *resource,
                                                                  unsigned int mmwidth, unsigned int mmheight)
 {
-       /* TODO */
+       tdm_server_voutput_info *voutput_info;
+
+       voutput_info = wl_resource_get_user_data(resource);
+
+       voutput_info->mmwidth = mmwidth;
+       voutput_info->mmheight = mmheight;
 }
 
 static void
 _tdm_voutput_cb_set_mode(struct wl_client *client, struct wl_resource *resource, unsigned int index)
 {
-       /* TODO */
+       tdm_server_voutput_info *voutput_info = NULL;
+       tdm_output *output = NULL;
+       tdm_output_conn_status status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+       const tdm_output_mode *modes, *mode;
+
+       int count = 0;
+       tdm_error ret;
+
+       voutput_info = wl_resource_get_user_data(resource);
+       TDM_RETURN_IF_FAIL(voutput_info != NULL);
+       output = voutput_info->output;
+
+       ret = tdm_output_get_conn_status(output, &status);
+       TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE);
+       TDM_RETURN_IF_FAIL(status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED);
+
+       ret = tdm_output_get_available_modes(output, &modes, &count);
+       TDM_RETURN_IF_FAIL(index < count);
+
+       mode = &modes[index];
+       TDM_DBG("mode set request to index:%d (%dx%d, %d)", index, mode->hdisplay, mode->vdisplay, mode->vrefresh);
+
+       ret = tdm_output_set_mode(output, mode);
+       TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE);
+
+       tdm_output_request_mode_set(voutput_info->output, index);
 }
 
 static void
 _tdm_voutput_cb_connect(struct wl_client *client, struct wl_resource *resource)
 {
-       /* TODO */
+       tdm_server_voutput_info *voutput_info;
+
+       voutput_info = wl_resource_get_user_data(resource);
+       voutput_info->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+
+       tdm_voutput_set_physical_size(voutput_info->voutput, voutput_info->mmwidth, voutput_info->mmheight);
+       tdm_voutput_set_available_mode(voutput_info->voutput, voutput_info->available_modes.modes, voutput_info->available_modes.count);
+       tdm_voutput_connect(voutput_info->voutput);
 }
 
 static void
 _tdm_voutput_cb_disconnect(struct wl_client *client, struct wl_resource *resource)
 {
-       /* TODO */
+       tdm_server_voutput_info *voutput_info;
+
+       voutput_info = wl_resource_get_user_data(resource);
+       voutput_info->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+       /* Do free resources when it's being disconnected */
+       free(voutput_info->available_modes.modes);
+       voutput_info->available_modes.modes = NULL;
+       voutput_info->available_modes.count = 0;
+       voutput_info->mmwidth = 0;
+       voutput_info->mmheight = 0;
+
+       tdm_voutput_disconnect(voutput_info->voutput);
 }
 
 static void