X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcompositor.c;h=ef06314d12276196c35480fe66aac31fb80171f5;hb=refs%2Fchanges%2F03%2F28803%2F1;hp=9e715525b9916a2f65f6252dd866d441eecc8c3a;hpb=c9d3edb4ee23a5630136ca4a67eaa3860f7651d1;p=src%2Fagl-compositor.git diff --git a/src/compositor.c b/src/compositor.c index 9e71552..ef06314 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; @@ -1648,6 +1742,35 @@ copy_command_line(int argc, char * const argv[]) return str; } +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) { @@ -1663,10 +1786,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; @@ -1684,9 +1809,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); @@ -1725,7 +1853,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); @@ -1811,6 +1939,22 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da 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);