From 1e41a25f00aab1038486cff37e286fd5c729a72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Nov 2019 20:34:32 +0100 Subject: [PATCH] terminal: call user-defined callback when destroying terminal main uses this to get the exit code of the terminal. --- main.c | 33 +++++++++++++++++++++++---------- terminal.c | 9 ++++++++- terminal.h | 8 +++++++- wayland.h | 1 - 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/main.c b/main.c index b9e0e5f7..606b0199 100644 --- a/main.c +++ b/main.c @@ -26,14 +26,27 @@ static void print_usage(const char *prog_name) { - printf("Usage: %s [OPTION]...\n", prog_name); + printf("Usage: %s [OPTIONS]...\n", prog_name); printf("\n"); printf("Options:\n"); printf(" -f,--font=FONT comma separated list of fonts in fontconfig format (monospace)\n" " -t,--term=TERM value to set the environment variable TERM to (foot)\n" " -g,--geometry=WIDTHxHEIGHT set initial width and height\n" + " -s,--server run as a server\n" " -v,--version show the version number and quit\n"); - printf("\n"); +} + +struct shutdown_context { + struct terminal **term; + int exit_code; +}; + +static void +term_shutdown_cb(void *data, int exit_code) +{ + struct shutdown_context *ctx = data; + *ctx->term = NULL; + ctx->exit_code = exit_code; } int @@ -136,6 +149,7 @@ main(int argc, char *const *argv) struct fdm *fdm = NULL; struct wayland *wayl = NULL; struct terminal *term = NULL; + struct shutdown_context shutdown_ctx = {.term = &term, .exit_code = EXIT_FAILURE}; if ((fdm = fdm_init()) == NULL) goto out; @@ -143,7 +157,10 @@ main(int argc, char *const *argv) if ((wayl = wayl_init(fdm)) == NULL) goto out; - if ((term = term_init(&conf, fdm, wayl, argc, argv)) == NULL) + if (!as_server && (term = term_init(&conf, fdm, wayl, argc, argv, + &term_shutdown_cb, &shutdown_ctx)) == NULL) + goto out; + goto out; while (tll_length(wayl->terms) > 0) { @@ -157,15 +174,11 @@ main(int argc, char *const *argv) out: shm_fini(); - tll_foreach(wayl->terms, it) - term_destroy(it->item); - - int child_ret = wayl->last_exit_value; - + server_destroy(server); + term_destroy(term); wayl_destroy(wayl); fdm_destroy(fdm); config_free(conf); - return ret == EXIT_SUCCESS ? child_ret : ret; - + return ret == EXIT_SUCCESS && !as_server ? shutdown_ctx.exit_code : ret; } diff --git a/terminal.c b/terminal.c index e0c76708..cbe67b58 100644 --- a/terminal.c +++ b/terminal.c @@ -289,7 +289,8 @@ initialize_fonts(struct terminal *term, const struct config *conf) struct terminal * term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl, - int argc, char *const *argv) + int argc, char *const *argv, + void (*shutdown_cb)(void *data, int exit_code), void *shutdown_data) { int ptmx = -1; int flash_fd = -1; @@ -411,6 +412,8 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl, .lower_fd = delay_lower_fd, .upper_fd = delay_upper_fd, }, + .shutdown_cb = shutdown_cb, + .shutdown_data = shutdown_data, }; initialize_color_cube(term); @@ -484,8 +487,12 @@ fdm_shutdown(struct fdm *fdm, int fd, int events, void *data) assert(wayl->focused != term); assert(wayl->moused != term); + void (*cb)(void *, int) = term->shutdown_cb; + void *cb_data = term->shutdown_data; int exit_code = term_destroy(term); + if (cb != NULL) + cb(cb_data, exit_code); return true; } diff --git a/terminal.h b/terminal.h index 5a0473b3..3ec2802c 100644 --- a/terminal.h +++ b/terminal.h @@ -287,12 +287,18 @@ struct terminal { int lower_fd; int upper_fd; } delayed_render_timer; + + bool is_shutting_down; + void (*shutdown_cb)(void *data, int exit_code); + void *shutdown_data; }; struct config; struct terminal *term_init( const struct config *conf, struct fdm *fdm, struct wayland *wayl, - int argc, char *const *argv); + int argc, char *const *argv, + void (*shutdown_cb)(void *data, int exit_code), void *shutdown_data); + bool term_shutdown(struct terminal *term); int term_destroy(struct terminal *term); diff --git a/wayland.h b/wayland.h index 7e7bfd4c..951a0ece 100644 --- a/wayland.h +++ b/wayland.h @@ -150,7 +150,6 @@ struct wayland { tll(struct terminal *) terms; struct terminal *focused; struct terminal *moused; - int last_exit_value; /* TODO: exit value from client(s)? */ }; struct wayland *wayl_init(struct fdm *fdm);