Subject: Re: bug#16736: Compiling a Lisp file causes display to flash off and on

From: Eli Zaretskii <[email-masked]>
Date: Mon, 17 Feb 2014 17:42:45 +0200

> From: Glenn Morris <[email-masked]>
> Cc: [email-masked],  [email-masked]
> Date: Mon, 17 Feb 2014 02:45:40 -0500
> 
> Eli Zaretskii wrote:
> 
> >   if (new_text_height == FRAME_TEXT_HEIGHT (f)
> >       && new_text_width == FRAME_TEXT_WIDTH (f)
> >       && new_root_width == old_root_width
> >       && (FRAME_PIXEL_HEIGHT (f) ==
> > 	  FRAME_TEXT_TO_PIXEL_HEIGHT (f, new_text_height))
> >       && (FRAME_PIXEL_WIDTH (f) ==
> > 	  FRAME_TEXT_TO_PIXEL_WIDTH (f, new_text_width)))
> >     return;
> 
> new_text_height = 570 = FRAME_TEXT_HEIGHT (f)
> new_text_width = 640 = FRAME_TEXT_WIDTH (f)
> new_root_width = 672 = old_root_width
> 
> FRAME_PIXEL_HEIGHT (f) = 605
> FRAME_TEXT_TO_PIXEL_HEIGHT (f, new_text_height) = 572
> new_text_height = 570

Looks like FRAME_PIXEL_HEIGHT includes the tool bar, and is thus 33
pixels larger than we expect.  (What is f->tool_bar_height?)  But I
cannot find the place where we assign any value to FRAME_PIXEL_HEIGHT,
except in this very function, so I'm unsure where do those extra 33
pixels come from.

Glenn, if you put a breakpoint in change_frame_size_1 and then just
"run -Q", can you show all the calls you see until Emacs starts up,
including the arguments we pass to that function?  Here's what I see
on Windows:

  (gdb) break change_frame_size_1
  Breakpoint 3 at 0x100d809: file dispnew.c, line 5467.
  (gdb) r -Q
  Starting program: D:\gnu\bzr\emacs\trunk\src\emacs.exe -Q
  [New Thread 2272.0x13c0]
  [New Thread 2272.0x1790]
  [New Thread 2272.0x324]

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=80, new_height=160,
      pretend=true, delay=false, safe=false, pixelwise=true) at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb) c
  Continuing.

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=640,
      new_height=608, pretend=false, delay=true, safe=false, pixelwise=true)
      at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb)
  Continuing.

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=640,
      new_height=608, pretend=false, delay=true, safe=false, pixelwise=true)
      at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb)
  Continuing.

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=640,
      new_height=608, pretend=false, delay=false, safe=false, pixelwise=true)
      at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb)
  Continuing.

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=0, new_height=0,
      pretend=false, delay=false, safe=false, pixelwise=true) at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb)
  Continuing.

  Breakpoint 3, change_frame_size_1 (f=0x394a9d8, new_width=640,
      new_height=608, pretend=true, delay=false, safe=false, pixelwise=true)
      at dispnew.c:5467
  5467      int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
  (gdb)
  Continuing.

(The 640x608 size corresponds to the 80x35 text size I get (35
includes the mode line and the echo area), plus the equivalent of 3
text lines used for the tool bar.)