GNU bug report logs -
#74876
31.0.50; Force fringe refresh / force-window-update not affecting fringes
Previous Next
Reported by: Michal Nazarewicz <mina86 <at> mina86.com>
Date: Sat, 14 Dec 2024 19:32:02 UTC
Severity: normal
Merged with 75291
Found in version 31.0.50
Done: Eli Zaretskii <eliz <at> gnu.org>
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 74876 in the body.
You can then email your comments to 74876 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#74876
; Package
emacs
.
(Sat, 14 Dec 2024 19:32:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Michal Nazarewicz <mina86 <at> mina86.com>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Sat, 14 Dec 2024 19:32:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
I’m implementing fringe dimming in non-selected windows as an extension
of the NonGNU ELPA auto-dim-other-buffers package (see
<https://github.com/mina86/auto-dim-other-buffers.el/issues/27>).
<https://github.com/mina86/auto-dim-other-buffers.el/tree/fringes> is
a test code which tries to achieve it. The expected behaviour is that
after enabling auto-dim-other-buffers-mode defined there, as you switch
between windows, the fringes of non-selected windows will be red.
Alas, it appears that fringes are redrawn lazily such that changing
window does not refresh the fringes.
For a bit more context, the package uses face-remap-add-relative and
:filtered faces, i.e. something like:
(face-remap-add-relative
'fringe
'(:filtered (:window adob--dim t) auto-dim-other-buffers-fringe-face))
I’ve tried toggling fringe-mode when forcing window update with the
below code, but it did not do the trick.
(defun adob--force-window-update (object)
(force-window-update object)
;; Force fringes to be updated
(when fringe-mode
(dolist (wnd (if (windowp object)
(list object)
(get-buffer-window-list object nil t)))
(let* ((frame (window-frame wnd))
(params (frame-parameters frame))
(left (alist-get 'left-fringe params))
(right (alist-get 'right-fringe params)))
(when (and left right)
(modify-frame-parameters
frame '((left-fringe nil) (right-fringe nil)))
(modify-frame-parameters
frame `((left-fringe . ,left) (right-fringe . ,right))))))))
I think what I’d like is for force-window-update to force full fringe
redraw? Honestly, I haven’t yet dug through all of the window and
fringe code so I’m not entirely sure where the main issue lays.
Configured using:
'configure --prefix=/usr/local --enable-link-time-optimization
--with-native-compilation=aot --without-dbus --without-gconf
--without-gpm --without-gsettings --without-pop --without-selinux
--without-systemd --without-toolkit-scroll-bars --with-x
--with-x-toolkit=gtk3 --with-xinput2 --with-xml2 --with-tree-sitter
'CFLAGS=-O2 -mtune=native -march=native -fstack-protector'
'CPPFLAGS=-O2 -mtune=native -march=native -fstack-protector'
'CXXFLAGS=-O2 -mtune=native -march=native -fstack-protector''
Configured features:
CAIRO FREETYPE GIF GLIB GMP GNUTLS HARFBUZZ JPEG LIBSYSTEMD LIBXML2
MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG SECCOMP SOUND THREADS
TIFF TREE_SITTER WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB
Important settings:
value of $LC_COLLATE: C
value of $LANG: en_GB.utf8
locale-coding-system: utf-8-unix
Major mode: Lisp Interaction
Minor modes in effect:
server-mode: t
form-feed-mode: t
auto-dim-other-buffers-mode: t
global-auto-revert-mode: t
icomplete-mode: t
global-num3-mode: t
num3-mode: t
global-whitespace-mode: t
whitespace-mode: t
global-flyspell-mode: t
remember-notes-mode: t
delete-selection-mode: t
windmove-mode: t
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
minibuffer-regexp-mode: t
column-number-mode: t
line-number-mode: t
auto-fill-function: do-auto-fill
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
Load-path shadows:
/home/mpn/.config/emacs/elpa/transient-20210525.1141/transient hides /usr/local/share/emacs/31.0.50/lisp/transient
~/.config/emacs/custom hides /usr/local/share/emacs/31.0.50/lisp/custom
Features:
(shadow emacsbug sort mail-extr notmuch notmuch-tree notmuch-jump
notmuch-hello notmuch-show notmuch-print notmuch-crypto notmuch-mua
notmuch-message notmuch-draft notmuch-maildir-fcc notmuch-address
notmuch-company notmuch-parser format-spec notmuch-wash diff-mode
track-changes coolj goto-addr icalendar notmuch-tag notmuch-lib
notmuch-compat pcase hl-line mm-view mml-smime smime gnutls dig
gnus-alias rot13 message sendmail yank-media puny dired dired-loaddefs
rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util
ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils mailheader
cus-edit wid-edit dabbrev checkdoc lisp-mnt shortdoc crm avy misearch
multi-isearch cus-start cus-load pulse color pp cl-print help-fns
radix-tree time-date auto-package-update easy-mmode dash descr-text
server flyspell form-feed init sgml-mode facemenu dom
auto-dim-other-buffers face-remap autorevert filenotify comp comp-cstr
cl-extra help-mode warnings comp-run comp-common rx icomplete num3-mode
disp-table whitespace compile text-property-search comint ansi-osc
ansi-color ring ispell remember advice browse-kill-ring delsel ffap
thingatpt windmove diary-lib diary-loaddefs cal-menu calendar
cal-loaddefs auto-dim-other-buffers-autoloads avy-autoloads
browse-kill-ring-autoloads csv-mode-autoloads evil-autoloads
gnu-elpa-keyring-update-autoloads gnus-alias-autoloads finder-inf
markdown-mode-autoloads notmuch-autoloads protobuf-mode-autoloads
sed-mode-autoloads info vterm-autoloads package browse-url xdg url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs icons password-cache json
subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs cl-lib
early-init rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd touch-screen 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 inotify dynamic-setting font-render-setting cairo gtk x-toolkit
xinput2 x multi-tty move-toolbar make-network-process native-compile
emacs)
Memory information:
((conses 16 257215 704427) (symbols 48 34587 67)
(strings 32 82254 29315) (string-bytes 1 2545384) (vectors 16 34779)
(vector-slots 8 825430 881688) (floats 8 257 4262)
(intervals 56 3296 6731) (buffers 992 19))
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Sat, 14 Dec 2024 20:29:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Date: Sat, 14 Dec 2024 20:31:00 +0100
>
> I’m implementing fringe dimming in non-selected windows as an extension
> of the NonGNU ELPA auto-dim-other-buffers package (see
> <https://github.com/mina86/auto-dim-other-buffers.el/issues/27>).
>
> <https://github.com/mina86/auto-dim-other-buffers.el/tree/fringes> is
> a test code which tries to achieve it. The expected behaviour is that
> after enabling auto-dim-other-buffers-mode defined there, as you switch
> between windows, the fringes of non-selected windows will be red.
>
> Alas, it appears that fringes are redrawn lazily such that changing
> window does not refresh the fringes.
Yes, because redrawing the fringes is expensive, especially in large
frames. So I'm not surprised that you see what you see, since no one
expected the fringe face to be changed frequently during the session.
> For a bit more context, the package uses face-remap-add-relative and
> :filtered faces, i.e. something like:
>
> (face-remap-add-relative
> 'fringe
> '(:filtered (:window adob--dim t) auto-dim-other-buffers-fringe-face))
>
> I’ve tried toggling fringe-mode when forcing window update with the
> below code, but it did not do the trick.
>
> (defun adob--force-window-update (object)
> (force-window-update object)
> ;; Force fringes to be updated
> (when fringe-mode
> (dolist (wnd (if (windowp object)
> (list object)
> (get-buffer-window-list object nil t)))
> (let* ((frame (window-frame wnd))
> (params (frame-parameters frame))
> (left (alist-get 'left-fringe params))
> (right (alist-get 'right-fringe params)))
> (when (and left right)
> (modify-frame-parameters
> frame '((left-fringe nil) (right-fringe nil)))
> (modify-frame-parameters
> frame `((left-fringe . ,left) (right-fringe . ,right))))))))
>
> I think what I’d like is for force-window-update to force full fringe
> redraw? Honestly, I haven’t yet dug through all of the window and
> fringe code so I’m not entirely sure where the main issue lays.
Can you show a simple Lisp which could be used to investigate the
behavior and perhaps see how what you want could be enabled? It is
not easy to do that by having the code of the whole package.
Presumably, what the package does to dynamically change the face of
the fringe can be done by a short Lisp function, which could then be
used from "emacs -Q" to see what prevents the fringe face from being
updated immediately.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Sat, 14 Dec 2024 21:41:02 GMT)
Full text and
rfc822 format available.
Message #11 received at 74876 <at> debbugs.gnu.org (full text, mbox):
On Sat, Dec 14 2024, Eli Zaretskii wrote:
> Can you show a simple Lisp which could be used to investigate the
> behavior and perhaps see how what you want could be enabled?
---- >% ----------------------------------------------------------------
(defvar-local adob-remapping nil)
(put 'adob-remapping 'permanent-local nil)
(defface adob-test '((t :background "red")) "Test")
(defun adob-test-for-each-window (func)
(save-current-buffer
(dolist (frame (frame-list))
(dolist (wnd (window-list frame))
(set-buffer (window-buffer wnd))
(when (funcall func wnd)
(force-window-update wnd))))))
(defun adob-test-update ()
(let ((face '(:filtered (:window adob-test t) adob-test))
(selected-window (selected-window)))
(adob-test-for-each-window
(lambda (wnd)
(let ((val (eq wnd selected-window)) update)
(unless adob-remapping
(setq adob-remapping (face-remap-add-relative 'fringe face)
update t))
(unless (eq val (window-parameter wnd 'adob-test))
(set-window-parameter wnd 'adob-test val)
(setq update t))
update)))))
(defun adob-test-on ()
(interactive)
(adob-test-update)
(add-hook 'post-command-hook #'adob-test-update))
(defun adob-test-off ()
(interactive)
(remove-hook 'post-command-hook #'adob-test-update)
(adob-test-for-each-window
(lambda (wnd)
(when adob-remapping
(face-remap-remove-relative adob-remapping)
(setq adob-remapping nil)
t))))
; (adob-test-on) to enable
; (adob-test-off) to disable
---- %< ----------------------------------------------------------------
1. Open two windows with two long buffers.
2. M-x adob-test-on RET
3. Scroll current window with M-v.
4. Switch to the other window with C-x o.
4. Scroll other window with C-M-v.
Expected: at all times, the fringes of the selected window are red while
fringes of the other window are grey.
Observed: Fringes are updated only when window is scrolled and new lines
are shown.
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Sun, 15 Dec 2024 07:08:01 GMT)
Full text and
rfc822 format available.
Message #14 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Cc: 74876 <at> debbugs.gnu.org
> Date: Sat, 14 Dec 2024 22:39:19 +0100
>
> 1. Open two windows with two long buffers.
> 2. M-x adob-test-on RET
> 3. Scroll current window with M-v.
> 4. Switch to the other window with C-x o.
> 4. Scroll other window with C-M-v.
>
> Expected: at all times, the fringes of the selected window are red while
> fringes of the other window are grey.
>
> Observed: Fringes are updated only when window is scrolled and new lines
> are shown.
Thanks. I don't think what you want can possibly work, unless we
completely redesign how the fringes are updated. The current design
is that we update the fringes only on the screen lines where redisplay
changed something. Since redisplay goes out of its way to try not to
redraw screen lines that don't need redrawing, this means that you
cannot reliably force the entire fringe of a window to be redrawn,
unless you (almost) completely change what is shown in the window.
You can see this if, for example, after step 1 you move the cursor
with C-n until point goes out of the window and Emacs scrolls and
recenters the window: only the lower half of the window gets its
fringes displayed in the red color. That's because the upper part was
not redrawn, just scrolled on the screen.
Sorry.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Mon, 16 Dec 2024 21:49:01 GMT)
Full text and
rfc822 format available.
Message #17 received at 74876 <at> debbugs.gnu.org (full text, mbox):
On Sun, Dec 15 2024, Eli Zaretskii wrote:
> Thanks. I don't think what you want can possibly work, unless we
> completely redesign how the fringes are updated.
Well… there’s always the atomic option of calling redraw-frame. Though
I’ve found that changing an attribute of a font is sufficient.
I believe what makes things work is setting f->face_change and calling
fset_redisplay.
---- >8 ----------------------------------------------------------------
(defvar-local adob-remapping nil)
(put 'adob-remapping 'permanent-local nil)
(defface adob-test '((t :background "red")) "Test")
(defface adob-hack '() "Test")
(defun adob-force-window-update (wnd)
(force-window-update wnd)
(let ((frame (window-frame wnd))
(value (face-attribute 'adob-hack :inverse-video frame nil)))
(internal-set-lisp-face-attribute
'adob-hack :inverse-video (not value) frame)))
(defun adob-force-window-update (wnd)
(force-window-update wnd)
; (redraw-frame (window-frame wnd))
(let ((frame (window-frame wnd))
(value (face-attribute 'adob-hack :inverse-video frame nil)))
(internal-set-lisp-face-attribute
'adob-hack :inverse-video (not value) frame)))
(defun adob-test-for-each-window (func)
(save-current-buffer
(dolist (frame (frame-list))
(dolist (wnd (window-list frame))
(set-buffer (window-buffer wnd))
(when (funcall func wnd)
(adob-force-window-update wnd))))))
(defun adob-test-update ()
(let ((face '(:filtered (:window adob-test t) adob-test))
(selected-window (selected-window)))
(adob-test-for-each-window
(lambda (wnd)
(let ((val (eq wnd selected-window)) update)
(unless adob-remapping
(setq adob-remapping (face-remap-add-relative 'fringe face)
update t))
(unless (eq val (window-parameter wnd 'adob-test))
(set-window-parameter wnd 'adob-test val)
(setq update t))
update)))))
(defun adob-test-on ()
(interactive)
(adob-test-update)
(add-hook 'post-command-hook #'adob-test-update))
(defun adob-test-off ()
(interactive)
(remove-hook 'post-command-hook #'adob-test-update)
(adob-test-for-each-window
(lambda (wnd)
(when adob-remapping
(face-remap-remove-relative adob-remapping)
(setq adob-remapping nil)
t))))
---- 8< ----------------------------------------------------------------
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Tue, 17 Dec 2024 12:17:02 GMT)
Full text and
rfc822 format available.
Message #20 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Cc: 74876 <at> debbugs.gnu.org
> Date: Mon, 16 Dec 2024 22:47:43 +0100
>
> On Sun, Dec 15 2024, Eli Zaretskii wrote:
> > Thanks. I don't think what you want can possibly work, unless we
> > completely redesign how the fringes are updated.
>
> Well… there’s always the atomic option of calling redraw-frame. Though
> I’ve found that changing an attribute of a font is sufficient.
> I believe what makes things work is setting f->face_change and calling
> fset_redisplay.
Both methods are quite expensive, and will cause flickering in some
configurations, so I recommend against that.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Tue, 17 Dec 2024 13:23:02 GMT)
Full text and
rfc822 format available.
Message #23 received at 74876 <at> debbugs.gnu.org (full text, mbox):
On Tue, Dec 17 2024, Eli Zaretskii wrote:
>> From: Michal Nazarewicz <mina86 <at> mina86.com>
>> Cc: 74876 <at> debbugs.gnu.org
>> Date: Mon, 16 Dec 2024 22:47:43 +0100
>>
>> On Sun, Dec 15 2024, Eli Zaretskii wrote:
>> > Thanks. I don't think what you want can possibly work, unless we
>> > completely redesign how the fringes are updated.
>>
>> Well… there’s always the atomic option of calling redraw-frame. Though
>> I’ve found that changing an attribute of a font is sufficient.
>> I believe what makes things work is setting f->face_change and calling
>> fset_redisplay.
>
> Both methods are quite expensive, and will cause flickering in some
> configurations,
Yes, I’ve figured as much, but it’s not like I have another choice.
auto-dim-other-buffers redraws entire windows already; someone using
likely has setup that can handle full frame redraws as well.
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Tue, 17 Dec 2024 14:21:02 GMT)
Full text and
rfc822 format available.
Message #26 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Cc: 74876 <at> debbugs.gnu.org
> Date: Tue, 17 Dec 2024 14:20:52 +0100
>
> On Tue, Dec 17 2024, Eli Zaretskii wrote:
> >> From: Michal Nazarewicz <mina86 <at> mina86.com>
> >> Cc: 74876 <at> debbugs.gnu.org
> >> Date: Mon, 16 Dec 2024 22:47:43 +0100
> >>
> >> On Sun, Dec 15 2024, Eli Zaretskii wrote:
> >> > Thanks. I don't think what you want can possibly work, unless we
> >> > completely redesign how the fringes are updated.
> >>
> >> Well… there’s always the atomic option of calling redraw-frame. Though
> >> I’ve found that changing an attribute of a font is sufficient.
> >> I believe what makes things work is setting f->face_change and calling
> >> fset_redisplay.
> >
> > Both methods are quite expensive, and will cause flickering in some
> > configurations,
>
> Yes, I’ve figured as much, but it’s not like I have another choice.
You have: declare this feature impossible to implement in a reasonable
way, given the restrictions of the current display engine design and
implementation.
At the very least, I hope you will document this for the users, so
they are not surprised.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Wed, 01 Jan 2025 18:15:02 GMT)
Full text and
rfc822 format available.
Message #29 received at 74876 <at> debbugs.gnu.org (full text, mbox):
On Tue, Dec 17 2024, Eli Zaretskii wrote:
> You have: declare this feature impossible to implement in a reasonable
> way, given the restrictions of the current display engine design and
> implementation.
>
> At the very least, I hope you will document this for the users, so
> they are not surprised.
pulse.el forces 10 refreshes every 30 ms. If that’s acceptable for
package which is part of Emacs, a single refresh when people switch
windows is good enough for a third-party package.
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Wed, 01 Jan 2025 18:55:02 GMT)
Full text and
rfc822 format available.
Message #32 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Cc: 74876 <at> debbugs.gnu.org
> Date: Wed, 01 Jan 2025 19:14:40 +0100
>
> On Tue, Dec 17 2024, Eli Zaretskii wrote:
> > You have: declare this feature impossible to implement in a reasonable
> > way, given the restrictions of the current display engine design and
> > implementation.
> >
> > At the very least, I hope you will document this for the users, so
> > they are not surprised.
>
> pulse.el forces 10 refreshes every 30 ms. If that’s acceptable for
> package which is part of Emacs, a single refresh when people switch
> windows is good enough for a third-party package.
pulse.el typically refreshes only a small portion of a window, and
therefore redisplay will only redraw that portion. So this doesn't
normally lead to flickering (unless you pulse a large portion of the
window).
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Wed, 01 Jan 2025 19:03:02 GMT)
Full text and
rfc822 format available.
Message #35 received at 74876 <at> debbugs.gnu.org (full text, mbox):
On Wed, Jan 01 2025, Eli Zaretskii wrote:
>> From: Michal Nazarewicz <mina86 <at> mina86.com>
>> Cc: 74876 <at> debbugs.gnu.org
>> Date: Wed, 01 Jan 2025 19:14:40 +0100
>>
>> On Tue, Dec 17 2024, Eli Zaretskii wrote:
>> > You have: declare this feature impossible to implement in a reasonable
>> > way, given the restrictions of the current display engine design and
>> > implementation.
>> >
>> > At the very least, I hope you will document this for the users, so
>> > they are not surprised.
>>
>> pulse.el forces 10 refreshes every 30 ms. If that’s acceptable for
>> package which is part of Emacs, a single refresh when people switch
>> windows is good enough for a third-party package.
>
> pulse.el typically refreshes only a small portion of a window, and
> therefore redisplay will only redraw that portion. So this doesn't
> normally lead to flickering (unless you pulse a large portion of the
> window).
pulse.el changes face which forces refresh just as I described in this
thread. If you’re saying Emacs is smart enough to notice that only
small portion of the window needs refreshing, this should also be true
in my case where only fringes need refreshing.
--
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#74876
; Package
emacs
.
(Wed, 01 Jan 2025 19:41:02 GMT)
Full text and
rfc822 format available.
Message #38 received at 74876 <at> debbugs.gnu.org (full text, mbox):
> From: Michal Nazarewicz <mina86 <at> mina86.com>
> Cc: 74876 <at> debbugs.gnu.org
> Date: Wed, 01 Jan 2025 20:02:45 +0100
>
> On Wed, Jan 01 2025, Eli Zaretskii wrote:
> >> From: Michal Nazarewicz <mina86 <at> mina86.com>
> >> Cc: 74876 <at> debbugs.gnu.org
> >> Date: Wed, 01 Jan 2025 19:14:40 +0100
> >>
> >> On Tue, Dec 17 2024, Eli Zaretskii wrote:
> >> > You have: declare this feature impossible to implement in a reasonable
> >> > way, given the restrictions of the current display engine design and
> >> > implementation.
> >> >
> >> > At the very least, I hope you will document this for the users, so
> >> > they are not surprised.
> >>
> >> pulse.el forces 10 refreshes every 30 ms. If that’s acceptable for
> >> package which is part of Emacs, a single refresh when people switch
> >> windows is good enough for a third-party package.
> >
> > pulse.el typically refreshes only a small portion of a window, and
> > therefore redisplay will only redraw that portion. So this doesn't
> > normally lead to flickering (unless you pulse a large portion of the
> > window).
>
> pulse.el changes face which forces refresh just as I described in this
> thread. If you’re saying Emacs is smart enough to notice that only
> small portion of the window needs refreshing
It is.
> this should also be true in my case where only fringes need
> refreshing.
I was talking about your suggestion to redraw the entire frame. That
will definitely cause flickering. The way we avoid redrawing the
portions of the window which didn't change only work on the text area,
not on the fringes and other window/frame decorations.
It is, of course, possible to redesign how fringes are redrawn so that
we won't need to redraw the entire frame, but this exactly the
redesign I was saying would be needed to avoid the flicker. IOW, with
the existing code you either have the partial redrawing of the
fringes, or you can force the entire frame be redrawn and get
flickering.
Merged 74876 75291.
Request was from
Eli Zaretskii <eliz <at> gnu.org>
to
control <at> debbugs.gnu.org
.
(Thu, 02 Jan 2025 19:28: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
.
(Sat, 15 Feb 2025 12:24:10 GMT)
Full text and
rfc822 format available.
This bug report was last modified 125 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.