-
-
Notifications
You must be signed in to change notification settings - Fork 174
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add alpha-background support to emacs 29 and 30
feat: add alpha-background support to emacs 29 and 30
- Loading branch information
Showing
4 changed files
with
263 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,260 @@ | ||
diff --git a/src/macfont.m b/src/macfont.m | ||
index 8aba440d196..56c1eb57024 100644 | ||
--- a/src/macfont.m | ||
+++ b/src/macfont.m | ||
@@ -2953,9 +2953,14 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no | ||
CG_SET_FILL_COLOR_WITH_FACE_FOREGROUND (context, face); | ||
else | ||
CG_SET_FILL_COLOR_WITH_FRAME_CURSOR (context, f); | ||
- } | ||
+ CGContextSetAlpha(context, 1); | ||
+ } | ||
else | ||
- CG_SET_FILL_COLOR_WITH_FACE_BACKGROUND (context, face); | ||
+ { | ||
+ CGContextSetAlpha(context, f->alpha_background); | ||
+ CG_SET_FILL_COLOR_WITH_FACE_BACKGROUND (context, face); | ||
+ } | ||
+ CGContextClearRect(context, background_rect); | ||
CGContextFillRects (context, &background_rect, 1); | ||
} | ||
|
||
@@ -2964,6 +2969,7 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no | ||
CGAffineTransform atfm; | ||
|
||
CGContextScaleCTM (context, 1, -1); | ||
+ CGContextSetAlpha(context, 1); | ||
if (s->hl == DRAW_CURSOR) | ||
{ | ||
if (face && (NS_FACE_BACKGROUND (face) | ||
diff --git a/src/nsfns.m b/src/nsfns.m | ||
index b0281aac257..3e19cce89de 100644 | ||
--- a/src/nsfns.m | ||
+++ b/src/nsfns.m | ||
@@ -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)) | ||
@@ -316,11 +316,10 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. | ||
f->output_data.ns->background_color = col; | ||
|
||
FRAME_BACKGROUND_PIXEL (f) = [col unsignedLong]; | ||
- alpha = [col alphaComponent]; | ||
|
||
if (view != nil) | ||
{ | ||
- [[view window] setBackgroundColor: col]; | ||
+ [[view window] setBackgroundColor: [col colorWithAlphaComponent: alpha]]; | ||
|
||
if (alpha != (EmacsCGFloat) 1.0) | ||
[[view window] setOpaque: NO]; | ||
@@ -330,10 +329,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. | ||
face = FRAME_DEFAULT_FACE (f); | ||
if (face) | ||
{ | ||
- col = [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]; | ||
- face->background = [[col colorWithAlphaComponent: alpha] | ||
- unsignedLong]; | ||
- | ||
+ face->background = [col unsignedLong]; | ||
update_face_from_frame_parameter (f, Qbackground_color, arg); | ||
} | ||
|
||
@@ -346,6 +342,36 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. | ||
unblock_input (); | ||
} | ||
|
||
+static void | ||
+ns_set_alpha_background (struct frame *f, Lisp_Object arg, Lisp_Object oldval) | ||
+{ | ||
+ NSView *view = FRAME_NS_VIEW (f); | ||
+ double alpha = 1.0; | ||
+ | ||
+ if (NILP (arg)) | ||
+ alpha = 1.0; | ||
+ else if (FLOATP (arg)) | ||
+ { | ||
+ alpha = XFLOAT_DATA (arg); | ||
+ if (! (0 <= alpha && alpha <= 1.0)) | ||
+ args_out_of_range (make_float (0.0), make_float (1.0)); | ||
+ } | ||
+ else if (FIXNUMP (arg)) | ||
+ { | ||
+ EMACS_INT ialpha = XFIXNUM (arg); | ||
+ if (! (0 <= ialpha && ialpha <= 100)) | ||
+ args_out_of_range (make_fixnum (0), make_fixnum (100)); | ||
+ alpha = ialpha / 100.0; | ||
+ } | ||
+ else | ||
+ wrong_type_argument (Qnumberp, arg); | ||
+ | ||
+ f->alpha_background = alpha; | ||
+ [[view window] setBackgroundColor: [f->output_data.ns->background_color | ||
+ colorWithAlphaComponent: alpha]]; | ||
+ recompute_basic_faces (f); | ||
+ SET_FRAME_GARBAGED (f); | ||
+} | ||
|
||
static void | ||
ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) | ||
@@ -1065,7 +1091,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. | ||
ns_set_z_group, | ||
0, /* x_set_override_redirect */ | ||
gui_set_no_special_glyphs, | ||
- gui_set_alpha_background, | ||
+ ns_set_alpha_background, | ||
NULL, | ||
#ifdef NS_IMPL_COCOA | ||
ns_set_appearance, | ||
diff --git a/src/nsterm.m b/src/nsterm.m | ||
index 518b38658d1..bda3a12172f 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); | ||
} | ||
|
||
@@ -2998,7 +2998,7 @@ Hide the window (X11 semantics) | ||
else | ||
bm_color = f->output_data.ns->cursor_color; | ||
|
||
- [bm_color set]; | ||
+ [[bm_color colorWithAlphaComponent:f->alpha_background] set]; | ||
[bmp fill]; | ||
|
||
[bmp release]; | ||
@@ -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)); | ||
} | ||
@@ -8436,8 +8438,8 @@ - (void)toggleFullScreen: (id)sender | ||
} | ||
|
||
[w setContentView:[fw contentView]]; | ||
- [w setBackgroundColor: col]; | ||
- if ([col alphaComponent] != (EmacsCGFloat) 1.0) | ||
+ [w setBackgroundColor: [col colorWithAlphaComponent: f->alpha_background]]; | ||
+ if (f->alpha_background != (EmacsCGFloat) 1.0) | ||
[w setOpaque: NO]; | ||
|
||
f->border_width = [w borderWidth]; | ||
@@ -9172,9 +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))]; | ||
- [self setBackgroundColor:col]; | ||
- if ([col alphaComponent] != (EmacsCGFloat) 1.0) | ||
+ (FACE_FROM_ID (f, DEFAULT_FACE_ID))]; | ||
+ [self setBackgroundColor:[col colorWithAlphaComponent:f->alpha_background]]; | ||
+ if (f->alpha_background != (EmacsCGFloat) 1.0) | ||
[self setOpaque:NO]; | ||
|
||
/* toolbar support */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../emacs-29/alpha-background.patch |