Files
bshell/bshell.runtime/line-editor/display.c
T

99 lines
2.7 KiB
C
Raw Normal View History

#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;
}