diff --git a/src/Color.cpp b/src/Color.cpp index d9f4d5e999..bcd60eda8e 100644 --- a/src/Color.cpp +++ b/src/Color.cpp @@ -102,6 +102,8 @@ ColorSet::ColorSet() { Color_background, N_("background"), "background", "linen", "background" }, { Color_foreground, N_("text"), "foreground", "black", "foreground" }, { Color_selection, N_("selection"), "selection", "LightBlue", "selection" }, + { Color_selectiontext, N_("selected text"), + "selectiontext", "black", "selectiontext" }, { Color_latex, N_("LaTeX text"), "latex", "DarkRed", "latex" }, { Color_inlinecompletion, N_("inline completion"), "inlinecompletion", "grey60", "inlinecompletion" }, diff --git a/src/ColorCode.h b/src/ColorCode.h index d4e671ef1c..bde9760372 100644 --- a/src/ColorCode.h +++ b/src/ColorCode.h @@ -44,6 +44,8 @@ enum ColorCode Color_foreground, /// Background color of selected text Color_selection, + /// Foreground color of selected text + Color_selectiontext, /// Text color in LaTeX mode Color_latex, /// The color used for previews diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index a50b8a77a1..3cd352e512 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -244,12 +244,22 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, str[0] = par_.transformChar(c, pos); } + // selected text? + pit_type const p0 = pi_.base.bv->cursor().selBegin().pit(); + bool selection = row_.sel_beg > -1 && row_.sel_beg != row_.sel_end + && ((pit_ == p0 && (pos >= row_.sel_beg && pos < row_.sel_end)) + || (pit_ > p0 && pos < row_.sel_end)); + // collect as much similar chars as we can for (++vpos ; vpos < end ; ++vpos) { pos = bidi_.vis2log(vpos); if (pos < font_span.first || pos > font_span.last) break; + if (row_.sel_beg > -1 && row_.sel_beg != row_.sel_end && + ((pit_ == p0 && pos == row_.sel_beg) || pos == row_.sel_end)) + break; + if (prev_change != par_.lookupChange(pos).type) break; @@ -299,9 +309,11 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, docstring s(&str[0], str.size()); - if (prev_change != Change::UNCHANGED) { + if (selection || prev_change != Change::UNCHANGED) { FontInfo copy = font; - if (prev_change == Change::DELETED) { + if (selection) { + copy.setColor(Color_selectiontext); + } else if (prev_change == Change::DELETED) { copy.setColor(Color_deletedtext); } else if (prev_change == Change::INSERTED) { copy.setColor(Color_addedtext);