summaryrefslogtreecommitdiff
path: root/compositor/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'compositor/main.c')
-rw-r--r--compositor/main.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/compositor/main.c b/compositor/main.c
index bb95beaf..21111013 100644
--- a/compositor/main.c
+++ b/compositor/main.c
@@ -60,6 +60,7 @@
#include <libweston/backend-drm.h>
#include <libweston/backend-headless.h>
+#include <libweston/backend-pipewire.h>
#include <libweston/backend-rdp.h>
#include <libweston/backend-vnc.h>
#include <libweston/backend-x11.h>
@@ -658,6 +659,9 @@ usage(int error_code)
#if defined(BUILD_HEADLESS_COMPOSITOR)
"\t\t\t\theadless\n"
#endif
+#if defined(BUILD_PIPEWIRE_COMPOSITOR)
+ "\t\t\t\tpipewire\n"
+#endif
#if defined(BUILD_RDP_COMPOSITOR)
"\t\t\t\trdp\n"
#endif
@@ -721,6 +725,14 @@ usage(int error_code)
"\n");
#endif
+#if defined(BUILD_PIPEWIRE_COMPOSITOR)
+ fprintf(out,
+ "Options for pipewire\n\n"
+ " --width=WIDTH\t\tWidth of desktop\n"
+ " --height=HEIGHT\tHeight of desktop\n"
+ "\n");
+#endif
+
#if defined(BUILD_RDP_COMPOSITOR)
fprintf(out,
"Options for rdp:\n\n"
@@ -3071,6 +3083,98 @@ load_headless_backend(struct weston_compositor *c,
return 0;
}
+static int
+pipewire_backend_output_configure(struct weston_output *output)
+{
+ struct wet_output_config defaults = {
+ .width = 640,
+ .height = 480,
+ };
+ struct wet_compositor *compositor = to_wet_compositor(output->compositor);
+ struct wet_output_config *parsed_options = compositor->parsed_options;
+ const struct weston_pipewire_output_api *api = weston_pipewire_output_get_api(output->compositor);
+ struct weston_config *wc = wet_get_config(output->compositor);
+ struct weston_config_section *section;
+ char *gbm_format = NULL;
+ int width;
+ int height;
+
+ assert(parsed_options);
+
+ if (!api) {
+ weston_log("Cannot use weston_pipewire_output_api.\n");
+ return -1;
+ }
+
+ section = weston_config_get_section(wc, "output", "name", output->name);
+
+ parse_simple_mode(output, section, &width, &height, &defaults,
+ parsed_options);
+
+ if (section)
+ weston_config_section_get_string(section, "gbm-format",
+ &gbm_format, NULL);
+
+ weston_output_set_scale(output, 1);
+ weston_output_set_transform(output, WL_OUTPUT_TRANSFORM_NORMAL);
+
+ api->set_gbm_format(output, gbm_format);
+ free(gbm_format);
+
+ if (api->output_set_size(output, width, height) < 0) {
+ weston_log("Cannot configure output \"%s\" using weston_pipewire_output_api.\n",
+ output->name);
+ return -1;
+ }
+ weston_log("pipewire_backend_output_configure.. Done\n");
+
+ return 0;
+}
+
+static void
+weston_pipewire_backend_config_init(struct weston_pipewire_backend_config *config)
+{
+ config->base.struct_version = WESTON_PIPEWIRE_BACKEND_CONFIG_VERSION;
+ config->base.struct_size = sizeof(struct weston_pipewire_backend_config);
+}
+
+static int
+load_pipewire_backend(struct weston_compositor *c,
+ int *argc, char *argv[], struct weston_config *wc,
+ enum weston_renderer_type renderer)
+{
+ struct weston_pipewire_backend_config config = {{ 0, }};
+ struct weston_config_section *section;
+ struct wet_output_config *parsed_options = wet_init_parsed_options(c);
+
+ if (!parsed_options)
+ return -1;
+
+ weston_pipewire_backend_config_init(&config);
+
+ const struct weston_option pipewire_options[] = {
+ { WESTON_OPTION_INTEGER, "width", 0, &parsed_options->width },
+ { WESTON_OPTION_INTEGER, "height", 0, &parsed_options->height },
+ };
+
+ parse_options(pipewire_options, ARRAY_LENGTH(pipewire_options), argc, argv);
+
+ config.renderer = renderer;
+
+ wet_set_simple_head_configurator(c, pipewire_backend_output_configure);
+
+ section = weston_config_get_section(wc, "core", NULL, NULL);
+ weston_config_section_get_string(section, "gbm-format",
+ &config.gbm_format, NULL);
+
+ section = weston_config_get_section(wc, "pipewire", NULL, NULL);
+ weston_config_section_get_int(section, "num-outputs",
+ &config.num_outputs, 1);
+
+ return weston_compositor_load_backend(c, WESTON_BACKEND_PIPEWIRE,
+ &config.base);
+}
+
static void
weston_rdp_backend_config_init(struct weston_rdp_backend_config *config)
{
@@ -3608,6 +3712,9 @@ load_backend(struct weston_compositor *compositor, const char *name,
case WESTON_BACKEND_HEADLESS:
return load_headless_backend(compositor, argc, argv, config,
renderer);
+ case WESTON_BACKEND_PIPEWIRE:
+ return load_pipewire_backend(compositor, argc, argv, config,
+ renderer);
case WESTON_BACKEND_RDP:
return load_rdp_backend(compositor, argc, argv, config,
renderer);