Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion src/kmscon_terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down
17 changes: 12 additions & 5 deletions src/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion src/pty.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions src/uterm_video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions src/uterm_video.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down