mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Merge branch 'feature/1238-lastreadpos'
This commit is contained in:
commit
20dc1710e8
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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++;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user