GNU bug report logs - #45556
27.1; Unexpected behavior of `tab-bar-show' variable

Previous Next

Package: emacs;

Reported by: Marcel Ventosa <mve1 <at> runbox.com>

Date: Wed, 30 Dec 2020 17:37:02 UTC

Severity: normal

Tags: fixed

Found in version 27.1

Fixed in version 28.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 45556 in the body.
You can then email your comments to 45556 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#45556; Package emacs. (Wed, 30 Dec 2020 17:37:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Marcel Ventosa <mve1 <at> runbox.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 30 Dec 2020 17:37:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Marcel Ventosa <mve1 <at> runbox.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 27.1; Unexpected behavior of `tab-bar-show' variable
Date: Wed, 30 Dec 2020 21:44:19 +0700
Hello,

I may be misunderstanding the purpose of the `tab-bar-show' variable.


Expected behavior
=================

If tab-bar-show = 1, Tab Bar is not visible when less than two tabs are
available.

If tab-bar-show = nil, Tab Bar is never visible

If tab-bar-show = t, Tab Bar is always visible

In addition, I would like to be able to change the value of
tab-bar-show to toggle the visibility of the Tab Bar (I don't want to
disable the mode, only hide the Tab Bar).


Actual behavior and recipe
==========================

Run "emacs -q", switch to *scratch* and evaluate the following, in
order:

(tab-bar-mode)
;; tab bar is shown on top of buffer
(setq tab-bar-show 1)
;; no change. Maybe we need to toggle the mode to effect changes?
(tab-bar-mode 0)
;; bar disappears
(tab-bar-mode)
;; bar still reappears with only one tab
;; expected behavior: tab bar remains hidden because only one tab exists
(tab-bar-new-tab)
;; two tabs exist and are visible
(tab-bar-close-tab)
;; only one tab is left, tab bar is hidden
(tab-bar-mode)
;; turn mode off again
(setq tab-bar-show nil)
;; no bar should be visible if I turn tab-bar-mode on again
(tab-bar-mode)
;; tab bar is still visible even with the variable set to nil


Best regards,

Marcel


In GNU Emacs 27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.22,
cairo version 1.17.3) of 2020-08-29 built on juergen
Windowing system distributor 'The X.Org Foundation', version
11.0.12010000 System Description: Arch Linux

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Configured using:
 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
 --localstatedir=/var --with-x-toolkit=gtk3 --with-xft --with-wide-int
 --with-modules --with-cairo --with-harfbuzz 'CFLAGS=-march=x86-64
 -mtune=generic -O2 -pipe -fno-plt' CPPFLAGS=-D_FORTIFY_SOURCE=2
 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GSETTINGS GLIB NOTIFY
INOTIFY ACL GNUTLS LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD JSON
PDUMPER LCMS2 GMP

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-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
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/usr/share/emacs/site-lisp/xscheme hides
/usr/share/emacs/27.1/lisp/progmodes/xscheme

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs text-property-search time-date
subr-x seq byte-opt gv bytecomp byte-compile cconv mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
timer select scroll-bar mouse jit-lock font-lock syntax facemenu
font-core term/tty-colors frame minibuffer cl-generic 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 charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
cairo move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 48049 7619)
 (symbols 48 6063 1)
 (strings 32 16016 1561)
 (string-bytes 1 513429)
 (vectors 16 10137)
 (vector-slots 8 130537 9788)
 (floats 8 19 43)
 (intervals 56 236 0)
 (buffers 1000 13))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#45556; Package emacs. (Tue, 05 Jan 2021 18:46:02 GMT) Full text and rfc822 format available.

Message #8 received at 45556 <at> debbugs.gnu.org (full text, mbox):

From: Juri Linkov <juri <at> linkov.net>
To: Marcel Ventosa <mve1 <at> runbox.com>
Cc: 45556 <at> debbugs.gnu.org
Subject: Re: bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
Date: Tue, 05 Jan 2021 20:43:48 +0200
> (tab-bar-mode)
> ;; tab bar is shown on top of buffer
> (setq tab-bar-show 1)
> ;; no change. Maybe we need to toggle the mode to effect changes?

This is expected behavior because tab-bar-show is designed
to be customized using

  (customize-set-variable 'tab-bar-show 1)

> (tab-bar-mode 0)
> ;; bar disappears
> (tab-bar-mode)
> ;; bar still reappears with only one tab
> ;; expected behavior: tab bar remains hidden because only one tab exists

Actually the low-level function 'tab-bar-mode' was designed
to give more freedom to override the value of 'tab-bar-show'.
So you don't need to use 'tab-bar-mode' because
after customizing 'tab-bar-show', the commands
'tab-bar-new-tab' and 'tab-bar-close-tab' will do the right thing
as your next examples demonstrate:

> (tab-bar-new-tab)
> ;; two tabs exist and are visible
> (tab-bar-close-tab)
> ;; only one tab is left, tab bar is hidden

But below again, no need to use low-level tab-bar-mode,
and tab-bar-show should be changed with customize.

> (tab-bar-mode)
> ;; turn mode off again
> (setq tab-bar-show nil)
> ;; no bar should be visible if I turn tab-bar-mode on again
> (tab-bar-mode)
> ;; tab bar is still visible even with the variable set to nil

So there are two levels: at high level you can customize 'tab-bar-show',
and tab commands do the right thing.

If you want more control, then you can use 'tab-bar-mode'.
Or if you want to enable/disable the tab bar individually
on each new frame, then you can use such configuration:

  (add-hook 'after-make-frame-functions 'toggle-frame-tab-bar)




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#45556; Package emacs. (Wed, 06 Jan 2021 12:18:02 GMT) Full text and rfc822 format available.

Message #11 received at 45556 <at> debbugs.gnu.org (full text, mbox):

From: Marcel Ventosa <mve1 <at> runbox.com>
To: Juri Linkov <juri <at> linkov.net>
Cc: 45556 <at> debbugs.gnu.org
Subject: Re: bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
Date: Wed, 6 Jan 2021 11:04:29 +0700
Hi Juri,

Thank you for your response! After your detailed explanation I was able
to set things up the way I want, though I still have a question below
inline. 

I was also unaware of the differences between setting a variable with
'setq' and 'customize-set-variable'. 

This was not a bug after all. But would it be useful to mention in the
doc string that the variable's behavior will be different if modified
by setq? Or is this already common knowledge? 


Best regards,

Marcel

On Tue, 05 Jan 2021 20:43:48 +0200
Juri Linkov <juri <at> linkov.net> wrote:

> So there are two levels: at high level you can customize
> 'tab-bar-show', and tab commands do the right thing.
> 
> If you want more control, then you can use 'tab-bar-mode'.
> Or if you want to enable/disable the tab bar individually
> on each new frame, then you can use such configuration:
> 
>   (add-hook 'after-make-frame-functions 'toggle-frame-tab-bar)

Somehow reading a function name "toggle-tab-bar-mode..." my
understanding is that such a function would enable and disable tab-bar
functionality itself, rather than only show and hide the bar. I see
now that toggling the 'tab-bar-mode' minor mode also does not
enable/disable the tab-bar functionality, but rather seems to just
toggle the actual bar. Is this correct? If so, what is the difference
between 'toggle-tab-bar-mode-from-frame' and 'tab-bar-mode'. Both of
them seem to toggle the tab bar in _all_ frames.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#45556; Package emacs. (Wed, 06 Jan 2021 18:12:01 GMT) Full text and rfc822 format available.

Message #14 received at 45556 <at> debbugs.gnu.org (full text, mbox):

From: Juri Linkov <juri <at> linkov.net>
To: Marcel Ventosa <mve1 <at> runbox.com>
Cc: 45556 <at> debbugs.gnu.org
Subject: Re: bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
Date: Wed, 06 Jan 2021 20:04:25 +0200
[Message part 1 (text/plain, inline)]
> This was not a bug after all. But would it be useful to mention in the
> doc string that the variable's behavior will be different if modified
> by setq? Or is this already common knowledge? 

Thank you for the suggestion to mention this in the doc string.
While updating the doc string, I noticed the problem that currently
it doesn't update each frame individually according to the new
customized value, so this problem will be fixed with this patch:

[tab-bar-show.patch (text/x-diff, inline)]
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 5a95e5975d..69746d5f84 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -236,18 +236,27 @@ tab-bar-show
 and show it again once more tabs are created.
 If nil, always keep the tab bar hidden.  In this case it's still
 possible to use persistent named window configurations by relying on
-keyboard commands `tab-new', `tab-close', `tab-next', `tab-switcher', etc."
+keyboard commands `tab-new', `tab-close', `tab-next', `tab-switcher', etc.
+
+Please customize this variable using the Customization UI, then
+it will automatically update the existing tab bars on each frame."
   :type '(choice (const :tag "Always" t)
                  (const :tag "When more than one tab" 1)
                  (const :tag "Never" nil))
   :initialize 'custom-initialize-default
   :set (lambda (sym val)
          (set-default sym val)
-         (tab-bar-mode
-          (if (or (eq val t)
-                  (and (natnump val)
-                       (> (length (funcall tab-bar-tabs-function)) val)))
-              1 -1)))
+         ;; Preload button images
+         (tab-bar-mode 1)
+         ;; Then handle each frame individually
+         (dolist (frame (frame-list))
+           (set-frame-parameter
+            frame 'tab-bar-lines
+            (if (or (eq val t)
+                    (and (natnump val)
+                         (> (length (funcall tab-bar-tabs-function frame))
+                            val)))
+                1 0))))
   :group 'tab-bar
   :version "27.1")
 
[Message part 3 (text/plain, inline)]
> Somehow reading a function name "toggle-tab-bar-mode..." my
> understanding is that such a function would enable and disable tab-bar
> functionality itself, rather than only show and hide the bar. I see
> now that toggling the 'tab-bar-mode' minor mode also does not
> enable/disable the tab-bar functionality, but rather seems to just
> toggle the actual bar. Is this correct?

This is almost correct.  Additionally, 'tab-bar-mode' also
loads button images and assigns C-TAB keys.

> If so, what is the difference between 'toggle-tab-bar-mode-from-frame'
> and 'tab-bar-mode'. Both of them seem to toggle the tab bar in
> _all_ frames.

Indeed, 'tab-bar-mode' toggles the tab bar in all frames, but
'toggle-tab-bar-mode-from-frame' is a very specialized command.
It's used only in the Show/Hide menu, to have the toggle reflect
the current frame, as the comment before its definition says.
Maybe this comment should be moved to its doc string like this:

diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 5a95e5975d..e239a02a64 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -187,9 +187,9 @@ tab-bar-handle-mouse
         ;; Clicking anywhere outside existing tabs will add a new tab
         (tab-bar-new-tab)))))
 
-;; Used in the Show/Hide menu, to have the toggle reflect the current frame.
 (defun toggle-tab-bar-mode-from-frame (&optional arg)
   "Toggle tab bar on or off, based on the status of the current frame.
+Used in the Show/Hide menu, to have the toggle reflect the current frame.
 See `tab-bar-mode' for more information."
   (interactive (list (or current-prefix-arg 'toggle)))
   (if (eq arg 'toggle)

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#45556; Package emacs. (Thu, 07 Jan 2021 18:11:02 GMT) Full text and rfc822 format available.

Message #17 received at 45556 <at> debbugs.gnu.org (full text, mbox):

From: Juri Linkov <juri <at> linkov.net>
To: Marcel Ventosa <mve1 <at> runbox.com>
Cc: 45556 <at> debbugs.gnu.org
Subject: Re: bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
Date: Thu, 07 Jan 2021 20:09:28 +0200
tags 45556 fixed
close 45556 28.0.50
thanks

>> This was not a bug after all. But would it be useful to mention in the
>> doc string that the variable's behavior will be different if modified
>> by setq? Or is this already common knowledge? 
>
> Thank you for the suggestion to mention this in the doc string.

Now all updates were pushed to master, and this bug report is closed.




Added tag(s) fixed. Request was from Juri Linkov <juri <at> linkov.net> to control <at> debbugs.gnu.org. (Thu, 07 Jan 2021 18:11:02 GMT) Full text and rfc822 format available.

bug marked as fixed in version 28.0.50, send any further explanations to 45556 <at> debbugs.gnu.org and Marcel Ventosa <mve1 <at> runbox.com> Request was from Juri Linkov <juri <at> linkov.net> to control <at> debbugs.gnu.org. (Thu, 07 Jan 2021 18:11:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 05 Feb 2021 12:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 80 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.