bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

James Nguyen-2
Wondering if we can support transparent titlebars in the OSX build of
Emacs?

It looks something like this.

https://cloud.githubusercontent.com/assets/3277054/24304360/623a5ae2-10b9-11e7-8442-f8705580374e.png




Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

Alan Third
On Sat, Aug 05, 2017 at 10:26:37AM -0700, James Nguyen wrote:
> Wondering if we can support transparent titlebars in the OSX build of
> Emacs?
>
> It looks something like this.
>
> https://cloud.githubusercontent.com/assets/3277054/24304360/623a5ae2-10b9-11e7-8442-f8705580374e.png

Hi, I’m not sure what I’m looking at in this screenshot. Is it just
that the titlebar will show the background or windows underneath?

The documentation for titlebarAppearsTransparent
(https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc)
says

    It only makes sense to set this property to YES when
    NSFullSizeContentViewWindowMask
    is also set.

which I believe merges the toolbar and titlebar. Is that what you’re
thinking of?
--
Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

James Nguyen-2
Alan Third <[hidden email]> writes:

Hi Alan,

Here's a comparison.

https://www.dropbox.com/s/i4xw5mq82f5g3wc/Screenshot%202017-08-05%2017.16.20.png?dl=0

The title bar (that holds the red/yellow/green buttons) is the same
color as the rest of the window. Normally it is silver.

> On Sat, Aug 05, 2017 at 10:26:37AM -0700, James Nguyen wrote:
>> Wondering if we can support transparent titlebars in the OSX build of
>> Emacs?
>>
>> It looks something like this.
>>
>> https://cloud.githubusercontent.com/assets/3277054/24304360/623a5ae2-10b9-11e7-8442-f8705580374e.png
>
> Hi, I’m not sure what I’m looking at in this screenshot. Is it just
> that the titlebar will show the background or windows underneath?
>
> The documentation for titlebarAppearsTransparent
> (https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc)
> says
>
>     It only makes sense to set this property to YES when
>     NSFullSizeContentViewWindowMask
>     is also set.
>
> which I believe merges the toolbar and titlebar. Is that what you’re
> thinking of?
> --
> Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

Alan Third
On Sat, Aug 05, 2017 at 05:19:46PM -0700, James Nguyen wrote:
> Here's a comparison.
>
> https://www.dropbox.com/s/i4xw5mq82f5g3wc/Screenshot%202017-08-05%2017.16.20.png?dl=0
>
> The title bar (that holds the red/yellow/green buttons) is the same
> color as the rest of the window. Normally it is silver.

Oh, I get you. That’s quite nifty.

Out of interest, what happens if you turn the toolbar on? Is it
reasonable, or does it need something else done with it?
--
Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

James Nguyen-2
Alan Third <[hidden email]> writes:

It looks reasonable to me, the toolbar is also transparent.

https://www.dropbox.com/s/tiy36twyut6uw73/Screenshot%202017-08-05%2017.31.42.png?dl=0

The frame color isn't adjustable since I'm setting up the colors at
Emac's compile time so using a dark theme results in dark font in the
title bar instead of a light one.

https://www.dropbox.com/s/kasebe8a8srffyu/Screenshot%202017-08-05%2017.35.31.png?dl=0
(Can ignore the white line, taking a screenshot causes it to go white momentarily,
but it's a black line normally.)

> On Sat, Aug 05, 2017 at 05:19:46PM -0700, James Nguyen wrote:
>> Here's a comparison.
>>
>> https://www.dropbox.com/s/i4xw5mq82f5g3wc/Screenshot%202017-08-05%2017.16.20.png?dl=0
>>
>> The title bar (that holds the red/yellow/green buttons) is the same
>> color as the rest of the window. Normally it is silver.
>
> Oh, I get you. That’s quite nifty.
>
> Out of interest, what happens if you turn the toolbar on? Is it
> reasonable, or does it need something else done with it?
> --
> Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

Alan Third
On Sat, Aug 05, 2017 at 05:39:03PM -0700, James Nguyen wrote:
> It looks reasonable to me, the toolbar is also transparent.
>
> https://www.dropbox.com/s/tiy36twyut6uw73/Screenshot%202017-08-05%2017.31.42.png?dl=0
>
> The frame color isn't adjustable since I'm setting up the colors at
> Emac's compile time so using a dark theme results in dark font in the
> title bar instead of a light one.

It seems to me there are at least two things we want here:

  1. Setting transparency of UI elements. Possibly with an option to
  use ‘unified’ toolbars and titlebars.

  2. Setting the NSAppearance theme.

After messing about with NSAppearance I’ve discovered this is the
solution to one of my bugbears: if you set it to dark then the
scrollbars are no longer white, which always looks stupid with a dark
Emacs theme.

I’m not sure how these settings should be implemented, though. I think
they’d be best as frame parameters, but none of the existing frame
parameters are system dependent like these, so I don’t know if doing
it that way would upset anyone.

Alternatively we just make them variables which affect any
subsequently created frames.
--
Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: 26.0.50; Feature Request - OSX - Transparent Titlebars

James Nguyen-2
Alan Third <[hidden email]> writes:

It'd be great if the current frame can be updated programatically.

I think many use a 'theme-changer' that changes themes from light to
dark or vice versa and would want ther rest of the UI to match after.

> On Sat, Aug 05, 2017 at 05:39:03PM -0700, James Nguyen wrote:
>> It looks reasonable to me, the toolbar is also transparent.
>>
>> https://www.dropbox.com/s/tiy36twyut6uw73/Screenshot%202017-08-05%2017.31.42.png?dl=0
>>
>> The frame color isn't adjustable since I'm setting up the colors at
>> Emac's compile time so using a dark theme results in dark font in the
>> title bar instead of a light one.
>
> It seems to me there are at least two things we want here:
>
>   1. Setting transparency of UI elements. Possibly with an option to
>   use ‘unified’ toolbars and titlebars.
>
>   2. Setting the NSAppearance theme.
>
> After messing about with NSAppearance I’ve discovered this is the
> solution to one of my bugbears: if you set it to dark then the
> scrollbars are no longer white, which always looks stupid with a dark
> Emacs theme.
>
> I’m not sure how these settings should be implemented, though. I think
> they’d be best as frame parameters, but none of the existing frame
> parameters are system dependent like these, so I don’t know if doing
> it that way would upset anyone.
>
> Alternatively we just make them variables which affect any
> subsequently created frames.
> --
> Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: [PATCH] Add ability to change macOS WM theme (bug#27973)

Alan Third
* src/frame.c (make_frame, frame_parms, syms_of_frame)
[NS_IMPL_COCOA]: Add ns-appearance and ns-transparent-titlebar
options.
* src/frame.h (ns_appearance_type) [NS_IMPL_COCOA]: Add enum to
represent NSAppearance options.
(struct frame) [NS_IMPL_COCOA]: Add ns_appearance and
ns_transparent_titlebar frame parameters.
* src/nsfns.m (ns_frame_parm_handlers) [NS_IMPL_COCOA]: Add
ns_set_appearance and ns_set_transparent_titlebar handlers.
(Sx_create_frame): Handle ns-appearance and ns-transparent-titlebar
frame parameters.
(Qdark): Add new symbol for use with ns-appearance.
* src/nsterm.h (ns_set_appearance, ns_set_transparent_titlebar)
[NS_IMPL_COCOA]: Add prototypes.
* src/nsterm.m (ns_set_appearance, ns_set_transparent_titlebar)
[NS_IMPL_COCOA]: New functions.
(initFrameFromEmacs) [NS_IMPL_COCOA]: Handle ns-appearance and
ns-transparent-titlebar frame parameters.
---
 src/frame.c  | 12 +++++++++++
 src/frame.h  | 18 ++++++++++++++++
 src/nsfns.m  | 15 ++++++++++++++
 src/nsterm.h |  7 +++++++
 src/nsterm.m | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 120 insertions(+)

diff --git a/src/frame.c b/src/frame.c
index 1e5e4bbdb4..5099f75be4 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -834,6 +834,10 @@ make_frame (bool mini_p)
 #if ! defined (USE_GTK) && ! defined (HAVE_NS)
   f->last_tool_bar_item = -1;
 #endif
+#ifdef NS_IMPL_COCOA
+  f->ns_appearance = ns_appearance_aqua;
+  f->ns_transparent_titlebar = false;
+#endif
 #endif
 
   root_window = make_window ();
@@ -3520,6 +3524,10 @@ static const struct frame_parm_table frame_parms[] =
   {"z-group", SYMBOL_INDEX (Qz_group)},
   {"override-redirect", SYMBOL_INDEX (Qoverride_redirect)},
   {"no-special-glyphs", SYMBOL_INDEX (Qno_special_glyphs)},
+#ifdef NS_IMPL_COCOA
+  {"ns-appearance", SYMBOL_INDEX (Qns_appearance)},
+  {"ns-transparent-titlebar", SYMBOL_INDEX (Qns_transparent_titlebar)},
+#endif
 };
 
 #ifdef HAVE_WINDOW_SYSTEM
@@ -5646,6 +5654,10 @@ syms_of_frame (void)
 #ifdef HAVE_NS
   DEFSYM (Qns_parse_geometry, "ns-parse-geometry");
 #endif
+#ifdef NS_IMPL_COCOA
+  DEFSYM (Qns_appearance, "ns-appearance");
+  DEFSYM (Qns_transparent_titlebar, "ns-transparent-titlebar");
+#endif
 
   DEFSYM (Qalpha, "alpha");
   DEFSYM (Qauto_lower, "auto-lower");
diff --git a/src/frame.h b/src/frame.h
index 154dc9a3bb..4b7e448b54 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -65,6 +65,14 @@ enum internal_border_part
    INTERNAL_BORDER_BOTTOM_EDGE,
    INTERNAL_BORDER_BOTTOM_LEFT_CORNER,
   };
+
+#ifdef NS_IMPL_COCOA
+enum ns_appearance_type
+  {
+   ns_appearance_aqua,
+   ns_appearance_vibrant_dark
+  };
+#endif
 #endif /* HAVE_WINDOW_SYSTEM */
 
 /* The structure representing a frame.  */
@@ -563,6 +571,12 @@ struct frame
   /* All display backends seem to need these two pixel values.  */
   unsigned long background_pixel;
   unsigned long foreground_pixel;
+
+#ifdef NS_IMPL_COCOA
+  /* NSAppearance theme used on this frame.  */
+  enum ns_appearance_type ns_appearance;
+  bool_bf ns_transparent_titlebar;
+#endif
 };
 
 /* Most code should use these functions to set Lisp fields in struct frame.  */
@@ -953,6 +967,10 @@ default_pixels_per_inch_y (void)
 #define FRAME_Z_GROUP_ABOVE_SUSPENDED(f) \
   ((f)->z_group == z_group_above_suspended)
 #define FRAME_Z_GROUP_BELOW(f) ((f)->z_group == z_group_below)
+#ifdef NS_IMPL_COCOA
+#define FRAME_NS_APPEARANCE(f) ((f)->ns_appearance)
+#define FRAME_NS_TRANSPARENT_TITLEBAR(f) ((f)->ns_transparent_titlebar)
+#endif
 #else /* not HAVE_WINDOW_SYSTEM */
 #define FRAME_UNDECORATED(f) ((void) (f), 0)
 #define FRAME_OVERRIDE_REDIRECT(f) ((void) (f), 0)
diff --git a/src/nsfns.m b/src/nsfns.m
index 36748cebb8..8d48737054 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -985,6 +985,10 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
   x_set_z_group, /* x_set_z_group */
   0, /* x_set_override_redirect */
   x_set_no_special_glyphs,
+#ifdef NS_IMPL_COCOA
+  ns_set_appearance,
+  ns_set_transparent_titlebar,
+#endif
 };
 
 
@@ -1277,6 +1281,16 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
   FRAME_UNDECORATED (f) = !NILP (tem) && !EQ (tem, Qunbound);
   store_frame_param (f, Qundecorated, FRAME_UNDECORATED (f) ? Qt : Qnil);
 
+  tem = x_get_arg (dpyinfo, parms, Qns_appearance, NULL, NULL, RES_TYPE_SYMBOL);
+  FRAME_NS_APPEARANCE (f) = EQ (tem, Qdark)
+    ? ns_appearance_vibrant_dark : ns_appearance_aqua;
+  store_frame_param (f, Qns_appearance, tem);
+
+  tem = x_get_arg (dpyinfo, parms, Qns_transparent_titlebar,
+                   NULL, NULL, RES_TYPE_BOOLEAN);
+  FRAME_NS_TRANSPARENT_TITLEBAR (f) = !NILP (tem) && !EQ (tem, Qunbound);
+  store_frame_param (f, Qns_transparent_titlebar, tem);
+
   parent_frame = x_get_arg (dpyinfo, parms, Qparent_frame, NULL, NULL,
     RES_TYPE_SYMBOL);
   /* Accept parent-frame iff parent-id was not specified.  */
@@ -3239,6 +3253,7 @@ - (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
   DEFSYM (Qfontsize, "fontsize");
   DEFSYM (Qframe_title_format, "frame-title-format");
   DEFSYM (Qicon_title_format, "icon-title-format");
+  DEFSYM (Qdark, "dark");
 
   DEFVAR_LISP ("ns-icon-type-alist", Vns_icon_type_alist,
                doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
diff --git a/src/nsterm.h b/src/nsterm.h
index 67c0d42ac1..2adf28b8b0 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1234,6 +1234,13 @@ extern void x_set_no_accept_focus (struct frame *f, Lisp_Object new_value,
                                    Lisp_Object old_value);
 extern void x_set_z_group (struct frame *f, Lisp_Object new_value,
                            Lisp_Object old_value);
+#ifdef NS_IMPL_COCOA
+extern void ns_set_appearance (struct frame *f, Lisp_Object new_value,
+                               Lisp_Object old_value);
+extern void ns_set_transparent_titlebar (struct frame *f,
+                                         Lisp_Object new_value,
+                                         Lisp_Object old_value);
+#endif
 extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
       fd_set *exceptfds, struct timespec *timeout,
       sigset_t *sigmask);
diff --git a/src/nsterm.m b/src/nsterm.m
index 36d906a7ce..cc41e3a0dc 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -2025,6 +2025,58 @@ so some key presses (TAB) are swallowed by the system. */
     error ("Invalid z-group specification");
 }
 
+#ifdef NS_IMPL_COCOA
+void
+ns_set_appearance (struct frame *f, Lisp_Object new_value, Lisp_Object old_value)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090
+  EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f);
+  NSWindow *window = [view window];
+
+  NSTRACE ("ns_set_appearance");
+
+#ifndef NSAppKitVersionNumber10_9
+#define NSAppKitVersionNumber10_9 1265
+#endif
+
+  if (NSAppKitVersionNumber < NSAppKitVersionNumber10_9)
+    return;
+
+  if (EQ (new_value, Qdark))
+    {
+      window.appearance = [NSAppearance
+                            appearanceNamed: NSAppearanceNameVibrantDark];
+      FRAME_NS_APPEARANCE (f) = ns_appearance_vibrant_dark;
+    }
+  else
+    {
+      window.appearance = [NSAppearance
+                            appearanceNamed: NSAppearanceNameAqua];
+      FRAME_NS_APPEARANCE (f) = ns_appearance_aqua;
+    }
+#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 */
+}
+
+void
+ns_set_transparent_titlebar (struct frame *f, Lisp_Object new_value,
+                             Lisp_Object old_value)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101000
+  EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f);
+  NSWindow *window = [view window];
+
+  NSTRACE ("ns_set_transparent_titlebar");
+
+  if ([window respondsToSelector: @selector(titlebarAppearsTransparent)]
+      && !EQ (new_value, old_value))
+    {
+      window.titlebarAppearsTransparent = !NILP (new_value);
+      FRAME_NS_TRANSPARENT_TITLEBAR (f) = !NILP (new_value);
+    }
+#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 101000 */
+}
+#endif /* NS_IMPL_COCOA */
+
 static void
 ns_fullscreen_hook (struct frame *f)
 {
@@ -7051,6 +7103,22 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f
   if (! FRAME_UNDECORATED (f))
     [self createToolbar: f];
 
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090
+#ifndef NSAppKitVersionNumber10_9
+#define NSAppKitVersionNumber10_9 1265
+#endif
+
+  if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_9
+      && FRAME_NS_APPEARANCE (f) != ns_appearance_aqua)
+    win.appearance = [NSAppearance
+                          appearanceNamed: NSAppearanceNameVibrantDark];
+#endif
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101000
+  if ([win respondsToSelector: @selector(titlebarAppearsTransparent)])
+    win.titlebarAppearsTransparent = FRAME_NS_TRANSPARENT_TITLEBAR (f);
+#endif
+
   tem = f->icon_name;
   if (!NILP (tem))
     [win setMiniwindowTitle:
--
2.12.0


--
Alan Third



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: [PATCH] Add ability to change macOS WM theme (bug#27973)

Eli Zaretskii
> Date: Sun, 13 Aug 2017 14:11:10 +0100
> From: Alan Third <[hidden email]>
> Cc: [hidden email]
>
> * src/frame.c (make_frame, frame_parms, syms_of_frame)
> [NS_IMPL_COCOA]: Add ns-appearance and ns-transparent-titlebar
> options.

This should be mentioned in the documentation somewhere, I think.
Including how to use it to solve whatever problems we have with themes
on NS.

> * src/frame.h (ns_appearance_type) [NS_IMPL_COCOA]: Add enum to
> represent NSAppearance options.
> (struct frame) [NS_IMPL_COCOA]: Add ns_appearance and
> ns_transparent_titlebar frame parameters.
> * src/nsfns.m (ns_frame_parm_handlers) [NS_IMPL_COCOA]: Add
> ns_set_appearance and ns_set_transparent_titlebar handlers.
> (Sx_create_frame): Handle ns-appearance and ns-transparent-titlebar
> frame parameters.

Is the transparency thing, or its equivalent, supported on GNU/Linux?

Thanks.



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

bug#27973: [PATCH] Add ability to change macOS WM theme (bug#27973)

Alan Third
On Sun, Aug 13, 2017 at 05:38:37PM +0300, Eli Zaretskii wrote:

> > Date: Sun, 13 Aug 2017 14:11:10 +0100
> > From: Alan Third <[hidden email]>
> > Cc: [hidden email]
> >
> > * src/frame.c (make_frame, frame_parms, syms_of_frame)
> > [NS_IMPL_COCOA]: Add ns-appearance and ns-transparent-titlebar
> > options.
>
> This should be mentioned in the documentation somewhere, I think.
> Including how to use it to solve whatever problems we have with themes
> on NS.

Ah yes, I knew there was something else I needed to do. :)

> Is the transparency thing, or its equivalent, supported on GNU/Linux?

I’m not sure, because it’s roughly equivalent to changing a window
manager and/or GTK theme. On macOS the theme of the window decorations is
set by a combination of system‐wide settings and application specific
settings.
--
Alan Third



Loading...