#include "line-editor.h" void line_ed_hide(struct bshell_line_ed_p *ed) { if (!ed->ed_render.r_vlines) { return; } #if 0 fprintf(stderr, "--- hide ---\n"); fprintf(stderr, "vlines=%lu, cursor=%lu->(%ld,%ld)\n", ed->ed_render.r_vlines, ed->ed_cursor, ed->ed_render.ed_points.c_cursor_x, ed->ed_render.ed_points.c_cursor_y); #endif if (ed->ed_render.ed_points.c_cursor_y > 0) { fx_tty_move_cursor_y( ed->ed_tty, FX_TTY_POS_CURSOR, -ed->ed_render.ed_points.c_cursor_y); } fx_tty_move_cursor_x(ed->ed_tty, FX_TTY_POS_START, 0); fx_tty_clear( ed->ed_tty, FX_TTY_CLEAR_SCREEN | FX_TTY_CLEAR_FROM_CURSOR); memset(&ed->ed_render, 0x0, sizeof ed->ed_render); } static void render_prompt(struct bshell_line_ed_p *ed) { if (ed->ed_render_prompt) { bshell_line_ed_plugin_class *renderer = fx_object_get_interface( ed->ed_render_prompt, BSHELL_TYPE_LINE_EDITOR_PLUGIN); renderer->p_render_prompt(ed->ed_render_prompt, ed->ed_self); } } static void render_buffer(struct bshell_line_ed_p *ed) { if (ed->ed_render_buffer) { bshell_line_ed_plugin_class *renderer = fx_object_get_interface( ed->ed_render_buffer, BSHELL_TYPE_LINE_EDITOR_PLUGIN); renderer->p_render_buffer(ed->ed_render_buffer, ed->ed_self); } } void line_ed_show(struct bshell_line_ed_p *ed) { render_prompt(ed); render_buffer(ed); line_ed_get_points(ed, &ed->ed_render.ed_points); bool cursor_limit_newline = ed->ed_render.ed_points.c_cursor_limit_x == 0 && ed->ed_render.ed_points.c_cursor_limit_y > 0; if (cursor_limit_newline) { fx_tty_putc(ed->ed_tty, 0, '\r'); fx_tty_putc(ed->ed_tty, 0, '\n'); } long shift_x = 0, shift_y = 0; shift_x = (long)ed->ed_render.ed_points.c_cursor_x - (long)ed->ed_render.ed_points.c_cursor_limit_x; shift_y = (long)ed->ed_render.ed_points.c_cursor_y - (long)ed->ed_render.ed_points.c_cursor_limit_y; fx_tty_move_cursor_x(ed->ed_tty, FX_TTY_POS_CURSOR, shift_x); fx_tty_move_cursor_y(ed->ed_tty, FX_TTY_POS_CURSOR, shift_y); #if 0 fprintf(stderr, "--- show ---\n"); fprintf(stderr, "cursor=%lu->(%lu,%lu)\n", ed->ed_cursor, ed->ed_render.ed_points.c_cursor_x, ed->ed_render.ed_points.c_cursor_y); fprintf(stderr, "cursor_limit=(%lu,%lu)\n", ed->ed_render.ed_points.c_cursor_limit_x, ed->ed_render.ed_points.c_cursor_limit_y); fprintf(stderr, "render_limit=(%lu,%lu)\n", ed->ed_render.ed_points.c_render_limit_x, ed->ed_render.ed_points.c_render_limit_y); #endif ed->ed_render.r_vlines = ed->ed_render.ed_points.c_render_limit_y + 1; } int line_ed_get_char_width(fx_wchar c) { /* TODO support double-width and zero-width characters */ return fx_wchar_is_graph(c) ? 1 : 0; }