aboutsummaryrefslogtreecommitdiff
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)
downloadmessenger-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.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,
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
47static int 47static 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
334void 338void
335messages_add(UI_MESSAGES_Handle *messages, 339messages_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
362void 397void
363messages_remove(UI_MESSAGES_Handle *messages, 398messages_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
76void 76void
77messages_add(UI_MESSAGES_Handle *messages, 77messages_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
80void 81void
81messages_remove(UI_MESSAGES_Handle *messages, 82messages_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_ */