mirror of
https://github.com/profanity-im/profanity.git
synced 2024-08-18 19:04:14 -04: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);
|
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
|
gboolean
|
||||||
buffer_mark_received(ProfBuff buffer, const char *const id)
|
buffer_mark_received(ProfBuff buffer, const char *const id)
|
||||||
{
|
{
|
||||||
|
@ -64,6 +64,7 @@ ProfBuff buffer_create();
|
|||||||
void buffer_free(ProfBuff buffer);
|
void buffer_free(ProfBuff buffer);
|
||||||
void buffer_append(ProfBuff buffer, const char show_char, int pad_indent, GDateTime *time,
|
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);
|
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);
|
int buffer_size(ProfBuff buffer);
|
||||||
ProfBuffEntry* buffer_get_entry(ProfBuff buffer, int entry);
|
ProfBuffEntry* buffer_get_entry(ProfBuff buffer, int entry);
|
||||||
ProfBuffEntry* buffer_get_entry_by_id(ProfBuff buffer, const char *const id);
|
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);
|
win_print_incoming(window, display_name, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -651,16 +651,41 @@ ui_focus_win(ProfWin *window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ProfWin *old_current = wins_get_current();
|
ProfWin *old_current = wins_get_current();
|
||||||
|
|
||||||
if (old_current->type == WIN_CONFIG) {
|
if (old_current->type == WIN_CONFIG) {
|
||||||
ProfConfWin *confwin = (ProfConfWin*)old_current;
|
ProfConfWin *confwin = (ProfConfWin*)old_current;
|
||||||
cmd_ac_remove_form_fields(confwin->form);
|
cmd_ac_remove_form_fields(confwin->form);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->type == WIN_CONFIG) {
|
if (window->type == WIN_CONFIG) {
|
||||||
ProfConfWin *confwin = (ProfConfWin*)window;
|
ProfConfWin *confwin = (ProfConfWin*)window;
|
||||||
cmd_ac_add_form_fields(confwin->form);
|
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);
|
int i = wins_get_num(window);
|
||||||
wins_set_current_by_num(i);
|
wins_set_current_by_num(i);
|
||||||
|
|
||||||
|
@ -551,6 +551,8 @@ mucwin_incoming_msg(ProfMucWin *mucwin, ProfMessage *message, GSList *mentions,
|
|||||||
ch = prefs_get_omemo_char();
|
ch = prefs_get_omemo_char();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
win_insert_last_read_position_marker((ProfWin*)mucwin, mucwin->roomjid);
|
||||||
|
|
||||||
if (g_slist_length(mentions) > 0) {
|
if (g_slist_length(mentions) > 0) {
|
||||||
_mucwin_print_mention(window, message->plain, message->jid->resourcepart, mynick, mentions, &ch, flags);
|
_mucwin_print_mention(window, message->plain, message->jid->resourcepart, mynick, mentions, &ch, flags);
|
||||||
} else if (triggers) {
|
} else if (triggers) {
|
||||||
|
@ -69,6 +69,7 @@ privwin_incoming_msg(ProfPrivateWin *privatewin, ProfMessage *message)
|
|||||||
} else {
|
} else {
|
||||||
status_bar_new(num, WIN_PRIVATE, privatewin->fulljid);
|
status_bar_new(num, WIN_PRIVATE, privatewin->fulljid);
|
||||||
cons_show_incoming_private_message(jidp->resourcepart, jidp->barejid, num, privatewin->unread);
|
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);
|
win_print_incoming(window, jidp->resourcepart, message);
|
||||||
|
|
||||||
privatewin->unread++;
|
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
|
void
|
||||||
win_newline(ProfWin *window)
|
win_newline(ProfWin *window)
|
||||||
{
|
{
|
||||||
@ -1643,6 +1650,18 @@ _win_print_wrapped(WINDOW *win, const char *const message, size_t indent, int pa
|
|||||||
free(word);
|
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
|
void
|
||||||
win_redraw(ProfWin *window)
|
win_redraw(ProfWin *window)
|
||||||
{
|
{
|
||||||
@ -1652,8 +1671,15 @@ win_redraw(ProfWin *window)
|
|||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
ProfBuffEntry *e = buffer_get_entry(window->layout->buffer, i);
|
ProfBuffEntry *e = buffer_get_entry(window->layout->buffer, i);
|
||||||
|
|
||||||
|
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);
|
_win_print(window, e->show_char, e->pad_indent, e->time, e->flags, e->theme_item, e->from, e->message, e->receipt);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -1809,3 +1835,32 @@ win_handle_command_exec_result_note(ProfWin *window, const char *const type, con
|
|||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
win_println(window, THEME_DEFAULT, '!', value);
|
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_down(ProfWin *window);
|
||||||
void win_sub_page_up(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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user