virtual: add tdm_voutput_connect & disconnect 26/184826/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Mon, 23 Jul 2018 11:35:02 +0000 (20:35 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Mon, 23 Jul 2018 11:35:29 +0000 (20:35 +0900)
Change-Id: Ia80b476627ff79ff3eac2e3187aa8e8577a7cf6b
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
backends/virtual/tdm_virtual.c
backends/virtual/tdm_virtual.h
backends/virtual/tdm_virtual_display.c
include/tdm_backend.h
src/tdm_output.c
src/tdm_private.h
src/tdm_server.c

index 426feaf..1b96a4c 100644 (file)
@@ -77,6 +77,9 @@ tdm_virtual_init(tdm_display *dpy, tdm_error *error)
        virtual_func_output.output_get_mode = virtual_output_get_mode;
        virtual_func_output.output_set_available_mode = virtual_output_set_available_mode;
        virtual_func_output.output_set_physical_size = virtual_output_set_physical_size;
+       virtual_func_output.output_set_connect = virtual_output_set_connect;
+       virtual_func_output.output_set_disconnect = virtual_output_set_disconnect;
+       virtual_func_output.output_set_status_handler = virtual_output_set_status_handler;
 
        memset(&virtual_func_layer, 0, sizeof(virtual_func_layer));
        virtual_func_layer.layer_get_capability = virtual_layer_get_capability;
index 1ad4550..766a155 100644 (file)
@@ -42,6 +42,9 @@ tdm_error virtual_output_set_mode(tdm_output *output, const tdm_output_mode *mod
 tdm_error 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_error virtual_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight);
+tdm_error virtual_output_set_connect(tdm_output *output);
+tdm_error virtual_output_set_disconnect(tdm_output *output);
+tdm_error virtual_output_set_status_handler(tdm_output *output, tdm_output_status_handler func, void *user_data);
 
 tdm_error virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
 tdm_error virtual_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
index 2288a72..1e8f20c 100644 (file)
@@ -39,6 +39,8 @@ struct _tdm_virtual_output_data {
        tdm_output_commit_handler commit_func;
 
        tdm_output_conn_status status;
+       tdm_output_status_handler status_func;
+       void *status_user_data;
 
        int mode_changed;
        const tdm_output_mode *current_mode;
@@ -504,20 +506,27 @@ virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps)
        caps->type = output_data->connector_type;
        caps->type_id = 0;
 
-       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;
+       if (output_data->status == TDM_OUTPUT_CONN_STATUS_CONNECTED ||
+               output_data->status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED) {
+               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;
+                       }
+                       memcpy(caps->modes, output_data->output_modes, output_data->mode_count * sizeof(tdm_output_mode));
                }
 
-               *caps->modes = *output_data->output_modes;
+               caps->mmWidth = output_data->mmwidth;
+               caps->mmHeight = output_data->mmheight;
+       } else {
+               caps->modes = NULL;
+               caps->mode_count = 0;
+               caps->mmWidth = 0;
+               caps->mmHeight = 0;
        }
-
-       caps->mmWidth = output_data->mmwidth;
-       caps->mmHeight =output_data->mmheight;
        caps->subpixel = 1;
 
        caps->min_w = -1;
@@ -727,6 +736,58 @@ virtual_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsig
        return TDM_ERROR_NONE;
 }
 
+tdm_error virtual_output_set_connect(tdm_output *output)
+{
+       tdm_virtual_output_data *output_data = output;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+       if (output_data->status == TDM_OUTPUT_CONN_STATUS_CONNECTED ||
+               output_data->status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED)
+               return TDM_ERROR_NONE;
+
+       output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+
+       if (output_data->status_func)
+               output_data->status_func(output_data, output_data->status,
+                                                                output_data->status_user_data);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error virtual_output_set_disconnect(tdm_output *output)
+{
+       tdm_virtual_output_data *output_data = output;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+       if (output_data->status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+               return TDM_ERROR_NONE;
+
+       output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+       if (output_data->status_func)
+               output_data->status_func(output_data, output_data->status,
+                                                                output_data->status_user_data);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+virtual_output_set_status_handler(tdm_output *output,
+                                                                 tdm_output_status_handler func, void *user_data)
+{
+       tdm_virtual_output_data *output_data = output;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(func, TDM_ERROR_INVALID_PARAMETER);
+
+       output_data->status_func = func;
+       output_data->status_user_data = user_data;
+
+       return TDM_ERROR_NONE;
+}
+
 tdm_error
 virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
 {
index 7f43ee2..72136b1 100644 (file)
@@ -553,6 +553,8 @@ typedef struct _tdm_func_output {
        /* virtual */
        tdm_error (*output_set_available_mode)(tdm_output *output, const tdm_output_mode *modes, int count);
        tdm_error (*output_set_physical_size)(tdm_output *output, unsigned int mmwidth, unsigned int mmheight);
+       tdm_error (*output_set_connect)(tdm_output *output);
+       tdm_error (*output_set_disconnect)(tdm_output *output);
 
        void (*reserved5)(void);
        void (*reserved6)(void);
index a7813da..778dc6d 100644 (file)
@@ -1735,7 +1735,8 @@ tdm_output_set_available_mode(tdm_output *output, const tdm_output_mode *modes,
        _pthread_mutex_lock(&private_display->lock);
 
        func_output = &private_module->func_output;
-       ret = func_output->output_set_available_mode(private_output->output_backend, modes, count);
+       if (func_output->output_set_available_mode)
+               ret = func_output->output_set_available_mode(private_output->output_backend, modes, count);
 
        _pthread_mutex_unlock(&private_display->lock);
 
@@ -1759,7 +1760,52 @@ tdm_output_set_physical_size(tdm_output *output,  unsigned int mmwidth, unsigned
        _pthread_mutex_lock(&private_display->lock);
 
        func_output = &private_module->func_output;
-       ret = func_output->output_set_physical_size(private_output->output_backend, mmwidth, mmheight);
+       if (func_output->output_set_physical_size)
+               ret = func_output->output_set_physical_size(private_output->output_backend, mmwidth, mmheight);
+
+       _pthread_mutex_unlock(&private_display->lock);
+
+       return ret;
+}
+
+INTERN tdm_error
+tdm_output_set_connect(tdm_output *output)
+{
+       tdm_private_module *private_module = NULL;
+       tdm_func_output *func_output = NULL;
+
+       OUTPUT_FUNC_ENTRY();
+
+       private_module = private_output->private_module;
+       TDM_RETURN_VAL_IF_FAIL(private_module == private_display->virtual_module, TDM_ERROR_BAD_MODULE);
+
+       _pthread_mutex_lock(&private_display->lock);
+
+       func_output = &private_module->func_output;
+       if (func_output->output_set_connect)
+               ret = func_output->output_set_connect(private_output->output_backend);
+
+       _pthread_mutex_unlock(&private_display->lock);
+
+       return ret;
+}
+
+INTERN tdm_error
+tdm_output_set_disconnect(tdm_output *output)
+{
+       tdm_private_module *private_module = NULL;
+       tdm_func_output *func_output = NULL;
+
+       OUTPUT_FUNC_ENTRY();
+
+       private_module = private_output->private_module;
+       TDM_RETURN_VAL_IF_FAIL(private_module == private_display->virtual_module, TDM_ERROR_BAD_MODULE);
+
+       _pthread_mutex_lock(&private_display->lock);
+
+       func_output = &private_module->func_output;
+       if (func_output->output_set_disconnect)
+               ret = func_output->output_set_disconnect(private_output->output_backend);
 
        _pthread_mutex_unlock(&private_display->lock);
 
index 2e7ffa3..02464d8 100644 (file)
@@ -264,6 +264,10 @@ tdm_error
 tdm_output_set_available_mode(tdm_output *output, const tdm_output_mode *modes, int count);
 tdm_error
 tdm_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight);
+tdm_error
+tdm_output_set_connect(tdm_output *output);
+tdm_error
+tdm_output_set_disconnect(tdm_output *output);
 
 #ifdef __cplusplus
 }
index e540133..0b15154 100644 (file)
@@ -612,19 +612,7 @@ destroy_output_callback(struct wl_resource *resource)
 
        free(output_info);
 }
-#if 0
-static void
-destroy_voutput_callback(struct wl_resource *resource)
-{
-       tdm_server_voutput_info *voutput_info = wl_resource_get_user_data(resource);
-
-       TDM_RETURN_IF_FAIL(voutput_info != NULL);
-
-       LIST_DEL(&voutput_info->link);
 
-       free(voutput_info);
-}
-#endif
 static void
 _tdm_server_cb_create_output(struct wl_client *client, struct wl_resource *resource,
                                                         const char *name, uint32_t id)
@@ -763,10 +751,8 @@ _tdm_voutput_cb_set_available_modes(struct wl_client *client,
 
        count = voutput_info->available_modes.count;
        old_modes = voutput_info->available_modes.modes;
-       if (index >= count)
-       {
-               if (count > 0)
-               {
+       if (index >= count) {
+               if (count > 0)  {
                        tmp_modes = malloc(count * sizeof(*tmp_modes));
                        memcpy(tmp_modes, old_modes, count * sizeof(tdm_output_mode));
                }
@@ -776,8 +762,7 @@ _tdm_voutput_cb_set_available_modes(struct wl_client *client,
                        realloc(voutput_info->available_modes.modes,
                                        sizeof(tdm_output_mode) * (index + 1));
 
-               if (count > 0)
-               {
+               if (count > 0) {
                        memcpy(voutput_info->available_modes.modes, tmp_modes, count * sizeof(tdm_output_mode));
                        free(tmp_modes);
                }
@@ -826,7 +811,7 @@ _tdm_voutput_cb_connect(struct wl_client *client, struct wl_resource *resource)
 
        tdm_output_set_physical_size(voutput_info->output, voutput_info->mmwidth, voutput_info->mmheight);
        tdm_output_set_available_mode(voutput_info->output, voutput_info->available_modes.modes, voutput_info->available_modes.count);
-       //tdm_output_set_connect();
+       tdm_output_set_connect(voutput_info->output);
 }
 
 static void
@@ -841,6 +826,10 @@ _tdm_voutput_cb_disconnect(struct wl_client *client, struct wl_resource *resourc
        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_output_set_disconnect(voutput_info->output);
 }
 
 static const struct wl_tdm_voutput_interface tdm_voutput_implementation = {
@@ -854,9 +843,11 @@ static const struct wl_tdm_voutput_interface tdm_voutput_implementation = {
 void
 tdm_voutput_cb_resource_destroy(struct wl_resource *resource)
 {
-       tdm_server_voutput_info *voutput_info;
+       tdm_server_voutput_info *voutput_info = wl_resource_get_user_data(resource);
 
-       voutput_info = wl_resource_get_user_data(resource);
+       TDM_RETURN_IF_FAIL(voutput_info != NULL);
+
+       LIST_DEL(&voutput_info->link);
 
        /* Do free your own resource */
        free(voutput_info);