ev_eloop_exit(app->eloop);
}
+static void terminal_close(struct wlt_terminal *term, unsigned int event,
+ void *data)
+{
+ struct wlt_app *app = data;
+
+ if (event == WLT_TERMINAL_HUP) {
+ log_info("closing pty");
+ ev_eloop_exit(app->eloop);
+ }
+}
+
static int window_init(struct wlt_app *app)
{
int ret;
return ret;
}
+ ret = wlt_terminal_open(term, terminal_close, app);
+ if (ret) {
+ log_error("cannot open terminal");
+ return ret;
+ }
+
return 0;
}
#include "tsm_screen.h"
#include "tsm_vte.h"
#include "wlt_main.h"
+#include "wlt_terminal.h"
#include "wlt_toolkit.h"
#define LOG_SUBSYSTEM "wlt_terminal"
struct kmscon_font *font_normal;
unsigned int cols;
unsigned int rows;
+
+ wlt_terminal_cb cb;
+ void *data;
};
static int draw_cell(struct tsm_screen *scr,
ret = tsm_screen_resize(term->scr, term->cols, term->rows);
if (ret)
log_error("cannot resize TSM screen: %d", ret);
-
- if (!term->pty_open) {
- term->pty_open = true;
- kmscon_pty_open(term->pty, term->cols, term->rows);
- } else {
- kmscon_pty_resize(term->pty, term->cols, term->rows);
- }
+ kmscon_pty_resize(term->pty, term->cols, term->rows);
}
static void widget_key(struct wlt_widget *widget, unsigned int mask,
struct wlt_terminal *term = data;
if (!len) {
- log_debug("hangup on PTY");
- /* TODO: signal that to caller */
+ term->pty_open = false;
+ if (term->cb)
+ term->cb(term, WLT_TERMINAL_HUP, term->data);
} else {
tsm_vte_input(term->vte, u8, len);
wlt_window_schedule_redraw(term->wnd);
memset(term, 0, sizeof(*term));
term->wnd = wnd;
term->eloop = wlt_window_get_eloop(wnd);
+ term->cols = 80;
+ term->rows = 24;
attr.ppi = wlt_conf.font_ppi;
attr.points = wlt_conf.font_size;
wlt_widget_destroy(term->widget);
}
+
+int wlt_terminal_open(struct wlt_terminal *term, wlt_terminal_cb cb,
+ void *data)
+{
+ int ret;
+
+ if (!term)
+ return -EINVAL;
+
+ if (term->pty_open)
+ return -EALREADY;
+
+ term->cb = cb;
+ term->data = data;
+
+ kmscon_pty_close(term->pty);
+ ret = kmscon_pty_open(term->pty, term->cols, term->rows);
+ if (ret)
+ return ret;
+
+ term->pty_open = true;
+ return 0;
+}
struct wlt_terminal;
+enum wlt_terminal_event_type {
+ WLT_TERMINAL_HUP,
+};
+
+typedef void (*wlt_terminal_cb) (struct wlt_terminal *term,
+ unsigned int event,
+ void *data);
+
int wlt_terminal_new(struct wlt_terminal **out, struct wlt_window *wnd);
void wlt_terminal_destroy(struct wlt_terminal *term);
+int wlt_terminal_open(struct wlt_terminal *term, wlt_terminal_cb cb,
+ void *data);
+
#endif /* WLT_TERMINAL_H */