[PATCH weston 03/12 v2] compositor: Implement output configuration using windowed_output_api

Quentin Glidic sardemff7+wayland at sardemff7.net
Tue Aug 16 10:31:41 UTC 2016


On 14/08/2016 17:28, Armin Krezović wrote:
> This implements output configuration for outputs which use
> previously added weston_windowed_output_api. The function
> takes an output that's to be configured, default configuration
> that's to be set in case no configuration is specified in
> the config file or on command line and optional third argument,
> parsed_options, which will override defaults and options for
> configuration if they are present.
>
> This also introduces new compositor specific functions for
> setting output's scale and transform from either hardcoded
> default, config file option or command line option.
>
> Pending output handling helpers have also been introduced.
>
> v2:
>
>  - Adapt to changes in previous patch.
>  - Fix potential double free().
>  - Remove redundant variables for scale and transform setting.
>  - Drop parsed_options helper and parameter and use it directly
>    in wet_configure_windowed_output_from_config().
>
> Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>

Good:
Reviewed-by: Quentin Glidic <sardemff7+git at sardemff7.net>

Cheers,


> ---
>  compositor/main.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 154 insertions(+)
>
> diff --git a/compositor/main.c b/compositor/main.c
> index 0e5af5b..905d71f 100644
> --- a/compositor/main.c
> +++ b/compositor/main.c
> @@ -63,11 +63,21 @@
>  #include "compositor-fbdev.h"
>  #include "compositor-x11.h"
>  #include "compositor-wayland.h"
> +#include "windowed-output-api.h"
>
>  #define WINDOW_TITLE "Weston Compositor"
>
> +struct wet_output_config {
> +	int width;
> +	int height;
> +	int32_t scale;
> +	uint32_t transform;
> +};
> +
>  struct wet_compositor {
>  	struct weston_config *config;
> +	struct wet_output_config *parsed_options;
> +	struct wl_listener pending_output_listener;
>  };
>
>  static FILE *weston_logfile = NULL;
> @@ -425,6 +435,39 @@ to_wet_compositor(struct weston_compositor *compositor)
>  	return weston_compositor_get_user_data(compositor);
>  }
>
> +static void
> +wet_set_pending_output_handler(struct weston_compositor *ec,
> +			       wl_notify_func_t handler)
> +{
> +	struct wet_compositor *compositor = to_wet_compositor(ec);
> +
> +	compositor->pending_output_listener.notify = handler;
> +	wl_signal_add(&ec->output_pending_signal, &compositor->pending_output_listener);
> +}
> +
> +static struct wet_output_config *
> +wet_init_parsed_options(struct weston_compositor *ec)
> +{
> +	struct wet_compositor *compositor = to_wet_compositor(ec);
> +	struct wet_output_config *config;
> +
> +	config = zalloc(sizeof *config);
> +
> +	if (!config) {
> +		perror("out of memory");
> +		return NULL;
> +	}
> +
> +	config->width = 0;
> +	config->height = 0;
> +	config->scale = 0;
> +	config->transform = UINT32_MAX;
> +
> +	compositor->parsed_options = config;
> +
> +	return config;
> +}
> +
>  WL_EXPORT struct weston_config *
>  wet_get_config(struct weston_compositor *ec)
>  {
> @@ -940,6 +983,111 @@ handle_exit(struct weston_compositor *c)
>  	wl_display_terminate(c->wl_display);
>  }
>
> +static void
> +wet_output_set_scale(struct weston_output *output,
> +		     struct weston_config_section *section,
> +		     int32_t default_scale,
> +		     int32_t parsed_scale)
> +{
> +	int32_t scale = default_scale;
> +
> +	if (section)
> +		weston_config_section_get_int(section, "scale", &scale, default_scale);
> +
> +	if (parsed_scale)
> +		scale = parsed_scale;
> +
> +	weston_output_set_scale(output, scale);
> +}
> +
> +/* UINT32_MAX is treated as invalid because 0 is a valid
> + * enumeration value and the parameter is unsigned
> + */
> +static void
> +wet_output_set_transform(struct weston_output *output,
> +			 struct weston_config_section *section,
> +			 uint32_t default_transform,
> +			 uint32_t parsed_transform)
> +{
> +	char *t;
> +	uint32_t transform = default_transform;
> +
> +	if (section) {
> +		weston_config_section_get_string(section,
> +						 "transform", &t, "normal");
> +
> +		if (weston_parse_transform(t, &transform) < 0) {
> +			weston_log("Invalid transform \"%s\" for output %s\n",
> +				   t, output->name);
> +			transform = default_transform;
> +		}
> +		free(t);
> +	}
> +
> +	if (parsed_transform != UINT32_MAX)
> +		transform = parsed_transform;
> +
> +	weston_output_set_transform(output, transform);
> +}
> +
> +static int
> +wet_configure_windowed_output_from_config(struct weston_output *output,
> +					  struct wet_output_config *defaults)
> +{
> +	const struct weston_windowed_output_api *api =
> +		weston_windowed_output_get_api(output->compositor);
> +
> +	struct weston_config *wc = wet_get_config(output->compositor);
> +	struct weston_config_section *section = NULL;
> +	struct wet_compositor *compositor = to_wet_compositor(output->compositor);
> +	struct wet_output_config *parsed_options = compositor->parsed_options;
> +	int width = defaults->width;
> +	int height = defaults->height;
> +
> +	assert(parsed_options);
> +
> +	if (!api) {
> +		weston_log("Cannot use weston_windowed_output_api.\n");
> +		return -1;
> +	}
> +
> +	if (output->name)
> +		section = weston_config_get_section(wc, "output", "name", output->name);
> +
> +	if (section) {
> +		char *mode;
> +
> +		weston_config_section_get_string(section, "mode", &mode, NULL);
> +		if (!mode || sscanf(mode, "%dx%d", &width,
> +				    &height) != 2) {
> +			weston_log("Invalid mode \"%s\" for output %s. Using defaults.\n",
> +				   mode, output->name);
> +			width = defaults->width;
> +			height = defaults->height;
> +		}
> +		free(mode);
> +	}
> +
> +	if (parsed_options->width)
> +		width = parsed_options->width;
> +
> +	if (parsed_options->height)
> +		height = parsed_options->height;
> +
> +	wet_output_set_scale(output, section, defaults->scale, parsed_options->scale);
> +	wet_output_set_transform(output, section, defaults->transform, parsed_options->transform);
> +
> +	if (api->output_set_size(output, width, height) < 0) {
> +		weston_log("Cannot configure output \"%s\" using weston_windowed_output_api.\n",
> +			   output->name ? output->name : "unnamed");
> +		return -1;
> +	}
> +
> +	weston_output_enable(output);
> +
> +	return 0;
> +}
> +
>  static enum weston_drm_backend_output_mode
>  drm_configure_output(struct weston_compositor *c,
>  		     bool use_current_mode,
> @@ -1659,6 +1807,7 @@ int main(int argc, char *argv[])
>  	if (load_configuration(&config, noconfig, config_file) < 0)
>  		goto out_signals;
>  	user_data.config = config;
> +	user_data.parsed_options = NULL;
>
>  	section = weston_config_get_section(config, "core", NULL, NULL);
>
> @@ -1683,6 +1832,8 @@ int main(int argc, char *argv[])
>  		goto out;
>  	}
>
> +	weston_pending_output_coldplug(ec);
> +
>  	catch_signals();
>  	segv_compositor = ec;
>
> @@ -1766,6 +1917,9 @@ int main(int argc, char *argv[])
>  	ret = ec->exit_code;
>
>  out:
> +	/* free(NULL) is valid, and it won't be NULL if it's used */
> +	free(user_data.parsed_options);
> +
>  	weston_compositor_destroy(ec);
>
>  out_signals:
>


-- 

Quentin “Sardem FF7” Glidic


More information about the wayland-devel mailing list