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, | |||
47 | messages->line_index = 0; | 47 | messages->line_index = 0; |
48 | messages->selected = NULL; | 48 | messages->selected = NULL; |
49 | 49 | ||
50 | int count = 0; | 50 | int count = 1; |
51 | 51 | ||
52 | UI_MESSAGES_List *element = messages->head; | 52 | UI_MESSAGES_List *element = messages->head; |
53 | while (element) | 53 | while (element) |
@@ -66,6 +66,16 @@ messages_event(UI_MESSAGES_Handle *messages, | |||
66 | app->chat.context = NULL; | 66 | app->chat.context = NULL; |
67 | break; | 67 | break; |
68 | } | 68 | } |
69 | case KEY_LEFT: | ||
70 | { | ||
71 | messages->text_pos--; | ||
72 | break; | ||
73 | } | ||
74 | case KEY_RIGHT: | ||
75 | { | ||
76 | messages->text_pos++; | ||
77 | break; | ||
78 | } | ||
69 | case KEY_UP: | 79 | case KEY_UP: |
70 | { | 80 | { |
71 | messages->line_selected--; | 81 | messages->line_selected--; |
@@ -79,18 +89,62 @@ messages_event(UI_MESSAGES_Handle *messages, | |||
79 | case '\n': | 89 | case '\n': |
80 | case KEY_ENTER: | 90 | case KEY_ENTER: |
81 | { | 91 | { |
92 | if ((!(messages->selected)) && (messages->text_len > 0)) | ||
93 | { | ||
94 | GNUNET_CHAT_context_send_text(app->chat.context, messages->text); | ||
95 | messages->text_len = 0; | ||
96 | } | ||
97 | break; | ||
98 | } | ||
99 | case KEY_BACKSPACE: | ||
100 | { | ||
82 | if (messages->selected) | 101 | if (messages->selected) |
102 | { | ||
83 | GNUNET_CHAT_message_delete( | 103 | GNUNET_CHAT_message_delete( |
84 | messages->selected, | 104 | messages->selected, |
85 | GNUNET_TIME_relative_get_zero_() | 105 | GNUNET_TIME_relative_get_zero_() |
86 | ); | 106 | ); |
107 | break; | ||
108 | } | ||
109 | |||
110 | if ((messages->text_pos < messages->text_len) && | ||
111 | (messages->text_pos > 0)) | ||
112 | for (int i = messages->text_pos; i < messages->text_len; i++) | ||
113 | messages->text[i - 1] = messages->text[i]; | ||
114 | |||
115 | if ((messages->text_pos > 0) && (messages->text_len > 0)) | ||
116 | { | ||
117 | messages->text_pos--; | ||
118 | messages->text_len--; | ||
119 | } | ||
87 | 120 | ||
88 | break; | 121 | break; |
89 | } | 122 | } |
90 | default: | 123 | default: |
124 | { | ||
125 | if ((messages->selected) || (!isprint(key))) | ||
126 | break; | ||
127 | |||
128 | for (int i = messages->text_len - 1; i >= messages->text_pos; i--) | ||
129 | messages->text[i + 1] = messages->text[i]; | ||
130 | |||
131 | messages->text[messages->text_pos++] = (char) key; | ||
132 | messages->text_len++; | ||
91 | break; | 133 | break; |
134 | } | ||
92 | } | 135 | } |
93 | 136 | ||
137 | if (messages->text_len >= TEXT_LEN_MAX) | ||
138 | messages->text_len = TEXT_LEN_MAX - 1; | ||
139 | |||
140 | messages->text[messages->text_len] = '\0'; | ||
141 | |||
142 | if (messages->text_pos < 0) | ||
143 | messages->text_pos = 0; | ||
144 | |||
145 | if (messages->text_pos > messages->text_len) | ||
146 | messages->text_pos = messages->text_len; | ||
147 | |||
94 | if (messages->line_selected < 0) | 148 | if (messages->line_selected < 0) |
95 | messages->line_selected = 0; | 149 | messages->line_selected = 0; |
96 | else if (messages->line_selected >= count) | 150 | else if (messages->line_selected >= count) |
@@ -125,7 +179,7 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages, | |||
125 | if (y < 0) | 179 | if (y < 0) |
126 | return; | 180 | return; |
127 | 181 | ||
128 | const int height = getmaxy(messages->window) - getbegy(messages->window); | 182 | const int height = getmaxy(messages->window) - getbegy(messages->window) - 2; |
129 | 183 | ||
130 | if (y >= height) | 184 | if (y >= height) |
131 | return; | 185 | return; |
@@ -166,12 +220,33 @@ messages_print(UI_MESSAGES_Handle *messages) | |||
166 | messages->line_index = 0; | 220 | messages->line_index = 0; |
167 | werase(messages->window); | 221 | werase(messages->window); |
168 | 222 | ||
223 | int count = 0; | ||
224 | |||
169 | UI_MESSAGES_List *element = messages->head; | 225 | UI_MESSAGES_List *element = messages->head; |
170 | while (element) | 226 | while (element) |
171 | { | 227 | { |
172 | _messages_iterate_print(messages, element->message); | 228 | _messages_iterate_print(messages, element->message); |
173 | element = element->next; | 229 | element = element->next; |
230 | |||
231 | count++; | ||
174 | } | 232 | } |
233 | |||
234 | const bool selected = (count == messages->line_selected); | ||
235 | |||
236 | const int width = getmaxx(messages->window) - getbegx(messages->window); | ||
237 | const int height = getmaxy(messages->window) - getbegy(messages->window); | ||
238 | |||
239 | wmove(messages->window, height - 2, 0); | ||
240 | whline(messages->window, '-', width); | ||
241 | |||
242 | const int attrs_select = A_BOLD; | ||
243 | |||
244 | if (selected) wattron(messages->window, attrs_select); | ||
245 | |||
246 | wmove(messages->window, height - 1, 0); | ||
247 | wprintw(messages->window, "%s", messages->text); | ||
248 | |||
249 | if (selected) wattroff(messages->window, attrs_select); | ||
175 | } | 250 | } |
176 | 251 | ||
177 | void | 252 | void |