diff options
Diffstat (limited to 'src/ui/messages.c')
-rw-r--r-- | src/ui/messages.c | 74 |
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 | ||
31 | void | 32 | void |
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 | |||
43 | void | ||
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 | ||
155 | void | 114 | void |
@@ -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); |