aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Morris2020-01-08 09:09:47 -0800
committerGlenn Morris2020-01-08 09:09:47 -0800
commitb968b733a2a0450eb7312a5e72c059ec3c59ddd9 (patch)
treeda0790ada823a4d7dee009e9df63b3b24d0d539b
parentf8a0b02949342b887822e7756fd36f06536c9c01 (diff)
parent6cd9ccb0a28ec03ffe180b7429e0378511b7d459 (diff)
downloademacs-b968b733a2a0450eb7312a5e72c059ec3c59ddd9.tar.gz
emacs-b968b733a2a0450eb7312a5e72c059ec3c59ddd9.zip
Merge from origin/emacs-27
6cd9ccb0a2 (origin/emacs-27) Fix compression of directories in Dired 42329e6d3b ; * etc/NEWS: Review of the whole text. af5709f16b Further enhancement on `tramp-file-local-name' fb432446f5 Objective C Mode imenu: cease recognizing "functions" with... a18373a999 ; * etc/NEWS: Update the text about the XDG_CONFIG_HOME/em... 73fd8a4b53 Fix BSD and macOS builds w.r.t. pthread_setname_np (bug#38... f54b24304d Scale top-left coordinates in display-monitor-attributes-list b46c75b16c xref-matches-in-files: Big Tramp speed-up 883b3490d8 * lisp/net/tramp.el (tramp-file-local-name): Remove `save-... c01f55f126 Fix rendering bug due to unsynchronized cairo surface size... 075f21c0e3 Avoid crash by access to cleared img->pixmap->data/img->ma... 16c6dfb4f1 Avoid assertion violations in very small-height windows 9063124b91 Use pthread_setname_np to set thread name # Conflicts: # etc/NEWS # lisp/net/tramp.el
-rw-r--r--configure.ac21
-rw-r--r--etc/NEWS.27297
-rw-r--r--lisp/dired-aux.el16
-rw-r--r--lisp/net/tramp.el21
-rw-r--r--lisp/progmodes/cc-menus.el98
-rw-r--r--lisp/progmodes/xref.el10
-rw-r--r--src/image.c4
-rw-r--r--src/systhread.c53
-rw-r--r--src/systhread.h5
-rw-r--r--src/thread.c7
-rw-r--r--src/thread.h3
-rw-r--r--src/xdisp.c28
-rw-r--r--src/xfns.c2
-rw-r--r--src/xterm.c4
14 files changed, 325 insertions, 244 deletions
diff --git a/configure.ac b/configure.ac
index 24d21c7afd9..08a45021224 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1767,7 +1767,7 @@ AC_CHECK_HEADERS_ONCE(
1767 sys/sysinfo.h 1767 sys/sysinfo.h
1768 coff.h pty.h 1768 coff.h pty.h
1769 sys/resource.h 1769 sys/resource.h
1770 sys/utsname.h pwd.h utmp.h util.h sys/prctl.h) 1770 sys/utsname.h pwd.h utmp.h util.h)
1771 1771
1772AC_CACHE_CHECK([for ADDR_NO_RANDOMIZE], 1772AC_CACHE_CHECK([for ADDR_NO_RANDOMIZE],
1773 [emacs_cv_personality_addr_no_randomize], 1773 [emacs_cv_personality_addr_no_randomize],
@@ -4192,9 +4192,26 @@ pthread_sigmask strsignal setitimer timer_getoverrun \
4192sendto recvfrom getsockname getifaddrs freeifaddrs \ 4192sendto recvfrom getsockname getifaddrs freeifaddrs \
4193gai_strerror sync \ 4193gai_strerror sync \
4194getpwent endpwent getgrent endgrent \ 4194getpwent endpwent getgrent endgrent \
4195cfmakeraw cfsetspeed __executable_start log2 prctl) 4195cfmakeraw cfsetspeed __executable_start log2 pthread_setname_np)
4196LIBS=$OLD_LIBS 4196LIBS=$OLD_LIBS
4197 4197
4198if test "$ac_cv_func_pthread_setname_np" = "yes"; then
4199 AC_CACHE_CHECK(
4200 [whether pthread_setname_np takes a single argument],
4201 [emacs_cv_pthread_setname_np_1arg],
4202 [AC_COMPILE_IFELSE(
4203 [AC_LANG_PROGRAM(
4204 [[#include <pthread.h>]],
4205 [[pthread_setname_np ("a");]])],
4206 [emacs_cv_pthread_setname_np_1arg=yes],
4207 [emacs_cv_pthread_setname_np_1arg=no])])
4208 if test "$emacs_cv_pthread_setname_np_1arg" = "yes"; then
4209 AC_DEFINE(
4210 HAVE_PTHREAD_SETNAME_NP_1ARG, 1,
4211 [Define to 1 if pthread_setname_np takes a single argument.])
4212 fi
4213fi
4214
4198dnl No need to check for posix_memalign if aligned_alloc works. 4215dnl No need to check for posix_memalign if aligned_alloc works.
4199AC_CHECK_FUNCS([aligned_alloc posix_memalign], [break]) 4216AC_CHECK_FUNCS([aligned_alloc posix_memalign], [break])
4200AC_CHECK_DECLS([aligned_alloc], [], [], [[#include <stdlib.h>]]) 4217AC_CHECK_DECLS([aligned_alloc], [], [], [[#include <stdlib.h>]])
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index a8c8e2763e4..6d4a6119afa 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -69,8 +69,8 @@ When built with the portable dumping support (which is the default),
69Emacs looks for the 'emacs.pdmp' file, generated during the build, in 69Emacs looks for the 'emacs.pdmp' file, generated during the build, in
70its data directory at startup, and loads the dumped state from there. 70its data directory at startup, and loads the dumped state from there.
71The new command-line argument '--dump-file=FILE' allows to specify a 71The new command-line argument '--dump-file=FILE' allows to specify a
72non-default '.pdmp' file to load the state from; see the node "Initial 72non-default '.pdmp' file to load the state from; see the node
73Options" in the Emacs manual for more information. 73"(emacs) Initial Options" in the Emacs manual for more information.
74 74
75An Emacs started via a dump file can create a new dump file only if it 75An Emacs started via a dump file can create a new dump file only if it
76was invoked with the '-batch' option. (This is a temporary 76was invoked with the '-batch' option. (This is a temporary
@@ -92,7 +92,7 @@ change to one of the data structures that it relies on.
92'--enable-checking=xmallocoverrun' have been withdrawn. The former 92'--enable-checking=xmallocoverrun' have been withdrawn. The former
93made Emacs irredeemably slow, and the latter made it crash. Neither 93made Emacs irredeemably slow, and the latter made it crash. Neither
94option was useful with modern debugging tools such as AddressSanitizer. 94option was useful with modern debugging tools such as AddressSanitizer.
95(See etc/DEBUG for the details of using the modern replacements of the 95(See "etc/DEBUG" for the details of using the modern replacements of the
96removed configure options.) 96removed configure options.)
97 97
98--- 98---
@@ -158,20 +158,25 @@ support.
158For example, it looks for init.el in "~/.config/emacs/init.el", and 158For example, it looks for init.el in "~/.config/emacs/init.el", and
159similarly for other init files. 159similarly for other init files.
160 160
161The XDG_CONFIG_HOME environment variable (which defaults to "~/.config") 161The 'XDG_CONFIG_HOME' environment variable (which defaults to "~/.config")
162specifies the parent directory of these and other configuration files, 162specifies the parent directory of these and other configuration files,
163and will override their traditional locations (the home directory, 163and will override their traditional locations (the home directory,
164"~/.emacs.d", etc.). 164"~/.emacs.d", etc.).
165 165
166Emacs will still look for init files in their traditional locations if 166Emacs will still look for init files in their traditional locations if
167XDG_CONFIG_HOME/emacs does not exist, so invoking Emacs with 167"$XDG_CONFIG_HOME/emacs" does not exist, but "~/.emacs.d" or
168XDG_CONFIG_HOME='/nowhere' might be useful if your new-location init 168"~/.emacs" does exist, so invoking Emacs with XDG_CONFIG_HOME='/nowhere'
169files are scrambled, or if you want to force Emacs to ignore files 169might be useful if your new-location init files are scrambled, or if
170under XDG_CONFIG_HOME for some other reason. 170you want to force Emacs to ignore files under 'XDG_CONFIG_HOME' for
171some other reason.
172
173If neither "$XDG_CONFIG_HOME/emacs" nor "~/.emacs.d" exist, Emacs will
174now default to "$XDG_CONFIG_HOME/emacs", and will create that directory
175and set 'user-emacs-directory' to point to it.
171 176
172+++ 177+++
173** Emacs can now be configured using an early init file. 178** Emacs can now be configured using an early init file.
174The file is called 'early-init.el', in 'user-emacs-directory'. It is 179The file is called "early-init.el", in 'user-emacs-directory'. It is
175loaded very early in the startup process: before graphical elements 180loaded very early in the startup process: before graphical elements
176such as the tool bar are initialized, and before the package manager 181such as the tool bar are initialized, and before the package manager
177is initialized. The primary purpose is to allow customizing how the 182is initialized. The primary purpose is to allow customizing how the
@@ -278,7 +283,6 @@ The old function names are maintained as aliases for backward
278compatibility. 283compatibility.
279 284
280** emacsclient 285** emacsclient
281
282+++ 286+++
283*** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable. 287*** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable.
284The command-line argument '--socket-name' overrides it. 288The command-line argument '--socket-name' overrides it.
@@ -463,7 +467,7 @@ This user option allows to specify the set of buffers that may be
463shown by 'switch-to-prev-buffer' and 'switch-to-next-buffer' more 467shown by 'switch-to-prev-buffer' and 'switch-to-next-buffer' more
464stringently than the now obsolete 'switch-to-visible-buffer'. 468stringently than the now obsolete 'switch-to-visible-buffer'.
465 469
466** New 'flex' completion style 470** New 'flex' completion style.
467An implementation of popular "flex/fuzzy/scatter" completion which 471An implementation of popular "flex/fuzzy/scatter" completion which
468matches strings where the pattern appears as a subsequence. Put 472matches strings where the pattern appears as a subsequence. Put
469simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex' 473simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex'
@@ -488,7 +492,6 @@ Consequently, a theme generally shouldn't specify this attribute
488unless it has a good reason to do so. 492unless it has a good reason to do so.
489 493
490** Connection-local variables 494** Connection-local variables
491
492+++ 495+++
493*** Connection-local variables are applied by default like file-local 496*** Connection-local variables are applied by default like file-local
494and directory-local variables. 497and directory-local variables.
@@ -516,7 +519,6 @@ Emacs configured with Cairo drawing and linked with cairo >= 1.16.0.
516 519
517+++ 520+++
518** Emacs now optionally displays a fill column indicator. 521** Emacs now optionally displays a fill column indicator.
519
520This is similar to what 'fill-column-indicator' package provides, but 522This is similar to what 'fill-column-indicator' package provides, but
521much faster and compatible with 'show-trailing-whitespace'. 523much faster and compatible with 'show-trailing-whitespace'.
522 524
@@ -528,7 +530,7 @@ The indicator is not displayed at all in minibuffer windows and
528in tooltips, as it is not useful there. 530in tooltips, as it is not useful there.
529 531
530There are 2 new buffer local variables and 1 face to customize this 532There are 2 new buffer local variables and 1 face to customize this
531mode they are described in the manual "(emacs) Display". 533mode, they are described in the manual "(emacs) Display".
532 534
533+++ 535+++
534** 'progress-reporter-update' accepts a suffix string to display. 536** 'progress-reporter-update' accepts a suffix string to display.
@@ -542,7 +544,6 @@ It is used for displaying file sizes and disk space in some cases.
542 544
543+++ 545+++
544** Emacs now interprets RGB triplets like HTML, SVG, and CSS do. 546** Emacs now interprets RGB triplets like HTML, SVG, and CSS do.
545
546The X convention previously used differed slightly, particularly for 547The X convention previously used differed slightly, particularly for
547RGB triplets with a single hexadecimal digit per component. 548RGB triplets with a single hexadecimal digit per component.
548 549
@@ -550,8 +551,8 @@ RGB triplets with a single hexadecimal digit per component.
550** The toolbar now shows the equivalent key binding in its tooltips. 551** The toolbar now shows the equivalent key binding in its tooltips.
551 552
552--- 553---
553** The File menu-bar menu was re-arranged: Print menu items moved to 554** The File menu-bar menu was re-arranged.
554submenu, and also added the new entries for tabs. 555Print menu items moved to submenu, and also added the new entries for tabs.
555 556
556--- 557---
557** 'scroll-lock-mode' is now bound to the 'Scroll_Lock' key globally. 558** 'scroll-lock-mode' is now bound to the 'Scroll_Lock' key globally.
@@ -729,6 +730,7 @@ network connection information (in addition to the host name).
729 730
730--- 731---
731** desktop 732** desktop
733
732*** When called interactively with a prefix arg 'C-u', 'desktop-read' 734*** When called interactively with a prefix arg 'C-u', 'desktop-read'
733now prompts the user for the directory containing the desktop file. 735now prompts the user for the directory containing the desktop file.
734 736
@@ -745,28 +747,34 @@ an offset to absolute line numbers.
745 747
746+++ 748+++
747** winner 749** winner
750
748*** A new user option, 'winner-boring-buffers-regexp', has been added. 751*** A new user option, 'winner-boring-buffers-regexp', has been added.
749 752
750** table 753** table
751** 'table-generate-source' and friends now support outputting wiki and 754
755*** 'table-generate-source' and friends now support outputting wiki and
752mediawiki format tables. 756mediawiki format tables.
753 757
754--- 758---
755** telnet-mode 759** telnet-mode
760
756*** Reverting a buffer in 'telnet-mode' will restart a closed connection. 761*** Reverting a buffer in 'telnet-mode' will restart a closed connection.
757 762
758** goto-addr 763** goto-addr
764
759*** A way to more conveniently specify what URI address schemes that 765*** A way to more conveniently specify what URI address schemes that
760should be ignored have been added via the 766should be ignored have been added via the
761'goto-address-uri-schemes-ignored' variable. 767'goto-address-uri-schemes-ignored' variable.
762 768
763+++ 769+++
764** tex-mode 770** tex-mode
771
765*** 'latex-noindent-commands' controls indentation of certain commands. 772*** 'latex-noindent-commands' controls indentation of certain commands.
766You can use this new user option to control indentation of arguments of 773You can use this new user option to control indentation of arguments of
767\emph, \footnote, and similar commands. 774\emph, \footnote, and similar commands.
768 775
769** byte compiler 776** byte compiler
777
770*** 'byte-compile-dynamic' is now obsolete. 778*** 'byte-compile-dynamic' is now obsolete.
771This is because on the one hand it suffers from misbehavior in corner 779This is because on the one hand it suffers from misbehavior in corner
772cases that have plagued it for years, and on the other experiments indicated 780cases that have plagued it for years, and on the other experiments indicated
@@ -778,20 +786,24 @@ command that will recompile the file previously compiled with 'M-x
778byte-compile-file' and the like. 786byte-compile-file' and the like.
779 787
780** compile.el 788** compile.el
789
781--- 790---
782*** In 'compilation-error-regexp-alist', 'line' (and 'end-line') can 791*** In 'compilation-error-regexp-alist', 'line' (and 'end-line') can
783be functions. 792be functions.
793
784+++ 794+++
785*** 'compilation-context-lines' can now take the value t; this is like 795*** 'compilation-context-lines' can now take the value t; this is like
786nil, but instead of scrolling the current line to the top of the 796nil, but instead of scrolling the current line to the top of the
787screen when there is no left fringe, it inserts a visible arrow before 797screen when there is no left fringe, it inserts a visible arrow before
788column zero. 798column zero.
799
789--- 800---
790*** The new 'compilation-transform-file-match-alist' user option can 801*** The new 'compilation-transform-file-match-alist' user option can
791be used to transform file name matches compilation output, and remove 802be used to transform file name matches compilation output, and remove
792known false positives being recognized as warnings/errors. 803known false positives being recognized as warnings/errors.
793 804
794** cl-lib.el 805** cl-lib.el
806
795+++ 807+++
796*** 'cl-defstruct' has a new ':noinline' argument to prevent inlining 808*** 'cl-defstruct' has a new ':noinline' argument to prevent inlining
797its functions. 809its functions.
@@ -803,13 +815,16 @@ its functions.
803*** 'cl-values-list' will now signal an error if its argument isn't a list. 815*** 'cl-values-list' will now signal an error if its argument isn't a list.
804 816
805** doc-view.el 817** doc-view.el
818
806*** New commands 'doc-view-presentation' and 'doc-view-fit-window-to-page'. 819*** New commands 'doc-view-presentation' and 'doc-view-fit-window-to-page'.
807*** Added support for password-protected PDF files 820
821*** Added support for password-protected PDF files.
808 822
809*** A new user option 'doc-view-pdftotext-program-args' has been added 823*** A new user option 'doc-view-pdftotext-program-args' has been added
810to allow controlling how the conversion to text is done. 824to allow controlling how the conversion to text is done.
811 825
812** Ido 826** Ido
827
813*** New user option 'ido-big-directories' to mark directories whose 828*** New user option 'ido-big-directories' to mark directories whose
814names match certain regular expressions as big. Ido won't attempt to 829names match certain regular expressions as big. Ido won't attempt to
815list the contents of such directories when completing file names. 830list the contents of such directories when completing file names.
@@ -841,13 +856,13 @@ at the end of the active minibuffer.
841a character using the minibuffer by 'read-char-from-minibuffer'. 856a character using the minibuffer by 'read-char-from-minibuffer'.
842 857
843** map.el 858** map.el
859
844*** Now also understands plists. 860*** Now also understands plists.
845*** Now defined via generic functions that can be extended via 'cl-defmethod'. 861*** Now defined via generic functions that can be extended via 'cl-defmethod'.
846*** Deprecate the 'map-put' macro in favor of a new 'map-put!' function. 862*** Deprecate the 'map-put' macro in favor of a new 'map-put!' function.
847*** 'map-contains-key' now returns a boolean rather than the key. 863*** 'map-contains-key' now returns a boolean rather than the key.
848*** Deprecate the 'testfn' args of 'map-elt' and 'map-contains-key'. 864*** Deprecate the 'testfn' args of 'map-elt' and 'map-contains-key'.
849*** New generic function 'map-insert'. 865*** New generic function 'map-insert'.
850
851+++ 866+++
852*** The 'type' arg can be a list '(hash-table :key1 VAL1 :key2 VAL2 ...)'. 867*** The 'type' arg can be a list '(hash-table :key1 VAL1 :key2 VAL2 ...)'.
853 868
@@ -917,7 +932,6 @@ The mode is automatically enabled in files that start with the
917** project.el 932** project.el
918 933
919*** New commands 'project-search' and 'project-query-replace-regexp'. 934*** New commands 'project-search' and 'project-query-replace-regexp'.
920
921*** New user option 'project-read-file-name-function'. 935*** New user option 'project-read-file-name-function'.
922 936
923** Etags 937** Etags
@@ -1065,7 +1079,7 @@ by Hg.
1065you invoke 'C-x v m' ('vc-merge'). 1079you invoke 'C-x v m' ('vc-merge').
1066 1080
1067--- 1081---
1068*** The Hg (Mercurial) back-end now use tags, branches and bookmarks 1082*** The Hg (Mercurial) back-end now uses tags, branches and bookmarks
1069instead of revision numbers as completion candidates when it prompts 1083instead of revision numbers as completion candidates when it prompts
1070for a revision. 1084for a revision.
1071 1085
@@ -1117,6 +1131,7 @@ Emacs 24.1, but wasn't documented until now.
1117*** New command 'diff-buffers' interactively diffs two buffers. 1131*** New command 'diff-buffers' interactively diffs two buffers.
1118 1132
1119** Diff mode 1133** Diff mode
1134
1120+++ 1135+++
1121*** Hunks are now automatically refined by font-lock. 1136*** Hunks are now automatically refined by font-lock.
1122To disable refinement, set the new user option 'diff-refine' to nil. 1137To disable refinement, set the new user option 'diff-refine' to nil.
@@ -1244,7 +1259,7 @@ included.
1244Database passwords can now by stored in NETRC or JSON data files that 1259Database passwords can now by stored in NETRC or JSON data files that
1245may optionally be encrypted. When establishing an interactive session 1260may optionally be encrypted. When establishing an interactive session
1246with the database via 'sql-connect' or a product specific function, 1261with the database via 'sql-connect' or a product specific function,
1247like 'sql-mysql' or 'my-postgres', the password wallet will be 1262like 'sql-mysql' or 'sql-postgres', the password wallet will be
1248searched for the password. The 'sql-product', 'sql-server', 1263searched for the password. The 'sql-product', 'sql-server',
1249'sql-database', and the 'sql-username' will be used to identify the 1264'sql-database', and the 'sql-username' will be used to identify the
1250appropriate authorization. This eliminates the discouraged practice of 1265appropriate authorization. This eliminates the discouraged practice of
@@ -1316,8 +1331,8 @@ package data. It is therefore recommended to keep this line.
1316 1331
1317+++ 1332+++
1318*** Change of 'package-check-signature' for packages with multiple sigs. 1333*** Change of 'package-check-signature' for packages with multiple sigs.
1319In previous Emacsen, 't' checked that all signatures are valid. 1334In previous Emacsen, t checked that all signatures are valid.
1320Now 't' only checks that at least one signature is valid and the new 'all' 1335Now t only checks that at least one signature is valid and the new 'all'
1321value needs to be used if you want to enforce that all signatures 1336value needs to be used if you want to enforce that all signatures
1322are valid. This only affects packages with multiple signatures. 1337are valid. This only affects packages with multiple signatures.
1323 1338
@@ -1397,9 +1412,9 @@ This command finds definitions of the identifier at the place of a
1397mouse click event, and is intended to be bound to a mouse event. 1412mouse click event, and is intended to be bound to a mouse event.
1398 1413
1399+++ 1414+++
1400*** Changing 'xref-marker-ring-length' works after 'xref.el' is loaded. 1415*** Changing 'xref-marker-ring-length' works after xref.el is loaded.
1401Previously, setting 'xref-marker-ring-length' would only take effect 1416Previously, setting 'xref-marker-ring-length' would only take effect
1402if set before 'xref.el' was loaded. 1417if set before xref.el was loaded.
1403 1418
1404--- 1419---
1405*** 'xref-find-definitions' now sets the mark at the buffer position 1420*** 'xref-find-definitions' now sets the mark at the buffer position
@@ -1418,8 +1433,7 @@ behavior and the display of results.
1418*** Search results show the buffer even for one hit. 1433*** Search results show the buffer even for one hit.
1419The search-type Xref commands (e.g. 'xref-find-references' or 1434The search-type Xref commands (e.g. 'xref-find-references' or
1420'project-find-regexp') now show the results buffer even when there is 1435'project-find-regexp') now show the results buffer even when there is
1421only one hit. This can be altered by changing 1436only one hit. This can be altered by changing 'xref-show-xrefs-function'.
1422'xref-show-xrefs-function'.
1423 1437
1424+++ 1438+++
1425*** Xref buffers support refreshing the search results. 1439*** Xref buffers support refreshing the search results.
@@ -1441,7 +1455,7 @@ completion facilities.
1441** Ecomplete 1455** Ecomplete
1442 1456
1443--- 1457---
1444*** The ecomplete sorting has changed to a decay-based algorithm. 1458*** The Ecomplete sorting has changed to a decay-based algorithm.
1445This can be controlled by the new 'ecomplete-sort-predicate' user option. 1459This can be controlled by the new 'ecomplete-sort-predicate' user option.
1446 1460
1447--- 1461---
@@ -1466,14 +1480,14 @@ are marked with "." in the summary mode lines.)
1466'never' for never expunging messages, 'immediately' for immediately 1480'never' for never expunging messages, 'immediately' for immediately
1467expunging deleted messages, and 'on-exit' to expunge deleted articles 1481expunging deleted messages, and 'on-exit' to expunge deleted articles
1468when exiting the group's summary buffer. Setting 'nnimap-expunge' to 1482when exiting the group's summary buffer. Setting 'nnimap-expunge' to
1469'nil' or 't' is still supported but not recommended, since it may 1483nil or t is still supported but not recommended, since it may
1470result in Gnus expunging all messages that have been flagged as 1484result in Gnus expunging all messages that have been flagged as
1471deleted by any IMAP client (rather than just those that have been 1485deleted by any IMAP client (rather than just those that have been
1472deleted by Gnus). 1486deleted by Gnus).
1473 1487
1474+++ 1488+++
1475*** New user option 'gnus-use-atomic-windows' makes Gnus window layouts atomic. 1489*** New user option 'gnus-use-atomic-windows' makes Gnus window layouts atomic.
1476See the "Atomic Windows" section of the Elisp manual for details. 1490See the "(elisp) Atomic Windows" node of the Elisp manual for details.
1477 1491
1478+++ 1492+++
1479*** There's a new value for 'gnus-article-date-headers', 1493*** There's a new value for 'gnus-article-date-headers',
@@ -1511,20 +1525,19 @@ See the concept index in the Gnus manual for the 'match-list' entry.
1511*** nil is no longer an allowed value for 'mm-text-html-renderer'. 1525*** nil is no longer an allowed value for 'mm-text-html-renderer'.
1512 1526
1513+++ 1527+++
1514The default value of 'mm-inline-large-images' has changed from nil to 1528*** The default value of 'mm-inline-large-images' has changed from nil
1515'resize', which means that large images will be resized instead of 1529to 'resize', which means that large images will be resized instead of
1516displayed with an external program by default. 1530displayed with an external program by default.
1517 1531
1518+++ 1532+++
1519*** A new Gnus summary mode command, 'S A' 1533*** A new Gnus summary mode command, 'S A' ('gnus-summary-attach-article')
1520('gnus-summary-attach-article') can be used to attach the current 1534can be used to attach the current article(s) to a pre-existing Message
1521article(s) to a pre-existing Message buffer, or create a new Message 1535buffer, or create a new Message buffer with the article(s) attached.
1522buffer with the article(s) attached.
1523 1536
1524+++ 1537+++
1525*** A new Gnus summary mode command, 'w' 1538*** A new Gnus summary mode command, 'w' ('gnus-summary-browse-url')
1526('gnus-summary-browse-url') scans the article buffer for URLs, and 1539scans the article buffer for URLs, and offers them to the user to open
1527offers them to the user to open with 'browse-url'. 1540with 'browse-url'.
1528 1541
1529--- 1542---
1530*** New user option 'nnir-notmuch-filter-group-names-function'. 1543*** New user option 'nnir-notmuch-filter-group-names-function'.
@@ -1545,8 +1558,7 @@ fail.
1545*** New hook 'erc-insert-done-hook'. 1558*** New hook 'erc-insert-done-hook'.
1546This hook is called after strings have been inserted into the buffer, 1559This hook is called after strings have been inserted into the buffer,
1547and is free to alter point and window configurations, as it's not 1560and is free to alter point and window configurations, as it's not
1548called from inside a 'save-excursion', as opposed to 1561called from inside a 'save-excursion', as opposed to 'erc-insert-post-hook'.
1549'erc-insert-post-hook'.
1550 1562
1551--- 1563---
1552*** 'erc-button-google-url' has been renamed to 'erc-button-search-url' 1564*** 'erc-button-google-url' has been renamed to 'erc-button-search-url'
@@ -1632,14 +1644,14 @@ attempt when communicating with the SMTP server(s), the
1632'smtpmail-servers-requiring-authorization' user option can be used. 1644'smtpmail-servers-requiring-authorization' user option can be used.
1633 1645
1634+++ 1646+++
1635*** smtpmail will now try resending mail when getting a transient 4xx 1647*** smtpmail will now try resending mail when getting a transient "4xx"
1636error message from the SMTP server. The new 'smtpmail-retries' 1648error message from the SMTP server. The new 'smtpmail-retries'
1637user option says how many times to retry. 1649user option says how many times to retry.
1638 1650
1639** Footnote mode 1651** Footnote mode
1640 1652
1641--- 1653---
1642*** Support Hebrew-style footnotes 1654*** Support Hebrew-style footnotes.
1643 1655
1644--- 1656---
1645*** Footnote text lines are now aligned. 1657*** Footnote text lines are now aligned.
@@ -1733,7 +1745,7 @@ with a numeric argument.
1733of matches in the Isearch prompt. User options 1745of matches in the Isearch prompt. User options
1734'lazy-count-prefix-format' and 'lazy-count-suffix-format' define the 1746'lazy-count-prefix-format' and 'lazy-count-suffix-format' define the
1735format of the current and the total number of matches in the prompt's 1747format of the current and the total number of matches in the prompt's
1736prefix and suffix respectively. 1748prefix and suffix, respectively.
1737 1749
1738--- 1750---
1739*** 'lazy-highlight-buffer' highlights matches in the full buffer. 1751*** 'lazy-highlight-buffer' highlights matches in the full buffer.
@@ -1746,7 +1758,6 @@ highlight in one iteration while processing the full buffer.
1746 1758
1747+++ 1759+++
1748*** New isearch bindings. 1760*** New isearch bindings.
1749
1750'C-M-z' invokes new function 'isearch-yank-until-char', which yanks 1761'C-M-z' invokes new function 'isearch-yank-until-char', which yanks
1751everything from point up to but not including the specified 1762everything from point up to but not including the specified
1752character into the search string. This is especially useful for 1763character into the search string. This is especially useful for
@@ -1763,13 +1774,13 @@ to the existing binding 'M-s h r' ('highlight-regexp') that highlights
1763JUST the search string. 1774JUST the search string.
1764 1775
1765+++ 1776+++
1766*** New user option 'isearch-yank-on-move' provides options 't' and 'shift' 1777*** New user option 'isearch-yank-on-move' provides options t and 'shift'
1767to extend the search string by yanking text that ends at the new 1778to extend the search string by yanking text that ends at the new
1768position after moving point in the current buffer. 'shift' extends 1779position after moving point in the current buffer. 'shift' extends
1769the search string by motion commands while holding down the shift key. 1780the search string by motion commands while holding down the shift key.
1770 1781
1771+++ 1782+++
1772*** 'isearch-allow-scroll' provides new option 'unlimited' to allow 1783*** 'isearch-allow-scroll' provides a new option 'unlimited' to allow
1773scrolling any distance off screen. 1784scrolling any distance off screen.
1774 1785
1775--- 1786---
@@ -1794,7 +1805,7 @@ IOTA WITH OXIA".
1794*** New char-folding options: 'char-fold-include' lets you add ad hoc 1805*** New char-folding options: 'char-fold-include' lets you add ad hoc
1795foldings, 'char-fold-exclude' to remove foldings from default decomposition, 1806foldings, 'char-fold-exclude' to remove foldings from default decomposition,
1796and 'char-fold-symmetric' to search for any of an equivalence class of 1807and 'char-fold-symmetric' to search for any of an equivalence class of
1797characters. For example, with a 'nil' value of 'char-fold-symmetric' 1808characters. For example, with a nil value of 'char-fold-symmetric'
1798you can search for "e" to find "é", but not vice versa. With a non-nil 1809you can search for "e" to find "é", but not vice versa. With a non-nil
1799value you can search for either, for example, you can search for "é" 1810value you can search for either, for example, you can search for "é"
1800to find "e". 1811to find "e".
@@ -1908,7 +1919,7 @@ This is useful for games where lower scores are better, like time-based games.
1908** Filecache 1919** Filecache
1909 1920
1910--- 1921---
1911*** Completing filenames in the minibuffer via 'C-TAB' now uses the 1922*** Completing file names in the minibuffer via 'C-TAB' now uses the
1912styles as configured by the user option 'completion-styles'. 1923styles as configured by the user option 'completion-styles'.
1913 1924
1914** New macros 'thunk-let' and 'thunk-let*'. 1925** New macros 'thunk-let' and 'thunk-let*'.
@@ -2055,8 +2066,8 @@ Tramp for some look-alike remote file names.
2055 2066
2056+++ 2067+++
2057*** For some connection methods, like "su" or "sudo", the host name in 2068*** For some connection methods, like "su" or "sudo", the host name in
2058ad-hoc multi-hop file names must match the previous hop. Default host 2069multi-hop file names must match the previous hop. Default host names
2059names are adjusted to the host name from the previous hop. 2070are adjusted to the host name from the previous hop.
2060 2071
2061+++ 2072+++
2062*** For the connection methods "sudo" and "doas" there exists a 2073*** For the connection methods "sudo" and "doas" there exists a
@@ -2092,15 +2103,6 @@ Two new user options are provided for this:
2092*** The return value of method 'register-val-describe' includes the 2103*** The return value of method 'register-val-describe' includes the
2093names of buffers shown by the windows of a window configuration. 2104names of buffers shown by the windows of a window configuration.
2094 2105
2095---
2096** The options.el library has been removed.
2097It was obsolete since Emacs 22.1, replaced by customize.
2098
2099---
2100** The tls.el and starttls.el libraries are now marked obsolete.
2101Use of built-in libgnutls based functionality (described in the Emacs
2102GnuTLS manual) is recommended instead.
2103
2104** Message 2106** Message
2105 2107
2106--- 2108---
@@ -2135,7 +2137,7 @@ are formatted as MIME digests.
2135*** 'message-forward-included-headers' has changed its default to 2137*** 'message-forward-included-headers' has changed its default to
2136exclude most headers when forwarding. 2138exclude most headers when forwarding.
2137 2139
2138*** 'mml-secure-openpgp-sign-with-sender' sets also "gpg --sender" 2140*** 'mml-secure-openpgp-sign-with-sender' sets also "gpg --sender".
2139When 'mml-secure-openpgp-sign-with-sender' is non-nil message sender's 2141When 'mml-secure-openpgp-sign-with-sender' is non-nil message sender's
2140email address (in addition to its old behavior) will also be used to 2142email address (in addition to its old behavior) will also be used to
2141set gpg's "--sender email@domain" option. 2143set gpg's "--sender email@domain" option.
@@ -2145,10 +2147,10 @@ The option is useful for two reasons when verifying the signature:
2145 1. GnuPG's TOFU statistics are updated for the specific user id 2147 1. GnuPG's TOFU statistics are updated for the specific user id
2146 (email) only. See gpg(1) man page about "--sender". 2148 (email) only. See gpg(1) man page about "--sender".
2147 2149
2148 2. GnuPG's '--auto-key-retrieve' functionality can use WKD (web key 2150 2. GnuPG's "--auto-key-retrieve" functionality can use WKD (web key
2149 directory) method for finding the signer's key. You need GnuPG 2151 directory) method for finding the signer's key. You need GnuPG
2150 2.2.17 to fully benefit from this feature. See gpg(1) man page for 2152 2.2.17 to fully benefit from this feature. See gpg(1) man page for
2151 '--auto-key-retrieve'. 2153 "--auto-key-retrieve".
2152 2154
2153--- 2155---
2154** EasyPG 2156** EasyPG
@@ -2166,9 +2168,9 @@ been removed. Use 'encode-coding-string', 'decode-coding-string', and
2166--- 2168---
2167*** 'epg-context' structure supports now 'sender' slot. 2169*** 'epg-context' structure supports now 'sender' slot.
2168The value of the new 'sender' slot (if a string) is used to set gpg's 2170The value of the new 'sender' slot (if a string) is used to set gpg's
2169'--sender' option. This feature is used by 2171"--sender" option. This feature is used by
2170'mml-secure-openpgp-sign-with-sender'. See gpg(1) manual page about 2172'mml-secure-openpgp-sign-with-sender'. See gpg(1) manual page about
2171'--sender' for more information. 2173"--sender" for more information.
2172 2174
2173--- 2175---
2174** Rmail 2176** Rmail
@@ -2409,7 +2411,7 @@ of an idle Emacs, but may fail on some network file systems; set
2409notification is not supported. The default value is nil. 2411notification is not supported. The default value is nil.
2410 2412
2411+++ 2413+++
2412*** New variable 'buffer-auto-revert-by-notification' 2414*** New variable 'buffer-auto-revert-by-notification'.
2413A major mode can declare that notification on the buffer's default 2415A major mode can declare that notification on the buffer's default
2414directory is sufficient to know when updates are required, by setting 2416directory is sufficient to know when updates are required, by setting
2415the new variable 'buffer-auto-revert-by-notification' to a non-nil 2417the new variable 'buffer-auto-revert-by-notification' to a non-nil
@@ -2546,6 +2548,7 @@ if you set 'time-stamp-format' or 'time-stamp-pattern' with a
2546file-local variable, you may need to update the value. 2548file-local variable, you may need to update the value.
2547 2549
2548** mode-local 2550** mode-local
2551
2549--- 2552---
2550*** Declare 'define-overload' and 'define-child-mode' as obsolete. 2553*** Declare 'define-overload' and 'define-child-mode' as obsolete.
2551 2554
@@ -2560,13 +2563,38 @@ To do this, use 'c-toggle-comment-style', if needed, to set the desired
2560default comment style (block or line); then set the user option 2563default comment style (block or line); then set the user option
2561'c-mark-wrong-style-of-comment' to non-nil. 2564'c-mark-wrong-style-of-comment' to non-nil.
2562 2565
2566** Mailcap
2567
2568---
2569*** The new function 'mailcap-file-name-to-mime-type' has been added.
2570It's a simple convenience function for looking up MIME types based on
2571file name extensions.
2572
2573---
2574*** The default way the list of possible external viewers for MIME
2575types is sorted and chosen has changed. Earlier, the most specific
2576viewer was chosen, even if there was a general override in "~/.mailcap".
2577For instance, if "/etc/mailcap" has an entry for "image/gif", that one
2578will be chosen even if you have an entry for "image/*" in your
2579"~/.mailcap" file. But with the new method, entries from "~/.mailcap"
2580overrides all system and Emacs-provided defaults. To get the old
2581method back, set 'mailcap-prefer-mailcap-viewers' to nil.
2582
2583** URL
2584
2585---
2586*** The 'file:' handler no longer looks for "index.html" in
2587directories if you ask it for a "file:///dir" URL. Since this is a
2588low-level library, such decisions (if they are to be made at all) are
2589left to higher-level functions.
2590
2563 2591
2564* New Modes and Packages in Emacs 27.1 2592* New Modes and Packages in Emacs 27.1
2565 2593
2566** Tab Bars 2594** Tab Bars
2567 2595
2568+++ 2596+++
2569*** Tab Bar mode. 2597*** Tab Bar mode
2570The new command 'tab-bar-mode' enables the tab bar at the top of each 2598The new command 'tab-bar-mode' enables the tab bar at the top of each
2571frame, where you can use tabs to switch between named persistent 2599frame, where you can use tabs to switch between named persistent
2572window configurations. 2600window configurations.
@@ -2749,43 +2777,48 @@ fixnum for such arguments.
2749 2777
2750--- 2778---
2751** Some functions and variables obsolete since Emacs 22 have been removed: 2779** Some functions and variables obsolete since Emacs 22 have been removed:
2752archive-mouse-extract, assoc-ignore-case, assoc-ignore-representation, 2780'archive-mouse-extract', 'assoc-ignore-case', 'assoc-ignore-representation',
2753backward-text-line, blink-cursor, bookmark-exit-hooks, 2781'backward-text-line', 'blink-cursor', 'bookmark-exit-hooks',
2754c-opt-op-identitier-prefix, comint-use-prompt-regexp-instead-of-fields, 2782'c-opt-op-identitier-prefix', 'comint-use-prompt-regexp-instead-of-fields',
2755compilation-finish-function, count-text-lines, cperl-vc-header-alist, 2783'compilation-finish-function', 'count-text-lines', 'cperl-vc-header-alist',
2756custom-face-save-command, cvs-display-full-path, cvs-fileinfo->full-path, 2784'custom-face-save-command', 'cvs-display-full-path', 'cvs-fileinfo->full-path',
2757delete-frame-hook, derived-mode-class, describe-char-after, describe-project, 2785'delete-frame-hook', 'derived-mode-class', 'describe-char-after',
2758desktop-basefilename, desktop-buffer-handlers, desktop-buffer-misc-functions, 2786'describe-project', 'desktop-basefilename', 'desktop-buffer-handlers',
2759desktop-buffer-modes-to-save, desktop-enable, desktop-load-default, 2787'desktop-buffer-misc-functions', 'desktop-buffer-modes-to-save',
2760dired-omit-files-p, disabled-command-hook, dungeon-mode-map, 2788'desktop-enable', 'desktop-load-default', 'dired-omit-files-p',
2761electric-nroff-mode, electric-nroff-newline, electric-perl-terminator, 2789'disabled-command-hook', 'dungeon-mode-map', 'electric-nroff-mode',
2762focus-frame, forward-text-line, generic-define-mswindows-modes, 2790'electric-nroff-newline', 'electric-perl-terminator', 'focus-frame',
2763generic-define-unix-modes, generic-font-lock-defaults, goto-address-at-mouse, 2791'forward-text-line', 'generic-define-mswindows-modes',
2764highlight-changes-colours, ibuffer-elide-long-columns, ibuffer-hooks, 2792'generic-define-unix-modes', 'generic-font-lock-defaults',
2765ibuffer-mode-hooks, icalendar-convert-diary-to-ical, 2793'goto-address-at-mouse', 'highlight-changes-colours',
2766icalendar-extract-ical-from-buffer, imenu-always-use-completion-buffer-p, 2794'ibuffer-elide-long-columns', 'ibuffer-hooks', 'ibuffer-mode-hooks',
2767ipconfig-program, ipconfig-program-options, isearch-lazy-highlight-cleanup, 2795'icalendar-convert-diary-to-ical', 'icalendar-extract-ical-from-buffer',
2768isearch-lazy-highlight-initial-delay, isearch-lazy-highlight-interval, 2796'imenu-always-use-completion-buffer-p', 'ipconfig-program',
2769isearch-lazy-highlight-max-at-a-time, iswitchb-use-fonts, 2797'ipconfig-program-options', 'isearch-lazy-highlight-cleanup',
2770latin1-char-displayable-p, mouse-wheel-click-button, mouse-wheel-down-button, 2798'isearch-lazy-highlight-initial-delay', 'isearch-lazy-highlight-interval',
2771mouse-wheel-up-button, new-frame, pascal-outline, process-kill-without-query, 2799'isearch-lazy-highlight-max-at-a-time', 'iswitchb-use-fonts',
2772recentf-menu-append-commands-p, rmail-pop-password, 2800'latin1-char-displayable-p', 'mouse-wheel-click-button',
2773rmail-pop-password-required, savehist-load, set-default-font, 2801'mouse-wheel-down-button', 'mouse-wheel-up-button', 'new-frame',
2774spam-list-of-processors, speedbar-add-ignored-path-regexp, 2802'pascal-outline', 'process-kill-without-query',
2775speedbar-buffers-line-path, speedbar-ignored-path-expressions, 2803'recentf-menu-append-commands-p', 'rmail-pop-password',
2776speedbar-ignored-path-regexp, speedbar-line-path, speedbar-path-line, 2804'rmail-pop-password-required', 'savehist-load', 'set-default-font',
2777timer-set-time-with-usecs, tooltip-gud-display, tooltip-gud-modes, 2805'spam-list-of-processors', 'speedbar-add-ignored-path-regexp',
2778tooltip-gud-toggle-dereference, unfocus-frame, unload-hook-features-list, 2806'speedbar-buffers-line-path', 'speedbar-ignored-path-expressions',
2779update-autoloads-from-directories, vc-comment-ring, vc-comment-ring-index, 2807'speedbar-ignored-path-regexp', 'speedbar-line-path', 'speedbar-path-line',
2780vc-comment-search-forward, vc-comment-search-reverse, vc-comment-to-change-log, 2808'timer-set-time-with-usecs', 'tooltip-gud-display', 'tooltip-gud-modes',
2781vc-diff-switches-list, vc-next-comment, vc-previous-comment, view-todo, 2809'tooltip-gud-toggle-dereference', 'unfocus-frame', 'unload-hook-features-list',
2782x-lost-selection-hooks, x-sent-selection-hooks. 2810'update-autoloads-from-directories', 'vc-comment-ring', 'vc-comment-ring-index',
2811'vc-comment-search-forward', 'vc-comment-search-reverse',
2812'vc-comment-to-change-log', 'vc-diff-switches-list', 'vc-next-comment',
2813'vc-previous-comment', 'view-todo', 'x-lost-selection-hooks',
2814'x-sent-selection-hooks'.
2783 2815
2784--- 2816---
2785** Further functions and variables obsolete since Emacs 24 have been removed: 2817** Further functions and variables obsolete since Emacs 24 have been removed:
2786default-directory-alist, dired-default-directory, 2818'default-directory-alist', 'dired-default-directory',
2787dired-default-directory-alist, dired-enable-local-variables, 2819'dired-default-directory-alist', 'dired-enable-local-variables',
2788dired-hack-local-variables, dired-local-variables-file, dired-omit-here-always. 2820'dired-hack-local-variables', 'dired-local-variables-file',
2821'dired-omit-here-always'.
2789 2822
2790+++ 2823+++
2791** Garbage collection no longer treats miscellaneous objects specially; 2824** Garbage collection no longer treats miscellaneous objects specially;
@@ -2864,6 +2897,20 @@ where it scales the image under the mouse pointer.
2864** 'help-follow-symbol' now signals 'user-error' if point (or the 2897** 'help-follow-symbol' now signals 'user-error' if point (or the
2865position pointed to by the argument POS) is not in a symbol. 2898position pointed to by the argument POS) is not in a symbol.
2866 2899
2900---
2901** The options.el library has been removed.
2902It was obsolete since Emacs 22.1, replaced by customize.
2903
2904---
2905** The tls.el and starttls.el libraries are now marked obsolete.
2906Use of built-in libgnutls based functionality (described in the Emacs
2907GnuTLS manual) is recommended instead.
2908
2909---
2910** The url-ns.el library is now marked obsolete.
2911This library is used to open configuration files for the long defunct
2912web browser Netscape, and is no longer relevant.
2913
2867 2914
2868* Lisp Changes in Emacs 27.1 2915* Lisp Changes in Emacs 27.1
2869 2916
@@ -3062,12 +3109,12 @@ informational messages that look pleasing during the Emacs build.
3062 3109
3063--- 3110---
3064** New 'help-fns-describe-variable-functions' hook. 3111** New 'help-fns-describe-variable-functions' hook.
3065Makes it possible to add metadata information to 'describe-variable'. 3112It makes it possible to add metadata information to 'describe-variable'.
3066 3113
3067** i18n (internationalization) 3114** i18n (internationalization)
3068 3115
3069--- 3116---
3070*** ngettext can be used now to return the right plural form 3117*** 'ngettext' can be used now to return the right plural form
3071according to the given numeric value. 3118according to the given numeric value.
3072 3119
3073+++ 3120+++
@@ -3080,7 +3127,7 @@ according to the given numeric value.
3080** 'lookup-key' can take a list of keymaps as argument. 3127** 'lookup-key' can take a list of keymaps as argument.
3081 3128
3082+++ 3129+++
3083** 'condition-case' now accepts 't' to match any error symbol. 3130** 'condition-case' now accepts t to match any error symbol.
3084 3131
3085+++ 3132+++
3086** New function 'proper-list-p'. 3133** New function 'proper-list-p'.
@@ -3152,7 +3199,7 @@ are unaffected by these changes.
3152 3199
3153In addition, a number of functions now allow the caller to detect what 3200In addition, a number of functions now allow the caller to detect what
3154has changed since last redisplay: 'window-old-buffer' returns for any 3201has changed since last redisplay: 'window-old-buffer' returns for any
3155window the buffer it showed at that time. ‘old-selected-window’ and 3202window the buffer it showed at that time. 'old-selected-window' and
3156'old-selected-frame' return the window and frame that were selected 3203'old-selected-frame' return the window and frame that were selected
3157during last redisplay. 'window-old-pixel-width' (renamed from 3204during last redisplay. 'window-old-pixel-width' (renamed from
3158'window-pixel-width-before-size-change'), 'window-old-pixel-height' 3205'window-pixel-width-before-size-change'), 'window-old-pixel-height'
@@ -3317,36 +3364,6 @@ If the new optional ALLOW-PARTIAL argument is passed, then the data
3317that was decompressed successfully before failing will be inserted 3364that was decompressed successfully before failing will be inserted
3318into the buffer. 3365into the buffer.
3319 3366
3320** Mailcap
3321
3322---
3323*** The new function 'mailcap-file-name-to-mime-type' has been added.
3324It's a simple convenience function for looking up MIME types based on
3325file name extensions.
3326
3327---
3328*** The default way the list of possible external viewers for MIME
3329types is sorted and chosen has changed. Earlier, the most specific
3330viewer was chosen, even if there was a general override in "~/.mailcap".
3331For instance, if "/etc/mailcap" has an entry for "image/gif", that one
3332will be chosen even if you have an entry for "image/*" in your
3333"~/.mailcap" file. But with the new method, entries from "~/.mailcap"
3334overrides all system and Emacs-provided defaults. To get the old
3335method back, set 'mailcap-prefer-mailcap-viewers' to nil.
3336
3337** URL
3338
3339---
3340*** The 'file:' handler no longer looks for "index.html" in
3341directories if you ask it for a "file:///dir" URL. Since this is a
3342low-level library, such decisions (if they are to be made at all) are
3343left to higher-level functions.
3344
3345---
3346** The url-ns.el library is now marked obsolete.
3347This library is used to open configuration files for the long defunct
3348web browser Netscape, and is no longer relevant.
3349
3350** Image mode 3367** Image mode
3351 3368
3352--- 3369---
@@ -3465,7 +3482,7 @@ case.
3465It is a convenient and readable way to specify a regexp that should 3482It is a convenient and readable way to specify a regexp that should
3466not match anything, and is as fast as any such regexp can be. 3483not match anything, and is as fast as any such regexp can be.
3467 3484
3468++++ 3485+++
3469** New functions to handle the URL variant of base-64 encoding. 3486** New functions to handle the URL variant of base-64 encoding.
3470New functions 'base64url-encode-string' and 'base64url-encode-region' 3487New functions 'base64url-encode-string' and 'base64url-encode-region'
3471implement the url-variant of base-64 encoding as defined in RFC4648. 3488implement the url-variant of base-64 encoding as defined in RFC4648.
@@ -3479,7 +3496,7 @@ encoding.
3479The new third argument is a string put between the number and unit; it 3496The new third argument is a string put between the number and unit; it
3480defaults to the empty string. The new fourth argument is a string 3497defaults to the empty string. The new fourth argument is a string
3481representing the unit to use; it defaults to "B" when the second 3498representing the unit to use; it defaults to "B" when the second
3482argument is 'iec' and the empty string otherwise. We recomment a 3499argument is 'iec' and the empty string otherwise. We recommend a
3483space or non-breaking space as third argument, and "B" as fourth 3500space or non-breaking space as third argument, and "B" as fourth
3484argument, circumstances allowing. 3501argument, circumstances allowing.
3485 3502
@@ -3538,7 +3555,7 @@ ordinary keys, function keys and mouse clicks. This allows using them
3538in their standard macOS way for composing characters. 3555in their standard macOS way for composing characters.
3539 3556
3540** The special handling of 'frame-title-format' on NS where setting it 3557** The special handling of 'frame-title-format' on NS where setting it
3541to 't' would enable the macOS proxy icon has been replaced with a 3558to t would enable the macOS proxy icon has been replaced with a
3542separate variable, 'ns-use-proxy-icon'. 'frame-title-format' will now 3559separate variable, 'ns-use-proxy-icon'. 'frame-title-format' will now
3543work as on other platforms. 3560work as on other platforms.
3544 3561
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 59d389dc630..0069c1744dc 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -992,7 +992,14 @@ command with a prefix argument (the value does not matter)."
992 (ignore-errors (dired-remove-entry new-file)) 992 (ignore-errors (dired-remove-entry new-file))
993 (goto-char start) 993 (goto-char start)
994 ;; Now replace the current line with an entry for NEW-FILE. 994 ;; Now replace the current line with an entry for NEW-FILE.
995 (dired-update-file-line new-file) nil) 995 ;; But don't remove the current line if either FROM-FILE or
996 ;; NEW-FILE is a directory, because compressing/uncompressing
997 ;; directories doesn't remove the original.
998 (if (or (file-directory-p from-file)
999 (file-directory-p new-file))
1000 (dired-add-entry new-file nil t)
1001 (dired-update-file-line new-file))
1002 nil)
996 (dired-log (concat "Failed to (un)compress " from-file)) 1003 (dired-log (concat "Failed to (un)compress " from-file))
997 from-file))) 1004 from-file)))
998 1005
@@ -1020,8 +1027,9 @@ command with a prefix argument (the value does not matter)."
1020 ("\\.7z\\'" "" "7z x -aoa -o%o %i") 1027 ("\\.7z\\'" "" "7z x -aoa -o%o %i")
1021 ;; This item controls naming for compression. 1028 ;; This item controls naming for compression.
1022 ("\\.tar\\'" ".tgz" nil) 1029 ("\\.tar\\'" ".tgz" nil)
1023 ;; This item controls the compression of directories 1030 ;; This item controls the compression of directories. Its REGEXP
1024 (":" ".tar.gz" "tar -cf - %i | gzip -c9 > %o")) 1031 ;; element should never match any valid file name.
1032 ("\000" ".tar.gz" "tar -cf - %i | gzip -c9 > %o"))
1025 "Control changes in file name suffixes for compression and uncompression. 1033 "Control changes in file name suffixes for compression and uncompression.
1026Each element specifies one transformation rule, and has the form: 1034Each element specifies one transformation rule, and has the form:
1027 (REGEXP NEW-SUFFIX PROGRAM) 1035 (REGEXP NEW-SUFFIX PROGRAM)
@@ -1145,7 +1153,7 @@ Return nil if no change in files."
1145 (condition-case nil 1153 (condition-case nil
1146 (if (file-directory-p file) 1154 (if (file-directory-p file)
1147 (progn 1155 (progn
1148 (setq suffix (cdr (assoc ":" dired-compress-file-suffixes))) 1156 (setq suffix (cdr (assoc "\000" dired-compress-file-suffixes)))
1149 (when suffix 1157 (when suffix
1150 (let ((out-name (concat file (car suffix))) 1158 (let ((out-name (concat file (car suffix)))
1151 (default-directory (file-name-directory file))) 1159 (default-directory (file-name-directory file)))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 22bac9ce459..a7c9b34d29d 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1330,8 +1330,7 @@ entry does not exist, return nil."
1330 t)) 1330 t))
1331 1331
1332;; This function bypasses the file name handler approach. It is NOT 1332;; This function bypasses the file name handler approach. It is NOT
1333;; recommended to use it in any package if not absolutely necessary, 1333;; recommended to use it in any package if not absolutely necessary.
1334;; because it won't work for remote file names not supported by Tramp.
1335;; However, it is more performant than `file-local-name', and might be 1334;; However, it is more performant than `file-local-name', and might be
1336;; useful where performance matters, like in operations over a bulk 1335;; useful where performance matters, like in operations over a bulk
1337;; list of file names. 1336;; list of file names.
@@ -1339,16 +1338,14 @@ entry does not exist, return nil."
1339 "Return the local name component of NAME. 1338 "Return the local name component of NAME.
1340This function removes from NAME the specification of the remote 1339This function removes from NAME the specification of the remote
1341host and the method of accessing the host, leaving only the part 1340host and the method of accessing the host, leaving only the part
1342that identifies NAME locally on the remote system. NAME must be 1341that identifies NAME locally on the remote system. If NAME does
1343a string that matches `tramp-file-name-regexp'. If NAME does not 1342not match `tramp-file-name-regexp', just `file-local-name' is
1344match `tramp-file-name-regexp', just NAME is returned. The 1343called. The returned file name can be used directly as argument
1345returned file name can be used directly as argument of 1344of `process-file', `start-file-process', or `shell-command'."
1346`process-file', `start-file-process', or `shell-command'." 1345 (or (and (tramp-tramp-file-p name)
1347 (save-match-data 1346 (string-match (nth 0 tramp-file-name-structure) name)
1348 (or (and (tramp-tramp-file-p name) 1347 (match-string (nth 4 tramp-file-name-structure) name))
1349 (string-match (nth 0 tramp-file-name-structure) name) 1348 (tramp-compat-file-local-name name)))
1350 (match-string (nth 4 tramp-file-name-structure) name))
1351 name)))
1352 1349
1353;; The localname can be quoted with "/:". Extract this. 1350;; The localname can be quoted with "/:". Extract this.
1354(defun tramp-unquote-file-local-name (name) 1351(defun tramp-unquote-file-local-name (name)
diff --git a/lisp/progmodes/cc-menus.el b/lisp/progmodes/cc-menus.el
index 9c8c7ab56f5..97037dea6e8 100644
--- a/lisp/progmodes/cc-menus.el
+++ b/lisp/progmodes/cc-menus.el
@@ -45,6 +45,7 @@
45(cc-bytecomp-defvar imenu-case-fold-search) 45(cc-bytecomp-defvar imenu-case-fold-search)
46(cc-bytecomp-defvar imenu-generic-expression) 46(cc-bytecomp-defvar imenu-generic-expression)
47(cc-bytecomp-defvar imenu-create-index-function) 47(cc-bytecomp-defvar imenu-create-index-function)
48(cc-bytecomp-defun c-literal-limits)
48 49
49 50
50;; imenu integration 51;; imenu integration
@@ -437,55 +438,56 @@ Example:
437 (goto-char (point-max)) 438 (goto-char (point-max))
438 ;; 439 ;;
439 (while (re-search-backward cc-imenu-objc-generic-expression nil t) 440 (while (re-search-backward cc-imenu-objc-generic-expression nil t)
440 (setq langnum (if (match-beginning OBJC) 441 (when (not (c-literal-limits))
441 OBJC 442 (setq langnum (if (match-beginning OBJC)
442 (cond 443 OBJC
443 ((match-beginning Cproto) Cproto) 444 (cond
444 ((match-beginning Cgeneralfunc) Cgeneralfunc) 445 ((match-beginning Cproto) Cproto)
445 ((match-beginning Cnoreturn) Cnoreturn)))) 446 ((match-beginning Cgeneralfunc) Cgeneralfunc)
446 (setq str (funcall func (match-beginning langnum) (match-end langnum))) 447 ((match-beginning Cnoreturn) Cnoreturn))))
447 ;; 448 (setq str (funcall func (match-beginning langnum) (match-end langnum)))
448 (cond 449 ;;
449 ;;
450 ;; C
451 ;;
452 ((not (eq langnum OBJC))
453 (setq clist (cons (cons str (match-beginning langnum)) clist)))
454 ;;
455 ;; ObjC
456 ;;
457 ;; An instance Method
458 ((eq (aref str 0) ?-)
459 (setq str (concat "-" (cc-imenu-objc-method-to-selector str)))
460 (setq methodlist (cons (cons str
461 (match-beginning langnum))
462 methodlist)))
463 ;; A factory Method
464 ((eq (aref str 0) ?+)
465 (setq str (concat "+" (cc-imenu-objc-method-to-selector str)))
466 (setq methodlist (cons (cons str
467 (match-beginning langnum))
468 methodlist)))
469 ;; Interface or implementation or protocol
470 ((eq (aref str 0) ?@)
471 (setq classcount (1+ classcount))
472 (cond 450 (cond
473 ((and (> (length str) implen) 451 ;;
474 (string= (substring str 0 implen) "@implementation")) 452 ;; C
475 (setq str (substring str implen) 453 ;;
476 str2 "@implementation")) 454 ((not (eq langnum OBJC))
477 ((string= (substring str 0 intflen) "@interface") 455 (setq clist (cons (cons str (match-beginning langnum)) clist)))
478 (setq str (substring str intflen) 456 ;;
479 str2 "@interface")) 457 ;; ObjC
480 ((string= (substring str 0 prtlen) "@protocol") 458 ;;
481 (setq str (substring str prtlen) 459 ;; An instance Method
482 str2 "@protocol"))) 460 ((eq (aref str 0) ?-)
483 (setq str (cc-imenu-objc-remove-white-space str)) 461 (setq str (concat "-" (cc-imenu-objc-method-to-selector str)))
484 (setq methodlist (cons (cons str2 462 (setq methodlist (cons (cons str
485 (match-beginning langnum)) 463 (match-beginning langnum))
486 methodlist)) 464 methodlist)))
487 (setq toplist (cons (cons str methodlist) toplist) 465 ;; A factory Method
488 methodlist nil)))) 466 ((eq (aref str 0) ?+)
467 (setq str (concat "+" (cc-imenu-objc-method-to-selector str)))
468 (setq methodlist (cons (cons str
469 (match-beginning langnum))
470 methodlist)))
471 ;; Interface or implementation or protocol
472 ((eq (aref str 0) ?@)
473 (setq classcount (1+ classcount))
474 (cond
475 ((and (> (length str) implen)
476 (string= (substring str 0 implen) "@implementation"))
477 (setq str (substring str implen)
478 str2 "@implementation"))
479 ((string= (substring str 0 intflen) "@interface")
480 (setq str (substring str intflen)
481 str2 "@interface"))
482 ((string= (substring str 0 prtlen) "@protocol")
483 (setq str (substring str prtlen)
484 str2 "@protocol")))
485 (setq str (cc-imenu-objc-remove-white-space str))
486 (setq methodlist (cons (cons str2
487 (match-beginning langnum))
488 methodlist))
489 (setq toplist (cons (cons str methodlist) toplist)
490 methodlist nil)))))
489 491
490 ;; In this buffer, there is only one or zero @{interface|implementation|protocol}. 492 ;; In this buffer, there is only one or zero @{interface|implementation|protocol}.
491 (if (< classcount 2) 493 (if (< classcount 2)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index a8ca6f8fbec..4fbcd08506b 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1218,6 +1218,9 @@ IGNORES is a list of glob patterns for files to ignore."
1218 #'xref-matches-in-directory 1218 #'xref-matches-in-directory
1219 "27.1") 1219 "27.1")
1220 1220
1221(declare-function tramp-tramp-file-p "tramp")
1222(declare-function tramp-file-local-name "tramp")
1223
1221;;;###autoload 1224;;;###autoload
1222(defun xref-matches-in-files (regexp files) 1225(defun xref-matches-in-files (regexp files)
1223 "Find all matches for REGEXP in FILES. 1226 "Find all matches for REGEXP in FILES.
@@ -1240,7 +1243,12 @@ FILES must be a list of absolute file names."
1240 "") 1243 "")
1241 (shell-quote-argument (xref--regexp-to-extended regexp))))) 1244 (shell-quote-argument (xref--regexp-to-extended regexp)))))
1242 (when remote-id 1245 (when remote-id
1243 (setq files (mapcar #'file-local-name files))) 1246 (require 'tramp)
1247 (setq files (mapcar
1248 (if (tramp-tramp-file-p dir)
1249 #'tramp-file-local-name
1250 #'file-local-name)
1251 files)))
1244 (with-current-buffer output 1252 (with-current-buffer output
1245 (erase-buffer) 1253 (erase-buffer)
1246 (with-temp-buffer 1254 (with-temp-buffer
diff --git a/src/image.c b/src/image.c
index b4ce08eeb3c..d3fec37186c 100644
--- a/src/image.c
+++ b/src/image.c
@@ -1242,6 +1242,10 @@ prepare_image_for_display (struct frame *f, struct image *img)
1242 if (img->cr_data == NULL || (cairo_pattern_get_type (img->cr_data) 1242 if (img->cr_data == NULL || (cairo_pattern_get_type (img->cr_data)
1243 != CAIRO_PATTERN_TYPE_SURFACE)) 1243 != CAIRO_PATTERN_TYPE_SURFACE))
1244 { 1244 {
1245 /* Fill in the background/background_transparent field while
1246 we have img->pixmap->data/img->mask->data. */
1247 IMAGE_BACKGROUND (img, f, img->pixmap);
1248 IMAGE_BACKGROUND_TRANSPARENT (img, f, img->mask);
1245 cr_put_image_to_cr_data (img); 1249 cr_put_image_to_cr_data (img);
1246 if (img->cr_data == NULL) 1250 if (img->cr_data == NULL)
1247 { 1251 {
diff --git a/src/systhread.c b/src/systhread.c
index c3e4e6a2c5a..2c3a060a17e 100644
--- a/src/systhread.c
+++ b/src/systhread.c
@@ -98,10 +98,6 @@ sys_thread_yield (void)
98 98
99#include <sched.h> 99#include <sched.h>
100 100
101#ifdef HAVE_SYS_PRCTL_H
102#include <sys/prctl.h>
103#endif
104
105void 101void
106sys_mutex_init (sys_mutex_t *mutex) 102sys_mutex_init (sys_mutex_t *mutex)
107{ 103{
@@ -204,9 +200,28 @@ sys_thread_equal (sys_thread_t t, sys_thread_t u)
204 return pthread_equal (t, u); 200 return pthread_equal (t, u);
205} 201}
206 202
203void
204sys_thread_set_name (const char *name)
205{
206#ifdef HAVE_PTHREAD_SETNAME_NP
207 /* We need to truncate here otherwise pthread_setname_np
208 fails to set the name. TASK_COMM_LEN is what the length
209 is called in the Linux kernel headers (Bug#38632). */
210#define TASK_COMM_LEN 16
211 char p_name[TASK_COMM_LEN];
212 strncpy (p_name, name, TASK_COMM_LEN - 1);
213 p_name[TASK_COMM_LEN - 1] = '\0';
214 #ifdef HAVE_PTHREAD_SETNAME_NP_1ARG
215 pthread_setname_np (p_name);
216 #else
217 pthread_setname_np (pthread_self (), p_name);
218 #endif
219#endif
220}
221
207bool 222bool
208sys_thread_create (sys_thread_t *thread_ptr, const char *name, 223sys_thread_create (sys_thread_t *thread_ptr, thread_creation_function *func,
209 thread_creation_function *func, void *arg) 224 void *arg)
210{ 225{
211 pthread_attr_t attr; 226 pthread_attr_t attr;
212 bool result = false; 227 bool result = false;
@@ -225,13 +240,7 @@ sys_thread_create (sys_thread_t *thread_ptr, const char *name,
225 } 240 }
226 241
227 if (!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)) 242 if (!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED))
228 { 243 result = pthread_create (thread_ptr, &attr, func, arg) == 0;
229 result = pthread_create (thread_ptr, &attr, func, arg) == 0;
230#if defined (HAVE_SYS_PRCTL_H) && defined (HAVE_PRCTL) && defined (PR_SET_NAME)
231 if (result && name != NULL)
232 prctl (PR_SET_NAME, name);
233#endif
234 }
235 244
236 out: ; 245 out: ;
237 int error = pthread_attr_destroy (&attr); 246 int error = pthread_attr_destroy (&attr);
@@ -452,26 +461,24 @@ w32_set_thread_name (DWORD thread_id, const char *name)
452 461
453static thread_creation_function *thread_start_address; 462static thread_creation_function *thread_start_address;
454 463
464void
465sys_thread_set_name (const char *name)
466{
467 w32_set_thread_name (GetCurrentThreadId (), name);
468}
469
455/* _beginthread wants a void function, while we are passed a function 470/* _beginthread wants a void function, while we are passed a function
456 that returns a pointer. So we use a wrapper. See the command in 471 that returns a pointer. So we use a wrapper. See the command in
457 w32term.h about the need for ALIGN_STACK attribute. */ 472 w32term.h about the need for ALIGN_STACK attribute. */
458static void ALIGN_STACK 473static void ALIGN_STACK
459w32_beginthread_wrapper (void *arg) 474w32_beginthread_wrapper (void *arg)
460{ 475{
461 /* FIXME: This isn't very clean: systhread.c is not supposed to know
462 that ARG is a pointer to a thread_state object, or be familiar
463 with thread_state object's structure in general. */
464 struct thread_state *this_thread = arg;
465
466 if (this_thread->thread_name)
467 w32_set_thread_name (GetCurrentThreadId (), this_thread->thread_name);
468
469 (void)thread_start_address (arg); 476 (void)thread_start_address (arg);
470} 477}
471 478
472bool 479bool
473sys_thread_create (sys_thread_t *thread_ptr, const char *name, 480sys_thread_create (sys_thread_t *thread_ptr, thread_creation_function *func,
474 thread_creation_function *func, void *arg) 481 void *arg)
475{ 482{
476 /* FIXME: Do threads that run Lisp require some minimum amount of 483 /* FIXME: Do threads that run Lisp require some minimum amount of
477 stack? Zero here means each thread will get the same amount as 484 stack? Zero here means each thread will get the same amount as
diff --git a/src/systhread.h b/src/systhread.h
index 5368acfb52c..005388fd5a4 100644
--- a/src/systhread.h
+++ b/src/systhread.h
@@ -112,10 +112,11 @@ extern sys_thread_t sys_thread_self (void)
112extern bool sys_thread_equal (sys_thread_t, sys_thread_t) 112extern bool sys_thread_equal (sys_thread_t, sys_thread_t)
113 ATTRIBUTE_WARN_UNUSED_RESULT; 113 ATTRIBUTE_WARN_UNUSED_RESULT;
114 114
115extern bool sys_thread_create (sys_thread_t *, const char *, 115extern bool sys_thread_create (sys_thread_t *, thread_creation_function *,
116 thread_creation_function *, void *) 116 void *)
117 ATTRIBUTE_WARN_UNUSED_RESULT; 117 ATTRIBUTE_WARN_UNUSED_RESULT;
118 118
119extern void sys_thread_yield (void); 119extern void sys_thread_yield (void);
120extern void sys_thread_set_name (const char *);
120 121
121#endif /* SYSTHREAD_H */ 122#endif /* SYSTHREAD_H */
diff --git a/src/thread.c b/src/thread.c
index f81163414bb..c7fe0614269 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -725,6 +725,9 @@ run_thread (void *state)
725 self->m_stack_bottom = self->stack_top = (char *) &stack_pos; 725 self->m_stack_bottom = self->stack_top = (char *) &stack_pos;
726 self->thread_id = sys_thread_self (); 726 self->thread_id = sys_thread_self ();
727 727
728 if (self->thread_name)
729 sys_thread_set_name (self->thread_name);
730
728 acquire_global_lock (self); 731 acquire_global_lock (self);
729 732
730 /* Put a dummy catcher at top-level so that handlerlist is never NULL. 733 /* Put a dummy catcher at top-level so that handlerlist is never NULL.
@@ -826,13 +829,13 @@ If NAME is given, it must be a string; it names the new thread. */)
826 new_thread->next_thread = all_threads; 829 new_thread->next_thread = all_threads;
827 all_threads = new_thread; 830 all_threads = new_thread;
828 831
829 char const *c_name = !NILP (name) ? SSDATA (ENCODE_UTF_8 (name)) : NULL; 832 char const *c_name = !NILP (name) ? SSDATA (ENCODE_SYSTEM (name)) : NULL;
830 if (c_name) 833 if (c_name)
831 new_thread->thread_name = xstrdup (c_name); 834 new_thread->thread_name = xstrdup (c_name);
832 else 835 else
833 new_thread->thread_name = NULL; 836 new_thread->thread_name = NULL;
834 sys_thread_t thr; 837 sys_thread_t thr;
835 if (! sys_thread_create (&thr, c_name, run_thread, new_thread)) 838 if (! sys_thread_create (&thr, run_thread, new_thread))
836 { 839 {
837 /* Restore the previous situation. */ 840 /* Restore the previous situation. */
838 all_threads = all_threads->next_thread; 841 all_threads = all_threads->next_thread;
diff --git a/src/thread.h b/src/thread.h
index e96a063a10b..a09929fa440 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -169,8 +169,7 @@ struct thread_state
169 interrupter should broadcast to this condition. */ 169 interrupter should broadcast to this condition. */
170 sys_cond_t *wait_condvar; 170 sys_cond_t *wait_condvar;
171 171
172 /* Thread's name in the locale encoding. Actually used only on 172 /* Thread's name in the locale encoding. */
173 WINDOWSNT. */
174 char *thread_name; 173 char *thread_name;
175 174
176 /* This thread might have released the global lock. If so, this is 175 /* This thread might have released the global lock. If so, this is
diff --git a/src/xdisp.c b/src/xdisp.c
index cc936ff179d..53300928d7b 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -16244,8 +16244,8 @@ set_cursor_from_row (struct window *w, struct glyph_row *row,
16244 bool string_from_text_prop = false; 16244 bool string_from_text_prop = false;
16245 16245
16246 /* Don't even try doing anything if called for a mode-line or 16246 /* Don't even try doing anything if called for a mode-line or
16247 header-line row, since the rest of the code isn't prepared to 16247 header-line or tab-line row, since the rest of the code isn't
16248 deal with such calamities. */ 16248 prepared to deal with such calamities. */
16249 eassert (!row->mode_line_p); 16249 eassert (!row->mode_line_p);
16250 if (row->mode_line_p) 16250 if (row->mode_line_p)
16251 return false; 16251 return false;
@@ -17504,6 +17504,9 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
17504 else 17504 else
17505 { 17505 {
17506 row = MATRIX_ROW (w->current_matrix, w->last_cursor_vpos); 17506 row = MATRIX_ROW (w->current_matrix, w->last_cursor_vpos);
17507 /* Skip the tab-line and header-line rows, if any. */
17508 if (row->tab_line_p)
17509 ++row;
17507 if (row->mode_line_p) 17510 if (row->mode_line_p)
17508 ++row; 17511 ++row;
17509 if (!row->enabled_p) 17512 if (!row->enabled_p)
@@ -17576,6 +17579,9 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
17576 || row->mode_line_p) 17579 || row->mode_line_p)
17577 { 17580 {
17578 row = w->current_matrix->rows; 17581 row = w->current_matrix->rows;
17582 /* Skip the tab-line and header-line rows, if any. */
17583 if (row->tab_line_p)
17584 ++row;
17579 if (row->mode_line_p) 17585 if (row->mode_line_p)
17580 ++row; 17586 ++row;
17581 } 17587 }
@@ -17640,8 +17646,9 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
17640 ; 17646 ;
17641 else if (rc != CURSOR_MOVEMENT_SUCCESS 17647 else if (rc != CURSOR_MOVEMENT_SUCCESS
17642 && MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row) 17648 && MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row)
17643 /* Make sure this isn't a header line by any chance, since 17649 /* Make sure this isn't a header line nor a tab-line by
17644 then MATRIX_ROW_PARTIALLY_VISIBLE_P might yield true. */ 17650 any chance, since then MATRIX_ROW_PARTIALLY_VISIBLE_P
17651 might yield true. */
17645 && !row->mode_line_p 17652 && !row->mode_line_p
17646 && !cursor_row_fully_visible_p (w, true, true, true)) 17653 && !cursor_row_fully_visible_p (w, true, true, true))
17647 { 17654 {
@@ -18769,11 +18776,14 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
18769 } 18776 }
18770 } 18777 }
18771 /* Finally, fall back on the first row of the window after the 18778 /* Finally, fall back on the first row of the window after the
18772 header line (if any). This is slightly better than not 18779 tab-line and header line (if any). This is slightly better
18773 displaying the cursor at all. */ 18780 than not displaying the cursor at all. */
18774 if (!row) 18781 if (!row)
18775 { 18782 {
18776 row = matrix->rows; 18783 row = matrix->rows;
18784 /* Skip the tab-line and header-line rows, if any. */
18785 if (row->tab_line_p)
18786 ++row;
18777 if (row->mode_line_p) 18787 if (row->mode_line_p)
18778 ++row; 18788 ++row;
18779 } 18789 }
@@ -19787,7 +19797,9 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
19787 ptrdiff_t mindif = BUF_ZV (XBUFFER (w->contents)) + 1; 19797 ptrdiff_t mindif = BUF_ZV (XBUFFER (w->contents)) + 1;
19788 int last_y; 19798 int last_y;
19789 19799
19790 /* If we happen to start on a header-line, skip that. */ 19800 /* If we happen to start on a header-line or a tab-line, skip that. */
19801 if (row->tab_line_p)
19802 ++row;
19791 if (row->mode_line_p) 19803 if (row->mode_line_p)
19792 ++row; 19804 ++row;
19793 19805
@@ -22380,7 +22392,7 @@ find_row_edges (struct it *it, struct glyph_row *row,
22380 if (STRINGP (it->object) 22392 if (STRINGP (it->object)
22381 /* this is not the first row */ 22393 /* this is not the first row */
22382 && row > it->w->desired_matrix->rows 22394 && row > it->w->desired_matrix->rows
22383 /* previous row is not the header line */ 22395 /* previous row is not the header line or tab-line */
22384 && !r1->mode_line_p 22396 && !r1->mode_line_p
22385 /* previous row also ends in a newline from a string */ 22397 /* previous row also ends in a newline from a string */
22386 && r1->ends_in_newline_from_string_p) 22398 && r1->ends_in_newline_from_string_p)
diff --git a/src/xfns.c b/src/xfns.c
index d0d5d399dc4..276ea1c3935 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -5089,6 +5089,8 @@ Internal use only, use `display-monitor-attributes-list' instead. */)
5089#elif defined HAVE_GTK3 5089#elif defined HAVE_GTK3
5090 scale = gdk_screen_get_monitor_scale_factor (gscreen, i); 5090 scale = gdk_screen_get_monitor_scale_factor (gscreen, i);
5091#endif 5091#endif
5092 rec.x *= scale;
5093 rec.y *= scale;
5092 rec.width *= scale; 5094 rec.width *= scale;
5093 rec.height *= scale; 5095 rec.height *= scale;
5094 work.x *= scale; 5096 work.x *= scale;
diff --git a/src/xterm.c b/src/xterm.c
index ada3cec1636..21d99f0c7bb 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -8934,6 +8934,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
8934 if (f) 8934 if (f)
8935 x_cr_update_surface_desired_size (f, configureEvent.xconfigure.width, 8935 x_cr_update_surface_desired_size (f, configureEvent.xconfigure.width,
8936 configureEvent.xconfigure.height); 8936 configureEvent.xconfigure.height);
8937 else if (any && configureEvent.xconfigure.window == FRAME_X_WINDOW (any))
8938 x_cr_update_surface_desired_size (any,
8939 configureEvent.xconfigure.width,
8940 configureEvent.xconfigure.height);
8937#endif 8941#endif
8938#ifdef USE_GTK 8942#ifdef USE_GTK
8939 if (!f 8943 if (!f