unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Arthur Miller <arthur.miller@live.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 52129@debbugs.gnu.org
Subject: bug#52129: 29.0.50; Wish: Extend `:align-to center' to work on lines in buffer
Date: Sat, 27 Nov 2021 12:06:19 +0100	[thread overview]
Message-ID: <AM9PR09MB49774A2F9688B86A4F2BF25096649@AM9PR09MB4977.eurprd09.prod.outlook.com> (raw)
In-Reply-To: <834k7y0xjv.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 27 Nov 2021 04:15:12 -0500")

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Cc: 52129@debbugs.gnu.org
>> Date: Sat, 27 Nov 2021 09:47:58 +0100
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> > I don't understand what exactly are you asking for.  Is your problem
>> > that you have to prepend some character to the string and put the
>> > :align-to spec on that character?  Because AFAIU that simple measure
>> > should achieve your goal.
>> 
>> You mean something like this:
>> 
>> #+begin_src emacs-lisp
>> (defun evc--time ()
>>   (propertize
>>    (time-stamp-string " %H:%M") 'face evc--time-face 'display '(space :align-to center)))
>> 
>> (defun evc--date ()
>>   (propertize
>>    (concat
>>     " "
>>     (capitalize (time-stamp-string "%A")) ". "
>>     (capitalize (time-stamp-string "%B %d"))) 'face evc--date-face 'display '(space :align-to center)))
>
> No, I mean to put this property:
>
>     'display '(space :align-to center)
>
> on a space character (or any other character, which will not be
> displayed) that is prepended to the time-stamp-string you want to
> display.

Aha, like this?:

(defun evc--time ()
  (concat (propertize " " 'display '(space :align-to center))
          (propertize
           (time-stamp-string " %H:%M") 'face evc--time-face)))

That still seems to be dependanble on when the time string is inserted? Because
when I test to insert like this:

(defun evc--update ()
  (let ((time (evc--time))
        (date (evc--date)))
    (when (frame-live-p evc--frame)
      (select-frame evc--frame))
    (with-current-buffer evc--buffer
      (erase-buffer)
      (insert time "\n" date)
      (goto-char 1))))

the string is not centered correctly; there is ~70 pixels difference between
left and right margins.

Maybe if I inserted longer string first, fitted frame to buffer, and than
inserted time, but I don't think it is relevant if you say it is not possible to
do it due to renderer only looking at one char at a time.

> Because the Emacs display code examines buffer text one character at a
> time, left to right, and produces the glyphs for display for each
> character before it goes to the next.  You are asking the display
> engine to know the display width of your string before it performs the
> layout calculations for that string, and that cannot work.  The
> display code cannot even assume that it will traverse all the
> characters of a line, it could be forced to stop before it reaches the
> end of the line, in which case it cannot know that width even
> post-factum.
>
>> Also what if the text is longer then visual line? Would it be possible for the
>> rendering engine to center part of the tring with 'aligne-to center' property,
>> and cull extensive part on sides that are outside. That is not acheavable with a spacer.
>
> You want the display engine to decide where to break such a long line?
> Or do you want to decide that up front and indicate that via the
> portion of the text on which you put this hypothetical property?  IOW,

Meant mostly that display engine would keep marked portion of the string
centered on the display, for example if there is some more important of the
string or so, but at the second thought I don't see much use of such
feature.

Anyway, I understand now when you say that renderer only looks at one char at a
time.

Is there any way to make it aware of surrounding context, like entire line? Or
would that be too demanding computationally? I guess there is a reason why it is
made one char at a time.





  reply	other threads:[~2021-11-27 11:06 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-26 20:01 bug#52129: 29.0.50; Wish: Extend `:align-to center' to work on lines in buffer Arthur Miller
2021-11-27  5:59 ` Eli Zaretskii
2021-11-27  8:47   ` Arthur Miller
2021-11-27  9:15     ` Eli Zaretskii
2021-11-27 11:06       ` Arthur Miller [this message]
2021-11-27 11:25         ` Eli Zaretskii
2021-11-27 23:40           ` Arthur Miller
2021-11-28  7:48             ` Eli Zaretskii
2021-11-28 10:38               ` Arthur Miller
2021-11-29 15:59                 ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM9PR09MB49774A2F9688B86A4F2BF25096649@AM9PR09MB4977.eurprd09.prod.outlook.com \
    --to=arthur.miller@live.com \
    --cc=52129@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).