diff --git a/src/pty.c b/src/pty.c index 744fe81..fffe153 100644 --- a/src/pty.c +++ b/src/pty.c @@ -37,6 +37,7 @@ #include #include +#include "eloop.h" #include "log.h" #include "pty.h" @@ -54,8 +55,8 @@ struct kmscon_pty { void *closed_data; }; -int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb, - void *data) +int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop, + kmscon_pty_input_cb input_cb, void *data) { struct kmscon_pty *pty; @@ -71,9 +72,11 @@ int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb, memset(pty, 0, sizeof(*pty)); pty->fd = -1; pty->ref = 1; + pty->eloop = loop; pty->input_cb = input_cb; pty->data = data; + kmscon_eloop_ref(pty->eloop); *out = pty; return 0; } @@ -95,6 +98,7 @@ void kmscon_pty_unref(struct kmscon_pty *pty) return; kmscon_pty_close(pty); + kmscon_eloop_unref(pty->eloop); free(pty); log_debug("pty: destroying pty object\n"); } @@ -290,38 +294,12 @@ static void pty_input(struct kmscon_fd *fd, int mask, void *data) pty->input_cb(pty, u8, len, pty->data); } -static int connect_eloop(struct kmscon_pty *pty, struct kmscon_eloop *eloop) +int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, + unsigned short height, kmscon_pty_closed_cb closed_cb, void *data) { int ret; - if (pty->eloop) - return -EALREADY; - - ret = kmscon_eloop_new_fd(eloop, &pty->efd, pty->fd, - KMSCON_READABLE, pty_input, pty); - if (ret) - return ret; - - kmscon_eloop_ref(eloop); - pty->eloop = eloop; - return 0; -} - -static void disconnect_eloop(struct kmscon_pty *pty) -{ - kmscon_eloop_rm_fd(pty->efd); - kmscon_eloop_unref(pty->eloop); - pty->efd = NULL; - pty->eloop = NULL; -} - -int kmscon_pty_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop, - unsigned short width, unsigned short height, - kmscon_pty_closed_cb closed_cb, void *data) -{ - int ret; - - if (!pty || !eloop) + if (!pty) return -EINVAL; if (pty->fd >= 0) @@ -331,11 +309,8 @@ int kmscon_pty_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop, if (ret) return ret; - ret = connect_eloop(pty, eloop); - if (ret == -EALREADY) { - disconnect_eloop(pty); - ret = connect_eloop(pty, eloop); - } + ret = kmscon_eloop_new_fd(pty->eloop, &pty->efd, pty->fd, + KMSCON_READABLE, pty_input, pty); if (ret) { close(pty->fd); pty->fd = -1; @@ -355,7 +330,8 @@ void kmscon_pty_close(struct kmscon_pty *pty) if (!pty || pty->fd < 0) return; - disconnect_eloop(pty); + kmscon_eloop_rm_fd(pty->efd); + pty->efd = NULL; close(pty->fd); pty->fd = -1; diff --git a/src/pty.h b/src/pty.h index 302d2e8..54449ad 100644 --- a/src/pty.h +++ b/src/pty.h @@ -51,14 +51,13 @@ 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, kmscon_pty_input_cb input_cb, - void *data); +int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop, + 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_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop, - unsigned short width, unsigned short height, - kmscon_pty_closed_cb closed_cb, void *data); +int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width, + unsigned short height, kmscon_pty_closed_cb closed_cb, void *data); 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 da4b39d..b1f7d42 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -120,7 +120,8 @@ static void pty_input(struct kmscon_pty *pty, char *u8, size_t len, void *data) } int kmscon_terminal_new(struct kmscon_terminal **out, - struct kmscon_font_factory *ff, struct kmscon_compositor *comp) + struct kmscon_eloop *loop, struct kmscon_font_factory *ff, + struct kmscon_compositor *comp) { struct kmscon_terminal *term; int ret; @@ -136,6 +137,7 @@ int kmscon_terminal_new(struct kmscon_terminal **out, memset(term, 0, sizeof(*term)); term->ref = 1; + term->eloop = loop; term->comp = comp; ret = kmscon_idle_new(&term->redraw); @@ -151,10 +153,11 @@ int kmscon_terminal_new(struct kmscon_terminal **out, goto err_con; kmscon_vte_bind(term->vte, term->console); - ret = kmscon_pty_new(&term->pty, pty_input, term); + ret = kmscon_pty_new(&term->pty, term->eloop, pty_input, term); if (ret) goto err_vte; + kmscon_eloop_ref(term->eloop); kmscon_compositor_ref(term->comp); *out = term; @@ -195,33 +198,11 @@ void kmscon_terminal_unref(struct kmscon_terminal *term) kmscon_console_unref(term->console); kmscon_idle_unref(term->redraw); kmscon_compositor_unref(term->comp); + kmscon_eloop_unref(term->eloop); free(term); log_debug("terminal: destroying terminal object\n"); } -int connect_eloop(struct kmscon_terminal *term, struct kmscon_eloop *eloop) -{ - if (!term || !eloop) - return -EINVAL; - - if (term->eloop) - return -EALREADY; - - kmscon_eloop_ref(eloop); - term->eloop = eloop; - - return 0; -} - -void disconnect_eloop(struct kmscon_terminal *term) -{ - if (!term) - return; - - kmscon_eloop_unref(term->eloop); - term->eloop = NULL; -} - static void pty_closed(struct kmscon_pty *pty, void *data) { struct kmscon_terminal *term = data; @@ -229,8 +210,7 @@ static void pty_closed(struct kmscon_pty *pty, void *data) } int kmscon_terminal_open(struct kmscon_terminal *term, - struct kmscon_eloop *eloop, - kmscon_terminal_closed_cb closed_cb, void *data) + kmscon_terminal_closed_cb closed_cb, void *data) { int ret; unsigned short width, height; @@ -238,21 +218,11 @@ int kmscon_terminal_open(struct kmscon_terminal *term, if (!term) return -EINVAL; - ret = connect_eloop(term, eloop); - if (ret == -EALREADY) { - disconnect_eloop(term); - ret = connect_eloop(term, eloop); - } - if (ret) - return ret; - width = kmscon_console_get_width(term->console); height = kmscon_console_get_height(term->console); - ret = kmscon_pty_open(term->pty, eloop, width, height, pty_closed, term); - if (ret) { - disconnect_eloop(term); + ret = kmscon_pty_open(term->pty, width, height, pty_closed, term); + if (ret) return ret; - } term->closed_cb = closed_cb; term->closed_data = data; @@ -272,7 +242,6 @@ void kmscon_terminal_close(struct kmscon_terminal *term) term->closed_data = NULL; term->closed_cb = NULL; - disconnect_eloop(term); kmscon_pty_close(term->pty); if (cb) diff --git a/src/terminal.h b/src/terminal.h index d773c72..34a2c19 100644 --- a/src/terminal.h +++ b/src/terminal.h @@ -35,6 +35,7 @@ #include #include "console.h" +#include "eloop.h" #include "font.h" #include "output.h" #include "unicode.h" @@ -45,13 +46,13 @@ typedef void (*kmscon_terminal_closed_cb) (struct kmscon_terminal *term, void *data); int kmscon_terminal_new(struct kmscon_terminal **out, - struct kmscon_font_factory *ff, struct kmscon_compositor *comp); + struct kmscon_eloop *loop, struct kmscon_font_factory *ff, + struct kmscon_compositor *comp); void kmscon_terminal_ref(struct kmscon_terminal *term); void kmscon_terminal_unref(struct kmscon_terminal *term); int kmscon_terminal_open(struct kmscon_terminal *term, - struct kmscon_eloop *eloop, - kmscon_terminal_closed_cb closed_cb, void *data); + kmscon_terminal_closed_cb closed_cb, void *data); void kmscon_terminal_close(struct kmscon_terminal *term); int kmscon_terminal_add_output(struct kmscon_terminal *term, diff --git a/tests/test_terminal.c b/tests/test_terminal.c index 00d08cb..d94cf3b 100644 --- a/tests/test_terminal.c +++ b/tests/test_terminal.c @@ -110,8 +110,7 @@ static void terminal_closed(struct kmscon_terminal *term, void *data) if (!app) goto err_out; - ret = kmscon_terminal_open(app->term, app->eloop, - terminal_closed, app); + ret = kmscon_terminal_open(app->term, terminal_closed, app); if (ret) goto err_out; @@ -247,12 +246,11 @@ static int setup_app(struct app *app) if (ret) goto err_loop; - ret = kmscon_terminal_new(&app->term, app->ff, app->comp); + ret = kmscon_terminal_new(&app->term, app->eloop, app->ff, app->comp); if (ret) goto err_loop; - ret = kmscon_terminal_open(app->term, app->eloop, - terminal_closed, app); + ret = kmscon_terminal_open(app->term, terminal_closed, app); if (ret) goto err_loop;