commit a4ca0cd7f03c1cf0e7b1f3e0d49c4cf42fcacc90 (HEAD, refs/remotes/origin/master) Author: James Thomas Date: Mon Jun 16 10:32:29 2025 +0530 Add repeat map for tab-bar-history (bug#78804) Add repeat map similar to that of winner-mode (to which tab-bar-history is an alternative). * lisp/tab-bar.el (tab-bar-history-repeat-map): Make the change. diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index bd9af41de00..306fed34e40 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -2528,6 +2528,13 @@ This navigates forward in the history of window configurations." "C-c " #'tab-bar-history-back "C-c " #'tab-bar-history-forward) +(defvar-keymap tab-bar-history-repeat-map + :doc "Keymap to repeat tab-bar-history key sequences. +Used in `repeat-mode'." + :repeat t + "" #'tab-bar-history-back + "" #'tab-bar-history-forward) + (define-minor-mode tab-bar-history-mode "Toggle tab history mode for the tab bar. Tab history mode remembers window configurations used in every tab, commit 477112ebc3497e9529cc06b24134d85d17c642ee Author: Paul Eggert Date: Sun Jun 15 15:02:07 2025 -0700 process-attributes now uses get_boot_time I noticed this issue while looking into Bug#63496. GNU Emacs does not infer the boot time consistently on GNU/Linux and similar platforms: android_notifications_notify_1 and get_boot_sec use Gnulib’s boot-time module, but process-attributes has idiosyncratic code that evidently predates that module. The idiosyncratic code returns an unstable etime, which is a minor bug. Simplify process-attributes by just using Gnulib. This returns a stable etime. It may also fix Bug#63496; if not, we can fix Gnulib later. * src/sysdep.c: Include . (get_up_time) [GNU_LINUX || CYGWIN || __ANDROID__]: Remove. (system_process_attributes) [GNU_LINUX || CYGWIN || __ANDROID__]: Use get_boot_time instead of get_up_time. diff --git a/src/sysdep.c b/src/sysdep.c index 042de2acf80..71108f50db1 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -30,6 +30,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include #include #include @@ -3453,39 +3454,6 @@ put_jiffies (Lisp_Object attrs, Lisp_Object propname, return Fcons (Fcons (propname, time_from_jiffies (ticks, hz, Qnil)), attrs); } -static Lisp_Object -get_up_time (void) -{ - FILE *fup; - Lisp_Object up = Qnil; - - block_input (); - fup = emacs_fopen ("/proc/uptime", "r"); - - if (fup) - { - unsigned long long upsec; - EMACS_UINT upfrac; - int upfrac_start, upfrac_end; - - if (fscanf (fup, "%llu.%n%"pI"u%n", - &upsec, &upfrac_start, &upfrac, &upfrac_end) - == 2) - { - EMACS_INT hz = 1; - for (int i = upfrac_start; i < upfrac_end; i++) - hz *= 10; - Lisp_Object sec = make_uint (upsec); - Lisp_Object subsec = Fcons (make_fixnum (upfrac), make_fixnum (hz)); - up = Ftime_add (sec, subsec); - } - emacs_fclose (fup); - } - unblock_input (); - - return up; -} - # if defined GNU_LINUX || defined __ANDROID__ #define MAJOR(d) (((unsigned)(d) >> 8) & 0xfff) #define MINOR(d) (((unsigned)(d) & 0xff) | (((unsigned)(d) & 0xfff00000) >> 12)) @@ -3702,11 +3670,12 @@ system_process_attributes (Lisp_Object pid) attrs = put_jiffies (attrs, Qcstime, cstime, hz); attrs = put_jiffies (attrs, Qctime, cstime + cutime, hz); - Lisp_Object uptime = get_up_time (); - if (!NILP (uptime)) + struct timespec bt; + if (get_boot_time (&bt) == 0) { + Lisp_Object boot = Ftime_convert (timespec_to_lisp (bt), hz); Lisp_Object now = Ftime_convert (Qnil, hz); - Lisp_Object boot = Ftime_subtract (now, uptime); + Lisp_Object uptime = Ftime_subtract (now, boot); Lisp_Object tstart = time_from_jiffies (start, hz, hz); Lisp_Object lstart = Ftime_convert (Ftime_add (boot, tstart), Qnil); commit ebdad09c5a0a822acb52ec58b3319d77d156f0ce Author: Mattias Engdegård Date: Sun Jun 15 16:08:26 2025 +0200 * src/bytecode.c (exec_byte_code): Remove superfluous condition Bytecode should never be able to set anything to Qunbound because that value is not accessible from Lisp. Found by Pip Cet. diff --git a/src/bytecode.c b/src/bytecode.c index 4475d4a0b30..1da2ecba071 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -697,10 +697,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, { Lisp_Object sym = vectorp[op]; Lisp_Object val = POP; - - /* Inline the most common case. */ - if (!BASE_EQ (val, Qunbound) - && XBARE_SYMBOL (sym)->u.s.redirect == SYMBOL_PLAINVAL + if (XBARE_SYMBOL (sym)->u.s.redirect == SYMBOL_PLAINVAL && !XBARE_SYMBOL (sym)->u.s.trapped_write) SET_SYMBOL_VAL (XBARE_SYMBOL (sym), val); else commit 08a7477d2205f4f4a9c6bcc184fdea060c33474b Author: Mattias Engdegård Date: Sun Jun 15 10:08:33 2025 +0200 * src/fns.c (mapcar1): Less lax type checking Previously, mapcar etc would crash or return nonsense when passed a record. Found by Pip Cet. diff --git a/src/fns.c b/src/fns.c index 52f911b8de6..49c185178ff 100644 --- a/src/fns.c +++ b/src/fns.c @@ -3409,9 +3409,8 @@ mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq) vals[i_before] = dummy; } } - else + else if (BOOL_VECTOR_P (seq)) { - eassert (BOOL_VECTOR_P (seq)); for (EMACS_INT i = 0; i < leni; i++) { Lisp_Object dummy = calln (fn, bool_vector_ref (seq, i)); @@ -3419,6 +3418,8 @@ mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq) vals[i] = dummy; } } + else + wrong_type_argument (Qsequencep, seq); return leni; }