Commit cd06d173 authored by Eli Zaretskii's avatar Eli Zaretskii

Fix bug with face-id after restoring from pdump

* src/xfaces.c (init_xfaces): New function.
* src/emacs.c (main) [HAVE_PDUMPER]: If dumped with pdumper,
call init_xfaces.  (Bug#34226)
* src/lisp.h (init_xfaces) [HAVE_PDUMPER]: Add prototype.

* test/lisp/faces-tests.el (faces--test-face-id): New test for
bug#34226.
parent fa7a8411
Pipeline #635 failed with stage
in 7 minutes and 23 seconds
......@@ -1484,6 +1484,11 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
running_asynch_code = 0;
init_random ();
#ifdef HAVE_PDUMPER
if (dumped_with_pdumper_p ())
init_xfaces ();
#endif
#if defined HAVE_JSON && !defined WINDOWSNT
init_json ();
#endif
......
......@@ -4606,6 +4606,9 @@ extern void syms_of_w32cygwinx (void);
extern Lisp_Object Vface_alternative_font_family_alist;
extern Lisp_Object Vface_alternative_font_registry_alist;
extern void syms_of_xfaces (void);
#ifdef HAVE_PDUMPER
extern void init_xfaces (void);
#endif
#ifdef HAVE_X_WINDOWS
/* Defined in xfns.c. */
......
......@@ -6507,6 +6507,46 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
Initialization
***********************************************************************/
#ifdef HAVE_PDUMPER
/* All the faces defined during loadup are recorded in
face-new-frame-defaults, with the last face first in the list. We
need to set next_lface_id to the next face ID number, so that any
new faces defined in this session will have face IDs different from
those defined during loadup. We also need to set up the
lface_id_to_name[] array for the faces that were defined during
loadup. */
void
init_xfaces (void)
{
if (CONSP (Vface_new_frame_defaults))
{
Lisp_Object lface = XCAR (Vface_new_frame_defaults);
if (CONSP (lface))
{
/* The first face in the list is the last face defined
during loadup. Compute how many faces are there, and
allocate the lface_id_to_name[] array. */
Lisp_Object lface_id = Fget (XCAR (lface), Qface);
lface_id_to_name_size = next_lface_id = XFIXNAT (lface_id) + 1;
lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
/* Store the last face. */
lface_id_to_name[next_lface_id - 1] = lface;
/* Store the rest of the faces. */
Lisp_Object tail;
for (tail = XCDR (Vface_new_frame_defaults); CONSP (tail);
tail = XCDR (tail))
{
lface = XCAR (tail);
int face_id = XFIXNAT (Fget (XCAR (lface), Qface));
eassert (face_id < lface_id_to_name_size);
lface_id_to_name[face_id] = lface;
}
}
}
}
#endif
void
syms_of_xfaces (void)
{
......
......@@ -60,5 +60,14 @@
(should (equal (background-color-at-point) "black"))
(should (equal (foreground-color-at-point) "black"))))
(ert-deftest faces--test-face-id ()
;; Face ID of 0 is the 'default' face; no face should have the same ID.
(should (> (face-id 'faces--test1) 0))
;; 'tooltip' is the last face defined by preloaded packages, so any
;; face we define in Emacs should have a face ID greater than that,
;; since the ID of a face is just its index in the array that maps
;; face IDs to faces.
(should (> (face-id 'faces--test1) (face-id 'tooltip))))
(provide 'faces-tests)
;;; faces-tests.el ends here
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment