unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
@ 2024-07-28  5:10 Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-08-04  8:33 ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-28  5:10 UTC (permalink / raw)
  To: 72331

Directly modifying the variable horizontal-scroll-bar on MacOS doesn't
show a scroll bar unless the frame also has the horizontal-scroll-bars
frame  parameter set.  This only happens on MacOS, on Linux and Windows
everything behaves as I would expect.

To reproduce, define the following function:

(defun bug-report-toggle-buffer-horizontal-scroll-bar ()
   "Like `toggle-scroll-bar', but for just the current buffer.
And for horizontal scroll bars.  I guess it's acutally very
different."
   (interactive)
   (setq horizontal-scroll-bar (if horizontal-scroll-bar nil 'bottom))
   (set-window-buffer (selected-window) (current-buffer)))

Then run M-x bug-report-toggle-buffer-horizontal-scroll-bar repeatedly
and observe that on MacOS space gets reserved for the horizontal scroll
bar but no scroll bar is rendered.  Finally, run M-x
horizontal-scroll-bar-mode and observe that now the horizontal scroll
bar is properly shown and hidden.

I also tested this on master and observed the same behavior.

In GNU Emacs 29.4 (build 1, aarch64-apple-darwin21.6.0, NS
  appkit-2113.60 Version 12.6.6 (Build 21G646)) of 2024-07-24 built on
  armbob.lan
Windowing system distributor 'Apple', version 10.3.2487
System Description:  macOS 14.5

Configured using:
  'configure --with-ns '--enable-locallisppath=/Library/Application
  Support/Emacs/${version}/site-lisp:/Library/Application
  Support/Emacs/site-lisp' --with-modules 'CFLAGS=-DFD_SETSIZE=10000
  -DDARWIN_UNLIMITED_SELECT' --with-x-toolkit=no'

Configured features:
ACL GLIB GMP GNUTLS JPEG JSON LIBXML2 MODULES NOTIFY KQUEUE NS PDUMPER
PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER ZLIB

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

Major mode: ELisp/l

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 vc-git diff-mode easy-mmode vc-dispatcher
cl-extra cl-print byte-opt gv bytecomp byte-compile thingatpt help-fns
radix-tree help-mode dabbrev 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 subr-x
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 rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/ns-win ns-win ucs-normalize mule-util term/common-win 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 kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 60165 20431)
  (symbols 48 6527 0)
  (strings 32 20561 2286)
  (string-bytes 1 561629)
  (vectors 16 13714)
  (vector-slots 8 194672 14038)
  (floats 8 33 135)
  (intervals 56 399 17)
  (buffers 984 14))





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

* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
  2024-07-28  5:10 bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS only) Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-08-04  8:33 ` Eli Zaretskii
  2024-08-05 13:43   ` Gerd Möllmann
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2024-08-04  8:33 UTC (permalink / raw)
  To: Jared Finder; +Cc: 72331

> Date: Sat, 27 Jul 2024 22:10:06 -0700
> From:  Jared Finder via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> 
> Directly modifying the variable horizontal-scroll-bar on MacOS doesn't
> show a scroll bar unless the frame also has the horizontal-scroll-bars
> frame  parameter set.  This only happens on MacOS, on Linux and Windows
> everything behaves as I would expect.
> 
> To reproduce, define the following function:
> 
> (defun bug-report-toggle-buffer-horizontal-scroll-bar ()
>    "Like `toggle-scroll-bar', but for just the current buffer.
> And for horizontal scroll bars.  I guess it's acutally very
> different."
>    (interactive)
>    (setq horizontal-scroll-bar (if horizontal-scroll-bar nil 'bottom))
>    (set-window-buffer (selected-window) (current-buffer)))
> 
> Then run M-x bug-report-toggle-buffer-horizontal-scroll-bar repeatedly
> and observe that on MacOS space gets reserved for the horizontal scroll
> bar but no scroll bar is rendered.  Finally, run M-x
> horizontal-scroll-bar-mode and observe that now the horizontal scroll
> bar is properly shown and hidden.
> 
> I also tested this on master and observed the same behavior.

Thanks.

Could some macOS user please look into this?





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

* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
  2024-08-04  8:33 ` Eli Zaretskii
@ 2024-08-05 13:43   ` Gerd Möllmann
  2024-08-08  6:45     ` Gerd Möllmann
  0 siblings, 1 reply; 6+ messages in thread
From: Gerd Möllmann @ 2024-08-05 13:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Po Lu, Jared Finder, 72331

Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Sat, 27 Jul 2024 22:10:06 -0700
>> From:  Jared Finder via "Bug reports for GNU Emacs,
>>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>> 
>> Directly modifying the variable horizontal-scroll-bar on MacOS doesn't
>> show a scroll bar unless the frame also has the horizontal-scroll-bars
>> frame  parameter set.  This only happens on MacOS, on Linux and Windows
>> everything behaves as I would expect.
>> 
>> To reproduce, define the following function:
>> 
>> (defun bug-report-toggle-buffer-horizontal-scroll-bar ()
>>    "Like `toggle-scroll-bar', but for just the current buffer.
>> And for horizontal scroll bars.  I guess it's acutally very
>> different."
>>    (interactive)
>>    (setq horizontal-scroll-bar (if horizontal-scroll-bar nil 'bottom))
>>    (set-window-buffer (selected-window) (current-buffer)))
>> 
>> Then run M-x bug-report-toggle-buffer-horizontal-scroll-bar repeatedly
>> and observe that on MacOS space gets reserved for the horizontal scroll
>> bar but no scroll bar is rendered.  Finally, run M-x
>> horizontal-scroll-bar-mode and observe that now the horizontal scroll
>> bar is properly shown and hidden.
>> 
>> I also tested this on master and observed the same behavior.
>
> Thanks.
>
> Could some macOS user please look into this?

Same for vertical-scroll-bar, BTW. From reading the code and setting a
breakpoint in ns_set_horizontal_scroll_bar, I'd say it's the definition
of these macros in nsterm.h:

  /* Compute pixel size for vertical scroll bars.  */
  #define NS_SCROLL_BAR_WIDTH(f)						\
    (FRAME_HAS_VERTICAL_SCROLL_BARS (f)					\
     ? rint (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0			\
             ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f)				\
             : (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)))	\
     : 0)

  /* Compute pixel size for horizontal scroll bars.  */
  #define NS_SCROLL_BAR_HEIGHT(f)						\
    (FRAME_HAS_HORIZONTAL_SCROLL_BARS (f)					\
     ? rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0			\
             ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f)				\
             : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)))	\
     : 0)

Both check FRAME_HAS_H/V_SCROLL_BARS which in this case results in width
or height being 0, which is a bit small.

A change like the one below makes the horizontal scroll bar visible with
Jared's test function.

1 file changed, 4 insertions(+), 1 deletion(-)
src/nsterm.m | 5 ++++-

modified   src/nsterm.m
@@ -5167,7 +5167,10 @@ Function modeled after x_draw_glyph_string_box ().
   window_box (window, ANY_AREA, &window_x, 0, &window_width, 0);
   left = window_x;
   width = window_width;
-  height = NS_SCROLL_BAR_HEIGHT (f);
+  //  height = NS_SCROLL_BAR_HEIGHT (f);
+  height = rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0
+		 ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f)
+		 : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)));
   top = WINDOW_SCROLL_BAR_AREA_Y (window);
 
   r = NSMakeRect (left, top, width, height);

If that's the right thing (plus a corresponding change for vertical
scroll bars) I don't know without studying the code and docs, and what
other platforms do.

Maybe Po Lu can help (CC'd).





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

* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
  2024-08-05 13:43   ` Gerd Möllmann
@ 2024-08-08  6:45     ` Gerd Möllmann
  2024-08-09  3:47       ` Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 6+ messages in thread
From: Gerd Möllmann @ 2024-08-08  6:45 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Po Lu, Jared Finder, 72331

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

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> Date: Sat, 27 Jul 2024 22:10:06 -0700
>>> From:  Jared Finder via "Bug reports for GNU Emacs,
>>>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>>> 
>>> Directly modifying the variable horizontal-scroll-bar on MacOS doesn't
>>> show a scroll bar unless the frame also has the horizontal-scroll-bars
>>> frame  parameter set.  This only happens on MacOS, on Linux and Windows
>>> everything behaves as I would expect.
>>> 
>>> To reproduce, define the following function:
>>> 
>>> (defun bug-report-toggle-buffer-horizontal-scroll-bar ()
>>>    "Like `toggle-scroll-bar', but for just the current buffer.
>>> And for horizontal scroll bars.  I guess it's acutally very
>>> different."
>>>    (interactive)
>>>    (setq horizontal-scroll-bar (if horizontal-scroll-bar nil 'bottom))
>>>    (set-window-buffer (selected-window) (current-buffer)))
>>> 
>>> Then run M-x bug-report-toggle-buffer-horizontal-scroll-bar repeatedly
>>> and observe that on MacOS space gets reserved for the horizontal scroll
>>> bar but no scroll bar is rendered.  Finally, run M-x
>>> horizontal-scroll-bar-mode and observe that now the horizontal scroll
>>> bar is properly shown and hidden.
>>> 
>>> I also tested this on master and observed the same behavior.
>>
>> Thanks.
>>
>> Could some macOS user please look into this?
>
> Same for vertical-scroll-bar, BTW. From reading the code and setting a
> breakpoint in ns_set_horizontal_scroll_bar, I'd say it's the definition
> of these macros in nsterm.h:
>
>   /* Compute pixel size for vertical scroll bars.  */
>   #define NS_SCROLL_BAR_WIDTH(f)						\
>     (FRAME_HAS_VERTICAL_SCROLL_BARS (f)					\
>      ? rint (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0			\
>              ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f)				\
>              : (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)))	\
>      : 0)
>
>   /* Compute pixel size for horizontal scroll bars.  */
>   #define NS_SCROLL_BAR_HEIGHT(f)						\
>     (FRAME_HAS_HORIZONTAL_SCROLL_BARS (f)					\
>      ? rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0			\
>              ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f)				\
>              : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)))	\
>      : 0)
>
> Both check FRAME_HAS_H/V_SCROLL_BARS which in this case results in width
> or height being 0, which is a bit small.
>
> A change like the one below makes the horizontal scroll bar visible with
> Jared's test function.

I think the fix is the attached patch. Jared, could you please try it?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-NS-Fix-scroll-bar-setting-code-bug-72331.patch --]
[-- Type: text/x-patch, Size: 3132 bytes --]

From 0388af932e0c013ad45597fffad3e990ae00d664 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gerd=20M=C3=B6llmann?= <gerd@gnu.org>
Date: Thu, 8 Aug 2024 08:19:56 +0200
Subject: [PATCH] NS: Fix scroll-bar setting code ()bug#72331)

* src/nsterm.m (ns_set_vertical_scroll_bar): Use
WINDOW_SCROLL_AREA_WIDTH instead of NS_SCROLL_BAR_WIDTH.
(ns_set_horizontal_scroll_bar): Use WINDOW_SCROLL_AREA_HEIGHT
instead of NS_SCROLL_BAR_HEIGHT. Clear area differently if vertical
scroll bars are present.
* src/nsterm.h (NS_SCROLL_BAR_WIDTH, NS_SCROLL_BAR_HEIGHT): Remove.
---
 src/nsterm.h | 16 ----------------
 src/nsterm.m |  6 +++---
 2 files changed, 3 insertions(+), 19 deletions(-)

diff --git a/src/nsterm.h b/src/nsterm.h
index 844f2b2bc78..256a233558e 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1070,22 +1070,6 @@ #define FRAME_TOOLBAR_HEIGHT(f)                                         \
                      styleMask:[[FRAME_NS_VIEW (f) window] styleMask]]) \
            - NSHeight([[[FRAME_NS_VIEW (f) window] contentView] frame])))
 
-/* Compute pixel size for vertical scroll bars.  */
-#define NS_SCROLL_BAR_WIDTH(f)						\
-  (FRAME_HAS_VERTICAL_SCROLL_BARS (f)					\
-   ? rint (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0			\
-	   ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f)				\
-	   : (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)))	\
-   : 0)
-
-/* Compute pixel size for horizontal scroll bars.  */
-#define NS_SCROLL_BAR_HEIGHT(f)						\
-  (FRAME_HAS_HORIZONTAL_SCROLL_BARS (f)					\
-   ? rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0			\
-	   ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f)				\
-	   : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)))	\
-   : 0)
-
 /* Difference between char-column-calculated and actual SB widths.
    This is only a concern for rendering when SB on left.  */
 #define NS_SCROLL_BAR_ADJUST(w, f)				\
diff --git a/src/nsterm.m b/src/nsterm.m
index 594f7ba974b..4f2047fa3ef 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -5072,7 +5072,7 @@ Function modeled after x_draw_glyph_string_box ().
   window_box (window, ANY_AREA, 0, &window_y, 0, &window_height);
   top = window_y;
   height = window_height;
-  width = NS_SCROLL_BAR_WIDTH (f);
+  width = WINDOW_SCROLL_BAR_AREA_WIDTH (window);
   left = WINDOW_SCROLL_BAR_AREA_X (window);
 
   r = NSMakeRect (left, top, width, height);
@@ -5166,7 +5166,7 @@ Function modeled after x_draw_glyph_string_box ().
   window_box (window, ANY_AREA, &window_x, 0, &window_width, 0);
   left = window_x;
   width = window_width;
-  height = NS_SCROLL_BAR_HEIGHT (f);
+  height = WINDOW_SCROLL_BAR_AREA_HEIGHT (window);
   top = WINDOW_SCROLL_BAR_AREA_Y (window);
 
   r = NSMakeRect (left, top, width, height);
@@ -5204,7 +5204,7 @@ Function modeled after x_draw_glyph_string_box ().
      it fills with junk.  */
   if (!NILP (window->vertical_scroll_bar))
     ns_clear_frame_area (f, WINDOW_SCROLL_BAR_AREA_X (window), top,
-                         NS_SCROLL_BAR_HEIGHT (f), height);
+                         WINDOW_SCROLL_BAR_AREA_WIDTH (window), height);
 
   if (update_p)
     [bar setPosition: position portion: portion whole: whole];
-- 
2.46.0


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

* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
  2024-08-08  6:45     ` Gerd Möllmann
@ 2024-08-09  3:47       ` Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-08-09  5:23         ` Gerd Möllmann
  0 siblings, 1 reply; 6+ messages in thread
From: Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-08-09  3:47 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: Po Lu, Eli Zaretskii, 72331

On 2024-08-07 23:45, Gerd Möllmann wrote:
> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
> 
>> Eli Zaretskii <eliz@gnu.org> writes:
> 
> I think the fix is the attached patch. Jared, could you please try it?

The patch fully worked for me, both in the test case I provided and my 
real use case.

Thanks!

   -- MJF





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

* bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS  only)
  2024-08-09  3:47       ` Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-08-09  5:23         ` Gerd Möllmann
  0 siblings, 0 replies; 6+ messages in thread
From: Gerd Möllmann @ 2024-08-09  5:23 UTC (permalink / raw)
  To: Jared Finder; +Cc: Po Lu, Eli Zaretskii, 72331

Jared Finder <jared@finder.org> writes:

> On 2024-08-07 23:45, Gerd Möllmann wrote:
>> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
>> 
>>> Eli Zaretskii <eliz@gnu.org> writes:
>> I think the fix is the attached patch. Jared, could you please try
>> it?
>
> The patch fully worked for me, both in the test case I provided and my
> real use case.
>
> Thanks!
>
>   -- MJF

Thanks for testing! Pushed to emacs-30, and closing.





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

end of thread, other threads:[~2024-08-09  5:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-28  5:10 bug#72331: 29.4; Modifying horizontal-scroll-bar does not fully work (MacOS only) Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-04  8:33 ` Eli Zaretskii
2024-08-05 13:43   ` Gerd Möllmann
2024-08-08  6:45     ` Gerd Möllmann
2024-08-09  3:47       ` Jared Finder via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-09  5:23         ` Gerd Möllmann

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