X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcompositor.c;h=6904d596e4093e6ed41caa9880082188a8df56b9;hb=5629337d14032e9aa8271d6ae1d4cf9622c3f199;hp=15fd42a2a5d35effe4f35841f0ba2ed85f2b4bb8;hpb=33997a7c96838795ccb586fc7fc43ce093210546;p=src%2Fagl-compositor.git diff --git a/src/compositor.c b/src/compositor.c index 15fd42a..6904d59 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include "shared/os-compatibility.h" #include "shared/helpers.h" @@ -79,6 +79,95 @@ sigint_helper(int sig) raise(SIGUSR2); } +void +ivi_layout_save(struct ivi_compositor *ivi, struct ivi_output *output) +{ + struct ivi_output *new_output; + ivi->need_ivi_output_relayout = true; + + new_output = zalloc(sizeof(*new_output)); + + new_output->ivi = ivi; + new_output->background = output->background; + + new_output->top = output->top; + new_output->bottom = output->bottom; + new_output->left = output->left; + new_output->right = output->right; + + new_output->active = output->active; + new_output->previous_active = output->previous_active; + new_output->name = strdup(output->name); + if (output->app_ids) + new_output->app_ids = strdup(output->app_ids); + + new_output->area = output->area; + new_output->area_saved = output->area_saved; + new_output->area_activation = output->area_activation; + + weston_log("saving output layout for output %s\n", new_output->name); + + wl_list_insert(&ivi->saved_outputs, &new_output->link); +} + +void +ivi_layout_restore(struct ivi_compositor *ivi, struct ivi_output *n_output) +{ + struct ivi_output *output = NULL; + struct ivi_output *iter_output; + + if (!ivi->need_ivi_output_relayout) + return; + + ivi->need_ivi_output_relayout = false; + + wl_list_for_each(iter_output, &ivi->saved_outputs, link) { + if (strcmp(n_output->name, iter_output->name) == 0) { + output = iter_output; + break; + } + } + + if (!output) + return; + + weston_log("restoring output layout for output %s\n", output->name); + n_output->background = output->background; + + n_output->top = output->top; + n_output->bottom = output->bottom; + n_output->left = output->left; + n_output->right = output->right; + + n_output->active = output->active; + n_output->previous_active = output->previous_active; + if (output->app_ids) + n_output->app_ids = strdup(output->app_ids); + + n_output->area = output->area; + n_output->area_saved = output->area_saved; + n_output->area_activation = output->area_activation; + + free(output->app_ids); + free(output->name); + wl_list_remove(&output->link); + free(output); +} + +void +ivi_layout_destroy_saved_outputs(struct ivi_compositor *ivi) +{ + struct ivi_output *output, *output_next; + + wl_list_for_each_safe(output, output_next, &ivi->saved_outputs, link) { + free(output->app_ids); + free(output->name); + + wl_list_remove(&output->link); + free(output); + } +} + static void handle_output_destroy(struct wl_listener *listener, void *data) { @@ -87,11 +176,14 @@ handle_output_destroy(struct wl_listener *listener, void *data) output = wl_container_of(listener, output, output_destroy); assert(output->output == data); - if (output->fullscreen_view.fs->view) { + if (output->fullscreen_view.fs && + output->fullscreen_view.fs->view) { weston_surface_destroy(output->fullscreen_view.fs->view->surface); output->fullscreen_view.fs->view = NULL; } + ivi_layout_save(output->ivi, output); + output->output = NULL; wl_list_remove(&output->output_destroy.link); } @@ -112,19 +204,19 @@ static void ivi_output_configure_app_id(struct ivi_output *ivi_output) { if (ivi_output->config) { - if (ivi_output->app_id != NULL) + if (ivi_output->app_ids != NULL) return; weston_config_section_get_string(ivi_output->config, "agl-shell-app-id", - &ivi_output->app_id, + &ivi_output->app_ids, NULL); - if (ivi_output->app_id == NULL) + if (ivi_output->app_ids == NULL) return; weston_log("Will place app_id %s on output %s\n", - ivi_output->app_id, ivi_output->name); + ivi_output->app_ids, ivi_output->name); } } @@ -453,6 +545,8 @@ try_attach_enable_heads(struct ivi_output *output) for (size_t i = fail_len; i < output->add_len; ++i) add_head_destroyed_listener(output->add[i]); + ivi_layout_restore(output->ivi, output); + output->add_len = fail_len; return 0; } @@ -501,6 +595,7 @@ head_disable(struct ivi_compositor *ivi, struct weston_head *head) } } wl_list_remove(&ivi_output->link); + free(ivi_output->app_ids); free(ivi_output); } @@ -743,7 +838,7 @@ remote_output_init(struct ivi_output *ivi_output, goto err; } - if (weston_output_enable(ivi_output->output) < 0) { + if ((ret = weston_output_enable(ivi_output->output)) < 0) { weston_log("Enabling remoted output \"%s\" failed.\n", output_name); goto err; @@ -1232,27 +1327,18 @@ load_modules(struct ivi_compositor *ivi, const char *modules, snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p); if (strstr(buffer, "xwayland.so")) { - weston_log("Xwayland plug-in not supported!\n"); - p = end; - while (*p == ',') - p++; - continue; - } - - if (strstr(buffer, "systemd-notify.so")) { + *xwayland = true; + } else if (strstr(buffer, "systemd-notify.so")) { weston_log("systemd-notify plug-in already loaded!\n"); - p = end; - while (*p == ',') - p++; - continue; - } + } else { + module_init = weston_load_module(buffer, "wet_module_init"); + if (!module_init) + return -1; - module_init = weston_load_module(buffer, "wet_module_init"); - if (!module_init) - return -1; + if (module_init(ivi->compositor, *argc, argv) < 0) + return -1; - if (module_init(ivi->compositor, *argc, argv) < 0) - return -1; + } p = end; while (*p == ',') @@ -1279,11 +1365,12 @@ choose_default_backend(void) } static int -compositor_init_config(struct weston_compositor *compositor, - struct weston_config *config) +compositor_init_config(struct ivi_compositor *ivi) { struct xkb_rule_names xkb_names; struct weston_config_section *section; + struct weston_compositor *compositor = ivi->compositor; + struct weston_config *config = ivi->config; int repaint_msec; bool vt_switching; bool require_input; @@ -1316,6 +1403,11 @@ compositor_init_config(struct weston_compositor *compositor, /* agl-compositor.ini [core] */ section = weston_config_get_section(config, "core", NULL, NULL); + weston_config_section_get_bool(section, "disable-cursor", + &ivi->disable_cursor, false); + weston_config_section_get_bool(section, "activate-by-default", + &ivi->activate_by_default, true); + weston_config_section_get_bool(section, "require-input", &require_input, true); compositor->require_input = require_input; @@ -1641,6 +1733,42 @@ copy_command_line(int argc, char * const argv[]) return str; } +#if !defined(BUILD_XWAYLAND) +int +wet_load_xwayland(struct weston_compositor *comp) +{ + return -1; +} +#endif + +static void +weston_log_setup_scopes(struct weston_log_context *log_ctx, + struct weston_log_subscriber *subscriber, + const char *names) +{ + assert(log_ctx); + assert(subscriber); + + char *tokenize = strdup(names); + char *token = strtok(tokenize, ","); + while (token) { + weston_log_subscribe(log_ctx, subscriber, token); + token = strtok(NULL, ","); + } + free(tokenize); +} + +static void +weston_log_subscribe_to_scopes(struct weston_log_context *log_ctx, + struct weston_log_subscriber *logger, + const char *debug_scopes) +{ + if (logger && debug_scopes) + weston_log_setup_scopes(log_ctx, logger, debug_scopes); + else + weston_log_subscribe(log_ctx, logger, "log"); +} + WL_EXPORT int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data) { @@ -1656,10 +1784,12 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da char *log = NULL; char *modules = NULL; char *option_modules = NULL; + char *debug_scopes = NULL; int help = 0; int version = 0; int no_config = 0; int debug = 0; + bool list_debug_scopes = false; char *config_file = NULL; struct weston_log_context *log_ctx = NULL; struct weston_log_subscriber *logger; @@ -1677,9 +1807,12 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da { WESTON_OPTION_BOOLEAN, "debug", 0, &debug }, { WESTON_OPTION_STRING, "config", 'c', &config_file }, { WESTON_OPTION_STRING, "modules", 0, &option_modules }, + { WESTON_OPTION_STRING, "debug-scopes", 'l', &debug_scopes }, + { WESTON_OPTION_STRING, "list-debug-scopes", 'L', &list_debug_scopes }, }; wl_list_init(&ivi.outputs); + wl_list_init(&ivi.saved_outputs); wl_list_init(&ivi.surfaces); wl_list_init(&ivi.pending_surfaces); wl_list_init(&ivi.popup_pending_apps); @@ -1718,7 +1851,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da weston_log_set_handler(vlog, vlog_continue); logger = weston_log_subscriber_create_log(logfile); - weston_log_subscribe(log_ctx, logger, "log"); + weston_log_subscribe_to_scopes(log_ctx, logger, debug_scopes); weston_log("Command line: %s\n", cmdline); free(cmdline); @@ -1732,11 +1865,6 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da if (!backend) backend = choose_default_backend(); } - /* from [core] */ - weston_config_section_get_bool(section, "hide-cursor", - &ivi.hide_cursor, false); - weston_config_section_get_bool(section, "activate-by-default", - &ivi.activate_by_default, true); display = wl_display_create(); loop = wl_display_get_event_loop(display); @@ -1778,7 +1906,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da goto error_signals; } - if (compositor_init_config(ivi.compositor, ivi.config) < 0) + if (compositor_init_config(&ivi) < 0) goto error_compositor; if (load_backend(&ivi, backend, &argc, argv) < 0) { @@ -1803,12 +1931,38 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da if (load_modules(&ivi, option_modules, &argc, argv, &xwayland) < 0) goto error_compositor; + if (!xwayland) { + weston_config_section_get_bool(section, "xwayland", &xwayland, + false); + } + + if (xwayland) { + if (wet_load_xwayland(ivi.compositor) < 0) + goto error_compositor; + } + if (ivi_policy_init(&ivi) < 0) goto error_compositor; if (ivi_shell_init(&ivi) < 0) goto error_compositor; + if (list_debug_scopes) { + struct weston_log_scope *nscope = NULL; + + weston_log("Printing available debug scopes:\n"); + + while ((nscope = weston_log_scopes_iterate(ivi.compositor, nscope))) { + weston_log("\tscope name: %s, desc: %s", + weston_log_scope_get_name(nscope), + weston_log_scope_get_description(nscope)); + } + + weston_log("\n"); + + goto error_compositor; + } + add_bindings(ivi.compositor); weston_compositor_flush_heads_changed(ivi.compositor); @@ -1829,7 +1983,12 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da weston_compositor_wake(ivi.compositor); ivi_shell_create_global(&ivi); - ivi_launch_shell_client(&ivi); + + ivi_launch_shell_client(&ivi, "shell-client", + &ivi.shell_client.client); + ivi_launch_shell_client(&ivi, "shell-client-ext", + &ivi.shell_client_ext.client); + if (debug) ivi_screenshooter_create(&ivi); ivi_agl_systemd_notify(&ivi);