summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2022-05-21 15:34:22 +0200
committerTheJackiMonster <thejackimonster@gmail.com>2022-05-21 15:34:22 +0200
commite56259e8766ea097e4f2b841584e2f6b20534464 (patch)
tree560d5491047365792223739cc378d57bb9da6f28
parent05d021e3994fc03341568053371f6f60ec848504 (diff)
Implemented text input for own messages
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-rw-r--r--src/ui/account_create_dialog.c2
-rw-r--r--src/ui/chat_open_dialog.c2
-rw-r--r--src/ui/messages.c79
-rw-r--r--src/ui/messages.h6
4 files changed, 85 insertions, 4 deletions
diff --git a/src/ui/account_create_dialog.c b/src/ui/account_create_dialog.c
index 70e3fe3..b283092 100644
--- a/src/ui/account_create_dialog.c
+++ b/src/ui/account_create_dialog.c
@@ -83,7 +83,7 @@ account_create_dialog_event(UI_ACCOUNT_CREATE_DIALOG_Handle *create_dialog,
}
default:
{
- if (!isalnum(key))
+ if (!isprint(key))
break;
for (int i = create_dialog->name_len - 1; i >= create_dialog->name_pos; i--)
diff --git a/src/ui/chat_open_dialog.c b/src/ui/chat_open_dialog.c
index 4ebe8be..180d7be 100644
--- a/src/ui/chat_open_dialog.c
+++ b/src/ui/chat_open_dialog.c
@@ -83,7 +83,7 @@ chat_open_dialog_event(UI_CHAT_OPEN_DIALOG_Handle *open_dialog,
}
default:
{
- if (!isalnum(key))
+ if (!isprint(key))
break;
for (int i = open_dialog->topic_len - 1; i >= open_dialog->topic_pos; i--)
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
diff --git a/src/ui/messages.h b/src/ui/messages.h
index b42bb1b..06de97f 100644
--- a/src/ui/messages.h
+++ b/src/ui/messages.h
@@ -42,6 +42,8 @@ typedef struct UI_MESSAGES_List
struct UI_MESSAGES_List *next;
} UI_MESSAGES_List;
+#define TEXT_LEN_MAX 1024
+
typedef struct UI_MESSAGES_Handle
{
WINDOW *window;
@@ -54,6 +56,10 @@ typedef struct UI_MESSAGES_Handle
int line_selected;
const struct GNUNET_CHAT_Message *selected;
+
+ char text [1024];
+ int text_len;
+ int text_pos;
} UI_MESSAGES_Handle;
void