commit a8e85243790b6ab9b9e261c77ddfdc65a9867069 (HEAD, refs/remotes/origin/master) Author: Gerd Möllmann Date: Sun Feb 2 15:09:52 2025 +0100 Handle mouse highlighting in the presence of tty child frames * src/term.c (tty_draw_row_with_mouse_face): Draw only parts of the highlighted text that are not covered by other frames. diff --git a/src/term.c b/src/term.c index f307d709316..fd95e75a007 100644 --- a/src/term.c +++ b/src/term.c @@ -2559,36 +2559,89 @@ A value of zero means TTY uses the system's default value. */) #if !defined DOS_NT && !defined HAVE_ANDROID /* Implementation of draw_row_with_mouse_face for TTY/GPM and macOS. */ + void -tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *row, - int start_hpos, int end_hpos, +tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *window_row, + int window_start_x, + int window_end_x, enum draw_glyphs_face draw) { - int nglyphs = end_hpos - start_hpos; - struct frame *f = XFRAME (WINDOW_FRAME (w)); - struct tty_display_info *tty = FRAME_TTY (f); - int face_id = tty->mouse_highlight.mouse_face_face_id; + struct frame *f = XFRAME (w->frame); + struct frame *root = root_frame (f); + + /* Window coordinates are relative to the text area. Make + them relative to the window's left edge, */ + window_end_x = min (window_end_x, window_row->used[TEXT_AREA]); + window_start_x += window_row->used[LEFT_MARGIN_AREA]; + window_end_x += window_row->used[LEFT_MARGIN_AREA]; + + /* Translate from window to window's frame. */ + int frame_start_x = WINDOW_LEFT_EDGE_X (w) + window_start_x; + int frame_end_x = WINDOW_LEFT_EDGE_X (w) + window_end_x; + int frame_y = window_row->y + WINDOW_TOP_EDGE_Y (w); + + /* Translate from (possible) child frame to root frame. */ + int root_start_x, root_end_x, root_y; + root_xy (f, frame_start_x, frame_y, &root_start_x, &root_y); + root_xy (f, frame_end_x, frame_y, &root_end_x, &root_y); + struct glyph_row *root_row = MATRIX_ROW (root->current_matrix, root_y); + + /* Remember current cursor coordinates so that we can restore + them at the end. */ + struct tty_display_info *tty = FRAME_TTY (root); + int save_x = curX (tty); + int save_y = curY (tty); - if (end_hpos >= row->used[TEXT_AREA]) - nglyphs = row->used[TEXT_AREA] - start_hpos; + /* If the root frame displays child frames, we cannot naively + write to the terminal what the window thinks should be drawn. + Instead, write only those parts that are not obscured by + other frames. */ + for (int root_x = root_start_x; root_x < root_end_x; ) + { + /* Find the start of a run of glyphs from frame F. */ + struct glyph *root_start = root_row->glyphs[TEXT_AREA] + root_x; + while (root_x < root_end_x && root_start->frame != f) + ++root_x, ++root_start; + + /* If start of a run of glyphs from F found. */ + int root_run_start_x = root_x; + if (root_run_start_x < root_end_x) + { + /* Find the end of the run of glyphs from frame F. */ + struct glyph *root_end = root_start; + while (root_x < root_end_x && root_end->frame == f) + ++root_x, ++root_end; - int pos_y = row->y + WINDOW_TOP_EDGE_Y (w); - int pos_x = row->used[LEFT_MARGIN_AREA] + start_hpos + WINDOW_LEFT_EDGE_X (w); + /* If we have a run glyphs to output, do it. */ + if (root_end > root_start) + { + cursor_to (root, root_y, root_run_start_x); + ptrdiff_t n = root_end - root_start; + switch (draw) + { + case DRAW_NORMAL_TEXT: + write_glyphs (f, root_start, n); + break; - /* Save current cursor coordinates. */ - int save_y = curY (tty); - int save_x = curX (tty); - cursor_to (f, pos_y, pos_x); + case DRAW_MOUSE_FACE: + { + int face_id = tty->mouse_highlight.mouse_face_face_id; + struct face *face = FACE_FROM_ID (f, face_id); + tty_write_glyphs_with_face (f, root_start, n, face); + } + break; - if (draw == DRAW_MOUSE_FACE) - { - struct glyph *glyph = row->glyphs[TEXT_AREA] + start_hpos; - struct face *face = FACE_FROM_ID (f, face_id); - tty_write_glyphs_with_face (f, glyph, nglyphs, face); + case DRAW_INVERSE_VIDEO: + case DRAW_CURSOR: + case DRAW_IMAGE_RAISED: + case DRAW_IMAGE_SUNKEN: + emacs_abort (); + } + } + } } - else if (draw == DRAW_NORMAL_TEXT) - write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs); + /* Restore cursor where it was before. */ cursor_to (f, save_y, save_x); } commit 7f10d2680be16219cbde78434836b0befce3a0b3 Author: Stephen Gildea Date: Sun Feb 2 20:14:40 2025 -0800 ; time-stamp: documentation, tests, NEWS * lisp/time-stamp.el (time-stamp-pattern, time-stamp-count): Document how to update different time stamps on multiple lines. * doc/emacs/files.texi (Time stamps): Add an example showing a time stamp at the end of a file. * etc/NEWS: Announce time-stamp format additions. * test/lisp/time-stamp-tests.el: More title-case tests. diff --git a/doc/emacs/files.texi b/doc/emacs/files.texi index 3db291d68e9..3bc7d6ea24a 100644 --- a/doc/emacs/files.texi +++ b/doc/emacs/files.texi @@ -1072,6 +1072,22 @@ identify and update that custom template: @end group @end example +Here is another example, with the time stamp inserted into the last +paragraph of an HTML document. The @code{%%} in the pattern asks for +the default format. + +@example +@r{@dots{}} +

Last modified:

+ + + +@end example + @vindex time-stamp-format By default the time stamp is formatted according to your locale setting (@pxref{Environment}) and diff --git a/etc/NEWS b/etc/NEWS index 259b6e03549..8cf86d1375d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -901,6 +901,30 @@ the 'grep' results editable. The edits will be reflected in the buffer visiting the originating file. Typing 'C-c C-c' will leave the Grep Edit mode. +** time-stamp + +--- +*** 'time-stamp' can up-case, capitalize and down-case date words. +This control can be useful in languages in which days of the week and/or +month names are capitalized only at the beginning of a sentence. For +details, see the built-in documentation for variable 'time-stamp-format'. + +Because this feature is new in Emacs 31.1, do not use it in the local +variables section of any file that might be edited by an older version +of Emacs. + +--- +*** Some historical 'time-stamp' conversions now warn. +'time-stamp-pattern' and 'time-stamp-format' had quietly +accepted several 'time-stamp' conversions (e.g., "%:y") that +have been deprecated since Emacs 27.1 (released in 2020). +These now generate a warning with a suggested migration. + +Merely having "(add-hook 'before-save-hook 'time-stamp)" +in your Emacs init file does not expose you to this change. +However, if you set 'time-stamp-format' or 'time-stamp-pattern' +with a file-local variable, you may be asked to update the value. + ** TeX modes +++ diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el index a2e91246ae2..ad356eb2bd6 100644 --- a/lisp/time-stamp.el +++ b/lisp/time-stamp.el @@ -248,7 +248,11 @@ your init file, you would be incompatible with other people's files.") (defvar time-stamp-count 1 ;Do not change! "How many templates \\[time-stamp] will look for in a buffer. -The same time stamp will be written in each case. + +If the value is greater than 1, the same time stamp will be written in +each case. If you want to insert different text on different lines, +then instead of changing this variable, include a newline (written as +\"\\n\") in `time-stamp-format' or the format part of `time-stamp-pattern'. `time-stamp-count' is best changed with a file-local variable. If you were to change it in your init file, you would be incompatible @@ -259,26 +263,27 @@ with other people's files.") (defvar time-stamp-pattern nil ;Do not change! "Convenience variable setting all `time-stamp' location and format values. This string has four parts, each of which is optional. -These four parts set `time-stamp-line-limit', `time-stamp-start', -`time-stamp-format', and `time-stamp-end'. See the documentation -for each of these variables for details. +These four parts override `time-stamp-line-limit', `time-stamp-start', +`time-stamp-format' and `time-stamp-end', respectively. See the +documentation for each of these variables for details. The first part is a number followed by a slash; the number sets the number of lines at the beginning (negative counts from end) of the file searched for the time stamp. The number and the slash may be omitted to use the -normal value. +value of `time-stamp-line-limit' as the number. The second part is a regexp identifying the pattern preceding the time stamp. -This part may be omitted to use the normal pattern. +This part may be omitted to use the value of `time-stamp-start'. -The third part specifies the format of the time stamp inserted. See -the documentation for `time-stamp-format' for details. Specify this -part as \"%%\" to use the normal format. +The third part specifies the format of the time stamp inserted. Specify +this part as \"%%\" to use the value of `time-stamp-format'. The fourth part is a regexp identifying the pattern following the time stamp. -This part may be omitted to use the normal pattern. +This part may be omitted to use the value of `time-stamp-end'. The pattern does not need to match the entire line of the time stamp. +The pattern will update time stamp information on multiple lines if the +pattern includes newlines, written as \"\\n\". These variables are best changed with file-local variables. If you were to change `time-stamp-pattern', `time-stamp-line-limit', @@ -299,6 +304,11 @@ Examples: %% time-stamp-pattern: \"newcommand{\\\\\\\\timestamp}{%%}\" (sets `time-stamp-start' and `time-stamp-end') +// time-stamp-pattern: \"10/Author %L\\nRevised %-d %b %Y$\" + (sets all four variables and updates text on two lines) + +See Info node `Time Stamps' for more examples. + See also `time-stamp-count' and `time-stamp-inserts-lines'.") ;;;###autoload(put 'time-stamp-pattern 'safe-local-variable 'stringp) diff --git a/test/lisp/time-stamp-tests.el b/test/lisp/time-stamp-tests.el index c59ae9f5356..a7aa00dc267 100644 --- a/test/lisp/time-stamp-tests.el +++ b/test/lisp/time-stamp-tests.el @@ -344,13 +344,12 @@ ;; broken in 2019, changed in 2024 (should (equal (time-stamp-string "%-A" ref-time1) Monday)) (should (equal (time-stamp-string "%_A" ref-time1) Monday)) - ;; allowed but not recommended since 2019 (warned 1997-2019) - (should (equal (time-stamp-string "%^A" ref-time1) MONDAY)) ;; warned 1997-2019, changed in 2019, recommended (with caveat) since 2024 (should (equal (time-stamp-string "%a" ref-time1) Mon)) (should (equal (time-stamp-string "%4a" ref-time1) p4-Mon)) (should (equal (time-stamp-string "%04a" ref-time1) p4-Mon)) (should (equal (time-stamp-string "%A" ref-time1) Monday)) + (should (equal (time-stamp-string "%^A" ref-time1) MONDAY)) ;; warned 1997-2019, changed in 2019 (should (equal (time-stamp-string "%^a" ref-time1) MON)) (should (equal (time-stamp-string "%^4a" ref-time1) p4-MON)) @@ -401,13 +400,12 @@ ;; broken in 2019, changed in 2024 (should (equal (time-stamp-string "%-B" ref-time1) January)) (should (equal (time-stamp-string "%_B" ref-time1) January)) - ;; allowed but not recommended since 2019 (warned 1997-2019) - (should (equal (time-stamp-string "%^B" ref-time1) JANUARY)) ;; warned 1997-2019, changed in 2019, recommended (with caveat) since 2024 (should (equal (time-stamp-string "%b" ref-time1) Jan)) (should (equal (time-stamp-string "%4b" ref-time1) p4-Jan)) (should (equal (time-stamp-string "%04b" ref-time1) p4-Jan)) (should (equal (time-stamp-string "%B" ref-time1) January)) + (should (equal (time-stamp-string "%^B" ref-time1) JANUARY)) ;; warned 1997-2019, changed in 2019 (should (equal (time-stamp-string "%^b" ref-time1) JAN)) (should (equal (time-stamp-string "%^4b" ref-time1) p4-JAN)) @@ -490,7 +488,7 @@ (should (equal (time-stamp-string "%:I" ref-time1) "3")) ;PM (should (equal (time-stamp-string "%:I" ref-time2) "12")) ;PM (should (equal (time-stamp-string "%:I" ref-time3) "6")) ;AM - ;; implemented since 1997, recommended since 2019 + ;; implemented since 1997, recommended 2019-2024 (should (equal (time-stamp-string "%1I" ref-time1) "3")) (should (equal (time-stamp-string "%1I" ref-time2) "12")) (should (equal (time-stamp-string "%1I" ref-time3) "6")) @@ -517,7 +515,7 @@ ;; recommended 1997-2019 (should (equal (time-stamp-string "%:m" ref-time1) "1")) (should (equal (time-stamp-string "%:m" ref-time2) "11")) - ;; implemented since 1997, recommended since 2019 + ;; implemented since 1997, recommended 2019-2024 (should (equal (time-stamp-string "%1m" ref-time1) "1")) (should (equal (time-stamp-string "%1m" ref-time2) "11")) ;; warned 1997-2019, allowed 2019, recommended (with caveat) since 2024 @@ -540,7 +538,7 @@ ;; recommended 1997-2019 (should (equal (time-stamp-string "%:M" ref-time1) "4")) (should (equal (time-stamp-string "%:M" ref-time2) "14")) - ;; implemented since 1997, recommended since 2019 + ;; implemented since 1997, recommended 2019-2024 (should (equal (time-stamp-string "%1M" ref-time1) "4")) (should (equal (time-stamp-string "%1M" ref-time2) "14")) ;; warned 1997-2019, allowed 2019, recommended (with caveat) since 2024 @@ -563,7 +561,7 @@ ;; recommended 1997-2019 (should (equal (time-stamp-string "%:S" ref-time1) "5")) (should (equal (time-stamp-string "%:S" ref-time2) "15")) - ;; implemented since 1997, recommended since 2019 + ;; implemented since 1997, recommended 2019-2024 (should (equal (time-stamp-string "%1S" ref-time1) "5")) (should (equal (time-stamp-string "%1S" ref-time2) "15")) ;; warned 1997-2019, allowed 2019, recommended (with caveat) since 2024 @@ -586,10 +584,12 @@ (should (equal (time-stamp-string "%:y" ref-time1) "2006"))) (time-stamp-should-warn (should (equal (time-stamp-string "%:y" ref-time2) "2016"))) - ;; warned 1997-2019, changed in 2019 - ;; (We don't expect the %-y or %_y form to be useful, - ;; but we test both so that we can confidently state that - ;; `-' and `_' affect all 2-digit conversions identically.) + ;; %-y and %_y warned 1997-2019, changed in 2019 + ;; (We don't expect these forms to be useful, + ;; but we test here so that we can confidently state that + ;; all 2-digit conversions behave identically.) + (should (equal (time-stamp-string "%1y" ref-time1) "6")) + (should (equal (time-stamp-string "%1y" ref-time2) "16")) (should (equal (time-stamp-string "%-y" ref-time1) "6")) (should (equal (time-stamp-string "%-y" ref-time2) "16")) (should (equal (time-stamp-string "%_y" ref-time1) " 6")) @@ -619,6 +619,8 @@ (am (format-time-string "%P" ref-time3 t)) (Pm (format-time-string "%p" ref-time1 t)) (Am (format-time-string "%p" ref-time3 t)) + (Pm-tc (capitalize (format-time-string "%p" ref-time1 t))) + (Am-tc (capitalize (format-time-string "%p" ref-time3 t))) (PM (format-time-string "%^p" ref-time1 t)) (AM (format-time-string "%^p" ref-time3 t))) ;; implemented and recommended since 1997 @@ -644,6 +646,11 @@ (should (equal (time-stamp-string "%^#P" ref-time3) am)) (should (equal (time-stamp-string "%^P" ref-time1) "")) (should (equal (time-stamp-string "%^P" ref-time3) "")) + ;; implemented since 2025 + (should (equal (time-stamp-string "%*p" ref-time1) Pm-tc)) + (should (equal (time-stamp-string "%*p" ref-time3) Am-tc)) + (should (equal (time-stamp-string "%*P" ref-time1) Pm-tc)) + (should (equal (time-stamp-string "%*P" ref-time3) Am-tc)) ;; reserved for possible adding or removing periods (dots) (should (equal (time-stamp-string "%:p" ref-time1) Pm)) (should (equal (time-stamp-string "%#:p" ref-time1) pm)) @@ -667,6 +674,7 @@ "Test `time-stamp' format %Z." (with-time-stamp-test-env (let ((UTC-abbr (format-time-string "%Z" ref-time1 t)) + (Utc-abbr (capitalize (format-time-string "%Z" ref-time1 t))) (utc-abbr (format-time-string "%#Z" ref-time1 t))) ;; implemented and recommended since 1995 (should (equal (time-stamp-string "%Z" ref-time1) UTC-abbr)) @@ -674,7 +682,10 @@ (should (equal (time-stamp-string "%#Z" ref-time1) utc-abbr)) ;; ^ accepted and ignored since 1995/1997, test for consistency with %p (should (equal (time-stamp-string "%^Z" ref-time1) UTC-abbr)) - (should (equal (time-stamp-string "%^#Z" ref-time1) utc-abbr))))) + (should (equal (time-stamp-string "%^#Z" ref-time1) utc-abbr)) + ;; implemented since 2025 + (should (equal (time-stamp-string "%*Z" ref-time1) Utc-abbr)) + ))) (ert-deftest time-stamp-format-time-zone-offset () "Test `time-stamp' legacy format %z and spot-test new offset format %5z." commit a62a26239780684d481533a57d12de520b737f9b Author: F. Jason Park Date: Thu Jan 30 19:07:00 2025 -0800 Run erc-services-regain-mode callback on a timer * lisp/erc/erc-services.el (erc-services-regain-timeout-seconds): New variable. (erc-services-regain-mode): Mention CertFP in doc string. (erc--nickname-in-use-make-request): Ensure the 900 RPL_LOGGEDIN callback always runs after `erc-services-regain-timeout-seconds', even when SASL isn't being used. * test/lisp/erc/erc-scenarios-services-misc.el (erc-scenarios-services-misc--regain-command/oftc): New test. * test/lisp/erc/resources/services/regain/taken-regain-oftc.eld: New file. diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el index d16aa8c54d8..429424117eb 100644 --- a/lisp/erc/erc-services.el +++ b/lisp/erc/erc-services.el @@ -548,6 +548,9 @@ for details and use cases." (function-item erc-services-issue-ghost-and-retry-nick) function))) +(defvar erc-services-regain-timeout-seconds 5 + "Seconds after which to run callbacks if necessary.") + (defun erc-services-retry-nick-on-connect (want) "Try at most once to grab nickname WANT after reconnecting. Expect to be used when automatically reconnecting to servers @@ -608,8 +611,8 @@ consider its main option, `erc-services-regain-alist': In practical terms, this means that this module, which is still somewhat experimental, is likely only useful in conjunction with -SASL authentication rather than the traditional approach provided -by the `services' module it shares a library with (see Info +SASL authentication or CertFP rather than the traditional approach +provided by the `services' module it shares a library with (see Info node `(erc) SASL' for more)." nil nil localp) @@ -632,11 +635,21 @@ one." (funcall found want)))) (on-900 (lambda (_ parsed) + (cancel-timer timer) (remove-hook 'erc-server-900-functions on-900 t) - (unless erc-server-connected - (when (equal (car (erc-response.command-args parsed)) temp) - (add-hook 'erc-after-connect after-connect nil t))) - nil))) + (unless (equal want (erc-current-nick)) + (if erc-server-connected + (funcall after-connect nil temp) + (when (or (eq parsed 'forcep) + (equal (car (erc-response.command-args parsed)) temp)) + (add-hook 'erc-after-connect after-connect nil t)))) + nil)) + (timer (run-at-time erc-services-regain-timeout-seconds + nil (lambda (buffer) + (when (buffer-live-p buffer) + (with-current-buffer buffer + (funcall on-900 nil 'forcep)))) + (current-buffer)))) (add-hook 'erc-server-900-functions on-900 nil t)) (cl-call-next-method)) diff --git a/test/lisp/erc/erc-scenarios-services-misc.el b/test/lisp/erc/erc-scenarios-services-misc.el index 823c97dd96b..13d66a54d3a 100644 --- a/test/lisp/erc/erc-scenarios-services-misc.el +++ b/test/lisp/erc/erc-scenarios-services-misc.el @@ -223,6 +223,31 @@ ;; Works with "given" `:id'. (should (and (erc-network) (not (eq (erc-network) 'ExampleNet))))))) +(ert-deftest erc-scenarios-services-misc--regain-command/oftc () + :tags '(:expensive-test) + (erc-scenarios-common-with-cleanup + ((erc-server-flood-penalty 0.1) + (erc-scenarios-common-dialog "services/regain") + (dumb-server (erc-d-run "localhost" t 'taken-regain-oftc)) + (port (process-contact dumb-server :service)) + (erc-modules `(services-regain ,@erc-modules)) + (erc-services-regain-timeout-seconds 1) + (use-id-p (cl-evenp (truncate (float-time)))) + (erc-services-regain-alist (list (cons (if use-id-p 'oftc 'OFTC) + #'erc-services-issue-regain))) + (expect (erc-d-t-make-expecter))) + + (with-current-buffer (erc :server "127.0.0.1" + :port port + :nick "dummy" + :user "tester" + :full-name "tester" + :id (and use-id-p 'oftc)) + (funcall expect 10 "Nickname dummy is already in use, trying dummy`") + (funcall expect 10 "-NickServ- REGAIN succeed on nickname") + (funcall expect 10 "*** Your new nickname is dummy") + (funcall expect 10 "*** dummy has changed mode for dummy to +R")))) + (ert-deftest erc-scenarios-services-misc--ghost-and-retry-nick () :tags '(:expensive-test) (erc-scenarios-common-with-cleanup diff --git a/test/lisp/erc/resources/services/regain/taken-regain-oftc.eld b/test/lisp/erc/resources/services/regain/taken-regain-oftc.eld new file mode 100644 index 00000000000..c6fa09dc45c --- /dev/null +++ b/test/lisp/erc/resources/services/regain/taken-regain-oftc.eld @@ -0,0 +1,42 @@ +;; -*- mode: lisp-data; -*- +((nick 10 "NICK dummy")) +((user 10 "USER tester 0 * :tester") + (0.09 ":reflection.oftc.net NOTICE AUTH :*** Looking up your hostname...") + (0.03 ":reflection.oftc.net NOTICE AUTH :*** Checking Ident") + (0.02 ":reflection.oftc.net NOTICE AUTH :*** Found your hostname") + (0.01 ":reflection.oftc.net NOTICE AUTH :*** No Ident response") + (0.01 ":reflection.oftc.net 433 * dummy :Nickname is already in use.")) +((nick 10 "NICK dummy`") + (0.09 ":reflection.oftc.net NOTICE dummy` :*** Connected securely via TLSv1.3 TLS_AES_256_GCM_SHA384-256") + (0.03 ":reflection.oftc.net NOTICE dummy` :*** Your client certificate fingerprint is 4F6DDB61A5CFFA42719D39E3819B45DC58E4E307") + (0.01 ":reflection.oftc.net 001 dummy` :Welcome to the OFTC Internet Relay Chat Network dummy`") + (0.01 ":reflection.oftc.net 002 dummy` :Your host is reflection.oftc.net[64.86.243.183/6697], running version hybrid-7.2.2+oftc1.7.3") + (0.01 ":reflection.oftc.net 003 dummy` :This server was created Nov 1 2023 at 10:10:46") + (0.00 ":reflection.oftc.net 004 dummy` reflection.oftc.net hybrid-7.2.2+oftc1.7.3 CDGPRSabcdfgijklnorsuwxyz bciklmnopstvzeIMRS bkloveI") + (0.01 ":reflection.oftc.net 005 dummy` CALLERID CASEMAPPING=rfc1459 DEAF=D KICKLEN=160 MODES=4 NICKLEN=30 PREFIX=(ov)@+ STATUSMSG=@+ TOPICLEN=391 NETWORK=OFTC MAXLIST=beI:100 MAXTARGETS=1 CHANTYPES=# :are supported by this server") + (0.03 ":reflection.oftc.net 005 dummy` CHANLIMIT=#:250 CHANNELLEN=50 CHANMODES=eIqb,k,l,cimnpstzMRS AWAYLEN=160 KNOCK ELIST=CMNTU SAFELIST EXCEPTS=e INVEX=I :are supported by this server") + (0.01 ":reflection.oftc.net 042 dummy` 8L3AAEM45 :your unique ID") + (0.00 ":reflection.oftc.net 251 dummy` :There are 31 users and 16297 invisible on 19 servers") + (0.00 ":reflection.oftc.net 252 dummy` 20 :IRC Operators online") + (0.00 ":reflection.oftc.net 253 dummy` 25 :unknown connection(s)") + (0.00 ":reflection.oftc.net 254 dummy` 4118 :channels formed") + (0.00 ":reflection.oftc.net 255 dummy` :I have 1245 clients and 1 servers") + (0.00 ":reflection.oftc.net 265 dummy` :Current local users: 1245 Max: 1782") + (0.00 ":reflection.oftc.net 266 dummy` :Current global users: 16328 Max: 19479") + (0.00 ":reflection.oftc.net 250 dummy` :Highest connection count: 1783 (1782 clients) (203288 connections received)") + (0.03 ":reflection.oftc.net 375 dummy` :- reflection.oftc.net Message of the Day - ") + (0.00 ":reflection.oftc.net 372 dummy` :- O") + (0.00 ":reflection.oftc.net 372 dummy` :- Thanks and enjoy your stay! The OFTC team.") + (0.00 ":reflection.oftc.net 376 dummy` :End of /MOTD command.") + (0.03 ":dummy`!~tester@static-198-54-134-141.cust.tzulo.com MODE dummy` :+i")) +((mode 10 "MODE dummy` +i") + (0.00 ":CTCPServ!services@services.oftc.net PRIVMSG dummy` :\1VERSION\1")) +((~notice 10 "NOTICE CTCPServ :\1VERSION \2ERC\2")) +((privmsg 10 "PRIVMSG NickServ :REGAIN dummy") + (0.01 ":NickServ!services@services.oftc.net NOTICE dummy` :REGAIN succeed on nickname \2dummy\2. You have been changed to your nickname.") + (0.05 ":dummy`!~tester@static-198-54-134-141.cust.tzulo.com NICK :dummy") + (0.01 ":dummy MODE dummy :+R") + (0.04 ":dummy MODE dummy :-R") + (0.01 ":dummy MODE dummy :+R")) +((quit 10 "QUIT :\2ERC\2 5") + (0.08 "ERROR :Closing Link: static-198-54-134-141.cust.tzulo.com ()")) commit fb53de0c06651ed9662610790b3c2938a314c468 Author: F. Jason Park Date: Sat Feb 1 17:57:56 2025 -0800 ; Remove obsolete :options value from erc-mode-hook * lisp/erc/erc.el (erc-mode-hook): Remove `erc-add-scroll-to-bottom' from :options list because the function has been deprecated. diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 72335a444cb..afa8e0a7b72 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1272,10 +1272,11 @@ particular sessions and/or `let'-bound for spells." :group 'erc) (defcustom erc-mode-hook nil - "Hook run after `erc-mode' setup is finished." + "Hook run after `erc-mode' setup is finished. +Members should be robust enough to run in any order and not depend on +hook depth." :group 'erc-hooks - :type 'hook - :options '(erc-add-scroll-to-bottom)) + :type 'hook) (defcustom erc-timer-hook nil "Abnormal hook run after each response handler. commit 669bb2eaf535728c58899ab56f0f7d5bdd3747c0 Author: Eli Zaretskii Date: Sun Feb 2 16:06:04 2025 +0200 Announce XINERAM and XRANDR in 'system-configuration-features' * configure.ac (emacs_config_features): Add XINERAMA and XRANDR. (Bug#75936) diff --git a/configure.ac b/configure.ac index 9db1f07d7fc..7b4c03c0908 100644 --- a/configure.ac +++ b/configure.ac @@ -7481,8 +7481,8 @@ for opt in ACL BE_APP CAIRO DBUS FREETYPE GCONF GIF GLIB GMP GNUTLS GPM GSETTING HARFBUZZ IMAGEMAGICK JPEG LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 \ M17N_FLT MODULES NATIVE_COMP NOTIFY NS OLDXMENU PDUMPER PGTK PNG RSVG SECCOMP \ SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER \ - UNEXEC WEBP X11 XAW3D XDBE XFT XIM XINPUT2 XPM XWIDGETS X_TOOLKIT \ - ZLIB; do + UNEXEC WEBP X11 XAW3D XDBE XFT XIM XINERAMA XINPUT2 XPM XRANDR XWIDGETS \ + X_TOOLKIT ZLIB; do case $opt in PDUMPER) val=${with_pdumper} ;;