aboutsummaryrefslogtreecommitdiff
path: root/src/ui/messages.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/messages.c')
-rw-r--r--src/ui/messages.c79
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
177void 252void