ledit

Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 1e7b988b795deff7e31c7a5c28a5c669b388fb3a
parent d8b6431785a46807eca08c11b4c79ac540e0e718
Author: lumidify <nobody@lumidify.org>
Date:   Fri,  2 Sep 2022 15:17:07 +0200

Support displaying the keyboard layout in the bottom bar

Diffstat:
Mconfigparser.c | 7+++++++
Mconfigparser.h | 1+
Mledit.c | 2+-
Mleditrc.5 | 8+++++---
Mleditrc.example | 2+-
Mtheme_config.h | 2+-
Mview.c | 4++--
Mview.h | 3++-
Mwindow.c | 26+++++++++++++++++++++-----
Mwindow.h | 2+-
10 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/configparser.c b/configparser.c @@ -1816,3 +1816,10 @@ config_get_language_index(char *lang, size_t *idx_ret) { } return 1; } + +char * +config_get_language_string(size_t lang_index) { + if (lang_index >= config.num_langs) + return NULL; + return config.langs[lang_index]; +} diff --git a/configparser.h b/configparser.h @@ -77,5 +77,6 @@ command_array *config_get_commands(size_t lang_index); int config_get_language_index(char *lang, size_t *idx_ret); int config_loadfile(ledit_common *common, char *filename, char **errstr); void config_cleanup(ledit_common *common); +char *config_get_language_string(size_t lang_index); #endif diff --git a/ledit.c b/ledit.c @@ -461,7 +461,7 @@ ledit_cleanup(void) { static void redraw(void) { for (size_t i = 0; i < buffer->views_num; i++) { - view_redraw(buffer->views[i]); + view_redraw(buffer->views[i], cur_lang); } } diff --git a/leditrc.5 b/leditrc.5 @@ -140,11 +140,13 @@ The character .Ql % itself. .It %l -The current line position of the cursor. +The current line index of the cursor (1-indexed). .It %b -The current byte position of the cursor. +The current byte index of the cursor (1-indexed). Note that this is really only the raw byte position. There currently is no way to get the unicode character position in the format string. +.It %k +The current keyboard layout used for mapping keys. .It %m The current mode. .It %h @@ -154,7 +156,7 @@ A separator. The remaining space is divided equally between all separators. .El .Pp -Default: %l,%b%s%m|%h +Default: %k%s%l,%b%s%m|%h .It Ar scrollbar-width Width of scrollbar in pixels. Default: 10 diff --git a/leditrc.example b/leditrc.example @@ -13,7 +13,7 @@ theme = { bar-fg = 000000 bar-bg = CCCCCC bar-cursor = 000000 - bar-fmt = "%l,%b%s%m|%h" + bar-fmt = "%k%s%l,%b%s%m|%h" scrollbar-width = 10 scrollbar-step = 20 scrollbar-bg = CCCCCC diff --git a/theme_config.h b/theme_config.h @@ -34,7 +34,7 @@ static const char *BAR_BG = "#CCCCCC"; /* color of text cursor in line editor */ static const char *BAR_CURSOR = "#000000"; /* format of bottom bar */ -static const char *BAR_FMT = "%l,%b%s%m|%h"; +static const char *BAR_FMT = "%k%s%l,%b%s%m|%h"; /* FIXME: give in units other than pixels */ /* scrollbar width in pixels */ diff --git a/view.c b/view.c @@ -1990,10 +1990,10 @@ view_redraw_text(ledit_view *view) { } void -view_redraw(ledit_view *view) { +view_redraw(ledit_view *view, size_t lang_index) { window_set_format_args( view->window, view->mode, view->buffer->hard_line_based, - view->cur_line + 1, view->cur_index + 1 + view->cur_line + 1, view->cur_index + 1, lang_index ); if (view->redraw || view->window->redraw) { window_clear(view->window); diff --git a/view.h b/view.h @@ -471,7 +471,8 @@ void view_set_selection(ledit_view *view, size_t line1, size_t byte1, size_t lin * This only redraws if the redraw bit of the view or window are set. * This should all be set automatically. */ -void view_redraw(ledit_view *view); +void view_redraw(ledit_view *view, size_t lang_index); +/* FIXME: kind of ugly to pass lang_index here, but the window needs it - maybe store centrally somewhere? */ /* * Perform up to num undo steps. diff --git a/window.c b/window.c @@ -30,7 +30,8 @@ enum bb_itemtype { BB_HLMODE, BB_LINE, BB_BYTE, - BB_SEP + BB_SEP, + BB_LANG }; struct bb_item { @@ -91,7 +92,7 @@ set_item_text(ledit_window *window, ledit_theme *theme, struct bb_item *item, ch } void -window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_t line, size_t byte) { +window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_t line, size_t byte, size_t lang_index) { struct bb_item *items = window->bb->items; char *text; int changed = 0; @@ -149,6 +150,16 @@ window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_ changed = 1; items[i].val.sz = byte; break; + case BB_LANG: + if (lang_index == items[i].val.sz) + continue; + text = config_get_language_string(lang_index); + if (!text) + text = "(invalid language)"; + set_item_text(window, theme, &items[i], text); + changed = 1; + items[i].val.sz = lang_index; + break; default: break; } @@ -710,12 +721,17 @@ window_create(ledit_common *common, ledit_clipboard *clipboard) { case 'l': item = push_bb_item(window); item->type = BB_LINE; - item->val.sz = 0; + item->val.sz = SIZE_MAX; break; case 'b': item = push_bb_item(window); item->type = BB_BYTE; - item->val.sz = 0; + item->val.sz = SIZE_MAX; + break; + case 'k': + item = push_bb_item(window); + item->type = BB_LANG; + item->val.sz = SIZE_MAX; break; case 'm': item = push_bb_item(window); @@ -756,7 +772,7 @@ window_create(ledit_common *common, ledit_clipboard *clipboard) { } end: free(fmt); - window_set_format_args(window, NORMAL, 1, 1, 1); + window_set_format_args(window, NORMAL, 1, 1, 1, 0); return window; } diff --git a/window.h b/window.h @@ -208,7 +208,7 @@ void window_hide_message(ledit_window *window); int window_message_shown(ledit_window *window); /* FIXME: document */ -void window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_t line, size_t byte); +void window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_t line, size_t byte, size_t lang_index); /* * Set the total pixel height of the text.