* lisp/vc/vc-hooks.el (vc-file-setprop): Use cl-pushnew.
(vc--repo-setprop, vc--repo-getprop, vc--repo-clearprops): New
functions.
* lisp/vc/vc.el (vc--incoming-revision): Cache incoming
revisions.
* src/fns.c (Fput): State that VALUE is returned.
* lisp/treesit.el (treesit-auto-install-grammar): Use the first
writable directory from 'treesit-extra-load-path' for values
'always', 'ask', 'ask-dir' (bug#79862).
* src/treesit.c (syms_of_treesit): Extend docstring.
* lisp/treesit.el (treesit-auto-install-grammar): Add the value 'ask-dir'.
(treesit-ensure-installed): When 'treesit-auto-install-grammar' is
'ask' or 'ask-dir', ask for the directory to install the grammar library
using the first writable directory of 'treesit-extra-load-path' as default.
Also add the provided directory to 'treesit-extra-load-path' afterwards.
* src/treesit.c (treesit-extra-load-path): In the docstring
mention the fact that the first directory is special (bug#79862).
Problem reported by John Paul Adrian Glaubitz (bug#79876).
* src/data.c (Fash): Don’t assume stdc_leading_zeros, which
returns an unsigned integer of unspecified width, returns
a value narrower than EMACS_INT. Also, don’t munge the code to
worry about stdc_leading_zeros (0); unlike GCC’s __builtin_clz,
stdc_leading_zeros works fine on 0. And use a temporary to
avoid a cast.
Problem reported by Helmut Eller (bug#79886).
* src/lisp.h (USE_LSB_TAG): Adjust to alignas changes.
(alignas): For GCC and Clang, prefer __attribute__ ((__aligned__ (A)))
to alignas (A) even if the compiler claims to support the latter.
This works around a bug in GCC 14 i386 C23 alignas.
No need to worry about whether __alignas_is_defined is defined.
We dropped support for MSVC long ago, and nowadays only support
MinGW for the MS-Windows builds of Emacs.
* src/w32term.h:
* src/w32fns.c:
* src/w32.c:
* nt/inc/sys/socket.h:
* nt/inc/stdalign.h:
* nt/inc/ms-w32.h: Remove MSVC-specific code and preprocessor
conditions.
* nt/inc/ms-w32.h: Don't redirect Posix functions to MS _FOO
equivalents, as MinGW headers do that nowadays better, not
necessarily via functions, and do not disable that when __STDC__
is defined.
Port to planned glibc 2.43 (scheduled for February 2026),
which will support qualifier-generic standard functions; see:
https://sourceware.org/git/?p=glibc.git;a=commit;h=cd748a63ab1a7ae846175c532a3daab341c62690
For example, strchr (P, C) will return pointer to const if P is
pointer to const. The idea is to catch dumb programming errors when a
program mistakenly uses strchr to convert a pointer to const
to an unrestricted pointer. This feature is required by C23,
and will be enabled by default in GCC 15.
* src/callint.c (Fcall_interactively):
Respect constness of pointer when calling memchr.
* src/gtkutil.c (xg_get_font):
2nd arg is char *, not const char *.
* src/xfaces.c (parse_float_color_comp): Return bool, not double.
New arg DST. All callers changed. This makes it easier for
callers to use char const *.
(parse_color_spec): Respect constness of pointer when calling strchr.
* lisp/cus-start.el: Make 'abbrev-mode' customizable.
* doc/emacs/abbrevs.texi (Abbrev Concepts):
* etc/NEWS:
* src/buffer.c (syms_of_buffer): <abbrev-mode>: Document
enabling Abbrev mode by default in all buffers by customizing
'abbrev-mode' to a non-nil value.
* java/org/gnu/emacs/EmacsNative.java (setEmacsParams): New arg
UIMODE.
(sendConfigurationChanged): New args DETAIL and UI_MODE.
* java/org/gnu/emacs/EmacsNoninteractive.java (main1): Provide
an undefined UI mode.
* java/org/gnu/emacs/EmacsService.java (EmacsService): New field
uiMode.
(onCreate): Initialize this field at start-up and provide the
same to setEmacsParams.
(onConfigurationChanged): If the UI mode has been altered,
generate a configuration changed event to match.
* src/android.c (android_ui_mode): New variable.
(setEmacsParams): New argument UI_MODE. Initialize the same
from this variable.
* src/androidgui.h (enum android_configuration_changed): New
enum.
(struct android_configuration_changed_event): New field
`DETAIL'. Convert fields providing specifics into a union of
display density information and a UI mode integer.
* src/androidterm.c (handle_one_android_event): Handle both
manners of configuration change events.
(android_term_init): Initialize Vtoolkit_theme from UI mode
provided at start-up.
* src/frame.c (syms_of_frame): Always define Vtoolkit_theme.
Define Qtoolkit_theme_set_functions.
* src/gtkutil.c (xg_update_dark_mode_for_all_displays):
* src/w32term.c (w32_read_socket): Generate special toolkit
theme events, rather than executing hooks directly within the
read_socket callback.
* src/keyboard.c (kbd_buffer_get_event)
<TOOLKIT_THEME_CHANGED_EVENT>: Run Qtoolkit_theme_set_functions
and set Vtoolkit_theme from event->ie.arg.
* src/termhooks.h (enum event_kind): New event
TOOLKIT_THEME_CHANGED_EVENT.
* src/window.c (window_set_parent_and_normal_sizes): When
assigning normal sizes in a combination, take the direction from
its parent's 'horizontal' slot and not from that of the first
window in the combination.
Assuming ATTRIBUTE_PURE means that the function must return,
a few more functions that should not be declared with ATTRIBUTE_PURE.
The GCC manual (and even the C23 standard, with [[reproducible]])
is not clear about this, and it’s better to be safe.
* src/bignum.h (mpz_get_d_rounded):
* src/lisp.h (bignum_to_double):
No longer pure, as it does not return if memory is exhausted.
* src/fns.c (Fproper_list_p): No longer pure, as it does not
return if the user quits.
* src/gnutls.c (Fgnutls_errorp): No longer pure, as it does not
return if it runs into an eassert failure in XSYMBOL_WITH_POS via EQ.
* src/lisp.h (bignum_to_intmax, bignum_to_uintmax, bignum_bufsize):
No longer pure, as it does not return if it runs into an
eassert failure in XBIGNUM via xbignum_val.
Problem for mpz_get_d_rounded reported by Helmut Eller in:
https://lists.gnu.org/r/emacs-devel/2025-11/msg00795.html
* lib-src/make-docfile.c (DEFUN_pure): New constant.
(write_globals, scan_c_stream): Support "attributes: pure".
* src/bignum.h (mpz_get_d_rounded):
* src/data.c (Fsymbolp, Fmodule_function_p, Fintegerp, Fnumberp):
* src/lisp.h (bignum_to_double, bignum_to_intmax)
(bignum_to_uintmax, bignum_bufsize):
Now pure, not const, since they depend on current state.
For example, Fsymbolp now inspects symbols_with_pos_enabled,
and the bignum functions inspect bignum contents in memory.
* src/data.c (Feq):
* src/xfaces.c (Fface_attribute_relative_p):
No longer const, since they might abort when debugging.
* src/pdumper.h (pdumper_object_p, pdumper_cold_object_p)
(pdumper_find_object_type, pdumper_object_p_precise):
These are not const functions. But there is no need to declare
them to be pure, either, as they’re inline so the compiler can
figure it out.
* src/keyboard.c (make_lispy_position): When calculating a
position in the left margin skip any scroll bar on the left of
the associated window (Bug#79846).
* src/conf_post.h: Avoid redirecting '*printf' functions if
'OMIT_CONSOLESAFE' is defined to 1.
* nt/cmdproxy.c:
* nt/ddeclient.c: Define 'OMIT_CONSOLESAFE' to 1 to avoid
redirecting '*printf functions' to stdio-consolesafe replacements.
* nt/Makefile.in (LIBS_ADDPM): Add -lgnu to link 'addpm' against
Gnulib. (Bug#79855)
* src/keyboard.c (adjust_point_for_property): Handle 'display'
property on the same text as 'invisible' property the same as the
overlay with a 'display' property. (Bug#79787)
* src/keyboard.c (adjust_point_for_property): Handle the case
where invisible text has an overlay over it with a replacing
'display' property, which leaves some "trace" of the invisible
text on display. (Bug#79787)
MSVCRT implementation of stdio functions which output
characters one by one fails for CJK double-byte encodings.
Gnulib provides replacement functions which work around
those bugs. This change makes Emacs and lib-src programs
use the replacements when Emacs is linked against MSVCRT.
* src/conf_post.h (fwrite, fprintf, printf, vfprintf, vprintf)
[WINDOWSNT]: Redirect to Gnulib replacements when Emacs is linked
against MSVCRT (as opposed to UCRT). Suggested by Bruno Haible
<bruno@clisp.org>.
* src/process.c (wait_reading_process_output): Process status
changes of sub-processes when called with read_kbd zero and some
"keyboard input" is available, but no output from any sub-process.
(Bug#79777)
* src/xdisp.c (reset_message_log_need_newline): New function.
* src/lisp.h: Add prototype of 'reset_message_log_need_newline'.
* src/print.c (print_error_message): Call
'reset_message_log_need_newline' to prevent message3 from
outputting a newline after "user-error:". (Bug#79840)
* src/android-asset.h (AAssetManager_open): Initialize desc and
asset to NULL, lest `desc' be accessed uninitialized if C_NAME
does not exist in the directory tree.
* src/xfaces.c (get_lface_attributes): Avoid crashes if F is NULL.
This happens when 'face_inheritance_cycle' is for some reason
called for the default attributes of a face (which are applicable
to future frames). We avoid the crashes by not consulting face
remapping in that case, since face remapping is buffer-local, and
therefore cannot possibly affect face defaults. (Bug#79790)
This fixes problems in some cases of out-f-tree builds
(bug#79694, bug#62099, bug#64806).
The use of true names in `load-history` dates back to to commits
33d74677e7 and 6bb6da3ec1 by Alan Mackenzie <acm@muc.de> in
May 24 2006, but that was reverted by Paul Eggert's commit
dff4f9c759 on Sep 18 2019.
* lisp/startup.el (command-line): Don't `file-truename` `lisp-directory`.
* src/lread.c (syms_of_lread) <load-history>: Adjust docstring,
to reflect the fact that the files there aren't "true names".
* doc/lispref/loading.texi (Hooks for Loading): Adjust accordingly.
Also massage the text to reflect the fact that nowadays features are
more common than file names as arguments to `with-eval-after-load`.
* doc/misc/eglot.texi (Eglot Features): Add comma after @xref.
* msdos/sed2v2.inp (GNULIB_ISSYMLINK): Define to 1.
* msdos/sedlibmk.inp (HAVE_RANDOM_H): Undefine, in line with its
deletion from gnulib.mk.
(GL_GNULIB_STRINGEQ): Define to 1.
* src/msdos.c (careadlinkat): NULL terminate at the end of the
data written, not one character beyond the same.
* src/timefns.c (Fdecode_time, Fencode_time)
(Fcurrent_time_string): Do not bother to preserve errno around
tzfree calls, as Gnulib now does that for us.
* admin/merge-gnulib (GNULIB_MODULES): Add stringeq.
With current Gnulib it is already present as in indirect dependency;
listing it here because Emacs now depends on it directly.
* lib-src/ebrowse.c, lib-src/etags.c:
(streq): Remove, as Gnulib defines this now.
* lib/fseterr.c, lib/fseterr.h, lib/issymlink.c, lib/issymlink.h:
* lib/issymlinkat.c, lib/stdio-consolesafe.c, lib/string.c:
* m4/fseterr.m4, m4/gettext_h.m4, m4/stringeq.m4:
New files from Gnulib.
* src/conf_post.h (tzfree) [__ANDROID_API__ >= 35]: Remove.
* src/xsettings.c (store_config_changed_event, dpyinfo_valid)
(store_font_name_changed, store_tool_bar_style_changed): Tweak
preprocessor conditions to satisfy all builds without warnings.
Latest tree-sitter library throws a syntax error if the
predicate names in a query don't end with question mark. So we
made the following change:
:equal changed to :eq?
:match changed to :match?
:pred changed to :pred?
Old names are transparently converted to new names when
expanding patterns.
:match predicate can now take the regexp and the node in any
order: it'll figure out which is which automatically. This way
it works with current Emacs convention (regexp first), as well
as tree-sitter's match convention (regexp second).
* doc/lispref/parsing.texi (Pattern Matching): Update manuel to
use new predicate names.
* src/treesit.c:
(Ftreesit_pattern_expand):
(Ftreesit_query_expand):
(treesit_predicate_match):
(treesit_eval_predicates):
(syms_of_treesit): Use new predicate names.
* test/src/treesit-tests.el (treesit-query-api): Update test.
* src/xsettings.c (store_tool_bar_style_changed): Compile only
under HAVE_GSETTINGS.
(xg_get_system_dark_mode): Compile only under HAVE_GSETTINGS.
* src/gtkutil.c (xg_set_gtk_theme_dark_mode)
(xg_update_dark_mode_for_all_displays, xg_set_initial_dark_mode):
Only compile when HAVE_GSETTINGS is defined.
(xg_create_frame_widgets): Call 'xg_set_initial_dark_mode' only
under HAVE_GSETTINGS.
(xg_create_frame_outer_widgets): Remove unused code. Call
'xg_set_initial_dark_mode' only under HAVE_GSETTINGS.
* src/pgtkselect.c (pgtk_reply_selection_request): Remove unused
variable.
* doc/emacs/frames.texi (Frame Commands): Document
'alter-fullscreen-frames', which is a user option. Fix indexing.
* src/frame.c (syms_of_frame) <alter-fullscreen-frames>: Doc fix.
(Bug#79756)
* src/frame.c (adjust_frame_size): Honor new option
'alter-fullscreen-frames'.
(syms_of_frame) <alter-fullscreen-frames>: New option to
maintain consistent state when attempting to resize fullscreen
frames. Default to 'inhibit' for NS builds because these
resized the frame while leaving the 'fullscreen' parameter alone
(Bug#79704).
(syms_of_frame) <Qinhibit>: Define symbol.
* lisp/cus-start.el (standard): Add customization options for
'alter-fullscreen-frames'
* doc/lispref/frames.texi (Frame Size): Describe new option
'alter-fullscreen-frames'.
* etc/NEWS: Call out new option 'alter-fullscreen-frames'.
* src/gtkutil.h: Declare 'xg_set_gtk_theme_dark_mode',
'xg_update_dark_mode_for_all_displays',
'xg_set_initial_dark_mode'.
* src/gtkutil.c (xg_set_gtk_theme_dark_mode): Toggle PGTK dark mode.
(xg_update_dark_mode_for_all_displays): Toggle PGTK dark mode for all
displays.
(xg_set_initial_dark_mode): Determine PGTK dark mode preference and set.
(xg_create_frame_widgets): Set PGTK dark mode preference for widgets.
(xg_create_frame_outer_widgets): Set PGTK dark mode preference for outer
widgets.
* src/xsettings.h: Declare 'xg_get_system_dark_mode'.
* src/xsettings.c (something_changed_gsettingsCB): Update PGTK dark mode
setting.
(xg_get_system_dark_mode): Determine PGTK dark mode preference.
GSETTINGS_COLOR_SCHEME: Defined and set to "color-scheme".
* etc/NEWS: Document automatic dark mode toggling.
(Bug#79689)
* src/xfaces.c (face_inheritance_cycle)
(Finternal_set_lisp_face_attribute): Prevent infinite recursion if
a face is defined to inherit from itself (whaaat? how??!).
* src/window.c (window_set_parent_and_normal_sizes): New function.
(Fcombine_windows): Improve doc-string. Use wset_... functions.
Call window_set_parent_and_normal_sizes to fix a bug where it
failed to assign new normal sizes.
(Funcombine_window): Call window_set_parent_and_normal_sizes.
* src/xfaces.c (face_inheritance_cycle): New function.
(Finternal_set_lisp_face_attribute): Signal an error if the
':inherit' attribute of a face is modified in a way that will
cause it to inherit from itself. (Bug#79672)
* test/src/xfaces-tests.el (xfaces-test-circular-inheritance): New
test.
* etc/NEWS: Announce the incompatible change.
Loading .elc files doesn't go through 'load-with-code-conversion' as
usual, but since these files are still 'read', we must still take care
to bind read-symbol-shorthands to nil around that. The process is
simpler than in 'load-with-code-conversion' because .elc files cannot
have read-symbol-shorthands cookies, so the binding is always to nil.
If we don't do this, the symbols in the .elc will be subject to
shorthand manipulation if there's an active binding in the recursive
load stack.
* src/lread.c (readevalloop): Bind read-symbol-shorthands to nil.
(syms_of_lread): Add Qread_symbol_shorthands.