diff options
Diffstat (limited to 'src/ui/messages.c')
-rw-r--r-- | src/ui/messages.c | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/src/ui/messages.c b/src/ui/messages.c index 79a7cab..4b7520a 100644 --- a/src/ui/messages.c +++ b/src/ui/messages.c @@ -47,7 +47,7 @@ messages_event(UI_MESSAGES_Handle *messages, messages->line_index = 0; messages->selected = NULL; - int count = 0; + int count = 1; UI_MESSAGES_List *element = messages->head; while (element) @@ -66,6 +66,16 @@ messages_event(UI_MESSAGES_Handle *messages, app->chat.context = NULL; break; } + case KEY_LEFT: + { + messages->text_pos--; + break; + } + case KEY_RIGHT: + { + messages->text_pos++; + break; + } case KEY_UP: { messages->line_selected--; @@ -79,18 +89,62 @@ messages_event(UI_MESSAGES_Handle *messages, case '\n': case KEY_ENTER: { + if ((!(messages->selected)) && (messages->text_len > 0)) + { + GNUNET_CHAT_context_send_text(app->chat.context, messages->text); + messages->text_len = 0; + } + break; + } + case KEY_BACKSPACE: + { if (messages->selected) + { GNUNET_CHAT_message_delete( messages->selected, GNUNET_TIME_relative_get_zero_() ); + break; + } + + if ((messages->text_pos < messages->text_len) && + (messages->text_pos > 0)) + for (int i = messages->text_pos; i < messages->text_len; i++) + messages->text[i - 1] = messages->text[i]; + + if ((messages->text_pos > 0) && (messages->text_len > 0)) + { + messages->text_pos--; + messages->text_len--; + } break; } default: + { + if ((messages->selected) || (!isprint(key))) + break; + + for (int i = messages->text_len - 1; i >= messages->text_pos; i--) + messages->text[i + 1] = messages->text[i]; + + messages->text[messages->text_pos++] = (char) key; + messages->text_len++; break; + } } + if (messages->text_len >= TEXT_LEN_MAX) + messages->text_len = TEXT_LEN_MAX - 1; + + messages->text[messages->text_len] = '\0'; + + if (messages->text_pos < 0) + messages->text_pos = 0; + + if (messages->text_pos > messages->text_len) + messages->text_pos = messages->text_len; + if (messages->line_selected < 0) messages->line_selected = 0; else if (messages->line_selected >= count) @@ -125,7 +179,7 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages, if (y < 0) return; - const int height = getmaxy(messages->window) - getbegy(messages->window); + const int height = getmaxy(messages->window) - getbegy(messages->window) - 2; if (y >= height) return; @@ -166,12 +220,33 @@ messages_print(UI_MESSAGES_Handle *messages) messages->line_index = 0; werase(messages->window); + int count = 0; + UI_MESSAGES_List *element = messages->head; while (element) { _messages_iterate_print(messages, element->message); element = element->next; + + count++; } + + const bool selected = (count == messages->line_selected); + + const int width = getmaxx(messages->window) - getbegx(messages->window); + const int height = getmaxy(messages->window) - getbegy(messages->window); + + wmove(messages->window, height - 2, 0); + whline(messages->window, '-', width); + + const int attrs_select = A_BOLD; + + if (selected) wattron(messages->window, attrs_select); + + wmove(messages->window, height - 1, 0); + wprintw(messages->window, "%s", messages->text); + + if (selected) wattroff(messages->window, attrs_select); } void |