X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcompositor.c;h=634c468aa1e14853152d9b8a7b0e9ee1308b64e1;hb=refs%2Fchanges%2F52%2F28052%2F2;hp=49ee90d3716b13f69fd427a0db76f4ef70e99037;hpb=89f67c5cf793bc69c7e5d5008829851069daa330;p=src%2Fagl-compositor.git diff --git a/src/compositor.c b/src/compositor.c index 49ee90d..634c468 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -73,6 +73,12 @@ to_ivi_compositor(struct weston_compositor *ec) return weston_compositor_get_user_data(ec); } +static void +sigint_helper(int sig) +{ + raise(SIGUSR2); +} + static void handle_output_destroy(struct wl_listener *listener, void *data) { @@ -321,6 +327,23 @@ parse_transform(const char *transform, uint32_t *out) return -1; } +static int +parse_activation_area(const char *geometry, struct ivi_output *output) +{ + int n; + unsigned width, height, x, y; + + n = sscanf(geometry, "%ux%u+%u,%u", &width, &height, &x, &y); + if (n != 4) { + return -1; + } + output->area_activation.width = width; + output->area_activation.height = height; + output->area_activation.x = x; + output->area_activation.y = y; + return 0; +} + static int configure_output(struct ivi_output *output) { @@ -344,6 +367,10 @@ configure_output(struct ivi_output *output) if (parse_transform(t, &transform) < 0) weston_log("Invalid transform \"%s\" for output %s\n", t, output->name); + weston_config_section_get_string(section, "activation-area", &t, ""); + if (parse_activation_area(t, output) < 0) + weston_log("Invalid activation-area \"%s\" for output %s\n", + t, output->name); free(t); } @@ -876,14 +903,15 @@ load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[]) int use_current_mode = 0; int use_pixman = 0; bool use_shadow; + bool without_input = false; int ret; const struct weston_option options[] = { { WESTON_OPTION_STRING, "seat", 0, &config.seat_id }, - { WESTON_OPTION_INTEGER, "tty", 0, &config.tty }, { WESTON_OPTION_STRING, "drm-device", 0, &config.specific_device }, { WESTON_OPTION_BOOLEAN, "current-mode", 0, &use_current_mode }, { WESTON_OPTION_BOOLEAN, "use-pixman", 0, &use_pixman }, + { WESTON_OPTION_BOOLEAN, "continue-without-input", false, &without_input } }; parse_options(options, ARRAY_LENGTH(options), argc, argv); @@ -898,6 +926,9 @@ load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[]) weston_config_section_get_bool(section, "pixman-shadow", &use_shadow, 1); config.use_pixman_shadow = use_shadow; + if (without_input) + ivi->compositor->require_input = !without_input; + ret = weston_compositor_load_backend(ivi->compositor, WESTON_BACKEND_DRM, &config.base); if (ret < 0) @@ -1621,6 +1652,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da struct weston_log_subscriber *logger; int ret = EXIT_FAILURE; bool xwayland = false; + struct sigaction action; const struct weston_option core_options[] = { { WESTON_OPTION_STRING, "backend", 'B', &backend }, @@ -1642,6 +1674,7 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da wl_list_init(&ivi.split_pending_apps); wl_list_init(&ivi.remote_pending_apps); wl_list_init(&ivi.desktop_clients); + wl_list_init(&ivi.child_process_list); /* Prevent any clients we spawn getting our stdin */ os_fd_set_cloexec(STDIN_FILENO); @@ -1702,11 +1735,26 @@ int wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_da signals[0] = wl_event_loop_add_signal(loop, SIGTERM, on_term_signal, display); - signals[1] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal, + signals[1] = wl_event_loop_add_signal(loop, SIGUSR2, on_term_signal, display); - signals[2] = wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal, + signals[2] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, display); + /* When debugging the compositor, if use wl_event_loop_add_signal() to + * catch SIGINT, the debugger can't catch it, and attempting to stop + * the compositor from within the debugger results in weston exiting + * cleanly. + * + * Instead, use the sigaction() function, which sets up the signal in a + * way that gdb can successfully catch, but have the handler for SIGINT + * send SIGUSR2 (xwayland uses SIGUSR1), which we catch via + * wl_event_loop_add_signal(). + */ + action.sa_handler = sigint_helper; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + sigaction(SIGINT, &action, NULL); + for (size_t i = 0; i < ARRAY_LENGTH(signals); ++i) if (!signals[i]) goto error_signals;