Change cursor color on NS port when it matches the face background

* src/macfont.m (CG_SET_FILL_COLOR_WITH_FRAME_CURSOR): New macro.
(CG_SET_FILL_COLOR_WITH_FRAME_BACKGROUND): New macro.
(macfont_draw): When the cursor's color matches the face background,
set the fill color of the cursor to the face foreground.
* src/nsterm.m (ns_maybe_dumpglyphs_background): When dumping the
background of a glyph string, apply the logic mentioned
above.  (Bug#62573)
This commit is contained in:
Daniel Martín 2023-04-02 22:39:44 +02:00 committed by Eli Zaretskii
parent 96714c106b
commit b36c21e27d
2 changed files with 47 additions and 23 deletions

View file

@ -632,21 +632,35 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
#define CG_SET_FILL_COLOR_WITH_FACE_FOREGROUND(context, face) \
do { \
CGColorRef refcol_ = get_cgcolor (NS_FACE_FOREGROUND (face)); \
CGContextSetFillColorWithColor (context, refcol_) ; \
CGColorRelease (refcol_); \
CGColorRef refcol = get_cgcolor (NS_FACE_FOREGROUND (face)); \
CGContextSetFillColorWithColor (context, refcol); \
CGColorRelease (refcol); \
} while (0)
#define CG_SET_FILL_COLOR_WITH_FACE_BACKGROUND(context, face) \
do { \
CGColorRef refcol_ = get_cgcolor (NS_FACE_BACKGROUND (face)); \
CGContextSetFillColorWithColor (context, refcol_); \
CGColorRelease (refcol_); \
CGColorRef refcol = get_cgcolor (NS_FACE_BACKGROUND (face)); \
CGContextSetFillColorWithColor (context, refcol); \
CGColorRelease (refcol); \
} while (0)
#define CG_SET_FILL_COLOR_WITH_FRAME_CURSOR(context, frame) \
do { \
CGColorRef refcol \
= get_cgcolor_from_nscolor (FRAME_CURSOR_COLOR (frame), frame); \
CGContextSetFillColorWithColor (context, refcol); \
CGColorRelease (refcol); \
} while (0)
#define CG_SET_FILL_COLOR_WITH_FRAME_BACKGROUND(context, frame) \
do { \
CGColorRef refcol \
= get_cgcolor_from_nscolor (FRAME_BACKGROUND_COLOR (frame), frame); \
CGContextSetFillColorWithColor (context, refcol); \
CGColorRelease (refcol); \
} while (0)
#define CG_SET_STROKE_COLOR_WITH_FACE_FOREGROUND(context, face) \
do { \
CGColorRef refcol_ = get_cgcolor (NS_FACE_FOREGROUND (face)); \
CGContextSetStrokeColorWithColor (context, refcol_); \
CGColorRelease (refcol_); \
CGColorRef refcol = get_cgcolor (NS_FACE_FOREGROUND (face)); \
CGContextSetStrokeColorWithColor (context, refcol); \
CGColorRelease (refcol); \
} while (0)
@ -2933,9 +2947,12 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no
{
if (s->hl == DRAW_CURSOR)
{
CGColorRef colorref = get_cgcolor_from_nscolor (FRAME_CURSOR_COLOR (f), f);
CGContextSetFillColorWithColor (context, colorref);
CGColorRelease (colorref);
if (face && (NS_FACE_BACKGROUND (face)
== [(NSColor *) FRAME_CURSOR_COLOR (f)
unsignedLong]))
CG_SET_FILL_COLOR_WITH_FACE_FOREGROUND (context, face);
else
CG_SET_FILL_COLOR_WITH_FRAME_CURSOR (context, f);
}
else
CG_SET_FILL_COLOR_WITH_FACE_BACKGROUND (context, face);
@ -2949,9 +2966,12 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no
CGContextScaleCTM (context, 1, -1);
if (s->hl == DRAW_CURSOR)
{
CGColorRef colorref = get_cgcolor_from_nscolor (FRAME_BACKGROUND_COLOR (f), f);
CGContextSetFillColorWithColor (context, colorref);
CGColorRelease (colorref);
if (face && (NS_FACE_BACKGROUND (face)
== [(NSColor *) FRAME_CURSOR_COLOR (f)
unsignedLong]))
CG_SET_FILL_COLOR_WITH_FACE_BACKGROUND (context, face);
else
CG_SET_FILL_COLOR_WITH_FRAME_BACKGROUND (context, f);
}
else
CG_SET_FILL_COLOR_WITH_FACE_FOREGROUND (context, face);

View file

@ -3750,14 +3750,18 @@ Function modeled after x_draw_glyph_string_box ().
{
struct face *face = s->face;
if (!face->stipple)
{
if (s->hl != DRAW_CURSOR)
[(NS_FACE_BACKGROUND (face) != 0
? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
: FRAME_BACKGROUND_COLOR (s->f)) set];
else
[FRAME_CURSOR_COLOR (s->f) set];
}
{
if (s->hl != DRAW_CURSOR)
[(NS_FACE_BACKGROUND (face) != 0
? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
: FRAME_BACKGROUND_COLOR (s->f)) set];
else if (face && (NS_FACE_BACKGROUND (face)
== [(NSColor *) FRAME_CURSOR_COLOR (s->f)
unsignedLong]))
[[NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (face)] set];
else
[FRAME_CURSOR_COLOR (s->f) set];
}
else
{
struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f);