summaryrefslogtreecommitdiff
path: root/src/fruits
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-03-05 14:37:12 -0500
committerAndrew Opalach <andrew@akon.city> 2025-03-06 16:05:01 -0500
commit46d5660a2582323e1c9c33a56694c322bc21b7bc (patch)
treed7db990d5978eb66847d4daadcd45bd723a62f01 /src/fruits
parent2f7e7ed84b6dafa0a81dde686b4a8e7cbecfcd94 (diff)
downloadcamu-46d5660a2582323e1c9c33a56694c322bc21b7bc.tar.gz
camu-46d5660a2582323e1c9c33a56694c322bc21b7bc.tar.bz2
camu-46d5660a2582323e1c9c33a56694c322bc21b7bc.zip
More robust disconnect for errored entries
- Improve >1 width character handling in tui input. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits')
-rw-r--r--src/fruits/cmc/ui/pane_search.c19
-rw-r--r--src/fruits/cmc/ui/ui.h1
2 files changed, 16 insertions, 4 deletions
diff --git a/src/fruits/cmc/ui/pane_search.c b/src/fruits/cmc/ui/pane_search.c
index e75caa5..e273504 100644
--- a/src/fruits/cmc/ui/pane_search.c
+++ b/src/fruits/cmc/ui/pane_search.c
@@ -37,6 +37,8 @@ void cmc_sp_add_search(struct cmc_ui *ui, struct cmc_search *search)
static bool handle_text_input(struct cmc_search_tab *tab, struct ncinput *input)
{
+ bool entered = false;
+
switch (input->id) {
case NCKEY_BACKSPACE:
if (tab->cursor > 0) {
@@ -59,7 +61,8 @@ static bool handle_text_input(struct cmc_search_tab *tab, struct ncinput *input)
tab->input_active = false;
// Erase text on next render.
tab->input_changed = true;
- return true;
+ entered = true;
+ break;
default:
if (ncinput_ctrl_p(input)) {
switch (input->id) {
@@ -111,7 +114,15 @@ static bool handle_text_input(struct cmc_search_tab *tab, struct ncinput *input)
break;
}
- return false;
+
+ tab->visual_cursor = 0;
+ if (tab->cursor > 0) {
+ for (u32 i = 0; i < tab->cursor; i++) {
+ tab->visual_cursor += al_wchar_width(al_wstr_at(&tab->input_text, i));
+ }
+ }
+
+ return entered;
}
bool cmc_sp_handle_input(struct cmc_ui *ui, struct ncinput *input)
@@ -142,7 +153,7 @@ bool cmc_sp_handle_input(struct cmc_ui *ui, struct ncinput *input)
tab->input_changed = true;
s32 absx = ncplane_abs_x(tab->input);
s32 absy = ncplane_abs_y(tab->input);
- notcurses_cursor_enable(ui->nc, absy, absx + tab->cursor);
+ notcurses_cursor_enable(ui->nc, absy, absx + tab->visual_cursor);
break;
}
}
@@ -174,7 +185,7 @@ void cmc_sp_render(struct cmc_ui *ui)
if (tab->input_active) {
s32 absx = ncplane_abs_x(tab->input);
s32 absy = ncplane_abs_y(tab->input);
- notcurses_cursor_enable(ui->nc, absy, absx + tab->cursor);
+ notcurses_cursor_enable(ui->nc, absy, absx + tab->visual_cursor);
}
}
diff --git a/src/fruits/cmc/ui/ui.h b/src/fruits/cmc/ui/ui.h
index 996bb73..2f73a81 100644
--- a/src/fruits/cmc/ui/ui.h
+++ b/src/fruits/cmc/ui/ui.h
@@ -21,6 +21,7 @@ struct cmc_search_tab {
struct cmc_search *search;
struct ncplane *input;
u32 cursor;
+ u32 visual_cursor;
bool input_active;
wstr input_text;
bool input_changed;