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;
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);
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;
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;
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)
{
/* 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);
_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);
_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);
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
}
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)
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));
}
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);
}
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
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 = {
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);