aboutsummaryrefslogtreecommitdiff
path: root/v2/chatty.c
diff options
context:
space:
mode:
Diffstat (limited to 'v2/chatty.c')
-rw-r--r--v2/chatty.c127
1 files changed, 69 insertions, 58 deletions
diff --git a/v2/chatty.c b/v2/chatty.c
index eb0273e..78c0ab1 100644
--- a/v2/chatty.c
+++ b/v2/chatty.c
@@ -86,7 +86,7 @@ void popup(u32 fg, u32 bg, char *text)
// TODO:(bug) text after pfx is wrapped one too soon
// TODO: text == NULL to know how many lines *would* be printed
// TODO: check if text[i] goes out of bounds
-int tb_printf_wrap(u32 x, u32 y, u32 fg, u32 bg, wchar_t *text, s32 text_len, char *pfx, s32 limit)
+int tb_printf_wrap(u32 x, u32 y, u32 fg, u32 bg, wchar_t *text, u32 fg_pfx, u32 bg_pfx, char *pfx, s32 limit)
{
assert(limit > 0);
@@ -111,14 +111,18 @@ int tb_printf_wrap(u32 x, u32 y, u32 fg, u32 bg, wchar_t *text, s32 text_len, ch
// used when retrying to get a longer limit
u32 failed = 0;
+ u32 text_len = 0;
+ while (text[text_len] != 0)
+ text_len++;
+
// NOTE: We can assume that we need to wrap, therefore print a newline after the prefix string
if (pfx != NULL) {
- tb_printf(x, ly, fg, bg, "%s", pfx);
+ tb_printf(x, ly, fg_pfx, bg_pfx, "%s", pfx);
s32 pfx_len = strlen(pfx);
if (limit > pfx_len + text_len) {
// everything fits on one line
- tb_printf(x, y, fg, bg, "%s%ls", pfx, text);
+ tb_printf(pfx_len, y, fg, bg, "%ls", text);
return 1;
} else {
ly++;
@@ -169,7 +173,8 @@ void screen_home(Arena *msgsArena, wchar_t input[], u32 input_len)
// the minimum height required is the hight for the box prompt
// the minimum width required is that one character should fit in the box prompt
- if (global.height < box_height || global.width < (box_x + box_mar_x * 2 + box_pad_x * 2 + box_bwith * 2 + 1)) {
+ if (global.height < box_height ||
+ global.width < (box_x + box_mar_x * 2 + box_pad_x * 2 + box_bwith * 2 + 1)) {
// + 1 for cursor
tb_hide_cursor();
return;
@@ -185,15 +190,15 @@ void screen_home(Arena *msgsArena, wchar_t input[], u32 input_len)
// you doing?
// 03:24:33 [TlasT] I am fine
{
+ u32 freesp = global.height - box_height;
+ if (freesp <= 0)
+ goto draw_prompt;
+
Message *messages = msgsArena->memory;
assert(messages != NULL);
// on what line to print the current message, used for scrolling
u32 msg_y = 0;
- u32 freesp = global.height - (global.height - box_height);
- if (freesp <= 0)
- goto draw_prompt;
-
u32 nmessages = (msgsArena->pos / sizeof(Message));
u32 offs = (nmessages > freesp) ? nmessages - freesp : 0;
@@ -209,10 +214,11 @@ void screen_home(Arena *msgsArena, wchar_t input[], u32 input_len)
u32 ty = 0;
char pfx[AUTHOR_LEN + TIMESTAMP_LEN - 2 + 5] = {0};
sprintf(pfx, "%s [%s] ", messages[i].timestamp, messages[i].author);
- ty = tb_printf_wrap(0, msg_y, fg, 0, messages[i].text, messages[i].text_len - 1, pfx, global.width);
+ ty = tb_printf_wrap(0, msg_y, 0, 0, messages[i].text, fg, 0, pfx, global.width);
msg_y += ty;
}
+ draw_prompt:
// Draw prompt box which is a box made out of
// should look like this: ╭───────╮
// │ text█ │
@@ -221,60 +227,65 @@ void screen_home(Arena *msgsArena, wchar_t input[], u32 input_len)
// the middle/inner part is opaque
// TODO: wrapping when the text is bigger & alternated with scrolling when there is not
// enough space.
- draw_prompt: {
-
- int box_len = 0;
- if (global.width >= box_mar_x * 2 + box_min_len) {
- // whole screen, but max out at box_max_len
- box_len = (global.width >= box_max_len + 2) ? box_max_len : global.width - box_mar_x * 2;
- } else {
- box_len = box_mar_x * 2 + box_min_len; // left + right side
+ {
+ int box_len = 0;
+ if (global.width >= box_max_len + 2 * box_mar_x)
+ box_len = box_max_len;
+ else
+ box_len = global.width - box_mar_x * 2;
+
+ // +2 for corners and null terminator
+ wchar_t box_up[box_len + 1];
+ wchar_t box_in[box_len + 1];
+ wchar_t box_down[box_len + 1];
+ wchar_t lr = L'─', ur = L'╭', rd = L'╮', dr = L'╰', ru = L'╯', ud = L'│';
+
+ // top bar
+ box_up[0] = ur;
+ fillstr(box_up + 1, lr, box_len - 1);
+ box_up[box_len - 1] = rd;
+ box_up[box_len] = 0;
+ // inner part
+ fillstr(box_in + 1, L' ', box_len - 1);
+ box_in[0] = ud;
+ box_in[box_len - 1] = ud;
+ box_in[box_len] = 0;
+ // bottom bar
+ box_down[0] = dr;
+ fillstr(box_down + 1, lr, box_len - 1);
+ box_down[box_len - 1] = ru;
+ box_down[box_len] = 0;
+
+ tb_printf(box_x + box_mar_x, box_y, 0, 0, "%ls", box_up);
+ tb_printf(box_x + box_mar_x, box_y + 1, 0, 0, "%ls", box_in);
+ tb_printf(box_x + box_mar_x, box_y + 2, 0, 0, "%ls", box_down);
+
+ global.cursor_y = box_y + 1;
+
+ // NOTE: wrapping would be better.
+ // Scroll the text when it exceeds the prompt's box length
+ u32 freesp = box_len - box_pad_x * 2 - box_bwith * 2;
+ if (freesp <= 0)
+ return;
+
+ if (input_len > freesp) {
+ wchar_t *text_offs = input + (input_len - freesp);
+ tb_printf(box_x + box_mar_x + box_pad_x + box_bwith, box_y + 1, 0, 0, "%ls", text_offs);
+ global.cursor_x = box_x + box_pad_x + box_mar_x + box_bwith + freesp;
+ } else {
+ global.cursor_x = prompt_x;
+ tb_printf(box_x + box_mar_x + box_pad_x + box_bwith, box_y + 1, 0, 0, "%ls", input);
+ }
}
- // +2 for corners and null terminator
- wchar_t box_up[box_len + 1];
- wchar_t box_in[box_len + 1];
- wchar_t box_down[box_len + 1];
- wchar_t lr = L'─', ur = L'╭', rd = L'╮', dr = L'╰', ru = L'╯', ud = L'│';
-
- // top bar
- box_up[0] = ur;
- fillstr(box_up + 1, lr, box_len - 1);
- box_up[box_len - 1] = rd;
- box_up[box_len] = 0;
- // inner part
- fillstr(box_in + 1, L' ', box_len - 1);
- box_in[0] = ud;
- box_in[box_len - 1] = ud;
- box_in[box_len] = 0;
- // bottom bar
- box_down[0] = dr;
- fillstr(box_down + 1, lr, box_len - 1);
- box_down[box_len - 1] = ru;
- box_down[box_len] = 0;
-
- tb_printf(box_x + box_mar_x, box_y, 0, 0, "%ls", box_up);
- tb_printf(box_x + box_mar_x, box_y + 1, 0, 0, "%ls", box_in);
- tb_printf(box_x + box_mar_x, box_y + 2, 0, 0, "%ls", box_down);
-
- global.cursor_y = box_y + 1;
-
- // NOTE: wrapping would be better.
- // Scroll the text when it exceeds the prompt's box length
- u32 freesp = box_len - box_pad_x * 2 - box_bwith * 2;
- if (freesp <= 0)
- return;
-
- if (input_len > freesp) {
- wchar_t *text_offs = input + (input_len - freesp);
- tb_printf(box_x + box_mar_x + box_pad_x + box_bwith, box_y + 1, 0, 0, "%ls", text_offs);
- global.cursor_x = box_x + box_pad_x + box_mar_x + box_bwith + freesp;
+ if (fds[FDS_SERVER].fd == -1) {
+ // show error popup
+ popup(TB_RED, TB_BLACK, "Server disconnected.");
+ tb_present();
} else {
- global.cursor_x = prompt_x;
- tb_printf(box_x + box_mar_x + box_pad_x + box_bwith, box_y + 1, 0, 0, "%ls", input);
+ bytebuf_puts(&global.out, global.caps[TB_CAP_SHOW_CURSOR]);
}
}
- }
}
int main(int argc, char **argv)