From d8ec77c4f8059e300070c739be5f1a2a94d3a928 Mon Sep 17 00:00:00 2001 From: Jocelyn Falempe Date: Wed, 19 Nov 2025 10:34:04 +0100 Subject: [PATCH] Set env variable KMS_START_SCRIPT and TERM_SESSION_TYPE Set the env variable KMS_START_SCRIPT to "kmscon-launch-gui". This can help scripts like startx to work better when launched from kmscon Set the env variable TERM_SESSION_TYPE to kms or fb, depending on the video backend, for the same reason Signed-off-by: Jocelyn Falempe --- src/kmscon_terminal.c | 15 ++++++++++++++- src/pty.c | 17 ++++++++++++----- src/pty.h | 2 +- src/uterm_video.c | 6 ++++++ src/uterm_video.h | 1 + 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/kmscon_terminal.c b/src/kmscon_terminal.c index bb1287fe..7fa8eb8e 100644 --- a/src/kmscon_terminal.c +++ b/src/kmscon_terminal.c @@ -188,6 +188,19 @@ static void redraw_all(struct kmscon_terminal *term) } } +static bool has_kms_display(struct kmscon_terminal *term) +{ + struct shl_dlist *iter; + struct screen *scr; + + shl_dlist_for_each(iter, &term->screens) { + scr = shl_dlist_entry(iter, struct screen, list); + if (uterm_display_is_drm(scr->disp)) + return true; + } + return false; +} + static void redraw_all_test(struct kmscon_terminal *term) { struct shl_dlist *iter; @@ -597,7 +610,7 @@ static int terminal_open(struct kmscon_terminal *term) tsm_vte_hard_reset(term->vte); width = tsm_screen_get_width(term->console); height = tsm_screen_get_height(term->console); - ret = kmscon_pty_open(term->pty, width, height); + ret = kmscon_pty_open(term->pty, width, height, has_kms_display(term)); if (ret) return ret; diff --git a/src/pty.c b/src/pty.c index 8c68177c..3039db3f 100644 --- a/src/pty.c +++ b/src/pty.c @@ -252,7 +252,7 @@ static bool pty_is_open(struct kmscon_pty *pty) static void __attribute__((noreturn)) exec_child(const char *term, const char *colorterm, char **argv, - const char *seat, const char *vtnr, bool env_reset) + const char *seat, const char *vtnr, bool env_reset, bool drm) { char **env; char **def_argv; @@ -286,6 +286,13 @@ exec_child(const char *term, const char *colorterm, char **argv, if (vtnr) setenv("XDG_VTNR", vtnr, 1); + if (drm) { + setenv("KMS_START_SCRIPT", "kmscon-launch-gui", 1); + setenv("TERM_SESSION_TYPE", "kms", 1); + } else { + setenv("TERM_SESSION_TYPE", "fb", 1); + } + execve(argv[0], argv, environ); log_err("failed to exec child %s: %m", argv[0]); @@ -394,7 +401,7 @@ static void setup_child(int master, struct winsize *ws) * the libutil library in glibc. */ static int pty_spawn(struct kmscon_pty *pty, int master, - unsigned short width, unsigned short height) + unsigned short width, unsigned short height, bool drm) { pid_t pid; struct winsize ws; @@ -411,7 +418,7 @@ static int pty_spawn(struct kmscon_pty *pty, int master, case 0: setup_child(master, &ws); exec_child(pty->term, pty->colorterm, pty->argv, pty->seat, - pty->vtnr, pty->env_reset); + pty->vtnr, pty->env_reset, drm); exit(EXIT_FAILURE); default: log_debug("forking child %d", pid); @@ -549,7 +556,7 @@ static void sig_child(struct ev_eloop *eloop, struct ev_child_data *chld, } int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, - unsigned short height) + unsigned short height, bool drm) { int ret; int master; @@ -575,7 +582,7 @@ int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, if (ret) goto err_fd; - ret = pty_spawn(pty, master, width, height); + ret = pty_spawn(pty, master, width, height, drm); if (ret) goto err_sig; diff --git a/src/pty.h b/src/pty.h index e5e051a4..413125ce 100644 --- a/src/pty.h +++ b/src/pty.h @@ -65,7 +65,7 @@ int kmscon_pty_get_fd(struct kmscon_pty *pty); void kmscon_pty_dispatch(struct kmscon_pty *pty); int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, - unsigned short height); + unsigned short height, bool drm); void kmscon_pty_close(struct kmscon_pty *pty); int kmscon_pty_write(struct kmscon_pty *pty, const char *u8, size_t len); diff --git a/src/uterm_video.c b/src/uterm_video.c index 84dc728b..e68e9b05 100644 --- a/src/uterm_video.c +++ b/src/uterm_video.c @@ -326,6 +326,12 @@ void uterm_display_unbind(struct uterm_display *disp) uterm_display_unref(disp); } +SHL_EXPORT +bool uterm_display_is_drm(struct uterm_display *disp) +{ + return (disp->flags & DISPLAY_DITHERING) == 0; +} + SHL_EXPORT struct uterm_display *uterm_display_next(struct uterm_display *disp) { diff --git a/src/uterm_video.h b/src/uterm_video.h index 154f3c20..fea62c38 100644 --- a/src/uterm_video.h +++ b/src/uterm_video.h @@ -148,6 +148,7 @@ unsigned int uterm_mode_get_height(const struct uterm_mode *mode); void uterm_display_ref(struct uterm_display *disp); void uterm_display_unref(struct uterm_display *disp); +bool uterm_display_is_drm(struct uterm_display *disp); struct uterm_display *uterm_display_next(struct uterm_display *disp); int uterm_display_register_cb(struct uterm_display *disp, uterm_display_cb cb,