1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-06-30 17:55:24 -04:00

Merge branch 'feature/1238-lastreadpos'

This commit is contained in:
Michael Vetter 2019-12-13 13:13:55 +01:00
commit 20dc1710e8
8 changed files with 103 additions and 2 deletions

View File

@ -106,6 +106,19 @@ buffer_append(ProfBuff buffer, const char show_char, int pad_indent, GDateTime *
buffer->entries = g_slist_append(buffer->entries, e);
}
void
buffer_remove_entry_by_id(ProfBuff buffer, const char *const id)
{
GSList *entries = buffer->entries;
while (entries) {
ProfBuffEntry *entry = entries->data;
if (entry->id && (g_strcmp0(entry->id, id) == 0)) {
buffer->entries = g_slist_delete_link(buffer->entries, entries);
}
entries = g_slist_next(entries);
}
}
gboolean
buffer_mark_received(ProfBuff buffer, const char *const id)
{

View File

@ -64,6 +64,7 @@ ProfBuff buffer_create();
void buffer_free(ProfBuff buffer);
void buffer_append(ProfBuff buffer, const char show_char, int pad_indent, GDateTime *time,
int flags, theme_item_t theme_item, const char *const from, const char *const message, DeliveryReceipt *receipt, const char *const id);
void buffer_remove_entry_by_id(ProfBuff buffer, const char *const id);
int buffer_size(ProfBuff buffer);
ProfBuffEntry* buffer_get_entry(ProfBuff buffer, int entry);
ProfBuffEntry* buffer_get_entry_by_id(ProfBuff buffer, const char *const id);

View File

@ -286,6 +286,7 @@ chatwin_incoming_msg(ProfChatWin *chatwin, ProfMessage *message, gboolean win_cr
}
}
win_insert_last_read_position_marker((ProfWin*)chatwin, chatwin->barejid);
win_print_incoming(window, display_name, message);
}

View File

@ -651,16 +651,41 @@ ui_focus_win(ProfWin *window)
}
ProfWin *old_current = wins_get_current();
if (old_current->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)old_current;
cmd_ac_remove_form_fields(confwin->form);
}
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
cmd_ac_add_form_fields(confwin->form);
}
// check for trackbar last position separator
switch (old_current->type)
{
case WIN_CHAT:
{
ProfChatWin *chatwin = (ProfChatWin*)old_current;
win_remove_entry_message(old_current, chatwin->barejid);
break;
}
case WIN_MUC:
{
ProfMucWin *mucwin = (ProfMucWin*)old_current;
win_remove_entry_message(old_current, mucwin->roomjid);
break;
}
case WIN_PRIVATE:
{
ProfPrivateWin *privwin = (ProfPrivateWin*)old_current;
win_remove_entry_message(old_current, privwin->fulljid);
break;
}
default:
break;
}
int i = wins_get_num(window);
wins_set_current_by_num(i);

View File

@ -551,6 +551,8 @@ mucwin_incoming_msg(ProfMucWin *mucwin, ProfMessage *message, GSList *mentions,
ch = prefs_get_omemo_char();
}
win_insert_last_read_position_marker((ProfWin*)mucwin, mucwin->roomjid);
if (g_slist_length(mentions) > 0) {
_mucwin_print_mention(window, message->plain, message->jid->resourcepart, mynick, mentions, &ch, flags);
} else if (triggers) {

View File

@ -69,6 +69,7 @@ privwin_incoming_msg(ProfPrivateWin *privatewin, ProfMessage *message)
} else {
status_bar_new(num, WIN_PRIVATE, privatewin->fulljid);
cons_show_incoming_private_message(jidp->resourcepart, jidp->barejid, num, privatewin->unread);
win_insert_last_read_position_marker((ProfWin*)privatewin, privatewin->fulljid);
win_print_incoming(window, jidp->resourcepart, message);
privatewin->unread++;

View File

@ -1354,6 +1354,13 @@ win_update_entry_message(ProfWin *window, const char *const id, const char *cons
}
}
void
win_remove_entry_message(ProfWin *window, const char *const id)
{
buffer_remove_entry_by_id(window->layout->buffer, id);
win_redraw(window);
}
void
win_newline(ProfWin *window)
{
@ -1643,6 +1650,18 @@ _win_print_wrapped(WINDOW *win, const char *const message, size_t indent, int pa
free(word);
}
void
win_print_separator(ProfWin *window)
{
int cols = getmaxx(window->layout->win);
int i;
for (i=1; i<cols; i++) {
wprintw(window->layout->win, "-");
}
wprintw(window->layout->win, "\n");
}
void
win_redraw(ProfWin *window)
{
@ -1652,7 +1671,14 @@ win_redraw(ProfWin *window)
for (i = 0; i < size; i++) {
ProfBuffEntry *e = buffer_get_entry(window->layout->buffer, i);
_win_print(window, e->show_char, e->pad_indent, e->time, e->flags, e->theme_item, e->from, e->message, e->receipt);
if (e->from == NULL && e->message && e->message[0] == '-') {
// just an indicator to print the separator not the actual message
win_print_separator(window);
} else {
// regular thing to print
_win_print(window, e->show_char, e->pad_indent, e->time, e->flags, e->theme_item, e->from, e->message, e->receipt);
}
}
}
@ -1809,3 +1835,32 @@ win_handle_command_exec_result_note(ProfWin *window, const char *const type, con
assert(window != NULL);
win_println(window, THEME_DEFAULT, '!', value);
}
void
win_insert_last_read_position_marker(ProfWin *window, char* id)
{
int i, size;
size = buffer_size(window->layout->buffer);
// TODO: this is somewhat costly. We should improve this later.
// check if we already have a separator present
for (i = 0; i < size; i++) {
ProfBuffEntry *e = buffer_get_entry(window->layout->buffer, i);
// if yes, don't print a new one
if (e->id && (g_strcmp0(e->id, id) == 0)) {
return;
}
}
GDateTime *time = g_date_time_new_now_local();
// the separator will actually be print in win_redraw().
// this only puts it in the buffer and win_redraw() will interpret it.
// so that we have the correct length even when resizing.
buffer_append(window->layout->buffer, ' ', 0, time, 0, THEME_TEXT, NULL, "-", NULL, id);
win_redraw(window);
g_date_time_unref(time);
}

View File

@ -90,4 +90,7 @@ void win_page_down(ProfWin *window);
void win_sub_page_down(ProfWin *window);
void win_sub_page_up(ProfWin *window);
void win_insert_last_read_position_marker(ProfWin *window, char* id);
void win_remove_entry_message(ProfWin *window, const char *const id);
#endif