summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2022-05-28 23:15:31 +0200
committerTheJackiMonster <thejackimonster@gmail.com>2022-05-29 00:26:15 +0200
commitd3a9d7a5c6f891acf2eb0bcdc32b68795c9c225b (patch)
treeb3dde5c0edcee214d6da077e52b432d10e3742dd
parent17eb90afe25208092bc878c89f68c219b8daa913 (diff)
First attempt of auto-scrolling works mostly
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-rw-r--r--src/chat.c3
-rw-r--r--src/ui/chats.c14
-rw-r--r--src/ui/chats.h2
-rw-r--r--src/ui/messages.c48
-rw-r--r--src/ui/messages.h2
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_ */