changeset 1965:ec737f5f1d6f

Couple of readmark-related bugfixes
author Mikael Berthe <mikael@lilotux.net>
date Fri, 18 Mar 2011 12:29:57 +0100
parents 306ddec07d63
children 88dafee4ee49
files mcabber/mcabber/hbuf.c mcabber/mcabber/histolog.c mcabber/mcabber/screen.c
diffstat 3 files changed, 17 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/hbuf.c	Tue Mar 15 14:14:20 2011 +0100
+++ b/mcabber/mcabber/hbuf.c	Fri Mar 18 12:29:57 2011 +0100
@@ -347,7 +347,10 @@
       (*array_elt)->mucnicklen = blk->prefix.mucnicklen;
       (*array_elt)->text       = g_strndup(blk->ptr, maxlen);
 
-      if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
+      if ((blk->flags & HBB_FLAG_PERSISTENT) &&
+          (blk->prefix.flags & ~HBB_PREFIX_READMARK)) {
+        // This is a new message: persistent block flag and no prefix flag
+        // (except a possible readmark flag)
         last_persist_prefixflags = blk->prefix.flags;
       } else {
         // Propagate highlighting flags
@@ -532,12 +535,13 @@
 
   if (!hbuf) return;
 
-  hbuf = g_list_last(hbuf);
+  hbuf = hbuf_previous_persistent(g_list_last(hbuf));
 
   if (action) {
     // Add a readmark flag
     blk = (hbuf_block*)(hbuf->data);
-    blk->prefix.flags ^= HBB_PREFIX_READMARK;
+    blk->prefix.flags |= HBB_PREFIX_READMARK;
+
     // Shift hbuf in order to remove previous flags
     // (maybe it can be optimized out, if there's no risk
     //  we have several marks)
--- a/mcabber/mcabber/histolog.c	Tue Mar 15 14:14:20 2011 +0100
+++ b/mcabber/mcabber/histolog.c	Fri Mar 18 12:29:57 2011 +0100
@@ -349,9 +349,6 @@
   }
   fclose(fp);
   g_free(data);
-
-  // Set a readmark to separate new content
-  hbuf_set_readmark(*p_buddyhbuf, TRUE);
 }
 
 //  hlog_enable()
--- a/mcabber/mcabber/screen.c	Tue Mar 15 14:14:20 2011 +0100
+++ b/mcabber/mcabber/screen.c	Fri Mar 18 12:29:57 2011 +0100
@@ -1056,6 +1056,9 @@
       tmp->bd = g_new0(buffdata, 1);
       hlog_read_history(title, &tmp->bd->hbuf,
                         maxX - Roster_Width - scr_getprefixwidth());
+
+      // Set a readmark to separate new content
+      hbuf_set_readmark(tmp->bd->hbuf, TRUE);
     }
 
     id = g_strdup(title);
@@ -1137,7 +1140,7 @@
   char pref[96];
   hbb_line **lines, *line;
   GList *hbuf_head;
-  int color;
+  int color = COLOR_GENERAL;
   bool readmark = FALSE;
   bool skipline = FALSE;
 
@@ -1285,10 +1288,6 @@
       wprintw(win_entry->win, "%s", line->text+line->mucnicklen);
       wclrtoeol(win_entry->win);
 
-      // Return the color back
-      if (color != COLOR_GENERAL)
-        wattrset(win_entry->win, get_color(COLOR_GENERAL));
-
 scr_update_window_skipline:
       skipline = FALSE;
       if (readmark && line->flags & HBB_PREFIX_READMARK) {
@@ -1298,7 +1297,8 @@
         // Display the mark
         winy = n + mark_offset;
         wmove(win_entry->win, winy, 0);
-        wattrset(win_entry->win, get_color(COLOR_READMARK));
+        color = COLOR_READMARK;
+        wattrset(win_entry->win, get_color(color));
         g_snprintf(pref, prefixwidth, "             == ");
         wprintw(win_entry->win, pref);
         w = scr_gettextwidth() / 3;
@@ -1308,6 +1308,10 @@
         wattrset(win_entry->win, get_color(COLOR_GENERAL));
       }
 
+      // Restore default ("general") color
+      if (color != COLOR_GENERAL)
+        wattrset(win_entry->win, get_color(COLOR_GENERAL));
+
       g_free(line->text);
       g_free(line);
     } else {