unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Eli Zaretskii <eliz@gnu.org>
Cc: jarekczek@poczta.onet.pl, 16051@debbugs.gnu.org
Subject: bug#16051: 24.3.50; Emacs hang - resize frame manually
Date: Mon, 23 Dec 2013 19:44:33 +0100	[thread overview]
Message-ID: <52B88491.1000903@gmx.at> (raw)
In-Reply-To: <83zjnr7bea.fsf@gnu.org>

 > It turns out this bug has 3 separate parts.  2 of them are very clear
 > and uncontroversial, so I simply fixed them; see revision 115718 on
 > the trunk.  After that, there are no more assertion violations like
 > above, and no hangs, and it is much harder to cause a redisplay loop.

Thanks.

-  it.last_visible_x = FRAME_TOTAL_COLS (f) * FRAME_COLUMN_WIDTH (f);
+  it.last_visible_x = WINDOW_PIXEL_WIDTH (w);

Wonderful.  The effect of this was visible in the Lucid/Motif builds but
since I hadn't seen it in the Windows build I didn't expect to find the
cause in the toolkit independent part of the code.  But is this related
to the current bug?

The second issue belongs in the category of things I expected to happen
hoping that sooner or later you would detect and fix them.  I would
certainly be able to spend some time studying your fix and still not
grasp it.

 > 	  if (change_height_p)
 > 	    {
 > 	      int new_lines = ((new_height + FRAME_LINE_HEIGHT (f) - 1)
 > 			       / FRAME_LINE_HEIGHT (f));
 >
 > 	      XSETFRAME (frame, f);
 > 	      Fmodify_frame_parameters (frame,
 > 					list1 (Fcons (Qtool_bar_lines,
 > 						      make_number (new_lines))));
 > 	      /* Always do that now.  */
 > 	      clear_glyph_matrix (w->desired_matrix);
 > 	      f->n_tool_bar_rows = nrows;
 > 	      f->fonts_changed = 1;
 > 	      return 1;
 > 	    }
 >
 > Why does it make sense to "always do that"?  Suppose new_lines is
 > exactly equal to the current number of canonical lines used by the
 > tool-bar window (it can happen even if pixel sizes are different, due
 > to integer truncation).  Or suppose you are asking for N lines, but
 > don't get it because the frame is too small.  Why set the
 > fonts_changed flag in those cases?  That flag causes redisplay to give
 > up, abandon the current glyph matrices, and retry anew.  What happens
 > with those endless cycles is precisely that: redisplay_tool_bar sets
 > the fonts_changed flag, which causes redisplay_internal to retry,
 > which again calls redisplay_tool_bar, which again sets the flag,
 > etc., ad nauseam.

"Always" referred to the glyph matrix clearing part.  I was completely
ignorant of the fact that setting the fonts_changed flag would cause
this to loop.  Admittedly, I normally don't use the toolbar and so have
not given it enough testing with more extreme behavior.

As an aside, I have never been able to understand the purpose of the
tool-bar-lines parameter.  IIUC we are only supposed to read its value
from Lisp but never to set it to anything but zero or one.  Am I right?

 > If there is some reasoning behind this "always do that" logic, please
 > describe it.  Otherwise, I propose the patch below, which cures the
 > problem altogether for me; if you agree, I will install it.

I certainly agree :-)

 > As an aside, I stared for a long time at this part of
 > w32fns.c:x_set_tool_bar_lines (which is part of the issue, because it
 > is called by modify-frame-parameters, when the tool-bar-lines
 > parameter is changed), and I still don't get why it does what it does:
 >       root_height = WINDOW_PIXEL_HEIGHT (XWINDOW (FRAME_ROOT_WINDOW (f)));
 >       if (root_height - delta < unit)

How would you know - it probably doesn't do anything reasonable.  When
we enter this part we see only the upper part of the first row of the
toolbar, the rest of the toolbar, root and minibuffer window being
clipped by the window manager.

 > 	{
 > 	  delta = root_height - unit;
 > 	  nlines = (root_height / unit) + min (1, (root_height % unit));
 > 	}
 >
 > First, delta is recomputed, but the result is never used.  More
 > importantly, you assign to nlines a value that is the size of the root
 > window _plus_ one line?  Did you mean minus instead?

Probably.  If you have any good idea what to do here, please do it.
IIUC we want to pretend that the frame has the full toolbar (probably as
many rows as it has items), a one line root window and, if it's present,
a one line minibuffer window.  This should be robust enough to avoid a
crash.

But the underlying problem, namely that shrinking the width of the frame
may mean that we'd have to enlarge its height, remains.  Currently, our
internal toolbar gets nominally larger than the containing frame.

 > Finally, the corresponding xfns.c implementation still works in lines,
 > not in pixels, as w32fns.c did before your pixelwise changes.  Is this
 > disparity on purpose or an oversight?

When I installed my changes I tested this only with the Windows and the
Gtk builds.  It's only now that I encountered problems with the Lucid
and Motif builds.  I'm working on this currently.

martin





  reply	other threads:[~2013-12-23 18:44 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-04 14:40 bug#16051: 24.3.50; Emacs hang - resize frame manually Drew Adams
2013-12-04 17:56 ` Eli Zaretskii
2013-12-05 14:03   ` martin rudalics
2013-12-05 17:52     ` Eli Zaretskii
2013-12-05 17:59       ` martin rudalics
2013-12-05 18:21         ` Eli Zaretskii
2013-12-05 18:27           ` martin rudalics
2013-12-05 18:30           ` Eli Zaretskii
2013-12-06 14:32             ` martin rudalics
2013-12-06 15:31               ` Eli Zaretskii
2013-12-06 16:21                 ` martin rudalics
2013-12-06 18:16                   ` Eli Zaretskii
2013-12-06 18:57                     ` martin rudalics
2013-12-06 19:07                       ` Eli Zaretskii
2013-12-07 12:25                         ` martin rudalics
2013-12-07 12:31                           ` martin rudalics
2013-12-07 13:12                           ` Eli Zaretskii
2013-12-07 14:23                             ` martin rudalics
2013-12-07 15:18                               ` Eli Zaretskii
2013-12-07 15:47                                 ` martin rudalics
2013-12-07 16:28                                   ` Eli Zaretskii
2013-12-07 17:00                                   ` Dani Moncayo
2013-12-07 17:36                                     ` martin rudalics
     [not found]                                 ` <<52A342F7.1070707@gmx.at>
     [not found]                                   ` <<83siu4zkuh.fsf@gnu.org>
2013-12-07 20:37                                     ` Drew Adams
2014-12-25 10:55   ` martin rudalics
2013-12-21 13:44 ` Jarek Czekalski
2013-12-21 15:12   ` Eli Zaretskii
2013-12-21 15:16     ` Eli Zaretskii
2013-12-21 15:46     ` Jarek Czekalski
2013-12-21 16:19       ` Eli Zaretskii
2013-12-21 17:13         ` martin rudalics
2013-12-21 18:48           ` Eli Zaretskii
2013-12-21 19:40             ` martin rudalics
2013-12-23 16:57           ` Eli Zaretskii
2013-12-23 18:44             ` martin rudalics [this message]
2013-12-23 19:31               ` Eli Zaretskii
2013-12-23 20:02                 ` martin rudalics
2013-12-23 20:18                   ` Eli Zaretskii
2013-12-24 10:14                     ` martin rudalics
2013-12-24 17:34                       ` Eli Zaretskii
2013-12-24 18:45                         ` martin rudalics
2013-12-24 18:55                           ` Eli Zaretskii
2013-12-26 11:51                             ` martin rudalics
2013-12-26 17:30                               ` Eli Zaretskii
2013-12-26 18:04                                 ` martin rudalics
2013-12-26 18:47                                   ` Eli Zaretskii
2013-12-26 19:56                                     ` martin rudalics
     [not found] <<3eea48d4-9267-45fa-84c8-3eb9c9290558@default>
     [not found] ` <<83siu833gc.fsf@gnu.org>
2013-12-04 18:45   ` Drew Adams

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=52B88491.1000903@gmx.at \
    --to=rudalics@gmx.at \
    --cc=16051@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    --cc=jarekczek@poczta.onet.pl \
    /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).