From: Jon Rubens <jonathan.rubens@gmail.com>
To: emacs-devel@gnu.org
Subject: macOS (Cocoa) alpha-background
Date: Mon, 22 Jan 2024 16:54:50 -0800 [thread overview]
Message-ID: <m2msswrhr9.fsf@jon-mbp.lan> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 10706 bytes --]
I’ve been jealous of the alpha-background feature for Cairo builds so
I took it upon myself to try and implement the same on my macOS build.
I’ve got it working to some extent and I’m looking for someone with
some experience to help finish this implementation.
What isn’t working yet:
- Main window face background is solid. I messed around in
src/macfont.m and did achieve transparency but it also caused a
bunch of strange behavior. I don’t understand the CoreGraphics
implementation well. I don’t know why the modeline text is
implemented differently from the window text. I almost think the NS
build is wildly outdated.
- I do not know if what I changed is done in an effective way, I’m not
a developer to any extent just someone who is too impatient to wait
for someone else to add this feature. This also means that my patch
file is invalid in some way because I’m teaching myself as I go
along.
---
src/nsfns.m | 9 ++++-----
src/nsfont.m | 2 +-
src/nsterm.h | 2 +-
src/nsterm.m | 44 ++++++++++++++++++++++++--------------------
4 files changed, 30 insertions(+), 27 deletions(-)
diff --git a/src/nsfns.m b/src/nsfns.m
index b0281aac257..705c8e5aab7 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -282,7 +282,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
[f->output_data.ns->foreground_color release];
f->output_data.ns->foreground_color = col;
- FRAME_FOREGROUND_PIXEL (f) = [col unsignedLong];
+ FRAME_FOREGROUND_PIXEL (f) = [[col colorWithAlphaComponent: f->alpha_background] unsignedLong];
if (FRAME_NS_VIEW (f))
{
@@ -301,7 +301,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
struct face *face;
NSColor *col;
NSView *view = FRAME_NS_VIEW (f);
- EmacsCGFloat alpha;
+ EmacsCGFloat alpha = f->alpha_background;
block_input ();
if (ns_lisp_to_color (arg, &col))
@@ -315,12 +315,11 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
[f->output_data.ns->background_color release];
f->output_data.ns->background_color = col;
- FRAME_BACKGROUND_PIXEL (f) = [col unsignedLong];
- alpha = [col alphaComponent];
+ FRAME_BACKGROUND_PIXEL (f) = [[col colorWithAlphaComponent: alpha] unsignedLong];
if (view != nil)
{
- [[view window] setBackgroundColor: col];
+ [[view window] setBackgroundColor: [col colorWithAlphaComponent: alpha]];
if (alpha != (EmacsCGFloat) 1.0)
[[view window] setOpaque: NO];
diff --git a/src/nsfont.m b/src/nsfont.m
index 1205fbe5263..9da964956e1 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -1185,7 +1185,7 @@ is false when (FROM > 0 || TO < S->nchars). */
{
if (s->hl != DRAW_CURSOR)
[(NS_FACE_BACKGROUND (face) != 0
- ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
+ ? [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: s->f->alpha_background]
,----
| FRAME_BACKGROUND_COLOR (s->f)) set];
`----
else
[FRAME_CURSOR_COLOR (s->f) set];
diff --git a/src/nsterm.h b/src/nsterm.h
index c2965cfcc0f..7b0a1db601d 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1017,7 +1017,7 @@ #define FRAME_NS_WINDOW(f) ((f)->output_data.ns->window_desc)
#define FRAME_NATIVE_WINDOW(f) FRAME_NS_WINDOW (f)
#define FRAME_FOREGROUND_COLOR(f) ((f)->output_data.ns->foreground_color)
-#define FRAME_BACKGROUND_COLOR(f) ((f)->output_data.ns->background_color)
+#define FRAME_BACKGROUND_COLOR(f) ([(f)->output_data.ns->background_color colorWithAlphaComponent: f->alpha_background])
#define NS_FACE_FOREGROUND(f) ((f)->foreground)
#define NS_FACE_BACKGROUND(f) ((f)->background)
diff --git a/src/nsterm.m b/src/nsterm.m
index 518b38658d1..1fd7ea54dae 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -2618,8 +2618,9 @@ Hide the window (X11 semantics)
block_input ();
ns_focus (f, &r, 1);
- [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
- (FACE_FROM_ID (f, DEFAULT_FACE_ID))] set];
+ [[[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
+ (FACE_FROM_ID (f, DEFAULT_FACE_ID))]
+ colorWithAlphaComponent: f->alpha_background] set];
NSRectFill (r);
ns_unfocus (f);
@@ -2647,7 +2648,7 @@ Hide the window (X11 semantics)
r = NSIntersectionRect (r, [view frame]);
ns_focus (f, &r, 1);
- [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] set];
+ [[[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: f->alpha_background] set];
NSRectFill (r);
@@ -2751,7 +2752,7 @@ Hide the window (X11 semantics)
return;
ns_focus (f, NULL, 1);
- [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] set];
+ [[[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: f->alpha_background] set];
NSRectFill (NSMakeRect (0, margin, width, border));
NSRectFill (NSMakeRect (0, 0, border, height));
NSRectFill (NSMakeRect (0, margin, width, border));
@@ -2802,7 +2803,7 @@ Hide the window (X11 semantics)
NSRect r = NSMakeRect (0, y, FRAME_PIXEL_WIDTH (f), height);
ns_focus (f, &r, 1);
- [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] set];
+ [[[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: f->alpha_background] set];
NSRectFill (NSMakeRect (0, y, width, height));
NSRectFill (NSMakeRect (FRAME_PIXEL_WIDTH (f) - width,
y, width, height));
@@ -2966,8 +2967,7 @@ Hide the window (X11 semantics)
if (! NSIsEmptyRect (clearRect))
{
NSTRACE_RECT ("clearRect", clearRect);
-
- [[NSColor colorWithUnsignedLong:face->background] set];
+ [[[NSColor colorWithUnsignedLong:face->background] colorWithAlphaComponent: f->alpha_background] set];
NSRectFill (clearRect);
}
@@ -2994,7 +2994,7 @@ Hide the window (X11 semantics)
if (!p->cursor_p)
bm_color = [NSColor colorWithUnsignedLong:face->foreground];
else if (p->overlay_p)
- bm_color = [NSColor colorWithUnsignedLong:face->background];
+ bm_color = [[NSColor colorWithUnsignedLong:face->background] colorWithAlphaComponent: f->alpha_background];
else
bm_color = f->output_data.ns->cursor_color;
@@ -3491,7 +3491,7 @@ larger if there are taller display elements (e.g., characters
if (s->face->use_box_color_for_shadows_p)
color = [NSColor colorWithUnsignedLong: s->face->box_color];
else
- color = [NSColor colorWithUnsignedLong: s->face->background];
+ color = [[NSColor colorWithUnsignedLong: s->face->background] colorWithAlphaComponent: s->f->alpha_background];
if (s->hl == DRAW_CURSOR)
color = FRAME_CURSOR_COLOR (s->f);
@@ -3719,7 +3719,7 @@ Function modeled after x_draw_glyph_string_box ().
if (s->face->box == FACE_SIMPLE_BOX && s->face->box_color)
{
ns_draw_box (r, abs (hthickness), abs (vthickness),
- [NSColor colorWithUnsignedLong:face->box_color],
+ [[NSColor colorWithUnsignedLong:face->box_color] colorWithAlphaComponent: s->f->alpha_background],
left_p, right_p);
}
else
@@ -3757,8 +3757,10 @@ Function modeled after x_draw_glyph_string_box ().
{
if (s->hl != DRAW_CURSOR)
[(NS_FACE_BACKGROUND (face) != 0
- ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
+ ? [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
+ colorWithAlphaComponent: s->f->alpha_background]
,----
| FRAME_BACKGROUND_COLOR (s->f)) set];
`----
+ else if (face && (NS_FACE_BACKGROUND (face)
== [(NSColor *) FRAME_CURSOR_COLOR (s->f)
unsignedLong]))
@@ -3902,7 +3904,7 @@ Function modeled after x_draw_glyph_string_box ().
otherwise, since we composite the image under NS (instead of mucking
with its background color), we must clear just the image area. */
- [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] set];
+ [[[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: s->f->alpha_background] set];
if (bg_height > s->slice.height || s->img->hmargin || s->img->vmargin
s->img->mask s->img->pixmap == 0 s->width != s->background_width)
@@ -3972,7 +3974,7 @@ Function modeled after x_draw_glyph_string_box ().
if (s->hl == DRAW_CURSOR)
{
[FRAME_CURSOR_COLOR (s->f) set];
- tdCol = [NSColor colorWithUnsignedLong: NS_FACE_BACKGROUND (face)];
+ tdCol = [[NSColor colorWithUnsignedLong: NS_FACE_BACKGROUND (face)] colorWithAlphaComponent: s->f->alpha_background];
}
else
tdCol = [NSColor colorWithUnsignedLong: NS_FACE_FOREGROUND (face)];
@@ -4066,10 +4068,10 @@ Function modeled after x_draw_glyph_string_box ().
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
prepare_face_for_display (s->f, face);
- [[NSColor colorWithUnsignedLong: face->background] set];
+ [[[NSColor colorWithUnsignedLong: face->background] colorWithAlphaComponent: s->f->alpha_background] set];
}
else
- [[NSColor colorWithUnsignedLong: s->face->background] set];
+ [[[NSColor colorWithUnsignedLong: s->face->background] colorWithAlphaComponent: s->f->alpha_background] set];
NSRectFill (NSMakeRect (x, y, w, h));
}
}
@@ -4095,7 +4097,7 @@ Function modeled after x_draw_glyph_string_box ().
if (s->hl == DRAW_CURSOR)
[FRAME_CURSOR_COLOR (s->f) set];
else
- [[NSColor colorWithUnsignedLong: s->face->background] set];
+ [[[NSColor colorWithUnsignedLong: s->face->background] colorWithAlphaComponent: s->f->alpha_background] set];
NSRectFill (NSMakeRect (x, s->y, background_width, s->height));
}
@@ -8374,8 +8376,9 @@ - (void)toggleFullScreen: (id)sender
w = (EmacsWindow *)[self window];
onFirstScreen = [[w screen] isEqual:[[NSScreen screens] objectAtIndex:0]];
f = emacsframe;
- col = [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
- (FACE_FROM_ID (f, DEFAULT_FACE_ID))];
+ col = [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
+ (FACE_FROM_ID (f, DEFAULT_FACE_ID))]
+ colorWithAlphaComponent: f->alpha_background];
if (fs_state != FULLSCREEN_BOTH)
{
@@ -9171,8 +9174,9 @@ - (instancetype) initWithEmacsFrame: (struct frame *) f
f->border_width = [self borderWidth];
- col = [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
- (FACE_FROM_ID (f, DEFAULT_FACE_ID))];
+ col = [[NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND
+ (FACE_FROM_ID (f, DEFAULT_FACE_ID))]
+ colorWithAlphaComponent: f->alpha_background];
[self setBackgroundColor:col];
if ([col alphaComponent] != (EmacsCGFloat) 1.0)
[self setOpaque:NO];
--
2.39.3 (Apple Git-145)
Thanks,
--
Jon
[-- Attachment #1.2: Type: text/html, Size: 31403 bytes --]
next reply other threads:[~2024-01-23 0:54 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-23 0:54 Jon Rubens [this message]
2024-01-23 3:21 ` macOS (Cocoa) alpha-background Po Lu
2024-01-23 4:17 ` Jon Rubens
2024-01-24 23:25 ` Jon Rubens
2024-01-25 1:46 ` Po Lu
2024-04-14 19:35 ` Rudolf Adamkovič
2024-05-19 10:18 ` Stefan Kangas
2024-06-27 23:02 ` Jon Rubens
2024-06-27 23:19 ` Stefan Kangas
2024-06-28 0:38 ` Jon Rubens
2024-06-30 5:09 ` bug#71850: [PATCH] " Stefan Kangas
2024-06-30 5:29 ` Stefan Kangas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2msswrhr9.fsf@jon-mbp.lan \
--to=jonathan.rubens@gmail.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.