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.c74
1 files changed, 9 insertions, 65 deletions
diff --git a/src/ui/messages.c b/src/ui/messages.c
index 211fe94..86df8e5 100644
--- a/src/ui/messages.c
+++ b/src/ui/messages.c
@@ -24,23 +24,12 @@
24 24
25#include "messages.h" 25#include "messages.h"
26 26
27#include "list_input.h"
27#include "text_input.h" 28#include "text_input.h"
28#include "../application.h" 29#include "../application.h"
29#include "../util.h" 30#include "../util.h"
30 31
31void 32void
32_messages_iterate(UI_MESSAGES_Handle *messages,
33 const struct GNUNET_CHAT_Message *message)
34{
35 const bool selected = (messages->line_selected == messages->line_index);
36
37 messages->line_index++;
38
39 if (selected)
40 messages->selected = message;
41}
42
43void
44_messages_handle_message(UI_MESSAGES_Handle *messages) 33_messages_handle_message(UI_MESSAGES_Handle *messages)
45{ 34{
46 switch (GNUNET_CHAT_message_get_kind(messages->selected)) 35 switch (GNUNET_CHAT_message_get_kind(messages->selected))
@@ -75,32 +64,23 @@ messages_event(UI_MESSAGES_Handle *messages,
75 MESSENGER_Application *app, 64 MESSENGER_Application *app,
76 int key) 65 int key)
77{ 66{
78 messages->line_index = 0; 67 list_input_reset(messages);
79 messages->selected = NULL;
80
81 int count = 1;
82 68
83 UI_MESSAGES_List *element = messages->head; 69 UI_MESSAGES_List *element = messages->head;
84 while (element) 70 while (element)
85 { 71 {
86 _messages_iterate(messages, element->message); 72 list_input_select(messages, 1, element->message);
87 count++;
88
89 element = element->next; 73 element = element->next;
90 } 74 }
91 75
76 list_input_select(messages, 1, NULL);
77
92 switch (key) 78 switch (key)
93 { 79 {
94 case 27: 80 case 27:
95 case KEY_EXIT: 81 case KEY_EXIT:
96 app->chat.context = NULL; 82 app->chat.context = NULL;
97 break; 83 break;
98 case KEY_UP:
99 messages->line_selected--;
100 break;
101 case KEY_DOWN:
102 messages->line_selected++;
103 break;
104 case '\t': 84 case '\t':
105 app->chat.show_members = TRUE; 85 app->chat.show_members = TRUE;
106 break; 86 break;
@@ -128,28 +108,7 @@ messages_event(UI_MESSAGES_Handle *messages,
128 if (!(messages->selected)) 108 if (!(messages->selected))
129 text_input_event(messages->text, key); 109 text_input_event(messages->text, key);
130 110
131 if (messages->line_selected < 0) 111 list_input_event(messages, key);
132 messages->line_selected = 0;
133 else if (messages->line_selected >= count)
134 messages->line_selected = count - 1;
135
136 if (!(messages->window))
137 return;
138
139 const int height = getmaxy(messages->window);
140 const int y = messages->line_selected - messages->line_offset;
141
142 const int line_height = height - 2;
143
144 if (y < 0)
145 messages->line_offset += y;
146 else if (y + 1 >= line_height)
147 messages->line_offset += y + 1 - line_height;
148
149 if (messages->line_offset < 0)
150 messages->line_offset = 0;
151 else if (messages->line_offset >= count)
152 messages->line_offset = count - 1;
153} 112}
154 113
155void 114void
@@ -158,19 +117,7 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages,
158{ 117{
159 enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); 118 enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message);
160 119
161 const bool selected = (messages->line_selected == messages->line_index); 120 list_input_print(messages, 1);
162 const int y = messages->line_index - messages->line_offset;
163
164 messages->line_index++;
165
166 if (y < 0)
167 return;
168
169 const int height = getmaxy(messages->window);
170 const int line_height = height - 2;
171
172 if (y >= line_height)
173 return;
174 121
175 struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); 122 struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message);
176 123
@@ -270,20 +217,17 @@ messages_print(UI_MESSAGES_Handle *messages)
270 if (!(messages->window)) 217 if (!(messages->window))
271 return; 218 return;
272 219
273 messages->line_index = 0; 220 list_input_reset(messages);
274 werase(messages->window); 221 werase(messages->window);
275 222
276 int count = 0;
277
278 UI_MESSAGES_List *element = messages->head; 223 UI_MESSAGES_List *element = messages->head;
279 while (element) 224 while (element)
280 { 225 {
281 _messages_iterate_print(messages, element->message); 226 _messages_iterate_print(messages, element->message);
282 count++;
283
284 element = element->next; 227 element = element->next;
285 } 228 }
286 229
230 const int count = messages->line_index;
287 const bool selected = (count == messages->line_selected); 231 const bool selected = (count == messages->line_selected);
288 232
289 const int width = getmaxx(messages->window); 233 const int width = getmaxx(messages->window);