main: Add the ability to load the remote plugin
[src/agl-compositor.git] / src / main.c
index 306ad6e..4294c64 100644 (file)
 #include <libweston/windowed-output-api.h>
 #include <libweston/config-parser.h>
 #include <libweston/weston-log.h>
+#include <weston/weston.h>
 
 #include "shared/os-compatibility.h"
 #include "shared/helpers.h"
 
 #include "agl-shell-server-protocol.h"
 
+#ifdef HAVE_REMOTING
+#include "remote.h"
+#endif
+
 static int cached_tm_mday = -1;
 static struct weston_log_scope *log_scope;
 
@@ -85,6 +90,20 @@ to_ivi_output(struct weston_output *o)
        return output;
 }
 
+static void
+ivi_output_configure_app_id(struct ivi_output *ivi_output)
+{
+       if (ivi_output->config) {
+               if (ivi_output->app_id != NULL)
+                       return;
+
+               weston_config_section_get_string(ivi_output->config,
+                                                "agl-shell-app-id",
+                                                &ivi_output->app_id,
+                                                NULL);
+       }
+}
+
 static struct ivi_output *
 ivi_ensure_output(struct ivi_compositor *ivi, char *name,
                  struct weston_config_section *config)
@@ -119,6 +138,7 @@ ivi_ensure_output(struct ivi_compositor *ivi, char *name,
                                           &output->output_destroy);
 
        wl_list_insert(&ivi->outputs, &output->link);
+       ivi_output_configure_app_id(output);
        return output;
 }
 
@@ -532,6 +552,151 @@ heads_changed(struct wl_listener *listener, void *arg)
        }
 }
 
+#ifdef HAVE_REMOTING
+static int
+drm_backend_remoted_output_configure(struct weston_output *output,
+                                    struct weston_config_section *section,
+                                    char *modeline,
+                                    const struct weston_remoting_api *api)
+{
+       char *gbm_format = NULL;
+       char *seat = NULL;
+       char *host = NULL;
+       char *pipeline = NULL;
+       int port, ret;
+
+       ret = api->set_mode(output, modeline);
+       if (ret < 0) {
+               weston_log("Cannot configure an output \"%s\" using "
+                               "weston_remoting_api. Invalid mode\n",
+                               output->name);
+               return -1;
+       }
+
+       /* FIXME: retrieve the scale and the transform from config file */
+       weston_output_set_scale(output, 1);
+       weston_output_set_transform(output, WL_OUTPUT_TRANSFORM_NORMAL);
+
+       weston_config_section_get_string(section, "gbm-format",
+                                        &gbm_format, NULL);
+       api->set_gbm_format(output, gbm_format);
+       free(gbm_format);
+
+       weston_config_section_get_string(section, "seat", &seat, "");
+
+       api->set_seat(output, seat);
+       free(seat);
+
+       weston_config_section_get_string(section, "gst-pipeline", &pipeline,
+                       NULL);
+       if (pipeline) {
+               api->set_gst_pipeline(output, pipeline);
+               free(pipeline);
+               return 0;
+       }
+
+       weston_config_section_get_string(section, "host", &host, NULL);
+       weston_config_section_get_int(section, "port", &port, 0);
+       if (!host || port <= 0 || 65533 < port) {
+               weston_log("Cannot configure an output \"%s\". "
+                               "Need to specify gst-pipeline or "
+                               "host and port (1-65533).\n", output->name);
+       }
+       api->set_host(output, host);
+       free(host);
+       api->set_port(output, port);
+
+       return 0;
+}
+
+
+static void
+remote_output_init(struct weston_compositor *compositor,
+                  struct weston_config_section *section,
+                  const struct weston_remoting_api *api)
+{
+       struct weston_output *output = NULL;
+       char *output_name, *modeline = NULL;
+       int ret;
+
+       weston_config_section_get_string(section, "name", &output_name, NULL);
+       if (!output_name)
+               return;
+
+       weston_config_section_get_string(section, "mode", &modeline, "off");
+       if (strcmp(modeline, "off") == 0)
+               goto err;
+
+       output = api->create_output(compositor, output_name);
+       if (!output) {
+               weston_log("Cannot create remoted output \"%s\".\n",
+                               output_name);
+               goto err;
+       }
+
+       ret = drm_backend_remoted_output_configure(output, section,
+                                                  modeline, api);
+       if (ret < 0) {
+               weston_log("Cannot configure remoted output \"%s\".\n",
+                               output_name);
+               goto err;
+       }
+
+       if (weston_output_enable(output) < 0) {
+               weston_log("Enabling remoted output \"%s\" failed.\n",
+                               output_name);
+               goto err;
+       }
+
+       free(modeline);
+       free(output_name);
+       weston_log("remoted output '%s' enabled\n", output->name);
+       return;
+
+err:
+       free(modeline);
+       free(output_name);
+       if (output)
+               weston_output_destroy(output);
+
+}
+
+static int
+load_remoting(struct weston_compositor *compositor, struct weston_config *config)
+{
+       const struct weston_remoting_api *api = NULL;
+       int (*module_init)(struct weston_compositor *wc);
+       struct weston_config_section *remote_section = NULL;
+       const char *section_name;
+
+       module_init = weston_load_module("remoting-plugin.so",
+                                        "weston_module_init");
+       if (!module_init)
+               return -1;
+
+       if (module_init(compositor) < 0)
+               return -1;
+
+       api = weston_remoting_get_api(compositor);
+       if (!api)
+               return -1;
+
+       while (weston_config_next_section(config, &remote_section, &section_name)) {
+               if (strcmp(section_name, "remote-output"))
+                       continue;
+               remote_output_init(compositor, remote_section, api);
+       }
+
+       return 0;
+}
+#else
+static int
+load_remoting(struct weston_compositor *compositor, struct weston_config *config)
+{
+       return -1;
+}
+#endif
+
 static int
 load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[])
 {
@@ -579,6 +744,8 @@ load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[])
                goto error;
        }
 
+       load_remoting(ivi->compositor, ivi->config);
+
 error:
        free(config.gbm_format);
        free(config.seat_id);
@@ -1126,20 +1293,6 @@ usage(int error_code)
        exit(error_code);
 }
 
-static void
-ivi_compositor_get_quirks(struct ivi_compositor *ivi)
-{
-       struct weston_config_section *section;
-
-       if (!ivi->config)
-               return;
-
-       section = weston_config_get_section(ivi->config, "shell", NULL, NULL);
-       weston_config_section_get_bool(section, "activate-by-default",
-                       &ivi->quirks.activate_apps_by_default, 0);
-
-}
-
 int main(int argc, char *argv[])
 {
        struct ivi_compositor ivi = { 0 };
@@ -1217,8 +1370,6 @@ int main(int argc, char *argv[])
                        backend = choose_default_backend();
        }
 
-       ivi_compositor_get_quirks(&ivi);
-
        display = wl_display_create();
        loop = wl_display_get_event_loop(display);