diff options
author | TheJackiMonster <thejackimonster@gmail.com> | 2022-05-28 23:15:31 +0200 |
---|---|---|
committer | TheJackiMonster <thejackimonster@gmail.com> | 2022-05-29 00:26:15 +0200 |
commit | d3a9d7a5c6f891acf2eb0bcdc32b68795c9c225b (patch) | |
tree | b3dde5c0edcee214d6da077e52b432d10e3742dd | |
parent | 17eb90afe25208092bc878c89f68c219b8daa913 (diff) | |
download | messenger-cli-d3a9d7a5c6f891acf2eb0bcdc32b68795c9c225b.tar.gz messenger-cli-d3a9d7a5c6f891acf2eb0bcdc32b68795c9c225b.zip |
First attempt of auto-scrolling works mostly
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-rw-r--r-- | src/chat.c | 3 | ||||
-rw-r--r-- | src/ui/chats.c | 14 | ||||
-rw-r--r-- | src/ui/chats.h | 2 | ||||
-rw-r--r-- | src/ui/messages.c | 48 | ||||
-rw-r--r-- | src/ui/messages.h | 2 |
5 files changed, 55 insertions, 14 deletions
@@ -91,10 +91,11 @@ _chat_message(void *cls, | |||
91 | if (GNUNET_CHAT_KIND_DELETION == GNUNET_CHAT_message_get_kind(message)) | 91 | if (GNUNET_CHAT_KIND_DELETION == GNUNET_CHAT_message_get_kind(message)) |
92 | messages_remove( | 92 | messages_remove( |
93 | &(app->messages), | 93 | &(app->messages), |
94 | context, | ||
94 | GNUNET_CHAT_message_get_target(message) | 95 | GNUNET_CHAT_message_get_target(message) |
95 | ); | 96 | ); |
96 | 97 | ||
97 | messages_add(&(app->messages), message); | 98 | messages_add(&(app->messages), context, message); |
98 | } | 99 | } |
99 | 100 | ||
100 | _chat_event(app, KEY_RESIZE); | 101 | _chat_event(app, KEY_RESIZE); |
diff --git a/src/ui/chats.c b/src/ui/chats.c index 5d991a7..dbffc26 100644 --- a/src/ui/chats.c +++ b/src/ui/chats.c | |||
@@ -39,19 +39,19 @@ _chats_iterate(void *cls, | |||
39 | chats->line_index++; | 39 | chats->line_index++; |
40 | 40 | ||
41 | if (selected) | 41 | if (selected) |
42 | chats->selected = GNUNET_CHAT_group_get_context(group); | 42 | chats->selected = group; |
43 | 43 | ||
44 | return GNUNET_YES; | 44 | return GNUNET_YES; |
45 | } | 45 | } |
46 | 46 | ||
47 | static int | 47 | static int |
48 | _chats_iterate_messages(void *cls, | 48 | _chats_iterate_messages(void *cls, |
49 | UNUSED struct GNUNET_CHAT_Context *context, | 49 | struct GNUNET_CHAT_Context *context, |
50 | const struct GNUNET_CHAT_Message *message) | 50 | const struct GNUNET_CHAT_Message *message) |
51 | { | 51 | { |
52 | UI_MESSAGES_Handle *messages = cls; | 52 | UI_MESSAGES_Handle *messages = cls; |
53 | 53 | ||
54 | messages_add(messages, message); | 54 | messages_add(messages, context, message); |
55 | 55 | ||
56 | return GNUNET_YES; | 56 | return GNUNET_YES; |
57 | } | 57 | } |
@@ -99,20 +99,22 @@ chats_event(UI_CHATS_Handle *chats, | |||
99 | { | 99 | { |
100 | if (chats->selected) | 100 | if (chats->selected) |
101 | { | 101 | { |
102 | struct GNUNET_CHAT_Context *context = GNUNET_CHAT_group_get_context(chats->selected); | ||
103 | |||
102 | messages_clear(&(app->messages)); | 104 | messages_clear(&(app->messages)); |
103 | 105 | ||
104 | GNUNET_CHAT_context_iterate_messages( | 106 | GNUNET_CHAT_context_iterate_messages( |
105 | chats->selected, | 107 | context, |
106 | &_chats_iterate_messages, | 108 | &_chats_iterate_messages, |
107 | &(app->messages) | 109 | &(app->messages) |
108 | ); | 110 | ); |
109 | 111 | ||
110 | GNUNET_CHAT_context_set_user_pointer( | 112 | GNUNET_CHAT_context_set_user_pointer( |
111 | chats->selected, | 113 | context, |
112 | &(app->messages) | 114 | &(app->messages) |
113 | ); | 115 | ); |
114 | 116 | ||
115 | app->chat.context = chats->selected; | 117 | app->chat.context = context; |
116 | } | 118 | } |
117 | else | 119 | else |
118 | chats->open_dialog.window = chats->window; | 120 | chats->open_dialog.window = chats->window; |
diff --git a/src/ui/chats.h b/src/ui/chats.h index 85a84eb..c4485ad 100644 --- a/src/ui/chats.h +++ b/src/ui/chats.h | |||
@@ -44,7 +44,7 @@ typedef struct UI_CHATS_Handle | |||
44 | int line_offset; | 44 | int line_offset; |
45 | int line_selected; | 45 | int line_selected; |
46 | 46 | ||
47 | struct GNUNET_CHAT_Context *selected; | 47 | struct GNUNET_CHAT_Group *selected; |
48 | 48 | ||
49 | UI_CHAT_OPEN_DIALOG_Handle open_dialog; | 49 | UI_CHAT_OPEN_DIALOG_Handle open_dialog; |
50 | } UI_CHATS_Handle; | 50 | } UI_CHATS_Handle; |
diff --git a/src/ui/messages.c b/src/ui/messages.c index 52da9a7..70d64df 100644 --- a/src/ui/messages.c +++ b/src/ui/messages.c | |||
@@ -156,10 +156,12 @@ messages_event(UI_MESSAGES_Handle *messages, | |||
156 | const int height = getmaxy(messages->window) - getbegy(messages->window); | 156 | const int height = getmaxy(messages->window) - getbegy(messages->window); |
157 | const int y = messages->line_selected - messages->line_offset; | 157 | const int y = messages->line_selected - messages->line_offset; |
158 | 158 | ||
159 | const int line_height = height - 2; | ||
160 | |||
159 | if (y < 0) | 161 | if (y < 0) |
160 | messages->line_offset += y; | 162 | messages->line_offset += y; |
161 | else if (y + 3 >= height) | 163 | else if (y + 1 >= line_height) |
162 | messages->line_offset += y + 3 - height; | 164 | messages->line_offset += y + 1 - line_height; |
163 | 165 | ||
164 | if (messages->line_offset < 0) | 166 | if (messages->line_offset < 0) |
165 | messages->line_offset = 0; | 167 | messages->line_offset = 0; |
@@ -181,9 +183,10 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages, | |||
181 | if (y < 0) | 183 | if (y < 0) |
182 | return; | 184 | return; |
183 | 185 | ||
184 | const int height = getmaxy(messages->window) - getbegy(messages->window) - 2; | 186 | const int height = getmaxy(messages->window) - getbegy(messages->window); |
187 | const int line_height = height - 2; | ||
185 | 188 | ||
186 | if (y >= height) | 189 | if (y >= line_height) |
187 | return; | 190 | return; |
188 | 191 | ||
189 | struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); | 192 | struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); |
@@ -276,8 +279,9 @@ messages_print(UI_MESSAGES_Handle *messages) | |||
276 | 279 | ||
277 | const int width = getmaxx(messages->window) - getbegx(messages->window); | 280 | const int width = getmaxx(messages->window) - getbegx(messages->window); |
278 | const int height = getmaxy(messages->window) - getbegy(messages->window); | 281 | const int height = getmaxy(messages->window) - getbegy(messages->window); |
282 | const int line_height = height - 2; | ||
279 | 283 | ||
280 | wmove(messages->window, height - 2, 0); | 284 | wmove(messages->window, line_height, 0); |
281 | whline(messages->window, '-', width); | 285 | whline(messages->window, '-', width); |
282 | 286 | ||
283 | const int attrs_select = A_BOLD; | 287 | const int attrs_select = A_BOLD; |
@@ -333,6 +337,7 @@ _message_compare_timestamps(UNUSED void *cls, | |||
333 | 337 | ||
334 | void | 338 | void |
335 | messages_add(UI_MESSAGES_Handle *messages, | 339 | messages_add(UI_MESSAGES_Handle *messages, |
340 | struct GNUNET_CHAT_Context *context, | ||
336 | const struct GNUNET_CHAT_Message *message) | 341 | const struct GNUNET_CHAT_Message *message) |
337 | { | 342 | { |
338 | enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); | 343 | enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); |
@@ -346,7 +351,28 @@ messages_add(UI_MESSAGES_Handle *messages, | |||
346 | break; | 351 | break; |
347 | } | 352 | } |
348 | 353 | ||
349 | UI_MESSAGES_List *element = GNUNET_new(UI_MESSAGES_List); | 354 | struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); |
355 | struct GNUNET_CHAT_Group *group = GNUNET_CHAT_context_get_group(context); | ||
356 | |||
357 | if ((GNUNET_CHAT_KIND_JOIN == kind) && | ||
358 | (GNUNET_CHAT_member_get_user_pointer(group, sender))) | ||
359 | { | ||
360 | return; | ||
361 | } | ||
362 | |||
363 | const int height = getmaxy(messages->window) - getbegy(messages->window); | ||
364 | const int line_height = height - 2; | ||
365 | |||
366 | int count = 0; | ||
367 | |||
368 | UI_MESSAGES_List *element = messages->head; | ||
369 | while (element) | ||
370 | { | ||
371 | count++; | ||
372 | element = element->next; | ||
373 | } | ||
374 | |||
375 | element = GNUNET_new(UI_MESSAGES_List); | ||
350 | element->message = message; | 376 | element->message = message; |
351 | 377 | ||
352 | GNUNET_CONTAINER_DLL_insert_sorted( | 378 | GNUNET_CONTAINER_DLL_insert_sorted( |
@@ -357,10 +383,20 @@ messages_add(UI_MESSAGES_Handle *messages, | |||
357 | messages->tail, | 383 | messages->tail, |
358 | element | 384 | element |
359 | ); | 385 | ); |
386 | |||
387 | if (GNUNET_CHAT_KIND_JOIN == kind) | ||
388 | GNUNET_CHAT_member_set_user_pointer(group, sender, element); | ||
389 | |||
390 | if (messages->line_selected >= count) | ||
391 | messages->line_selected = count + 1; | ||
392 | |||
393 | if ((line_height > 0) && (messages->line_offset + line_height >= count)) | ||
394 | messages->line_offset = count + 1 - line_height; | ||
360 | } | 395 | } |
361 | 396 | ||
362 | void | 397 | void |
363 | messages_remove(UI_MESSAGES_Handle *messages, | 398 | messages_remove(UI_MESSAGES_Handle *messages, |
399 | UNUSED struct GNUNET_CHAT_Context *context, | ||
364 | const struct GNUNET_CHAT_Message *message) | 400 | const struct GNUNET_CHAT_Message *message) |
365 | { | 401 | { |
366 | UI_MESSAGES_List *element = messages->head; | 402 | UI_MESSAGES_List *element = messages->head; |
diff --git a/src/ui/messages.h b/src/ui/messages.h index 06de97f..d969782 100644 --- a/src/ui/messages.h +++ b/src/ui/messages.h | |||
@@ -75,10 +75,12 @@ messages_clear(UI_MESSAGES_Handle *messages); | |||
75 | 75 | ||
76 | void | 76 | void |
77 | messages_add(UI_MESSAGES_Handle *messages, | 77 | messages_add(UI_MESSAGES_Handle *messages, |
78 | struct GNUNET_CHAT_Context *context, | ||
78 | const struct GNUNET_CHAT_Message *message); | 79 | const struct GNUNET_CHAT_Message *message); |
79 | 80 | ||
80 | void | 81 | void |
81 | messages_remove(UI_MESSAGES_Handle *messages, | 82 | messages_remove(UI_MESSAGES_Handle *messages, |
83 | struct GNUNET_CHAT_Context *context, | ||
82 | const struct GNUNET_CHAT_Message *message); | 84 | const struct GNUNET_CHAT_Message *message); |
83 | 85 | ||
84 | #endif /* UI_MESSAGES_H_ */ | 86 | #endif /* UI_MESSAGES_H_ */ |