diff options
Diffstat (limited to 'examples/dte/screen-status.c')
| -rw-r--r-- | examples/dte/screen-status.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/examples/dte/screen-status.c b/examples/dte/screen-status.c new file mode 100644 index 0000000..c7ec837 --- /dev/null +++ b/examples/dte/screen-status.c @@ -0,0 +1,46 @@ +#include "screen.h" +#include "status.h" + +void update_status_line(const Window *window) +{ + EditorState *e = window->editor; + const GlobalOptions *opts = &e->options; + InputMode mode = e->input_mode; + char lbuf[512], rbuf[512]; + sf_format(window, opts, mode, lbuf, sizeof lbuf, opts->statusline_left); + sf_format(window, opts, mode, rbuf, sizeof rbuf, opts->statusline_right); + + const ColorScheme *colors = &e->colors; + Terminal *term = &e->terminal; + TermOutputBuffer *obuf = &term->obuf; + size_t lw = u_str_width(lbuf); + size_t rw = u_str_width(rbuf); + int w = window->w; + static_assert_compatible_types(w, window->w); + term_output_reset(term, window->x, w, 0); + term_move_cursor(obuf, window->x, window->y + window->h - 1); + set_builtin_color(term, colors, BC_STATUSLINE); + + if (lw + rw <= w) { + // Both fit + term_add_str(obuf, lbuf); + term_set_bytes(term, ' ', w - lw - rw); + term_add_str(obuf, rbuf); + } else if (lw <= w && rw <= w) { + // Both would fit separately, draw overlapping + term_add_str(obuf, lbuf); + obuf->x = w - rw; + term_move_cursor(obuf, window->x + w - rw, window->y + window->h - 1); + term_add_str(obuf, rbuf); + } else if (lw <= w) { + // Left fits + term_add_str(obuf, lbuf); + term_clear_eol(term); + } else if (rw <= w) { + // Right fits + term_set_bytes(term, ' ', w - rw); + term_add_str(obuf, rbuf); + } else { + term_clear_eol(term); + } +} |
