commit 0047bdeb3393d5d7acbdffd7444370fc3e4d2384 (HEAD, refs/remotes/origin/master) Author: Po Lu Date: Thu Nov 10 13:25:28 2022 +0800 Be a little more paranoid about XI 2.0 implementations * src/xterm.c (xi_populate_device_from_info): (xi_disable_devices): Do not restore valuator values if the valuator info has a mode of Relative and a value of 0.0. diff --git a/src/xterm.c b/src/xterm.c index fd04061436..a175a4a6bb 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -5339,7 +5339,7 @@ xi_populate_device_from_info (struct x_display_info *dpyinfo, struct xi_known_valuator *values, *tem; int actual_valuator_count, c; XIScrollClassInfo *info; - XIValuatorClassInfo *val_info; + XIValuatorClassInfo *valuator_info; #endif #ifdef HAVE_XINPUT2_2 XITouchClassInfo *touch_info; @@ -5450,12 +5450,23 @@ xi_populate_device_from_info (struct x_display_info *dpyinfo, case XIValuatorClass: { - val_info = (XIValuatorClassInfo *) device->classes[c]; + valuator_info = (XIValuatorClassInfo *) device->classes[c]; tem = SAFE_ALLOCA (sizeof *tem); + /* Avoid restoring bogus values if some driver + accidentally specifies relative values in scroll + valuator classes how the input extension spec says they + should be, but allow restoring values when a value is + set, which is how the input extension actually + behaves. */ + + if (valuator_info->value == 0.0 + && valuator_info->mode != XIModeAbsolute) + continue; + tem->next = values; - tem->number = val_info->number; - tem->current_value = val_info->value; + tem->number = valuator_info->number; + tem->current_value = valuator_info->value; values = tem; break; @@ -13182,22 +13193,32 @@ xi_handle_new_classes (struct x_display_info *dpyinfo, struct xi_device_t *devic for (i = 0; i < num_classes; ++i) { - switch (classes[i]->type) - { - case XIValuatorClass: - valuator_info = (XIValuatorClassInfo *) classes[i]; + if (classes[i]->type != XIValuatorClass) + continue; - valuator = xi_get_scroll_valuator (device, - valuator_info->number); - if (valuator) - { - valuator->invalid_p = false; - valuator->current_value = valuator_info->value; - valuator->emacs_value = 0; - } + valuator_info = (XIValuatorClassInfo *) classes[i]; - break; - } + /* Avoid restoring bogus values if some driver accidentally + specifies relative values in scroll valuator classes how the + input extension spec says they should be, but allow restoring + values when a value is set, which is how the input extension + actually behaves. */ + + if (valuator_info->value == 0.0 + && valuator_info->mode != XIModeAbsolute) + continue; + + valuator = xi_get_scroll_valuator (device, + valuator_info->number); + + if (!valuator) + continue; + + valuator->invalid_p = false; + valuator->current_value = valuator_info->value; + valuator->emacs_value = 0; + + break; } } commit ef3627508a65ee750054622fc4557c42c6589e89 Author: Juanma Barranquero Date: Thu Nov 10 01:31:22 2022 +0100 Make 't' in bs-mode be more defensive * lisp/bs.el (bs-visit-tags-table): Verify that the buffer holds a tags-table file before using it as such. This is identical to bug#54133 affecting Buffer-menu, and this fix is copied from the one by Eli Zaretskii in commit 794fbd1c07 of 2022-02-24. Thanks to Bob Rogers for noticing. diff --git a/lisp/bs.el b/lisp/bs.el index aabc2dc558..060bae6fdd 100644 --- a/lisp/bs.el +++ b/lisp/bs.el @@ -823,10 +823,14 @@ Leave Buffer Selection Menu." "Visit the tags table in the buffer on this line. See `visit-tags-table'." (interactive) - (let ((file (buffer-file-name (bs--current-buffer)))) - (if file - (visit-tags-table file) - (error "Specified buffer has no file")))) + (let* ((buf (bs--current-buffer)) + (file (buffer-file-name buf))) + (cond + ((not file) (error "Specified buffer has no file")) + ((and buf (with-current-buffer buf + (etags-verify-tags-table))) + (visit-tags-table file)) + (t (error "Specified buffer is not a tags-table"))))) (defun bs-toggle-current-to-show () "Toggle status of showing flag for buffer in current line." commit 78144156b0fc8c8ed80e6bb04ab27b50eba01d23 Author: Alan Mackenzie Date: Wed Nov 9 21:28:18 2022 +0000 Optimize c-bs-interval, changing its value from 5000 to 2000 * lisp/progmodes/cc-engine.el (c-bs-interval): This optimization speeds forward scrolling in a C Mode buffer by ~2.4%, backward scrolling by ~1.8%. diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index a13a0c838a..0ea722a922 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -6052,7 +6052,7 @@ comment at the start of cc-engine.el for more info." ;; the like. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The approximate interval at which we cache the value of the brace stack. -(defconst c-bs-interval 5000) +(defconst c-bs-interval 2000) ;; The list of cached values of the brace stack. Each value in the list is a ;; cons of the position it is valid for and the value of the stack as ;; described above. commit 60219b1e4ecf1568718eb2c39081f3b410a6756f Author: Juri Linkov Date: Wed Nov 9 19:29:37 2022 +0200 * lisp/tab-bar.el (tab-bar-auto-width): Add selected-frame to the cache key. diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 0e8430fb38..19451b4e72 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -1062,7 +1062,8 @@ tab bar might wrap to the second line when it shouldn't.") (nth 1 tab-bar-auto-width-max))))) (dolist (item tabs) (setf (nth 2 item) - (with-memoization (gethash (cons width (nth 2 item)) + (with-memoization (gethash (list (selected-frame) + width (nth 2 item)) tab-bar--fixed-width-hash) (let* ((name (nth 2 item)) (len (length name)) commit 85b0587a93bdb80c4c304a39cb5ffd3600c95a16 Author: Eli Zaretskii Date: Wed Nov 9 16:25:02 2022 +0200 Avoid assertion violations in matrix_row * src/xdisp.c (cursor_in_mouse_face_p): Avoid rare assertion violations when the cursor's VPOS winds up being invalid for the window. (Bug#59147) diff --git a/src/xdisp.c b/src/xdisp.c index 95da704a07..f6a279636a 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -33564,8 +33564,14 @@ coords_in_mouse_face_p (struct window *w, int hpos, int vpos) bool cursor_in_mouse_face_p (struct window *w) { - int hpos = w->phys_cursor.hpos; int vpos = w->phys_cursor.vpos; + + /* If the cursor is outside the matrix glyph rows, it cannot be + within the mouse face. */ + if (!(0 <= vpos && vpos < w->current_matrix->nrows)) + return false; + + int hpos = w->phys_cursor.hpos; struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); /* When the window is hscrolled, cursor hpos can legitimately be out commit 6d1af1560e3b815d68759921a12bee0c80aa5c39 Author: Stefan Kangas Date: Wed Nov 9 15:10:24 2022 +0100 * lisp/thread.el (thread-list-mode-map): Prefer defvar-keymap. diff --git a/lisp/thread.el b/lisp/thread.el index 1e6e9e75a7..c0cc5feb97 100644 --- a/lisp/thread.el +++ b/lisp/thread.el @@ -58,20 +58,18 @@ An EVENT has the format :type 'number :version "27.1") -(defvar thread-list-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map tabulated-list-mode-map) - (define-key map "b" #'thread-list-pop-to-backtrace) - (define-key map "s" nil) - (define-key map "sq" #'thread-list-send-quit-signal) - (define-key map "se" #'thread-list-send-error-signal) - (easy-menu-define nil map "" - '("Threads" - ["Show backtrace" thread-list-pop-to-backtrace t] - ["Send Quit Signal" thread-list-send-quit-signal t] - ["Send Error Signal" thread-list-send-error-signal t])) - map) - "Local keymap for `thread-list-mode' buffers.") +(defvar-keymap thread-list-mode-map + :doc "Local keymap for `thread-list-mode' buffers." + :parent tabulated-list-mode-map + "b" #'thread-list-pop-to-backtrace + "s" nil + "s q" #'thread-list-send-quit-signal + "s e" #'thread-list-send-error-signal + :menu + '("Threads" + ["Show backtrace" thread-list-pop-to-backtrace t] + ["Send Quit Signal" thread-list-send-quit-signal t] + ["Send Error Signal" thread-list-send-error-signal t])) (define-derived-mode thread-list-mode tabulated-list-mode "Thread-List" "Major mode for monitoring Lisp threads." commit 43db0e2784bfafdb8b08a2f5f075e2d432df132f Author: Stephen Leake Date: Wed Nov 9 06:00:40 2022 -0800 Delete emacs < 26.2 workaround in eglot--apply-text-edits * lisp/progmodes/eglot.el (eglot--apply-text-edits): Delete emacs < 26.2 workaround; fixes bug in ada-mode test. diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index ce989b5611..2eaa396386 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -3095,25 +3095,7 @@ Returns a list as described in docstring of `imenu--index-alist'." (save-excursion (save-restriction (narrow-to-region beg end) - - ;; On emacs versions < 26.2, - ;; `replace-buffer-contents' is buggy - it calls - ;; change functions with invalid arguments - so we - ;; manually call the change functions here. - ;; - ;; See emacs bugs #32237, #32278: - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32237 - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32278 - (let ((inhibit-modification-hooks t) - (length (- end beg)) - (beg (marker-position beg)) - (end (marker-position end))) - (run-hook-with-args 'before-change-functions - beg end) - (replace-buffer-contents temp) - (run-hook-with-args 'after-change-functions - beg (+ beg (length newText)) - length)))) + (replace-buffer-contents temp))) (progress-reporter-update reporter (cl-incf done))))))) (mapcar (eglot--lambda ((TextEdit) range newText) (cons newText (eglot--range-region range 'markers))) commit 7c7e12405b1dbc3b7eb964972ba5d7b258439a14 Author: Eli Zaretskii Date: Wed Nov 9 15:26:42 2022 +0200 ; Fix typos in help.texi * doc/lispref/help.texi (Documentation Groups): Fix typos. Reported by Yuan Fu . (Bug#59136) diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi index 65ad5f0554..ee6fdb0dbb 100644 --- a/doc/lispref/help.texi +++ b/doc/lispref/help.texi @@ -980,8 +980,8 @@ In addition to function descriptions, the list can also have string elements, which are used to divide a documentation group into sections. -@defun shortdoc-add-function shortdoc-add-function group section elem -Lisp packages can add functions to groups with this command. Each +@defun shortdoc-add-function group section elem +Lisp packages can add functions to groups with this function. Each @var{elem} should be a function description, as described above. @var{group} is the function group, and @var{section} is what section in the function group to insert the function into. commit 4bd5ac04a3b11228c8b7a9c7144503267bb8b9b4 Author: F. Jason Park Date: Wed Jul 13 01:54:19 2022 -0700 Teach thing-at-point to recognize bracketed IPv6 URLs * lisp/thingatpt.el (thing-at-point-bounds-of-url-at-point): Allow IPv6 addresses as hosts. Overshoots in the case of bracketed markup but is rescued by `thing-at-point--bounds-of-well-formed-url'. * test/lisp/thingatpt-tests.el (thing-at-point-test-data): Add cases for IPv6 URLs. Bug#56514. diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el index 462f87d3c1..9dda3e1fcb 100644 --- a/lisp/thingatpt.el +++ b/lisp/thingatpt.el @@ -441,7 +441,7 @@ the bounds of a possible ill-formed URI (one lacking a scheme)." ;; Otherwise, find the bounds within which a URI may exist. The ;; method is similar to `ffap-string-at-point'. Note that URIs ;; may contain parentheses but may not contain spaces (RFC3986). - (let* ((allowed-chars "--:=&?$+@-Z_[:alpha:]~#,%;*()!'") + (let* ((allowed-chars "--:=&?$+@-Z_[:alpha:]~#,%;*()!'[]") (skip-before "^[0-9a-zA-Z]") (skip-after ":;.,!?'") (pt (point)) diff --git a/test/lisp/thingatpt-tests.el b/test/lisp/thingatpt-tests.el index b6d0b1446a..67dd00104b 100644 --- a/test/lisp/thingatpt-tests.el +++ b/test/lisp/thingatpt-tests.el @@ -44,6 +44,9 @@ ;; Non alphanumeric characters can be found in URIs ("ftp://example.net/~foo!;#bar=baz&goo=bob" 3 url "ftp://example.net/~foo!;#bar=baz&goo=bob") ("bzr+ssh://user@example.net:5/a%20d,5" 34 url "bzr+ssh://user@example.net:5/a%20d,5") + ;; IPv6 brackets enclosed in [markup] + ("[http://[::1]:8000/foo]" 10 url "http://[::1]:8000/foo") + ("[http://[fe08::7:8%eth0]]" 10 url "http://[fe08::7:8%eth0]") ;; markup ("Url: ..." 8 url "foo://1.example.com") ("Url: ..." 30 url "foo://2.example.com") commit b7e476a3d3023ab954939a68f326616ab970ddda Author: Po Lu Date: Wed Nov 9 21:04:39 2022 +0800 Make the PGTK port display a loud warning when run under X * src/pgtkterm.c (pgtk_display_x_warning): New function. (pgtk_term_init): Call it. diff --git a/src/pgtkterm.c b/src/pgtkterm.c index 3350676e3c..4f3e3697ba 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c @@ -6599,6 +6599,44 @@ pgtk_selection_event (GtkWidget *widget, GdkEvent *event, return FALSE; } +/* Display a warning message if the PGTK port is being used under X; + that is not supported. */ + +static void +pgtk_display_x_warning (GdkDisplay *display) +{ + GtkWidget *dialog_widget, *label, *content_area; + GtkDialog *dialog; + GtkWindow *window; + GdkScreen *screen; + + /* Do this instead of GDK_IS_X11_DISPLAY because the GDK X header + pulls in Xlib, which conflicts with definitions in pgtkgui.h. */ + if (strcmp (G_OBJECT_TYPE_NAME (display), + "GdkX11Display")) + return; + + dialog_widget = gtk_dialog_new (); + dialog = GTK_DIALOG (dialog_widget); + window = GTK_WINDOW (dialog_widget); + screen = gdk_display_get_default_screen (display); + content_area = gtk_dialog_get_content_area (dialog); + + gtk_window_set_title (window, "Warning"); + gtk_window_set_screen (window, screen); + + label = gtk_label_new ("You are trying to run Emacs configured with" + " the \"pure-GTK\" interface under the X Window" + " System. That configuration is unsupported and" + " will lead to sporadic crashes during transfer of" + " large selection data. It will also lead to" + " various problems with keyboard input."); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_container_add (GTK_CONTAINER (content_area), label); + gtk_widget_show (label); + gtk_widget_show (dialog_widget); +} + /* Open a connection to X display DISPLAY_NAME, and return the structure that describes the open display. If we cannot contact the display, return null. */ @@ -6702,6 +6740,9 @@ pgtk_term_init (Lisp_Object display_name, char *resource_name) return 0; } + /* If the PGTK port is being used under X, complain very loudly, as + that isn't supported. */ + pgtk_display_x_warning (dpy); dpyinfo = xzalloc (sizeof *dpyinfo); pgtk_initialize_display_info (dpyinfo); commit 6f329bd239593c5f54e8f2b51b7974769d75db1f Author: Po Lu Date: Wed Nov 9 20:41:17 2022 +0800 "Fix" iconification handling on PGTK * src/pgtkterm.c (pgtk_iconify_frame): Write some more comments and refrain from setting the frame as iconified here. (map_event): Remove redundant braces. (window_state_event): Remove useless code and manage frame visibility as correctly as possible under Wayland while iconified. (bug#55836) diff --git a/src/pgtkterm.c b/src/pgtkterm.c index 491ba33882..3350676e3c 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c @@ -714,40 +714,42 @@ pgtk_set_window_size (struct frame *f, bool change_gravity, void pgtk_iconify_frame (struct frame *f) -/* -------------------------------------------------------------------------- - External: Iconify window - -------------------------------------------------------------------------- */ { + GtkWindow *window; + /* Don't keep the highlight on an invisible frame. */ + if (FRAME_DISPLAY_INFO (f)->highlight_frame == f) - FRAME_DISPLAY_INFO (f)->highlight_frame = 0; + FRAME_DISPLAY_INFO (f)->highlight_frame = NULL; + + /* If the frame is already iconified, return. */ if (FRAME_ICONIFIED_P (f)) return; - block_input (); + /* Child frames on PGTK have no outer widgets. In that case, simply + refuse to iconify the frame. */ if (FRAME_GTK_OUTER_WIDGET (f)) { if (!FRAME_VISIBLE_P (f)) gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f)); - gtk_window_iconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f))); - SET_FRAME_VISIBLE (f, 0); - SET_FRAME_ICONIFIED (f, true); - unblock_input (); - return; - } + window = GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)); - /* Make sure the X server knows where the window should be positioned, - in case the user deiconifies with the window manager. */ - if (!FRAME_VISIBLE_P (f) && !FRAME_ICONIFIED_P (f)) - pgtk_set_offset (f, f->left_pos, f->top_pos, 0); + gtk_window_iconify (window); - SET_FRAME_ICONIFIED (f, true); - SET_FRAME_VISIBLE (f, 0); + /* Don't make the frame iconified here. Doing so will cause it + to be skipped by redisplay, until GDK says it is deiconified + (see window_state_event for more details). However, if the + window server rejects the iconification request, GDK will + never tell Emacs about the iconification not happening, + leading to the frame not being redisplayed until the next + window state change. */ - unblock_input (); + /* SET_FRAME_VISIBLE (f, 0); + SET_FRAME_ICONIFIED (f, true); */ + } } static gboolean @@ -5420,9 +5422,7 @@ map_event (GtkWidget *widget, /* Check if fullscreen was specified before we where mapped the first time, i.e. from the command line. */ if (!FRAME_X_OUTPUT (f)->has_been_visible) - { - set_fullscreen_state (f); - } + set_fullscreen_state (f); if (!iconified) { @@ -5465,24 +5465,6 @@ window_state_event (GtkWidget *widget, inev.ie.kind = NO_EVENT; inev.ie.arg = Qnil; - if (f) - { - if (new_state & GDK_WINDOW_STATE_FOCUSED) - { - if (FRAME_ICONIFIED_P (f)) - { - /* Gnome shell does not iconify us when C-z is pressed. - It hides the frame. So if our state says we aren't - hidden anymore, treat it as deiconified. */ - SET_FRAME_VISIBLE (f, 1); - SET_FRAME_ICONIFIED (f, false); - FRAME_X_OUTPUT (f)->has_been_visible = true; - inev.ie.kind = DEICONIFY_EVENT; - XSETFRAME (inev.ie.frame_or_window, f); - } - } - } - if (new_state & GDK_WINDOW_STATE_FULLSCREEN) store_frame_param (f, Qfullscreen, Qfullboth); else if (new_state & GDK_WINDOW_STATE_MAXIMIZED) @@ -5500,14 +5482,37 @@ window_state_event (GtkWidget *widget, else store_frame_param (f, Qfullscreen, Qnil); + /* The Wayland protocol provides no way for the client to know + whether or not one of its toplevels has actually been + deiconified. It only provides a request for clients to iconify a + toplevel, without even the ability to determine whether or not + the iconification request was rejected by the display server. + + GDK computes the iconified state by sending a window state event + containing only GDK_WINDOW_STATE_ICONIFIED immediately after + gtk_window_iconify is called. That is error-prone if the request + to iconify the frame was rejected by the display server, but is + not the main problem here, as Wayland compositors only rarely + reject such requests. GDK also assumes that it can clear the + iconified state upon receiving the next toplevel configure event + from the display server. Unfortunately, such events can be sent + by Wayland compositors while the frame is iconified, and may also + not be sent upon deiconification. So, no matter what Emacs does, + the iconification state of a frame is likely to be wrong under + one situation or another. */ + if (new_state & GDK_WINDOW_STATE_ICONIFIED) - SET_FRAME_ICONIFIED (f, true); + { + SET_FRAME_ICONIFIED (f, true); + SET_FRAME_VISIBLE (f, false); + } else { FRAME_X_OUTPUT (f)->has_been_visible = true; inev.ie.kind = DEICONIFY_EVENT; XSETFRAME (inev.ie.frame_or_window, f); SET_FRAME_ICONIFIED (f, false); + SET_FRAME_VISIBLE (f, true); } if (new_state & GDK_WINDOW_STATE_STICKY) commit c05b0131745987d062bb0d324af38f3d55c833ba Author: Po Lu Date: Wed Nov 9 20:17:39 2022 +0800 Avoid use of `uint' type in XKB code * src/xterm.c (x_find_modifier_meanings, handle_one_xevent): Use `unsigned int' instead of `uint'. diff --git a/src/xterm.c b/src/xterm.c index 861cf5da54..fd04061436 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -13522,7 +13522,7 @@ x_find_modifier_meanings (struct x_display_info *dpyinfo) #ifdef HAVE_XKB int i; int found_meta_p = false; - uint vmodmask; + unsigned int vmodmask; #endif dpyinfo->meta_mod_mask = 0; @@ -23079,7 +23079,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, char *copy_bufptr = copy_buffer; int copy_bufsiz = sizeof (copy_buffer); ptrdiff_t i; - uint old_state; + unsigned int old_state; struct xi_device_t *device, *source; coding = Qlatin_1; @@ -23225,8 +23225,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, #ifdef HAVE_XKB if (dpyinfo->xkb_desc) { - uint xkb_state = state; - xkb_state &= ~(1 << 13 | 1 << 14); + unsigned int xkb_state; + + xkb_state = state & ~(1 << 13 | 1 << 14); xkb_state |= xev->group.effective << 13; if (!XkbTranslateKeyCode (dpyinfo->xkb_desc, keycode, commit 8dc36cc53b7c2b66ca06ca4db84209bc492ea665 Author: Mattias EngdegÄrd Date: Wed Nov 9 11:54:57 2022 +0100 * src/lread.c (syms_of_lread): Drop unused capture group. diff --git a/src/lread.c b/src/lread.c index 957bc6895e..c28324dc35 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5620,7 +5620,8 @@ from the file, and matches them against this regular expression. When the regular expression matches, the file is considered to be safe to load. */); Vbytecomp_version_regexp - = build_pure_c_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)"); + = build_pure_c_string + ("^;;;.\\(?:in Emacs version\\|bytecomp version FSF\\)"); DEFSYM (Qlexical_binding, "lexical-binding"); DEFVAR_LISP ("lexical-binding", Vlexical_binding, commit a01024c859fd98a4a330a9b627dc11232afc6ad0 Author: Nicholas Vollmer Date: Mon Nov 7 19:57:34 2022 -0500 bytecomp.el (byte-recompile-directory): Fix negated ignore logic Previous logic would only compile files which matched the byte-compile-ignore-files regular expression. (Bug#59115) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 4d258dab96..c685e5087f 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -1955,9 +1955,9 @@ also be compiled." (not (auto-save-file-name-p source)) (not (member source (dir-locals--all-files directory))) ;; File is requested to be ignored - (string-match-p - (regexp-opt byte-compile-ignore-files) - source)) + (not (string-match-p + (regexp-opt byte-compile-ignore-files) + source))) (progn (cl-incf (pcase (byte-recompile-file source force arg) ('no-byte-compile skip-count) commit 3820e75d2fe1b5c446d83b1abbde8f544201de35 Author: Juri Linkov Date: Wed Nov 9 10:39:51 2022 +0200 * lisp/tab-bar.el (tab-bar-auto-width): Use 'frame-inner-width'. diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 84e1c432ff..0e8430fb38 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -1048,7 +1048,7 @@ tab bar might wrap to the second line when it shouldn't.") (unless (eq (nth 0 item) 'align-right) (setq non-tabs (concat non-tabs (nth 2 item))))))) (when tabs - (setq width (/ (- (frame-pixel-width) + (setq width (/ (- (frame-inner-width) (string-pixel-width (propertize non-tabs 'face 'tab-bar))) (length tabs)))