tSupport displaying the keyboard layout in the bottom bar - ledit - Text editor… | |
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 <[email protected]> | |
Date: Fri, 2 Sep 2022 15:17:07 +0200 | |
Support displaying the keyboard layout in the bottom bar | |
Diffstat: | |
M configparser.c | 7 +++++++ | |
M configparser.h | 1 + | |
M ledit.c | 2 +- | |
M leditrc.5 | 8 +++++--- | |
M leditrc.example | 2 +- | |
M theme_config.h | 2 +- | |
M view.c | 4 ++-- | |
M view.h | 3 ++- | |
M window.c | 26 +++++++++++++++++++++----- | |
M window.h | 2 +- | |
10 files changed, 42 insertions(+), 15 deletions(-) | |
--- | |
diff --git a/configparser.c b/configparser.c | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 … | |
+.It %k | |
+The current keyboard layout used for mapping keys. | |
.It %m | |
The current mode. | |
.It %h | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 | |
t@@ -471,7 +471,8 @@ void view_set_selection(ledit_view *view, size_t line1, si… | |
* 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 - mayb… | |
/* | |
* Perform up to num undo steps. | |
diff --git a/window.c b/window.c | |
t@@ -30,7 +30,8 @@ enum bb_itemtype { | |
BB_HLMODE, | |
BB_LINE, | |
BB_BYTE, | |
- BB_SEP | |
+ BB_SEP, | |
+ BB_LANG | |
}; | |
struct bb_item { | |
t@@ -91,7 +92,7 @@ set_item_text(ledit_window *window, ledit_theme *theme, stru… | |
} | |
void | |
-window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, siz… | |
+window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, siz… | |
struct bb_item *items = window->bb->items; | |
char *text; | |
int changed = 0; | |
t@@ -149,6 +150,16 @@ window_set_format_args(ledit_window *window, ledit_mode m… | |
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; | |
} | |
t@@ -710,12 +721,17 @@ window_create(ledit_common *common, ledit_clipboard *cli… | |
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); | |
t@@ -756,7 +772,7 @@ window_create(ledit_common *common, ledit_clipboard *clipb… | |
} | |
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 | |
t@@ -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… | |
+void window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode… | |
/* | |
* Set the total pixel height of the text. |