From ecb7ddbc290de6678fbf4aa3fb6c429824d8adf5 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 28 Jan 2012 14:03:52 +0100 Subject: [PATCH] pty: merge input and close callbacks There is no reason to keep two callbacks as the caller always registers both. Hence, we can use a shared callback. Reading length 0 means closed like reading from an fd. Signed-off-by: David Herrmann --- src/pty.c | 22 ++++------------------ src/pty.h | 3 +-- src/terminal.c | 24 +++++++++++------------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/pty.c b/src/pty.c index fffe153..bd4432b 100644 --- a/src/pty.c +++ b/src/pty.c @@ -50,9 +50,6 @@ struct kmscon_pty { kmscon_pty_input_cb input_cb; void *data; - - kmscon_pty_closed_cb closed_cb; - void *closed_data; }; int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop, @@ -290,12 +287,12 @@ static void pty_input(struct kmscon_fd *fd, int mask, void *data) return; } - if (pty->input_cb) + if (pty->input_cb && len) pty->input_cb(pty, u8, len, pty->data); } int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, - unsigned short height, kmscon_pty_closed_cb closed_cb, void *data) + unsigned short height) { int ret; @@ -317,32 +314,21 @@ int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, return ret; } - pty->closed_cb = closed_cb; - pty->closed_data = data; return 0; } void kmscon_pty_close(struct kmscon_pty *pty) { - kmscon_pty_closed_cb cb; - void *data; - if (!pty || pty->fd < 0) return; kmscon_eloop_rm_fd(pty->efd); pty->efd = NULL; - close(pty->fd); pty->fd = -1; - cb = pty->closed_cb; - data = pty->closed_data; - pty->closed_cb = NULL; - pty->closed_data = NULL; - - if (cb) - cb(pty, data); + if (pty->input_cb) + pty->input_cb(pty, NULL, 0, pty->data); } void kmscon_pty_write(struct kmscon_pty *pty, const char *u8, size_t len) diff --git a/src/pty.h b/src/pty.h index 54449ad..cf40197 100644 --- a/src/pty.h +++ b/src/pty.h @@ -49,7 +49,6 @@ struct kmscon_pty; typedef void (*kmscon_pty_input_cb) (struct kmscon_pty *pty, char *u8, size_t len, void *data); -typedef void (*kmscon_pty_closed_cb) (struct kmscon_pty *pty, void *data); int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop, kmscon_pty_input_cb input_cb, void *data); @@ -57,7 +56,7 @@ void kmscon_pty_ref(struct kmscon_pty *pty); void kmscon_pty_unref(struct kmscon_pty *pty); int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, - unsigned short height, kmscon_pty_closed_cb closed_cb, void *data); + unsigned short height); void kmscon_pty_close(struct kmscon_pty *pty); void kmscon_pty_write(struct kmscon_pty *pty, const char *u8, size_t len); diff --git a/src/terminal.c b/src/terminal.c index b1f7d42..c9b41ea 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -111,12 +111,16 @@ static void pty_input(struct kmscon_pty *pty, char *u8, size_t len, void *data) size_t i; struct kmscon_terminal *term = data; - /* FIXME: UTF-8. */ - for (i=0; i < len; i++) - if (u8[i] < 128) - kmscon_vte_input(term->vte, u8[i]); - - schedule_redraw(term); + if (!len) { + kmscon_terminal_close(term); + } else { + /* FIXME: UTF-8. */ + for (i=0; i < len; i++) + if (u8[i] < 128) + kmscon_vte_input(term->vte, u8[i]); + + schedule_redraw(term); + } } int kmscon_terminal_new(struct kmscon_terminal **out, @@ -203,12 +207,6 @@ void kmscon_terminal_unref(struct kmscon_terminal *term) log_debug("terminal: destroying terminal object\n"); } -static void pty_closed(struct kmscon_pty *pty, void *data) -{ - struct kmscon_terminal *term = data; - kmscon_terminal_close(term); -} - int kmscon_terminal_open(struct kmscon_terminal *term, kmscon_terminal_closed_cb closed_cb, void *data) { @@ -220,7 +218,7 @@ int kmscon_terminal_open(struct kmscon_terminal *term, width = kmscon_console_get_width(term->console); height = kmscon_console_get_height(term->console); - ret = kmscon_pty_open(term->pty, width, height, pty_closed, term); + ret = kmscon_pty_open(term->pty, width, height); if (ret) return ret; -- 2.7.4