From: Junkyeong Kim Date: Mon, 23 Jul 2018 11:35:02 +0000 (+0900) Subject: virtual: add tdm_voutput_connect & disconnect X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=36484ad90323ab7d4555b40702579e2eac77ff77;p=platform%2Fcore%2Fuifw%2Flibtdm.git virtual: add tdm_voutput_connect & disconnect Change-Id: Ia80b476627ff79ff3eac2e3187aa8e8577a7cf6b Signed-off-by: Junkyeong Kim --- diff --git a/backends/virtual/tdm_virtual.c b/backends/virtual/tdm_virtual.c index 426feaf..1b96a4c 100644 --- a/backends/virtual/tdm_virtual.c +++ b/backends/virtual/tdm_virtual.c @@ -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; diff --git a/backends/virtual/tdm_virtual.h b/backends/virtual/tdm_virtual.h index 1ad4550..766a155 100644 --- a/backends/virtual/tdm_virtual.h +++ b/backends/virtual/tdm_virtual.h @@ -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); diff --git a/backends/virtual/tdm_virtual_display.c b/backends/virtual/tdm_virtual_display.c index 2288a72..1e8f20c 100644 --- a/backends/virtual/tdm_virtual_display.c +++ b/backends/virtual/tdm_virtual_display.c @@ -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) { diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 7f43ee2..72136b1 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -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); diff --git a/src/tdm_output.c b/src/tdm_output.c index a7813da..778dc6d 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -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); diff --git a/src/tdm_private.h b/src/tdm_private.h index 2e7ffa3..02464d8 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -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 } diff --git a/src/tdm_server.c b/src/tdm_server.c index e540133..0b15154 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -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);