GNU bug report logs -
#78896
29.4; display-time-mode breaks minibuffer in emacsclient
Previous Next
Reported by: Varun Malladi <varun.malladi <at> gmail.com>
Date: Wed, 25 Jun 2025 17:36:03 UTC
Severity: normal
Found in version 29.4
Fixed in version 31.0.50
Done: Juri Linkov <juri <at> linkov.net>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 78896 in the body.
You can then email your comments to 78896 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Wed, 25 Jun 2025 17:36:03 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Varun Malladi <varun.malladi <at> gmail.com>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Wed, 25 Jun 2025 17:36:04 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Given the following minimal init file:
```
;; min-init.el
(require 'tab-bar)
(tab-bar-mode)
(add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
(display-time-mode -1)
```
I do the following:
```
emacs -Q --daemon --load min-init.el
```
Then when I start emacsclient in the terminal with `emacsclient -t`, the
minibuffer won't work at all. When I don't do this via the server,
e.g. removing `--daemon` from the above invocation, the minibuffer works
fine.
Let me try to describe what I mean when I say that the minibuffer
doesn't work. `M-x` puts the cursor at the beginning of the minibuffer
(no "M-x" text). Typing any key says that the key is not defined. `C-g`
doesn't work either.
In GNU Emacs 29.4 (build 1, x86_64-redhat-linux-gnu, GTK+ Version
3.24.31, cairo version 1.17.4) of 2025-01-20 built on
(redacted)
System Description: AlmaLinux 9.5 (Teal Serval)
Configured using:
'configure --build=x86_64-redhat-linux-gnu
--host=x86_64-redhat-linux-gnu --program-prefix=
--disable-dependency-tracking --prefix=/usr --exec-prefix=/usr
--bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc
--datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64
--libexecdir=/usr/libexec --localstatedir=/var
--sharedstatedir=/var/lib --mandir=/usr/share/man
--infodir=/usr/share/info --with-cairo --with-dbus --with-gif
--with-gpm=no --with-harfbuzz --with-jpeg --with-json --with-modules
--with-native-compilation --with-pgtk --with-png --with-rsvg
--with-sqlite3 --with-tiff --with-tree-sitter --with-webp --with-xpm
build_alias=x86_64-redhat-linux-gnu host_alias=x86_64-redhat-linux-gnu
CC=gcc 'CFLAGS=-fno-semantic-interposition -D_FILE_OFFSET_BITS=64
-pthread -fno-semantic-interposition -D_FILE_OFFSET_BITS=64 -pthread
-fno-semantic-interposition -D_FILE_OFFSET_BITS=64 -pthread
-DMAIL_USE_LOCKF -O2 -flto=auto -ffat-lto-objects -fexceptions -g
-grecord-gcc-switches -pipe -Wall -Werror=format-security
-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS
-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2
-mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection
-fcf-protection ' 'LDFLAGS= -Wl,-z,relro -Wl,--as-needed -Wl,-z,now
-specs=/usr/lib/rpm/redhat/redhat-hardened-ld
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 '
PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig CXX=g++
'CXXFLAGS=-std=gnu++20 -DFMT_CONSTEVAL= -DBUG681273
-fno-semantic-interposition -D_FILE_OFFSET_BITS=64
-fvisibility-inlines-hidden -pthread -std=gnu++20 -DFMT_CONSTEVAL=
-DBUG681273 -fno-semantic-interposition -D_FILE_OFFSET_BITS=64
-fvisibility-inlines-hidden -pthread -std=gnu++20 -DFMT_CONSTEVAL=
-DBUG681273 -fno-semantic-interposition -D_FILE_OFFSET_BITS=64
-fvisibility-inlines-hidden -pthread -O2 -flto=auto -ffat-lto-objects
-fexceptions -g -grecord-gcc-switches -pipe -Wall
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2
-Wp,-D_GLIBCXX_ASSERTIONS
-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2
-mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection
-fcf-protection ''
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER XIM GTK3 ZLIB
Important settings:
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix
Major mode: ELisp/d
Minor modes in effect:
tooltip-mode: t
global-eldoc-mode: t
eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
line-number-mode: t
indent-tabs-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
Load-path shadows:
None found.
Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util text-property-search time-date mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils comp comp-cstr
warnings icons rx cl-seq cl-extra help-mode term/screen term/xterm xterm
clang-rename clang-include-fixer let-alist json subr-x map byte-opt
bytecomp byte-compile clang-format cl-macs gv xml cl-loaddefs cl-lib rmc
iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win
term/common-win pgtk-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo gtk pgtk multi-tty make-network-process
native-compile emacs)
Memory information:
((conses 16 92347 8264)
(symbols 48 7619 0)
(strings 32 21282 1534)
(string-bytes 1 639143)
(vectors 16 15152)
(vector-slots 8 300714 14258)
(floats 8 31 230)
(intervals 56 462 0)
(buffers 984 14))
[Message part 2 (text/html, inline)]
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Wed, 25 Jun 2025 19:00:04 GMT)
Full text and
rfc822 format available.
Message #8 received at 78896 <at> debbugs.gnu.org (full text, mbox):
> Given the following minimal init file:
> ```
> ;; min-init.el
> (require 'tab-bar)
> (tab-bar-mode)
> (add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
> (display-time-mode -1)
> ```
>
> I do the following:
> ```
> emacs -Q --daemon --load min-init.el
> ```
>
> Then when I start emacsclient in the terminal with `emacsclient -t`, the
> minibuffer won't work at all. When I don't do this via the server,
> e.g. removing `--daemon` from the above invocation, the minibuffer works
> fine.
>
> Let me try to describe what I mean when I say that the minibuffer
> doesn't work. `M-x` puts the cursor at the beginning of the minibuffer
> (no "M-x" text). Typing any key says that the key is not defined. `C-g`
> doesn't work either.
Thanks for the bug report. My guess is that it's related
to forcing switching frame focus to the active minibuffer.
'tab-bar-format-global' calls 'format-mode-line' that
on a tty frame forces focus to the initial daemon frame.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Thu, 26 Jun 2025 05:12:03 GMT)
Full text and
rfc822 format available.
Message #11 received at 78896 <at> debbugs.gnu.org (full text, mbox):
> Cc: 78896 <at> debbugs.gnu.org
> From: Juri Linkov <juri <at> linkov.net>
> Date: Wed, 25 Jun 2025 21:57:30 +0300
>
> > Given the following minimal init file:
> > ```
> > ;; min-init.el
> > (require 'tab-bar)
> > (tab-bar-mode)
> > (add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
> > (display-time-mode -1)
> > ```
> >
> > I do the following:
> > ```
> > emacs -Q --daemon --load min-init.el
> > ```
> >
> > Then when I start emacsclient in the terminal with `emacsclient -t`, the
> > minibuffer won't work at all. When I don't do this via the server,
> > e.g. removing `--daemon` from the above invocation, the minibuffer works
> > fine.
> >
> > Let me try to describe what I mean when I say that the minibuffer
> > doesn't work. `M-x` puts the cursor at the beginning of the minibuffer
> > (no "M-x" text). Typing any key says that the key is not defined. `C-g`
> > doesn't work either.
>
> Thanks for the bug report. My guess is that it's related
> to forcing switching frame focus to the active minibuffer.
> 'tab-bar-format-global' calls 'format-mode-line' that
> on a tty frame forces focus to the initial daemon frame.
These kinds of initializations and customizations should be moved to
server-after-make-frame-hook. They should only be invoked directly
from the init file in non-daemon session (one could use the function
daemonp to check that). The rule is that any initialization or
customization that needs the Emacs GUI system to be up and running
should be done from server-after-make-frame-hook.
Note that server-after-make-frame-hook is run after starting each new
frame, not just once. So if you have one-time initializations, you
need some state variable you can set to indicate that the one-time
stuff was already done, and set it after performing those
initializations for the first time.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Thu, 26 Jun 2025 06:17:02 GMT)
Full text and
rfc822 format available.
Message #14 received at 78896 <at> debbugs.gnu.org (full text, mbox):
> These kinds of initializations and customizations should be moved to
> server-after-make-frame-hook. They should only be invoked directly
> from the init file in non-daemon session (one could use the function
> daemonp to check that). The rule is that any initialization or
> customization that needs the Emacs GUI system to be up and running
> should be done from server-after-make-frame-hook.
>
> Note that server-after-make-frame-hook is run after starting each new
> frame, not just once. So if you have one-time initializations, you
> need some state variable you can set to indicate that the one-time
> stuff was already done, and set it after performing those
> initializations for the first time.
I confirm that everything works without problems with:
```
;; min-init.el
(require 'tab-bar)
(add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
(display-time-mode 1)
(add-hook 'server-after-make-frame-hook 'toggle-frame-tab-bar)
```
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Fri, 27 Jun 2025 07:03:01 GMT)
Full text and
rfc822 format available.
Message #17 received at 78896 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
> I confirm that everything works without problems with:
>
> ```
> ;; min-init.el
> (require 'tab-bar)
> (add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
> (display-time-mode 1)
> (add-hook 'server-after-make-frame-hook 'toggle-frame-tab-bar)
> ```
Here is the patch that also allows using the original recipe:
```
;; min-init.el
(require 'tab-bar)
(tab-bar-mode)
(add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
(display-time-mode -1)
```
This patch instructs tab-bar-mode to ignore daemon's initial frame:
[tab-bar-daemon-initial-frame.patch (text/x-diff, inline)]
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 306fed34e40..7dc39086044 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -280,11 +280,13 @@ tab-bar--update-tab-bar-lines
(dolist (frame frame-lst)
(unless (or (frame-parameter frame 'tab-bar-lines-keep-state)
(and (eq auto-resize-tab-bars 'grow-only)
- (> (frame-parameter frame 'tab-bar-lines) 1)))
+ (> (frame-parameter frame 'tab-bar-lines) 1))
+ ;; Don't enable tab-bar in daemon's initial frame.
+ (and (daemonp) (not (frame-parameter frame 'client))))
(set-frame-parameter frame 'tab-bar-lines
(tab-bar--tab-bar-lines-for-frame frame)))))
;; Update `default-frame-alist'
- (when (eq frames t)
+ (when (and (eq frames t) (not (daemonp)))
(setq default-frame-alist
(cons (cons 'tab-bar-lines
(if (and tab-bar-mode (eq tab-bar-show t)) 1 0))
@@ -600,7 +602,11 @@ toggle-frame-tab-bar
or if you want to disable the tab bar individually on each
new frame when the global `tab-bar-mode' is enabled, by using
- (add-hook \\='after-make-frame-functions #\\='toggle-frame-tab-bar)"
+ (add-hook \\='after-make-frame-functions #\\='toggle-frame-tab-bar)
+
+Or when starting Emacs in daemon mode:
+
+ (add-hook \\='server-after-make-frame-hook #\\='toggle-frame-tab-bar)"
(interactive)
(set-frame-parameter frame 'tab-bar-lines
(if (> (frame-parameter frame 'tab-bar-lines) 0) 0 1))
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Fri, 27 Jun 2025 17:44:02 GMT)
Full text and
rfc822 format available.
Message #20 received at 78896 <at> debbugs.gnu.org (full text, mbox):
close 78896 31.0.50
thanks
> Here is the patch that also allows using the original recipe:
>
> ```
> ;; min-init.el
> (require 'tab-bar)
> (tab-bar-mode)
> (add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
> (display-time-mode -1)
> ```
>
> This patch instructs tab-bar-mode to ignore daemon's initial frame:
So now pushed and closed.
bug marked as fixed in version 31.0.50, send any further explanations to
78896 <at> debbugs.gnu.org and Varun Malladi <varun.malladi <at> gmail.com>
Request was from
Juri Linkov <juri <at> linkov.net>
to
control <at> debbugs.gnu.org
.
(Fri, 27 Jun 2025 17:44:03 GMT)
Full text and
rfc822 format available.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Sun, 29 Jun 2025 07:02:03 GMT)
Full text and
rfc822 format available.
Message #25 received at 78896 <at> debbugs.gnu.org (full text, mbox):
[Moving back to bug#78896 for continuity]
>>> * lisp/tab-bar.el: Ignore daemon's initial frame (bug#78896).
>>> (tab-bar--update-tab-bar-lines): Don't set the frame parameter
>>> 'tab-bar-lines' in daemon's initial frame because it messes up the
>>> frames when 'format-mode-line' called from 'tab-bar-format-global'
>>> on daemon's initial frame forces focus switch to daemon's initial
>>> frame. Also don't set 'default-frame-alist' in daemon mode because
>>> 'frame-notice-user-settings' copies the frame parameter 'tab-bar-lines'
>>> from 'default-frame-alist' to daemon's initial frame. Here updating
>>> 'default-frame-alist' is not much needed anyway since the frame
>>> parameter 'tab-bar-lines' for new frames is set in 'make_terminal_frame'
>>> and 'x-create-frame'. 'default-frame-alist' might be need only
>>> to handle non-default 'tab-bar-show', but this can be handled by
>>> 'toggle-frame-tab-bar' called from 'server-after-make-frame-hook'.
>>> (toggle-frame-tab-bar): Document a useful case of calling it
>>> from 'server-after-make-frame-hook'.
>>
>> This would seem to have broken (setopt tab-bar-show 1).
>> In my Emacs the tab bar is now always shown.
>
> The change to not update default-frame-alist, when (daemonp), is the
> problem. According to your commit message "this can be handled by
> 'toggle-frame-tab-bar' called from 'server-after-make-frame-hook'".
> But clearly it is not being handled. It seems like a regression that I
> would now have to add something to server-after-make-frame-hook to make
> my tab-bar-show customisation work.
Sorry, indeed not handled in 'toggle-frame-tab-bar'. And not sure
if it should handle 'tab-bar-show' at all. So need to find a solution
that doesn't require using 'toggle-frame-tab-bar'. The most reliable way
is to update 'default-frame-alist' even when (daemonp). The problem is
that it requires ad-hoc changes in 'frame-notice-user-settings'
that I tried to avoid.
The docstring of 'default-frame-alist' says:
Setting this variable does not affect existing frames, only new ones.
But in fact 'frame-notice-user-settings' affects the existing
daemon's initial frame. We need to find a fix that ignores it
in 'frame-notice-user-settings'.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Sun, 29 Jun 2025 17:08:06 GMT)
Full text and
rfc822 format available.
Message #28 received at 78896 <at> debbugs.gnu.org (full text, mbox):
> The most reliable way is to update 'default-frame-alist' even when
> (daemonp). The problem is that it requires ad-hoc changes in
> 'frame-notice-user-settings' that I tried to avoid.
>
> The docstring of 'default-frame-alist' says:
>
> Setting this variable does not affect existing frames, only new ones.
>
> But in fact 'frame-notice-user-settings' affects the existing
> daemon's initial frame. We need to find a fix that ignores it
> in 'frame-notice-user-settings'.
So I added 'tab-bar-lines' handling for daemon's initial frame
to 'frame-notice-user-settings'.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#78896
; Package
emacs
.
(Sun, 29 Jun 2025 21:29:02 GMT)
Full text and
rfc822 format available.
Message #31 received at 78896 <at> debbugs.gnu.org (full text, mbox):
Hello,
On Sun 29 Jun 2025 at 08:06pm +03, Juri Linkov wrote:
>> The most reliable way is to update 'default-frame-alist' even when
>> (daemonp). The problem is that it requires ad-hoc changes in
>> 'frame-notice-user-settings' that I tried to avoid.
>>
>> The docstring of 'default-frame-alist' says:
>>
>> Setting this variable does not affect existing frames, only new ones.
>>
>> But in fact 'frame-notice-user-settings' affects the existing
>> daemon's initial frame. We need to find a fix that ignores it
>> in 'frame-notice-user-settings'.
>
> So I added 'tab-bar-lines' handling for daemon's initial frame
> to 'frame-notice-user-settings'.
That fixes the problem I was seeing -- thanks!
--
Sean Whitton
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Mon, 28 Jul 2025 11:24:07 GMT)
Full text and
rfc822 format available.
This bug report was last modified 17 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.