mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-10 04:27:45 -05:00
terminal: shutdown (or --hold) when the client process terminates
Shutdown the terminal when the client process terminates, not when the ptmx file descriptor is closed. This fixes an issue where the terminal remains running after the client process has terminated, if it spawned child processes that inherited the ptmx file descriptor.
This commit is contained in:
parent
3c6789fb8b
commit
8b0ef6aa85
3 changed files with 28 additions and 6 deletions
|
|
@ -33,6 +33,11 @@
|
|||
### Deprecated
|
||||
### Removed
|
||||
### Fixed
|
||||
|
||||
* Exit when the client application terminates, not when the TTY file
|
||||
descriptor is closed.
|
||||
|
||||
|
||||
### Security
|
||||
### Contributors
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "async.h"
|
||||
#include "config.h"
|
||||
#include "reaper.h"
|
||||
#include "sixel.h"
|
||||
#include "user-notification.h"
|
||||
#include "vt.h"
|
||||
|
|
@ -134,6 +135,9 @@ notify_notify(const struct terminal *term, const char *title, const char *body)
|
|||
{
|
||||
}
|
||||
|
||||
void reaper_add(struct reaper *reaper, pid_t pid, reaper_cb cb, void *cb_data) {}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, const char *const *argv)
|
||||
{
|
||||
|
|
|
|||
25
terminal.c
25
terminal.c
|
|
@ -314,12 +314,8 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
|
|||
}
|
||||
|
||||
if (hup) {
|
||||
if (term->conf->hold_at_exit) {
|
||||
fdm_del(fdm, fd);
|
||||
term->ptmx = -1;
|
||||
return true;
|
||||
} else
|
||||
return term_shutdown(term);
|
||||
fdm_del(fdm, fd);
|
||||
term->ptmx = -1;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -954,6 +950,21 @@ load_fonts_from_conf(struct terminal *term)
|
|||
return reload_fonts(term);
|
||||
}
|
||||
|
||||
static bool
|
||||
slave_died(struct reaper *reaper, pid_t pid, void *data)
|
||||
{
|
||||
struct terminal *term = data;
|
||||
LOG_DBG("slave (PID=%u) died", pid);
|
||||
|
||||
if (term->conf->hold_at_exit) {
|
||||
fdm_del(term->fdm, term->ptmx);
|
||||
term->ptmx = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
return term_shutdown(term);
|
||||
}
|
||||
|
||||
struct terminal *
|
||||
term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
|
||||
struct wayland *wayl, const char *foot_exe, const char *cwd,
|
||||
|
|
@ -1159,6 +1170,8 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
|
|||
goto err;
|
||||
}
|
||||
|
||||
reaper_add(term->reaper, term->slave, &slave_died, term);
|
||||
|
||||
/* Guess scale; we're not mapped yet, so we don't know on which
|
||||
* output we'll be. Pick highest scale we find for now */
|
||||
tll_foreach(term->wl->monitors, it) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue