unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Lucid menu faces
@ 2022-07-20 14:54 Manuel Giraud
  2022-07-20 16:05 ` Eli Zaretskii
  0 siblings, 1 reply; 8+ messages in thread
From: Manuel Giraud @ 2022-07-20 14:54 UTC (permalink / raw)
  To: help-gnu-emacs

Hi,

The bug found by Colin earlier led me to the following question: how
hard would it be to have the Lucid menu rebuilt from elisp code?

As it is, if I do this:
--8<---------------cut here---------------start------------->8---
(let ((class '((class color) (min-colors 89))))
  (custom-theme-set-faces
   'user
   `(menu ((,class (:family "Iosevka" :foregroud "red" :background "blue"))))))
--8<---------------cut here---------------end--------------->8---

only the background color of the menu is changed.  Not the family font
nor the foreground color.

Best regards,
-- 
Manuel Giraud



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-20 14:54 Lucid menu faces Manuel Giraud
@ 2022-07-20 16:05 ` Eli Zaretskii
  2022-07-21  1:21   ` Po Lu
  2022-07-21 13:23   ` Manuel Giraud
  0 siblings, 2 replies; 8+ messages in thread
From: Eli Zaretskii @ 2022-07-20 16:05 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Manuel Giraud <manuel@ledu-giraud.fr>
> Date: Wed, 20 Jul 2022 16:54:52 +0200
> 
> Hi,
> 
> The bug found by Colin earlier led me to the following question: how
> hard would it be to have the Lucid menu rebuilt from elisp code?
> 
> As it is, if I do this:
> --8<---------------cut here---------------start------------->8---
> (let ((class '((class color) (min-colors 89))))
>   (custom-theme-set-faces
>    'user
>    `(menu ((,class (:family "Iosevka" :foregroud "red" :background "blue"))))))
> --8<---------------cut here---------------end--------------->8---
> 
> only the background color of the menu is changed.  Not the family font
> nor the foreground color.

Isn't it true that the appearance of toolkit menus can be fully
controlled only through X resources?  Toolkits are not part of Emacs,
so they don't abide by our Lisp trickery.  We are all spoiled rotten
by Emacs letting us control everything via Lisp objects and
properties, but the truth is that it only works because Emacs has code
to make it work.  Toolkits don't: they have no idea what is a 'face'
in its Emacs interpretation.



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-20 16:05 ` Eli Zaretskii
@ 2022-07-21  1:21   ` Po Lu
  2022-07-21 13:23   ` Manuel Giraud
  1 sibling, 0 replies; 8+ messages in thread
From: Po Lu @ 2022-07-21  1:21 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

Eli Zaretskii <eliz@gnu.org> writes:

> Isn't it true that the appearance of toolkit menus can be fully
> controlled only through X resources?  Toolkits are not part of Emacs,
> so they don't abide by our Lisp trickery.  We are all spoiled rotten
> by Emacs letting us control everything via Lisp objects and
> properties, but the truth is that it only works because Emacs has code
> to make it work.  Toolkits don't: they have no idea what is a 'face'
> in its Emacs interpretation.

Yes.  There is a hack in xfaces.c wrt the `menu' face:

static void
x_update_menu_appearance (struct frame *f)
{
  struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
  XrmDatabase rdb;

  if (dpyinfo
      && (rdb = XrmGetDatabase (FRAME_X_DISPLAY (f)),
	  rdb != NULL))
    {
      char line[512];
      char *buf = line;
      ptrdiff_t bufsize = sizeof line;
      Lisp_Object lface = lface_from_face_name (f, Qmenu, true);
      struct face *face = FACE_FROM_ID (f, MENU_FACE_ID);
      const char *myname = SSDATA (Vx_resource_name);
      bool changed_p = false;
#ifdef USE_MOTIF
      const char *popup_path = "popup_menu";
#else
      const char *popup_path = "menu.popup";
#endif

      if (STRINGP (LFACE_FOREGROUND (lface)))
	{
	  exprintf (&buf, &bufsize, line, -1, "%s.%s*foreground: %s",
		    myname, popup_path,
		    SDATA (LFACE_FOREGROUND (lface)));
	  XrmPutLineResource (&rdb, line);
	  exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*foreground: %s",
		    myname, SDATA (LFACE_FOREGROUND (lface)));
	  XrmPutLineResource (&rdb, line);
	  changed_p = true;
	}

      if (STRINGP (LFACE_BACKGROUND (lface)))
	{
	  exprintf (&buf, &bufsize, line, -1, "%s.%s*background: %s",
		    myname, popup_path,
		    SDATA (LFACE_BACKGROUND (lface)));
	  XrmPutLineResource (&rdb, line);

	  exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*background: %s",
		    myname, SDATA (LFACE_BACKGROUND (lface)));
	  XrmPutLineResource (&rdb, line);
	  changed_p = true;
	}

      if (face->font
	  /* On Solaris 5.8, it's been reported that the `menu' face
	     can be unspecified here, during startup.  Why this
	     happens remains unknown.  -- cyd  */
	  && FONTP (LFACE_FONT (lface))
	  && (!UNSPECIFIEDP (LFACE_FAMILY (lface))
	      || !UNSPECIFIEDP (LFACE_FOUNDRY (lface))
	      || !UNSPECIFIEDP (LFACE_SWIDTH (lface))
	      || !UNSPECIFIEDP (LFACE_WEIGHT (lface))
	      || !UNSPECIFIEDP (LFACE_SLANT (lface))
	      || !UNSPECIFIEDP (LFACE_HEIGHT (lface))))
	{
	  Lisp_Object xlfd = Ffont_xlfd_name (LFACE_FONT (lface), Qnil);
#ifdef USE_MOTIF
	  const char *suffix = "List";
	  bool motif = true;
#else
#if defined HAVE_X_I18N

	  const char *suffix = "Set";
#else
	  const char *suffix = "";
#endif
	  bool motif = false;
#endif

	  if (! NILP (xlfd))
	    {
#if defined HAVE_X_I18N
	      char *fontsetname = xic_create_fontsetname (SSDATA (xlfd), motif);
#else
	      char *fontsetname = SSDATA (xlfd);
#endif
	      exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*font%s: %s",
			myname, suffix, fontsetname);
	      XrmPutLineResource (&rdb, line);

	      exprintf (&buf, &bufsize, line, -1, "%s.%s*font%s: %s",
			myname, popup_path, suffix, fontsetname);
	      XrmPutLineResource (&rdb, line);
	      changed_p = true;
	      if (fontsetname != SSDATA (xlfd))
		xfree (fontsetname);
	    }
	}

      if (changed_p && f->output_data.x->menubar_widget)
	free_frame_menubar (f);

      if (buf != line)
	xfree (buf);
    }
}



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-20 16:05 ` Eli Zaretskii
  2022-07-21  1:21   ` Po Lu
@ 2022-07-21 13:23   ` Manuel Giraud
  2022-07-21 13:27     ` Po Lu
  1 sibling, 1 reply; 8+ messages in thread
From: Manuel Giraud @ 2022-07-21 13:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

Eli Zaretskii <eliz@gnu.org> writes:

[...]

> Isn't it true that the appearance of toolkit menus can be fully
> controlled only through X resources?

Yes of course and so far this is what I'm doing.

> Toolkits are not part of Emacs, so they don't abide by our Lisp
> trickery.  We are all spoiled rotten by Emacs letting us control
> everything via Lisp objects and properties, but the truth is that it
> only works because Emacs has code to make it work.

Ok.  I was just wondering as it partially work for the background of the
menu face.

As for my personal use case, I'd like to have that because I'm a exwm
user on a laptop (i.e. I do go from laptop screen to external ones back
and forth and so use differents resolutions).  So being able to modify
the menu aspect *without* restarting Emacs would be an improvement… but
it is not of life-and-death importance either.
-- 
Manuel Giraud



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-21 13:23   ` Manuel Giraud
@ 2022-07-21 13:27     ` Po Lu
  2022-07-21 16:15       ` Manuel Giraud
  0 siblings, 1 reply; 8+ messages in thread
From: Po Lu @ 2022-07-21 13:27 UTC (permalink / raw)
  To: Manuel Giraud; +Cc: Eli Zaretskii, help-gnu-emacs

Manuel Giraud <manuel@ledu-giraud.fr> writes:

> As for my personal use case, I'd like to have that because I'm a exwm
> user on a laptop (i.e. I do go from laptop screen to external ones back
> and forth and so use differents resolutions).  So being able to modify
> the menu aspect *without* restarting Emacs would be an improvement… but
> it is not of life-and-death importance either.

Why not use the no-toolkit build?  There, the menu bar (but not the menu
itself) is drawn by redisplay itself.



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-21 13:27     ` Po Lu
@ 2022-07-21 16:15       ` Manuel Giraud
  2022-07-22  1:04         ` Po Lu
  0 siblings, 1 reply; 8+ messages in thread
From: Manuel Giraud @ 2022-07-21 16:15 UTC (permalink / raw)
  To: Po Lu; +Cc: Eli Zaretskii, help-gnu-emacs

Po Lu <luangruo@yahoo.com> writes:

[...]

> Why not use the no-toolkit build?  There, the menu bar (but not the menu
> itself) is drawn by redisplay itself.

Yes why not but last time I check it was a bit ugly… but maybe
no-toolkit needs some tweaks (or love).
-- 
Manuel Giraud



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-21 16:15       ` Manuel Giraud
@ 2022-07-22  1:04         ` Po Lu
  2022-07-22  6:38           ` Manuel Giraud
  0 siblings, 1 reply; 8+ messages in thread
From: Po Lu @ 2022-07-22  1:04 UTC (permalink / raw)
  To: Manuel Giraud; +Cc: Eli Zaretskii, help-gnu-emacs

Manuel Giraud <manuel@ledu-giraud.fr> writes:

> Yes why not but last time I check it was a bit ugly… but maybe
> no-toolkit needs some tweaks (or love).

The point is it can be made prettier by changing the `menu' face.
(Or at least until you actually open the menus.)



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lucid menu faces
  2022-07-22  1:04         ` Po Lu
@ 2022-07-22  6:38           ` Manuel Giraud
  0 siblings, 0 replies; 8+ messages in thread
From: Manuel Giraud @ 2022-07-22  6:38 UTC (permalink / raw)
  To: Po Lu; +Cc: Eli Zaretskii, help-gnu-emacs

Po Lu <luangruo@yahoo.com> writes:

> Manuel Giraud <manuel@ledu-giraud.fr> writes:
>
>> Yes why not but last time I check it was a bit ugly… but maybe
>> no-toolkit needs some tweaks (or love).
>
> The point is it can be made prettier by changing the `menu' face.
> (Or at least until you actually open the menus.)

Yes I understood but there are some bugs/annoyances.  Just one example,
if I do:
--8<---------------cut here---------------start------------->8---
(custom-set-faces
 '(menu ((t (:family "Iosevka" :height 1.2))))
--8<---------------cut here---------------end--------------->8---

The height of the menu bar won't be correctly recalculated so menu-bar
entries will be truncated vertically.

I don't think that anybody really use the no-toolkit build nowadays.
And that why I said it might need some love to be usable again.
-- 
Manuel Giraud



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-07-22  6:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-20 14:54 Lucid menu faces Manuel Giraud
2022-07-20 16:05 ` Eli Zaretskii
2022-07-21  1:21   ` Po Lu
2022-07-21 13:23   ` Manuel Giraud
2022-07-21 13:27     ` Po Lu
2022-07-21 16:15       ` Manuel Giraud
2022-07-22  1:04         ` Po Lu
2022-07-22  6:38           ` Manuel Giraud

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).