unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Titus von der Malsburg <malsburg@posteo.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 19395@debbugs.gnu.org
Subject: bug#19395: 25.0.50; Setting left fringe to 0 messes up window-width
Date: Wed, 17 Dec 2014 19:36:04 -0800	[thread overview]
Message-ID: <87a92lmxy3.fsf@posteo.de> (raw)
In-Reply-To: <83tx0uum88.fsf@gnu.org>

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


On 2014-12-17 Wed 11:09, Eli Zaretskii wrote:
>> From: Titus von der Malsburg <malsburg@posteo.de>
>> Cc: 19395@debbugs.gnu.org
>> Date: Wed, 17 Dec 2014 10:48:25 -0800
>> 
>> The problem is that there may not be a clean solution to that
>> problem.  A buffer can contain text is several font sizes and as far as
>> I know there is no notion of a default size for a buffer, or is there?
>
> Yes, there is: the 'default' face.
>
>> In my special case, I have the font size under control and
>> `term-window-width' would be good enough.
>
> But if we want this function to be more generally useful, it
> shouldn't be limited to the frame's canonical character size, and
> should at least take the face-remapping into account.  Bonus points
> for accepting a face as an argument and using that face's font
> dimensions.

This is more difficult than I thought.  Below is a first sketch.  Let me
know if you think this is going in the right direction and I'll polish
it and add the bonus feature.

It appears that a font has to be rendered before Emacs can tell how wide
a character is.  That's why we need the temporary buffer.  Not elegant,
but I couldn't find a better way.  `default-font-width' complements
`default-font-height' in simple.el.  The other function would go into
window.el.

  Titus

(defun default-font-width () 
  "Return the width in pixels of the current buffer's default
face font.  More precisely, this returns the width of the letter
‘m’.  If the font is mono-spaced, this will also be the width of
all other printable characters."
  (let ((window (selected-window))
        (remapping face-remapping-alist))
    (with-temp-buffer
      (make-local-variable 'face-remapping-alist)
      (setq face-remapping-alist remapping)
      (set-window-buffer window (current-buffer))
      (insert "m")
      (aref (aref (font-get-glyphs (font-at 1) 1 2) 0) 4))))

(defun window-available-columns ()
  "Return the maximal number of characters that can be displayed
on one line.  This function is different from `window-body-width'
in that it accounts for fringes (when at least one fringe has
zero width, one column is reserved for continuation characters)
and for the size of the default font (which may have been
adjusted using, e.g., `text-scale-increase')."
  (let* ((window-width (window-body-width nil t))
	 (font-width (default-font-width))
	 (ncols (/ window-width font-width)))
    (if (and (not (featurep 'xemacs))
	     (display-graphic-p)
	     overflow-newline-into-fringe
	     (/= (frame-parameter nil 'left-fringe) 0)
	     (/= (frame-parameter nil 'right-fringe) 0))
        ncols
      (1- (ncols)))))


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 472 bytes --]

  reply	other threads:[~2014-12-18  3:36 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-16 20:01 bug#19395: 25.0.50; Setting left fringe to 0 messes up window-width Titus von der Malsburg
2014-12-16 20:09 ` Eli Zaretskii
2014-12-16 20:36   ` Titus von der Malsburg
2014-12-16 20:58     ` Eli Zaretskii
2014-12-16 23:12       ` Stefan Monnier
2014-12-17  3:39         ` Eli Zaretskii
2014-12-17 14:16           ` Stefan Monnier
2014-12-17 15:47             ` Eli Zaretskii
2014-12-17 21:31               ` Stefan Monnier
2014-12-17 22:57                 ` Drew Adams
2014-12-18  3:37                 ` Eli Zaretskii
2014-12-18 14:24                   ` Stefan Monnier
2014-12-18 15:51                     ` Eli Zaretskii
2014-12-20 10:09                       ` martin rudalics
2014-12-20 11:00                         ` Eli Zaretskii
2014-12-17  3:46         ` Titus von der Malsburg
2014-12-17 15:29           ` Eli Zaretskii
2014-12-17 21:34             ` Stefan Monnier
2014-12-18  3:40               ` Eli Zaretskii
2014-12-18 14:25                 ` Stefan Monnier
2014-12-18 15:52                   ` Eli Zaretskii
2014-12-17  3:28       ` Titus von der Malsburg
2014-12-17 15:32         ` Eli Zaretskii
2014-12-17 17:18           ` Titus von der Malsburg
2014-12-17 18:21             ` Eli Zaretskii
2014-12-17 18:48               ` Titus von der Malsburg
2014-12-17 19:09                 ` Eli Zaretskii
2014-12-18  3:36                   ` Titus von der Malsburg [this message]
2014-12-18 16:15                     ` Eli Zaretskii
2014-12-19 17:09                       ` martin rudalics
2014-12-19 19:35                         ` Eli Zaretskii
2014-12-20 10:09                           ` martin rudalics
2014-12-20 10:59                             ` Eli Zaretskii
2014-12-20 11:42                               ` martin rudalics
2014-12-20 12:45                                 ` Eli Zaretskii
2014-12-20 14:51                                   ` martin rudalics
2014-12-20 16:36                                     ` Eli Zaretskii
2014-12-20 17:50                                       ` martin rudalics
2014-12-20 18:16                                         ` Eli Zaretskii
2014-12-20 18:58                                           ` martin rudalics
2014-12-20 19:52                                             ` Eli Zaretskii
2014-12-21 12:14                                               ` Titus von der Malsburg
2014-12-21 16:43                                                 ` Eli Zaretskii
2014-12-20 14:51                       ` Titus von der Malsburg
2014-12-20 15:06                         ` martin rudalics
2014-12-20 15:21                           ` Titus von der Malsburg
2014-12-20 16:03                             ` martin rudalics
2014-12-20 16:40                               ` Eli Zaretskii
2014-12-20 15:45                           ` Titus von der Malsburg
2014-12-20 16:38                           ` Eli Zaretskii
2014-12-20 17:51                             ` martin rudalics
2014-12-20 18:19                               ` Eli Zaretskii
2014-12-20 16:31                         ` Eli Zaretskii
2014-12-21 22:04                           ` Titus von der Malsburg
2014-12-22 16:00                             ` Eli Zaretskii
2022-04-29 13:14                               ` Lars Ingebrigtsen
2022-06-02 21:41                                 ` Jim Porter
     [not found]                                 ` <a54d35b0-7ed6-374c-2a14-e7d97cf6c0a2@gmail.com>
2022-06-03  3:21                                   ` Lars Ingebrigtsen
2014-12-18 17:16         ` Eli Zaretskii

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=87a92lmxy3.fsf@posteo.de \
    --to=malsburg@posteo.de \
    --cc=19395@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).