unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
@ 2020-12-30 14:44 Marcel Ventosa
  2021-01-05 18:43 ` Juri Linkov
  0 siblings, 1 reply; 5+ messages in thread
From: Marcel Ventosa @ 2020-12-30 14:44 UTC (permalink / raw)
  To: 45556

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))





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
  2020-12-30 14:44 bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable Marcel Ventosa
@ 2021-01-05 18:43 ` Juri Linkov
  2021-01-06  4:04   ` Marcel Ventosa
  0 siblings, 1 reply; 5+ messages in thread
From: Juri Linkov @ 2021-01-05 18:43 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: 45556

> (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)





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
  2021-01-05 18:43 ` Juri Linkov
@ 2021-01-06  4:04   ` Marcel Ventosa
  2021-01-06 18:04     ` Juri Linkov
  0 siblings, 1 reply; 5+ messages in thread
From: Marcel Ventosa @ 2021-01-06  4:04 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 45556

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@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.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
  2021-01-06  4:04   ` Marcel Ventosa
@ 2021-01-06 18:04     ` Juri Linkov
  2021-01-07 18:09       ` Juri Linkov
  0 siblings, 1 reply; 5+ messages in thread
From: Juri Linkov @ 2021-01-06 18:04 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: 45556

[-- Attachment #1: Type: text/plain, Size: 456 bytes --]

> 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:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: tab-bar-show.patch --]
[-- Type: text/x-diff, Size: 1534 bytes --]

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")
 

[-- Attachment #3: Type: text/plain, Size: 1634 bytes --]


> 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)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable
  2021-01-06 18:04     ` Juri Linkov
@ 2021-01-07 18:09       ` Juri Linkov
  0 siblings, 0 replies; 5+ messages in thread
From: Juri Linkov @ 2021-01-07 18:09 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: 45556

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.





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-01-07 18:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-12-30 14:44 bug#45556: 27.1; Unexpected behavior of `tab-bar-show' variable Marcel Ventosa
2021-01-05 18:43 ` Juri Linkov
2021-01-06  4:04   ` Marcel Ventosa
2021-01-06 18:04     ` Juri Linkov
2021-01-07 18:09       ` Juri Linkov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).