unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#56763: 29.0.50; [PATCH] Update font for X toolkit
@ 2022-07-25 18:04 Manuel Giraud
  2022-07-26  2:19 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 2+ messages in thread
From: Manuel Giraud @ 2022-07-25 18:04 UTC (permalink / raw)
  To: 56763

[-- Attachment #1: Type: text/plain, Size: 1098 bytes --]


Hi,

Here is a patch that sure needs some work (and test) but still I'm
sending it as it works for me™.  The purpose is to have Emacs to update
its menu face for X toolkits (i.e. not GTK) from elisp.  For instance,
one can then do the following:

--8<---------------cut here---------------start------------->8---
(custom-set-faces
 '(menu ((t (:foreground "blue" :background "red" :font "Iosevka")))))
--8<---------------cut here---------------end--------------->8---

or

--8<---------------cut here---------------start------------->8---
(custom-set-faces
 '(menu ((t (:foreground "#0a0a0a" :background "#d7d7d7" :family "Fira Sans 20")))))
--8<---------------cut here---------------end--------------->8---

and the face (along with colors) will be updated in menu. AFAIU it was
not working because, when Emacs support i18n, only the fontSet resource
was set and not the font.  This code does that.

For the font resource, I've used "SSDATA (LFACE_FAMILY (lface))" without
making a copy.  I'm not sure it is the right string nor if I should have
made a copy of it.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Update-font-for-X-toolkit.patch --]
[-- Type: text/x-patch, Size: 3050 bytes --]

From ce3393209781a0f21ddbe0d3a5ed0b5dbdc27af7 Mon Sep 17 00:00:00 2001
From: Manuel Giraud <manuel@ledu-giraud.fr>
Date: Mon, 25 Jul 2022 19:07:04 +0200
Subject: [PATCH] Update font for X toolkit

---
 src/xfaces.c | 59 ++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 13 deletions(-)

diff --git a/src/xfaces.c b/src/xfaces.c
index bbc1d352c6..0424a58413 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -3913,6 +3913,42 @@ DEFUN ("internal-set-lisp-face-attribute-from-resource",
 
 #if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT
 
+/* Update both fontSet and font resources for X toolkit menu.  */
+static void
+x_update_menu_font_resources (XrmDatabase *rdb, const char *myname,
+			      const char *popup_path,
+			      const char *fontset_path,
+			      char *fontsetname, char *fontname)
+{
+  char line[512];
+  char *buf = line;
+  ptrdiff_t bufsize = sizeof line;
+
+  /* fontSet */
+  if (fontset_path && fontsetname)
+    {
+      exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*%s: %s",
+		myname, fontset_path, fontsetname);
+      XrmPutLineResource (rdb, line);
+
+      exprintf (&buf, &bufsize, line, -1, "%s.%s*%s: %s",
+		myname, popup_path, fontset_path, fontsetname);
+      XrmPutLineResource (rdb, line);
+    }
+
+  /* font */
+  if (fontname)
+    {
+      exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*font: %s",
+		myname, fontname);
+      XrmPutLineResource (rdb, line);
+
+      exprintf (&buf, &bufsize, line, -1, "%s.%s*font: %s",
+		myname, popup_path, fontname);
+      XrmPutLineResource (rdb, line);
+    }
+}
+
 /* Make menus on frame F appear as specified by the `menu' face.  */
 
 static void
@@ -3977,14 +4013,13 @@ x_update_menu_appearance (struct frame *f)
 	{
 	  Lisp_Object xlfd = Ffont_xlfd_name (LFACE_FONT (lface), Qnil);
 #ifdef USE_MOTIF
-	  const char *suffix = "List";
+	  const char *fontset_path = "fontList";
 	  bool motif = true;
 #else
 #if defined HAVE_X_I18N
-
-	  const char *suffix = "Set";
+	  const char *fontset_path = "fontSet";
 #else
-	  const char *suffix = "";
+	  const char *fontset_path = NULL;
 #endif
 	  bool motif = false;
 #endif
@@ -3994,17 +4029,15 @@ x_update_menu_appearance (struct frame *f)
 #if defined HAVE_X_I18N
 	      char *fontsetname = xic_create_fontsetname (SSDATA (xlfd), motif);
 #else
-	      char *fontsetname = SSDATA (xlfd);
+	      char *fontsetname = NULL;
 #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);
+	      char *fontname = SSDATA (LFACE_FAMILY (lface));
+	      x_update_menu_font_resources (&rdb, myname, popup_path,
+					    fontset_path, fontsetname,
+					    fontname);
 	      changed_p = true;
-	      if (fontsetname != SSDATA (xlfd))
+
+	      if (fontsetname)
 		xfree (fontsetname);
 	    }
 	}
-- 
2.37.0


[-- Attachment #3: Type: text/plain, Size: 6430 bytes --]



In GNU Emacs 29.0.50 (build 1, x86_64-unknown-openbsd7.1, X toolkit, cairo version 1.17.6, Xaw scroll bars)
 of 2022-07-25 built on elite.giraud
Repository revision: bd98ca6cea60c98eb7272fc33bbd05f9f858e4eb
Repository branch: mgi/ui
Windowing system distributor 'The X.Org Foundation', version 11.0.12101003
System Description: OpenBSD elite.giraud 7.1 GENERIC.MP#620 amd64

Configured using:
 'configure --prefix=/home/manuel/emacs --bindir=/home/manuel/bin
 --with-x-toolkit=athena --without-sound --without-compress-install
 CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
LCMS2 LIBOTF LIBXML2 MODULES NOTIFY KQUEUE PDUMPER PNG RSVG SQLITE3
THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM LUCID
ZLIB

Important settings:
  value of $LC_ALL: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Dired by name

Minor modes in effect:
  gnus-dired-mode: t
  icomplete-mode: t
  display-time-mode: t
  display-battery-mode: t
  shell-dirtrack-mode: t
  global-so-long-mode: t
  repeat-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  buffer-read-only: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/manuel/.emacs.d/elpa/transient-20220717.1713/transient hides /home/manuel/emacs/share/emacs/29.0.50/lisp/transient

Features:
(shadow sort mail-extr pulse emacsbug smerge-mode diff vc-git diff-mode
whitespace gnus-dired executable vc-dispatcher vc-svn tramp-archive
tramp-gvfs paredit edmacro icomplete time battery exwm-randr xcb-randr
exwm-config exwm exwm-input xcb-keysyms xcb-xkb exwm-manage
exwm-floating xcb-cursor xcb-render exwm-layout exwm-workspace exwm-core
xcb-ewmh xcb-icccm xcb xcb-xproto xcb-types xcb-debug kmacro server
stimmung-themes modus-operandi-theme modus-themes osm bookmark mingus
libmpdee reporter edebug debug backtrace transmission diary-lib
diary-loaddefs color calc-bin calc-ext calc calc-loaddefs rect calc-macs
w3m-load mu4e mu4e-org mu4e-main mu4e-view mu4e-view-gnus
mu4e-view-common mu4e-headers mu4e-compose mu4e-context mu4e-draft
mu4e-actions ido rfc2368 smtpmail mu4e-mark mu4e-proc mu4e-utils
doc-view filenotify jka-compr image-mode exif mu4e-lists mu4e-message
flow-fill mule-util hl-line mu4e-vars mu4e-meta supercite regi
ebdb-message ebdb-gnus gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime
smime gnutls dig gnus-sum shr pixel-fill kinsoku url-file url-dired svg
dom gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail
mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range message
sendmail yank-media puny rfc822 mml mml-sec epa epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums gmm-utils mailheader gnus-win gnus nnheader gnus-util
mail-utils range mm-util mail-prsvr ebdb-mua ebdb-com crm ebdb-format
ebdb mailabbrev eieio-opt speedbar ezimage dframe eieio-base pcase
timezone org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro
org-footnote org-src ob-comint org-pcomplete org-list org-faces
org-entities org-version ob-emacs-lisp ob-core ob-eval org-table
oc-basic bibtex ol rx org-keys oc org-compat org-macs org-loaddefs
find-func cal-menu calendar cal-loaddefs visual-basic-mode cl web-mode
disp-table erlang-start smart-tabs-mode skeleton cc-mode cc-fonts
cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs
slime-asdf grep slime-tramp tramp tramp-loaddefs trampver
tramp-integration cus-edit cus-load wid-edit files-x tramp-compat shell
pcomplete parse-time iso8601 time-date ls-lisp format-spec slime-fancy
slime-indentation slime-cl-indent cl-indent slime-trace-dialog
slime-fontifying-fu slime-package-fu slime-references
slime-compiler-notes-tree slime-scratch slime-presentations advice
bridge slime-macrostep macrostep slime-mdot-fu slime-enclosing-context
slime-fuzzy slime-fancy-trace slime-fancy-inspector slime-c-p-c
slime-editing-commands slime-autodoc slime-repl elp slime-parse slime
derived cl-extra help-mode lisp-mnt gud apropos compile
text-property-search etags fileloop generator xref project arc-mode
archive-mode noutline outline pp comint ansi-color ring hyperspec
thingatpt slime-autoloads dired-aux dired-x dired dired-loaddefs so-long
notifications dbus xml repeat easy-mmode tex-site hyperbole-autoloads
magit-autoloads git-commit-autoloads magit-section-autoloads
dash-autoloads paredit-autoloads rust-mode-autoloads
stimmung-themes-autoloads transient-autoloads with-editor-autoloads info
compat-autoloads package browse-url url url-proxy url-privacy url-expand
url-methods url-history url-cookie generate-lisp-file url-domsuf
url-util mailcap url-handlers url-parse auth-source cl-seq eieio
eieio-core cl-macs password-cache json subr-x map byte-opt gv bytecomp
byte-compile cconv url-vars cl-loaddefs cl-lib rmc iso-transl tooltip
eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
faces cus-face macroexp files window text-properties overlay sha1 md5
base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind kqueue lcms2
dynamic-setting system-font-setting font-render-setting cairo x-toolkit
xinput2 x multi-tty make-network-process emacs)

Memory information:
((conses 16 641088 55155)
 (symbols 48 52939 4)
 (strings 32 157441 6518)
 (string-bytes 1 5319930)
 (vectors 16 82850)
 (vector-slots 8 1122514 34803)
 (floats 8 489 287)
 (intervals 56 689 44)
 (buffers 992 15))

-- 
Manuel Giraud

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

* bug#56763: 29.0.50; [PATCH] Update font for X toolkit
  2022-07-25 18:04 bug#56763: 29.0.50; [PATCH] Update font for X toolkit Manuel Giraud
@ 2022-07-26  2:19 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 2+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-26  2:19 UTC (permalink / raw)
  To: Manuel Giraud; +Cc: 56763

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

> Hi,
>
> Here is a patch that sure needs some work (and test) but still I'm
> sending it as it works for me™.  The purpose is to have Emacs to update
> its menu face for X toolkits (i.e. not GTK) from elisp.  For instance,
> one can then do the following:
>
> (custom-set-faces
>  '(menu ((t (:foreground "blue" :background "red" :font "Iosevka")))))
>
>
> or
>
> (custom-set-faces
>  '(menu ((t (:foreground "#0a0a0a" :background "#d7d7d7" :family "Fira Sans 20")))))
>
> and the face (along with colors) will be updated in menu. AFAIU it was
> not working because, when Emacs support i18n, only the fontSet resource
> was set and not the font.  This code does that.

*.pane.menubar.fontSet is documented to supersede .pane.menubar.font,
and AFAIR that's what it did until the Xft support was added, which
completely broke all the font selection logic.

So I will eventually get around to fixing this in xlwmenu.c, because the
bug is not in xfaces.c.

Thanks for reporting the bug.





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

end of thread, other threads:[~2022-07-26  2:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-25 18:04 bug#56763: 29.0.50; [PATCH] Update font for X toolkit Manuel Giraud
2022-07-26  2:19 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).