struct kmscon_terminal *term = data;
if (!len) {
- kmscon_terminal_close(term);
+ if (term->closed_cb)
+ term->closed_cb(term, term->closed_data);
} else {
/* FIXME: UTF-8. */
for (i=0; i < len; i++)
int kmscon_terminal_new(struct kmscon_terminal **out,
struct kmscon_eloop *loop, struct kmscon_font_factory *ff,
- struct kmscon_compositor *comp)
+ struct kmscon_compositor *comp, struct kmscon_symbol_table *st)
{
struct kmscon_terminal *term;
int ret;
if (ret)
goto err_idle;
- ret = kmscon_vte_new(&term->vte);
+ ret = kmscon_vte_new(&term->vte, st);
if (ret)
goto err_con;
kmscon_vte_bind(term->vte, term->console);
if (--term->ref)
return;
- term->closed_cb = NULL;
kmscon_terminal_close(term);
kmscon_terminal_rm_all_outputs(term);
kmscon_pty_unref(term->pty);
void kmscon_terminal_close(struct kmscon_terminal *term)
{
- kmscon_terminal_closed_cb cb;
- void *data;
-
if (!term)
return;
- cb = term->closed_cb;
- data = term->closed_data;
+ kmscon_pty_close(term->pty);
term->closed_data = NULL;
term->closed_cb = NULL;
-
- kmscon_pty_close(term->pty);
-
- if (cb)
- cb(term, data);
}
int kmscon_terminal_add_output(struct kmscon_terminal *term,
}
}
-void kmscon_terminal_input(struct kmscon_terminal *term, kmscon_symbol_t ch)
+int kmscon_terminal_input(struct kmscon_terminal *term,
+ const struct kmscon_input_event *ev)
{
int ret;
+ const char *u8;
+ size_t len;
- /* FIXME: UTF-8. */
- if (ch < 128) {
- ret = kmscon_pty_write(term->pty, (char *)&ch, 1);
- if (ret)
- kmscon_terminal_close(term);
+ if (!term || !ev)
+ return -EINVAL;
+
+ ret = kmscon_vte_handle_keyboard(term->vte, ev, &u8, &len);
+ switch (ret) {
+ case KMSCON_VTE_SEND:
+ ret = kmscon_pty_write(term->pty, u8, len);
+ if (ret)
+ return ret;
+ break;
+ case KMSCON_VTE_DROP:
+ default:
+ break;
}
+
+ return 0;
}
int kmscon_terminal_new(struct kmscon_terminal **out,
struct kmscon_eloop *loop, struct kmscon_font_factory *ff,
- struct kmscon_compositor *comp);
+ struct kmscon_compositor *comp, struct kmscon_symbol_table *st);
void kmscon_terminal_ref(struct kmscon_terminal *term);
void kmscon_terminal_unref(struct kmscon_terminal *term);
struct kmscon_output *output);
void kmscon_terminal_rm_all_outputs(struct kmscon_terminal *term);
-void kmscon_terminal_input(struct kmscon_terminal *term, kmscon_symbol_t ch);
+int kmscon_terminal_input(struct kmscon_terminal *term,
+ const struct kmscon_input_event *ev);
#endif /* KMSCON_TERMINAL_H */
#include <string.h>
#include "console.h"
+#include "input.h"
#include "log.h"
#include "unicode.h"
#include "vte.h"
struct kmscon_vte {
unsigned long ref;
+ struct kmscon_symbol_table *st;
struct kmscon_console *con;
+
+ const char *kbd_sym;
};
-int kmscon_vte_new(struct kmscon_vte **out)
+int kmscon_vte_new(struct kmscon_vte **out, struct kmscon_symbol_table *st)
{
struct kmscon_vte *vte;
memset(vte, 0, sizeof(*vte));
vte->ref = 1;
+ vte->st = st;
+ kmscon_symbol_table_ref(vte->st);
*out = vte;
return 0;
}
return;
kmscon_console_unref(vte->con);
+ kmscon_symbol_free_u8(vte->kbd_sym);
+ kmscon_symbol_table_unref(vte->st);
free(vte);
log_debug("vte: destroying vte object\n");
}
else
kmscon_console_write(vte->con, ch);
}
+
+int kmscon_vte_handle_keyboard(struct kmscon_vte *vte,
+ const struct kmscon_input_event *ev, const char **u8, size_t *len)
+{
+ kmscon_symbol_t sym;
+
+ if (ev->unicode != KMSCON_INPUT_INVALID) {
+ kmscon_symbol_free_u8(vte->kbd_sym);
+ sym = kmscon_symbol_make(ev->unicode);
+ vte->kbd_sym = kmscon_symbol_get_u8(vte->st, sym, len);
+ *u8 = vte->kbd_sym;
+ return KMSCON_VTE_SEND;
+ } else {
+ return KMSCON_VTE_DROP;
+ }
+}
#include <stdlib.h>
#include "console.h"
+#include "input.h"
#include "unicode.h"
struct kmscon_vte;
-int kmscon_vte_new(struct kmscon_vte **out);
+enum kmscon_vte_keyboard_action {
+ KMSCON_VTE_DROP,
+ KMSCON_VTE_SEND,
+};
+
+int kmscon_vte_new(struct kmscon_vte **out, struct kmscon_symbol_table *st);
void kmscon_vte_ref(struct kmscon_vte *vte);
void kmscon_vte_unref(struct kmscon_vte *vte);
void kmscon_vte_bind(struct kmscon_vte *vte, struct kmscon_console *con);
void kmscon_vte_input(struct kmscon_vte *vte, kmscon_symbol_t ch);
+int kmscon_vte_handle_keyboard(struct kmscon_vte *vte,
+ const struct kmscon_input_event *ev, const char **u8, size_t *len);
#endif /* KMSCON_VTE_H */
static void terminal_closed(struct kmscon_terminal *term, void *data)
{
-#if 0
- /*
- * Alternativly, we could spwan a new login/shell here, like what
- * happens when the user exits the shell in a linux console:
- */
-
- int ret;
- struct app *app = data;
-
- if (!app)
- goto err_out;
-
- ret = kmscon_terminal_open(app->term, terminal_closed, app);
- if (ret)
- goto err_out;
-
- return;
-
-err_out:
-#endif
+ kmscon_terminal_close(term);
terminate = 1;
}
struct kmscon_input_event *ev, void *data)
{
struct app *app = data;
- kmscon_symbol_t ch;
-
- if (ev->unicode == KMSCON_INPUT_INVALID)
- return;
+ int ret;
- ch = kmscon_symbol_make(ev->unicode);
- kmscon_terminal_input(app->term, ch);
+ ret = kmscon_terminal_input(app->term, ev);
+ if (ret) {
+ kmscon_terminal_close(app->term);
+ terminate = 1;
+ }
}
static void activate_outputs(struct app *app)
if (ret)
goto err_loop;
- ret = kmscon_terminal_new(&app->term, app->eloop, app->ff, app->comp);
+ ret = kmscon_terminal_new(&app->term, app->eloop, app->ff,
+ app->comp, app->st);
if (ret)
goto err_loop;