X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcompositor.c;h=bb799cf87ba262c32e59784cdd776f69e5752017;hb=7b0b61877b2d812c8befaa689d326190895edabd;hp=1f45a713957bdf9630bb7842490872e71fb081c5;hpb=79eac214d4866d840767b6a430c6168e55a214c0;p=src%2Fagl-compositor.git diff --git a/src/compositor.c b/src/compositor.c index 1f45a71..bb799cf 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) { @@ -93,6 +182,8 @@ handle_output_destroy(struct wl_listener *listener, void *data) output->fullscreen_view.fs->view = NULL; } + ivi_layout_save(output->ivi, output); + output->output = NULL; wl_list_remove(&output->output_destroy.link); } @@ -113,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); } } @@ -454,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; } @@ -502,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); } @@ -744,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; @@ -1233,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 == ',') @@ -1280,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; @@ -1317,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; @@ -1642,6 +1733,44 @@ 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"); +} + +>>>>>>> cea026b (compositor: Add support for subscribing to libweston scopes) + WL_EXPORT int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data) { @@ -1657,6 +1786,7 @@ 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; @@ -1678,9 +1808,11 @@ 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 }, }; 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); @@ -1719,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); @@ -1733,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); @@ -1779,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) { @@ -1804,6 +1931,16 @@ 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;