From d3a9d7a5c6f891acf2eb0bcdc32b68795c9c225b Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Sat, 28 May 2022 23:15:31 +0200 Subject: First attempt of auto-scrolling works mostly Signed-off-by: TheJackiMonster --- src/chat.c | 3 ++- src/ui/chats.c | 14 ++++++++------ src/ui/chats.h | 2 +- src/ui/messages.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ src/ui/messages.h | 2 ++ 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/chat.c b/src/chat.c index 82fd43f..8ad21e5 100644 --- a/src/chat.c +++ b/src/chat.c @@ -91,10 +91,11 @@ _chat_message(void *cls, if (GNUNET_CHAT_KIND_DELETION == GNUNET_CHAT_message_get_kind(message)) messages_remove( &(app->messages), + context, GNUNET_CHAT_message_get_target(message) ); - messages_add(&(app->messages), message); + messages_add(&(app->messages), context, message); } _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, chats->line_index++; if (selected) - chats->selected = GNUNET_CHAT_group_get_context(group); + chats->selected = group; return GNUNET_YES; } static int _chats_iterate_messages(void *cls, - UNUSED struct GNUNET_CHAT_Context *context, + struct GNUNET_CHAT_Context *context, const struct GNUNET_CHAT_Message *message) { UI_MESSAGES_Handle *messages = cls; - messages_add(messages, message); + messages_add(messages, context, message); return GNUNET_YES; } @@ -99,20 +99,22 @@ chats_event(UI_CHATS_Handle *chats, { if (chats->selected) { + struct GNUNET_CHAT_Context *context = GNUNET_CHAT_group_get_context(chats->selected); + messages_clear(&(app->messages)); GNUNET_CHAT_context_iterate_messages( - chats->selected, + context, &_chats_iterate_messages, &(app->messages) ); GNUNET_CHAT_context_set_user_pointer( - chats->selected, + context, &(app->messages) ); - app->chat.context = chats->selected; + app->chat.context = context; } else 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 int line_offset; int line_selected; - struct GNUNET_CHAT_Context *selected; + struct GNUNET_CHAT_Group *selected; UI_CHAT_OPEN_DIALOG_Handle open_dialog; } 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, const int height = getmaxy(messages->window) - getbegy(messages->window); const int y = messages->line_selected - messages->line_offset; + const int line_height = height - 2; + if (y < 0) messages->line_offset += y; - else if (y + 3 >= height) - messages->line_offset += y + 3 - height; + else if (y + 1 >= line_height) + messages->line_offset += y + 1 - line_height; if (messages->line_offset < 0) messages->line_offset = 0; @@ -181,9 +183,10 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages, if (y < 0) return; - const int height = getmaxy(messages->window) - getbegy(messages->window) - 2; + const int height = getmaxy(messages->window) - getbegy(messages->window); + const int line_height = height - 2; - if (y >= height) + if (y >= line_height) return; struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); @@ -276,8 +279,9 @@ messages_print(UI_MESSAGES_Handle *messages) const int width = getmaxx(messages->window) - getbegx(messages->window); const int height = getmaxy(messages->window) - getbegy(messages->window); + const int line_height = height - 2; - wmove(messages->window, height - 2, 0); + wmove(messages->window, line_height, 0); whline(messages->window, '-', width); const int attrs_select = A_BOLD; @@ -333,6 +337,7 @@ _message_compare_timestamps(UNUSED void *cls, void messages_add(UI_MESSAGES_Handle *messages, + struct GNUNET_CHAT_Context *context, const struct GNUNET_CHAT_Message *message) { enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); @@ -346,7 +351,28 @@ messages_add(UI_MESSAGES_Handle *messages, break; } - UI_MESSAGES_List *element = GNUNET_new(UI_MESSAGES_List); + struct GNUNET_CHAT_Contact *sender = GNUNET_CHAT_message_get_sender(message); + struct GNUNET_CHAT_Group *group = GNUNET_CHAT_context_get_group(context); + + if ((GNUNET_CHAT_KIND_JOIN == kind) && + (GNUNET_CHAT_member_get_user_pointer(group, sender))) + { + return; + } + + const int height = getmaxy(messages->window) - getbegy(messages->window); + const int line_height = height - 2; + + int count = 0; + + UI_MESSAGES_List *element = messages->head; + while (element) + { + count++; + element = element->next; + } + + element = GNUNET_new(UI_MESSAGES_List); element->message = message; GNUNET_CONTAINER_DLL_insert_sorted( @@ -357,10 +383,20 @@ messages_add(UI_MESSAGES_Handle *messages, messages->tail, element ); + + if (GNUNET_CHAT_KIND_JOIN == kind) + GNUNET_CHAT_member_set_user_pointer(group, sender, element); + + if (messages->line_selected >= count) + messages->line_selected = count + 1; + + if ((line_height > 0) && (messages->line_offset + line_height >= count)) + messages->line_offset = count + 1 - line_height; } void messages_remove(UI_MESSAGES_Handle *messages, + UNUSED struct GNUNET_CHAT_Context *context, const struct GNUNET_CHAT_Message *message) { 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); void messages_add(UI_MESSAGES_Handle *messages, + struct GNUNET_CHAT_Context *context, const struct GNUNET_CHAT_Message *message); void messages_remove(UI_MESSAGES_Handle *messages, + struct GNUNET_CHAT_Context *context, const struct GNUNET_CHAT_Message *message); #endif /* UI_MESSAGES_H_ */ -- cgit v1.2.3