mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 05:44:38 +08:00
107 lines
3.8 KiB
C
107 lines
3.8 KiB
C
#include "tui_status.h"
|
||
#include "i18n.h"
|
||
#include "ssh_server.h"
|
||
#include "utf8.h"
|
||
|
||
static void format_command_input_tail(const char *input, int avail_width,
|
||
char *display, size_t display_size) {
|
||
if (!input || !display || display_size == 0) return;
|
||
|
||
display[0] = '\0';
|
||
if (avail_width < 1) {
|
||
return;
|
||
}
|
||
|
||
if (utf8_string_width(input) <= avail_width) {
|
||
strncpy(display, input, display_size - 1);
|
||
display[display_size - 1] = '\0';
|
||
return;
|
||
}
|
||
|
||
const char *marker = "<";
|
||
int marker_width = 1;
|
||
int tail_width = avail_width - marker_width;
|
||
if (tail_width < 1) {
|
||
snprintf(display, display_size, "%s", marker);
|
||
return;
|
||
}
|
||
|
||
const char *p = input + strlen(input);
|
||
const char *tail = p;
|
||
int width = 0;
|
||
|
||
while (p > input && width < tail_width) {
|
||
const char *q = p - 1;
|
||
while (q > input && ((*q & 0xC0) == 0x80)) {
|
||
q--;
|
||
}
|
||
|
||
int bytes_read = 0;
|
||
uint32_t cp = utf8_decode(q, &bytes_read);
|
||
int char_width = utf8_char_width(cp);
|
||
if (width + char_width > tail_width) {
|
||
break;
|
||
}
|
||
width += char_width;
|
||
tail = q;
|
||
p = q;
|
||
}
|
||
|
||
snprintf(display, display_size, "%s%s", marker, tail);
|
||
}
|
||
|
||
void tui_status_append(char *buffer, size_t buf_size, size_t *pos,
|
||
const struct client *client, int msg_count,
|
||
int start, int end) {
|
||
if (!buffer || !pos || !client) return;
|
||
|
||
if (client->mode == MODE_INSERT) {
|
||
if (client->width >= 58) {
|
||
buffer_appendf(buffer, buf_size, pos,
|
||
"\033[2;37m›\033[0m "
|
||
"\033[2;37m%s\033[0m"
|
||
"\033[K",
|
||
i18n_text(client->ui_lang,
|
||
I18N_INSERT_HINT_WIDE));
|
||
} else if (client->width >= 36) {
|
||
buffer_appendf(buffer, buf_size, pos,
|
||
"\033[2;37m›\033[0m "
|
||
"\033[2;37m%s\033[0m\033[K",
|
||
i18n_text(client->ui_lang,
|
||
I18N_INSERT_HINT_NARROW));
|
||
} else {
|
||
buffer_appendf(buffer, buf_size, pos, "\033[2;37m›\033[0m \033[K");
|
||
}
|
||
} else if (client->mode == MODE_NORMAL) {
|
||
int total = msg_count;
|
||
int range_start = total == 0 ? 0 : start + 1;
|
||
int range_end = total == 0 ? 0 : end;
|
||
int unseen = msg_count - end;
|
||
|
||
if (unseen > 0) {
|
||
buffer_appendf(buffer, buf_size, pos,
|
||
"\033[7;33m NORMAL \033[0m"
|
||
" \033[2;37m%d-%d / %d\033[0m"
|
||
" \033[33m▼ %d %s · %s\033[0m\033[K",
|
||
range_start, range_end, total, unseen,
|
||
i18n_text(client->ui_lang,
|
||
I18N_NORMAL_NEW_MESSAGES),
|
||
i18n_text(client->ui_lang, I18N_NORMAL_LATEST));
|
||
} else {
|
||
buffer_appendf(buffer, buf_size, pos,
|
||
"\033[7;33m NORMAL \033[0m"
|
||
" \033[2;37m%d-%d / %d\033[0m"
|
||
" \033[2;37m%s\033[0m\033[K",
|
||
range_start, range_end, total,
|
||
i18n_text(client->ui_lang, I18N_NORMAL_LATEST));
|
||
}
|
||
} else if (client->mode == MODE_COMMAND) {
|
||
char display[sizeof(client->command_input) + 2];
|
||
int avail = client->width - 1;
|
||
if (avail < 1) avail = 1;
|
||
format_command_input_tail(client->command_input, avail, display,
|
||
sizeof(display));
|
||
buffer_appendf(buffer, buf_size, pos,
|
||
"\033[35m:\033[0m%s\033[K", display);
|
||
}
|
||
}
|