[LyX/master] Add support for dedicated dark mode color in (Inset)Layout font and background color (#12462)
Juergen Spitzmueller
spitz at lyx.org
Mon May 25 14:50:53 UTC 2026
commit c962f7b8708fbb6ee7294b002cc4a780c07297e7
Author: Juergen Spitzmueller <spitz at lyx.org>
Date: Mon May 25 16:50:37 2026 +0200
Add support for dedicated dark mode color in (Inset)Layout font and background color (#12462)
---
lib/doc/Customization.lyx | 57 +++++++++++++++++++++++++++++++++++++++++---
lib/doc/de/Customization.lyx | 35 ++++++++++++++++++++++++---
src/FontInfo.cpp | 36 +++++++++++++++++++++++-----
src/FontInfo.h | 3 ++-
src/insets/InsetLayout.cpp | 43 ++++++++++++++++++++++++++++++---
5 files changed, 158 insertions(+), 16 deletions(-)
diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx
index f3633c2d45..5d1144f1a2 100644
--- a/lib/doc/Customization.lyx
+++ b/lib/doc/Customization.lyx
@@ -20206,7 +20206,11 @@ BgColor
\end_inset
- [
+
+\change_deleted -712698321 1779719873
+[
+\change_unchanged
+
\begin_inset Flex Code
status collapsed
@@ -20216,7 +20220,34 @@ status collapsed
\end_inset
-] The color for the inset's background.
+
+\change_deleted -712698321 1779719875
+]
+\change_inserted -712698321 1779720029
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1779720029
+<dark color name>
+\change_unchanged
+
+\end_layout
+
+\end_inset
+
+]
+\change_unchanged
+ The color for the inset's background
+\change_inserted -712698321 1779719922
+.
+ If two colors are specified,
+ the first one is used for light mode,
+ the second for dark mode
+\change_unchanged
+.
See
\begin_inset CommandInset ref
LatexCommand ref
@@ -26829,7 +26860,27 @@ string
\end_inset
-] See appendix
+]
+\change_inserted -712698321 1779719997
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1779719983
+string
+\end_layout
+
+\end_inset
+
+] The color of this font.
+ If two colors are specified,
+ the first one is used for light mode,
+ the second for dark mode.
+
+\change_unchanged
+ See appendix
\begin_inset space ~
\end_inset
diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx
index cc62449007..d4ea2265ef 100644
--- a/lib/doc/de/Customization.lyx
+++ b/lib/doc/de/Customization.lyx
@@ -18912,7 +18912,7 @@ BgColor
\end_inset
- [
+
\begin_inset Flex Code
status collapsed
@@ -18922,7 +18922,21 @@ status collapsed
\end_inset
-] ist die Hintergrundfarbe der Einfügung.
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+<Name für dunklen Modus>
+\end_layout
+
+\end_inset
+
+]:
+ die Hintergrundfarbe(n) der Einfügung.
+ Falls zwei Farben angegeben werden,
+ wird die erste für hellen,
+ die zweite für dunklen Modus verwendet.
Siehe
\begin_inset CommandInset ref
LatexCommand ref
@@ -25376,7 +25390,22 @@ string
\end_inset
-] Siehe Anhang
+] [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+string
+\end_layout
+
+\end_inset
+
+]:
+ die Farbe(n) des Textes.
+ Falls zwei Farben angegeben werden,
+ wird die erste für hellen,
+ die zweite für dunklen Modus verwendet.
+ Siehe Anhang
\begin_inset space ~
\end_inset
diff --git a/src/FontInfo.cpp b/src/FontInfo.cpp
index 7133836949..3dd396a516 100644
--- a/src/FontInfo.cpp
+++ b/src/FontInfo.cpp
@@ -716,16 +716,36 @@ FontState setLyXMisc(string const & siz)
/// Sets color after LyX text format
-void setLyXColor(string const & col, FontInfo & f)
+void setLyXColor(string const & col, FontInfo & f, string const & dmcol)
{
ColorCode cc = lcolor.getFromLyXName(col, false);
+ string lyxname = col;
+ string lchexname;
if (cc == Color_none && theLaTeXColors().isLaTeXColor(col)) {
LaTeXColor const lc = theLaTeXColors().getLaTeXColor(col);
- string const lyxname = lc.name();
- lcolor.setColor(lyxname, lc.hexname());
+ lyxname = lc.name();
+ lchexname = lc.hexname();
+ lcolor.setColor(lyxname, lchexname);
lcolor.setLaTeXName(lyxname, lc.latex());
lcolor.setGUIName(lyxname, to_ascii(lc.guiname()));
cc = lcolor.getFromLyXName(lyxname);
+ } else if (cc != Color_none)
+ lchexname = lcolor.getX11HexName(cc);
+ if (!dmcol.empty()) {
+ // generate a new name for this color
+ string nlyxname = lyxname;
+ int i = 0;
+ while (lcolor.isKnownLyXName(nlyxname)) {
+ ++i;
+ nlyxname = lyxname + convert<string>(i);
+ }
+ ColorCode dcc = lcolor.getFromLyXName(dmcol, false);
+ if (dcc == Color_none && theLaTeXColors().isLaTeXColor(dmcol)) {
+ LaTeXColor const dlc = theLaTeXColors().getLaTeXColor(dmcol);
+ lcolor.setColor(nlyxname, lchexname, dlc.hexname());
+ } else if (dcc != Color_none)
+ lcolor.setColor(nlyxname, lchexname, lcolor.getX11HexName(dcc));
+ cc = lcolor.getFromLyXName(nlyxname);
}
f.setColor(cc);
}
@@ -802,9 +822,13 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
lex.printError("Illegal misc type");
}
} else if (tok == "color") {
- lex.next();
- string const ttok = lex.getString();
- setLyXColor(ttok, f);
+ lex.eatLine();
+ vector<string> const colors = getVectorFromString(lex.getString(), " ");
+ string const lmcolor = colors.front();
+ string dmcolor;
+ if (colors.size() > 1)
+ dmcolor = colors.back();
+ setLyXColor(lmcolor, f, dmcolor);
} else {
lex.printError("Unknown tag");
error = true;
diff --git a/src/FontInfo.h b/src/FontInfo.h
index bcbe596e98..eb69fd3386 100644
--- a/src/FontInfo.h
+++ b/src/FontInfo.h
@@ -251,7 +251,8 @@ void setLyXShape(std::string const &, FontInfo &);
void setLyXSize(std::string const &, FontInfo &);
/// Sets color after LyX text format
-void setLyXColor(std::string const &, FontInfo &);
+void setLyXColor(std::string const &, FontInfo &,
+ std::string const & dmcol = std::string());
/// Returns misc flag after LyX text format
FontState setLyXMisc(std::string const &);
diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp
index 5c12f00bcc..7acaa3d3f8 100644
--- a/src/insets/InsetLayout.cpp
+++ b/src/insets/InsetLayout.cpp
@@ -17,6 +17,7 @@
#include "ColorSet.h"
#include "TextClass.h"
+#include "support/convert.h"
#include "support/debug.h"
#include "support/Lexer.h"
#include "support/lstrings.h"
@@ -531,10 +532,46 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass,
case IL_ARGUMENT:
readArgument(lex);
break;
- case IL_BGCOLOR:
- lex >> tmp;
- bgcolor_ = lcolor.getFromLyXName(tmp);
+ case IL_BGCOLOR: {
+ lex.eatLine();
+ vector<string> const colors = getVectorFromString(lex.getString(), " ");
+ string const lmcolor = colors.front();
+ string dmcolor;
+ if (colors.size() > 1)
+ dmcolor = colors.back();
+ if (dmcolor.empty()) {
+ bgcolor_ = lcolor.getFromLyXName(lmcolor);
+ break;
+ }
+ // generate a new name for this color
+ string nlyxname = to_utf8(name_);
+ int i = 0;
+ while (lcolor.isKnownLyXName(nlyxname)) {
+ ++i;
+ nlyxname = to_utf8(name_) + convert<string>(i);
+ }
+ ColorCode lcc = lcolor.getFromLyXName(lmcolor, false);
+ string lyxname = lmcolor;
+ string lchexname;
+ if (lcc == Color_none && theLaTeXColors().isLaTeXColor(lmcolor)) {
+ LaTeXColor const lc = theLaTeXColors().getLaTeXColor(lmcolor);
+ lyxname = lc.name();
+ lchexname = lc.hexname();
+ lcolor.setColor(lyxname, lchexname);
+ lcolor.setLaTeXName(lyxname, lc.latex());
+ lcolor.setGUIName(lyxname, to_ascii(lc.guiname()));
+ lcc = lcolor.getFromLyXName(lyxname);
+ } else if (lcc != Color_none)
+ lchexname = lcolor.getX11HexName(lcc);
+ ColorCode dcc = lcolor.getFromLyXName(dmcolor, false);
+ if (dcc == Color_none && theLaTeXColors().isLaTeXColor(dmcolor)) {
+ LaTeXColor const dlc = theLaTeXColors().getLaTeXColor(dmcolor);
+ lcolor.setColor(nlyxname, lchexname, dlc.hexname());
+ } else if (dcc != Color_none)
+ lcolor.setColor(nlyxname, lchexname, lcolor.getX11HexName(dcc));
+ bgcolor_ = lcolor.getFromLyXName(nlyxname);
break;
+ }
case IL_PREAMBLE:
preamble_ = lex.getLongString(from_ascii("EndPreamble"));
break;
More information about the lyx-cvs
mailing list