pty: set "TERM" via helper function instead of kmscon_conf
authorDavid Herrmann <dh.herrmann@googlemail.com>
Wed, 26 Sep 2012 17:25:35 +0000 (19:25 +0200)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Wed, 26 Sep 2012 17:25:35 +0000 (19:25 +0200)
Instead of accessing global state, we now set the TERM value via a helper
function. This is needed to make the pty layer independent of kmscon.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/pty.c
src/pty.h
src/terminal.c

index 98c9283..60a9fb1 100644 (file)
--- a/src/pty.c
+++ b/src/pty.c
@@ -57,6 +57,8 @@ struct kmscon_pty {
 
        kmscon_pty_input_cb input_cb;
        void *data;
+
+       char *term;
 };
 
 int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb,
@@ -112,11 +114,28 @@ void kmscon_pty_unref(struct kmscon_pty *pty)
 
        log_debug("free pty object");
        kmscon_pty_close(pty);
+       free(pty->term);
        shl_ring_free(pty->msgbuf);
        ev_eloop_unref(pty->eloop);
        free(pty);
 }
 
+int kmscon_pty_set_term(struct kmscon_pty *pty, const char *term)
+{
+       char *t;
+
+       if (!pty || !term)
+               return -EINVAL;
+
+       t = strdup(term);
+       if (!t)
+               return -ENOMEM;
+       free(pty->term);
+       pty->term = t;
+
+       return 0;
+}
+
 int kmscon_pty_get_fd(struct kmscon_pty *pty)
 {
        if (!pty)
@@ -167,9 +186,12 @@ static void pty_close(struct kmscon_pty *pty, bool user)
 }
 
 static void __attribute__((noreturn))
-exec_child(int pty_master)
+exec_child(int pty_master, const char *term)
 {
-       setenv("TERM", kmscon_conf.term, 1);
+       if (!term)
+               term = "vt220";
+
+       setenv("TERM", term, 1);
        execvp(kmscon_conf.argv[0], kmscon_conf.argv);
 
        log_err("failed to exec child %s: %m", kmscon_conf.argv[0]);
@@ -287,7 +309,7 @@ static int pty_spawn(struct kmscon_pty *pty, int master,
                return -errno;
        case 0:
                setup_child(master, &ws);
-               exec_child(pty->fd);
+               exec_child(pty->fd, pty->term);
                exit(EXIT_FAILURE);
        default:
                pty->fd = master;
index eb58e63..42558a1 100644 (file)
--- a/src/pty.h
+++ b/src/pty.h
@@ -53,6 +53,7 @@ int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb,
                   void *data);
 void kmscon_pty_ref(struct kmscon_pty *pty);
 void kmscon_pty_unref(struct kmscon_pty *pty);
+int kmscon_pty_set_term(struct kmscon_pty *pty, const char *term);
 
 int kmscon_pty_get_fd(struct kmscon_pty *pty);
 void kmscon_pty_dispatch(struct kmscon_pty *pty);
index 851d411..027f067 100644 (file)
@@ -450,6 +450,10 @@ int kmscon_terminal_new(struct kmscon_terminal **out,
        if (ret)
                goto err_vte;
 
+       ret = kmscon_pty_set_term(term->pty, kmscon_conf.term);
+       if (ret)
+               goto err_pty;
+
        ret = ev_eloop_new_fd(term->eloop, &term->ptyfd,
                              kmscon_pty_get_fd(term->pty),
                              EV_READABLE, pty_event, term);