selection colors

This commit is contained in:
Luca Bilke 2023-06-13 23:11:40 +02:00
parent 6d789d8231
commit d53df10eea
4 changed files with 147 additions and 17 deletions

View File

@ -144,6 +144,9 @@ unsigned int defaultfg = 258;
unsigned int defaultbg = 259;
unsigned int selectionfg = 260;
unsigned int selectionbg = 261;
/* If 0 use selectionfg as foreground in order to have a uniform foreground-color */
/* Else if 1 keep original foreground-color of each cell => more colors :) */
static int ignoreselfg = 1;
/*
+ * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81

View File

@ -0,0 +1,130 @@
From 0750c0b8c91579ec871c70c8990527bebc86a56e Mon Sep 17 00:00:00 2001
From: Ashish Kumar Yadav <ashishkumar.yadav@students.iiserpune.ac.in>
Date: Sat, 31 Jul 2021 22:21:11 +0530
Subject: [PATCH] Add settings for selection-colors
This patch adds the two color-settings *selectionfg* and *selectionbg* to
config.def.h. Those define the fore- and background colors which are used when
text on the screen is selected with the mouse. This removes the default
behaviour which would simply reverse the colors.
Additionally, a third setting *ingnoreselfg* exists. If true then the setting
*selectionfg* is ignored and the original foreground-colors of each cell are
not changed during selection. Basically only the background-color would change.
This might be more visually appealing to some folks.
---
config.def.h | 11 ++++++++---
st.h | 1 +
x.c | 30 +++++++++++++-----------------
3 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/config.def.h b/config.def.h
index 6f05dce..3679af8 100644
--- a/config.def.h
+++ b/config.def.h
@@ -119,18 +119,23 @@ static const char *colorname[] = {
/* more colors can be added after 255 to use with DefaultXX */
"#cccccc",
- "#555555",
+ "#2e3440",
};
/*
* Default colors (colorname index)
- * foreground, background, cursor, reverse cursor
+ * foreground, background, cursor, reverse cursor, selection
*/
unsigned int defaultfg = 7;
unsigned int defaultbg = 0;
static unsigned int defaultcs = 256;
-static unsigned int defaultrcs = 257;
+static unsigned int defaultrcs = 256;
+unsigned int selectionbg = 257;
+unsigned int selectionfg = 7;
+/* If 0 use selectionfg as foreground in order to have a uniform foreground-color */
+/* Else if 1 keep original foreground-color of each cell => more colors :) */
+static int ignoreselfg = 1;
/*
* Default shape of cursor
diff --git a/st.h b/st.h
index 3d351b6..e1a28c3 100644
--- a/st.h
+++ b/st.h
@@ -33,6 +33,7 @@ enum glyph_attribute {
ATTR_WRAP = 1 << 8,
ATTR_WIDE = 1 << 9,
ATTR_WDUMMY = 1 << 10,
+ ATTR_SELECTED = 1 << 11,
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
};
diff --git a/x.c b/x.c
index 210f184..7a6c70e 100644
--- a/x.c
+++ b/x.c
@@ -1425,6 +1425,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
bg = temp;
}
+ if (base.mode & ATTR_SELECTED) {
+ bg = &dc.col[selectionbg];
+ if (!ignoreselfg)
+ fg = &dc.col[selectionfg];
+ }
+
if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)
fg = bg;
@@ -1491,7 +1497,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
/* remove the old cursor */
if (selected(ox, oy))
- og.mode ^= ATTR_REVERSE;
+ og.mode |= ATTR_SELECTED;
xdrawglyph(og, ox, oy);
if (IS_SET(MODE_HIDE))
@@ -1504,23 +1510,13 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
if (IS_SET(MODE_REVERSE)) {
g.mode |= ATTR_REVERSE;
+ g.fg = defaultcs;
g.bg = defaultfg;
- if (selected(cx, cy)) {
- drawcol = dc.col[defaultcs];
- g.fg = defaultrcs;
- } else {
- drawcol = dc.col[defaultrcs];
- g.fg = defaultcs;
- }
+ drawcol = dc.col[defaultrcs];
} else {
- if (selected(cx, cy)) {
- g.fg = defaultfg;
- g.bg = defaultrcs;
- } else {
- g.fg = defaultbg;
- g.bg = defaultcs;
- }
- drawcol = dc.col[g.bg];
+ g.fg = defaultbg;
+ g.bg = defaultcs;
+ drawcol = dc.col[defaultcs];
}
/* draw the new one */
@@ -1612,7 +1608,7 @@ xdrawline(Line line, int x1, int y1, int x2)
if (new.mode == ATTR_WDUMMY)
continue;
if (selected(x, y1))
- new.mode ^= ATTR_REVERSE;
+ new.mode |= ATTR_SELECTED;
if (i > 0 && ATTRCMP(base, new)) {
xdrawglyphfontspecs(specs, base, i, ox, y1);
specs += i;
--
2.32.0

1
st.h
View File

@ -35,6 +35,7 @@ enum glyph_attribute {
ATTR_WIDE = 1 << 9,
ATTR_WDUMMY = 1 << 10,
ATTR_BOXDRAW = 1 << 11,
ATTR_SELECTED = 1 << 12,
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
ATTR_DIRTYUNDERLINE = 1 << 15,
};

30
x.c
View File

@ -1577,6 +1577,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
bg = temp;
}
if (base.mode & ATTR_SELECTED) {
bg = &dc.col[selectionbg];
if (!ignoreselfg)
fg = &dc.col[selectionfg];
}
if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)
fg = bg;
@ -1996,7 +2002,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le
/* remove the old cursor */
if (selected(ox, oy))
og.mode ^= ATTR_REVERSE;
og.mode |= ATTR_SELECTED;
/* Redraw the line where cursor was previously.
* It will restore the ligatures broken by the cursor. */
@ -2012,23 +2018,13 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le
if (IS_SET(MODE_REVERSE)) {
g.mode |= ATTR_REVERSE;
g.fg = defaultcs;
g.bg = defaultfg;
if (selected(cx, cy)) {
drawcol = dc.col[defaultcs];
g.fg = defaultrcs;
} else {
drawcol = dc.col[defaultrcs];
g.fg = defaultcs;
}
drawcol = dc.col[defaultrcs];
} else {
if (selected(cx, cy)) {
g.fg = defaultfg;
g.bg = defaultrcs;
} else {
g.fg = defaultbg;
g.bg = defaultcs;
}
drawcol = dc.col[g.bg];
g.fg = defaultbg;
g.bg = defaultcs;
drawcol = dc.col[defaultcs];
}
/* draw the new one */
@ -2179,7 +2175,7 @@ xdrawline(Line line, int x1, int y1, int x2)
if (new.mode == ATTR_WDUMMY)
continue;
if (selected(x, y1))
new.mode ^= ATTR_REVERSE;
new.mode |= ATTR_SELECTED;
if ((i > 0) && ATTRCMP(base, new)) {
numspecs = xmakeglyphfontspecs(specs, &line[ox], x - ox, ox, y1);
xdrawglyphfontspecs(specs, base, numspecs, ox, y1);