about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2019-12-13 13:13:55 +0100
committerMichael Vetter <jubalh@iodoru.org>2019-12-13 13:13:55 +0100
commit20dc1710e8f5abed960c6579a63117261d1ac8de (patch)
treebbe9880d98e8d840ee38f0cec12b86465262c057
parent9bb2d7f95e12b5a2ce6a957c92efaa6a4171e663 (diff)
parent3036834ec83d2433bf5b1b4408776d771554878c (diff)
downloadprofani-tty-20dc1710e8f5abed960c6579a63117261d1ac8de.tar.gz
Merge branch 'feature/1238-lastreadpos'
-rw-r--r--src/ui/buffer.c13
-rw-r--r--src/ui/buffer.h1
-rw-r--r--src/ui/chatwin.c1
-rw-r--r--src/ui/core.c27
-rw-r--r--src/ui/mucwin.c2
-rw-r--r--src/ui/privwin.c1
-rw-r--r--src/ui/window.c57
-rw-r--r--src/ui/window.h3
8 files changed, 103 insertions, 2 deletions
diff --git a/src/ui/buffer.c b/src/ui/buffer.c
index a4ae41da..916aba1a 100644
--- a/src/ui/buffer.c
+++ b/src/ui/buffer.c
@@ -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)
 {
diff --git a/src/ui/buffer.h b/src/ui/buffer.h
index 67cd6d5b..10151d17 100644
--- a/src/ui/buffer.h
+++ b/src/ui/buffer.h
@@ -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);
diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c
index d92f0de4..8faf4934 100644
--- a/src/ui/chatwin.c
+++ b/src/ui/chatwin.c
@@ -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);
     }
 
diff --git a/src/ui/core.c b/src/ui/core.c
index 8c7eca2e..545c508f 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -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);
 
diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c
index f2d1a946..66de0dba 100644
--- a/src/ui/mucwin.c
+++ b/src/ui/mucwin.c
@@ -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) {
diff --git a/src/ui/privwin.c b/src/ui/privwin.c
index b888041a..4befc325 100644
--- a/src/ui/privwin.c
+++ b/src/ui/privwin.c
@@ -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++;
diff --git a/src/ui/window.c b/src/ui/window.c
index 2a76496c..c062e694 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -1355,6 +1355,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)
 {
     win_appendln(window, THEME_DEFAULT, "");
@@ -1644,6 +1651,18 @@ _win_print_wrapped(WINDOW *win, const char *const message, size_t indent, int pa
 }
 
 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)
 {
     int i, size;
@@ -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);
+}
+
diff --git a/src/ui/window.h b/src/ui/window.h
index 79def390..b1f9a4af 100644
--- a/src/ui/window.h
+++ b/src/ui/window.h
@@ -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