Sorry for the delayed answer - had to do some "real work" yesterday. ;-)
vroonhof(a)math.ethz.ch wrote:
Now we only need to find out the real problem :-). Could you put a
breakpoint in this code from window.c
if (INTP (Vwindow_pixel_scroll_increment))
fheight = XINT (Vwindow_pixel_scroll_increment);
else if (!NILP (Vwindow_pixel_scroll_increment))
default_face_height_and_width (window, &fheight, &fwidth);
[I am particularly interested in the value of fheight at this point. I
have a feeling it might be 0 (which is really bad, in that case please
single step in to default_face_height_and_width to see where the 0 is
coming from)]
You had the right feeling ...! After loading a file larger than the visible
buffer and pressing the PgDown key, it stops at the breakpoint in the
"else" branch (line 4107) and fheight has indeed a value of 0. But where
does the 0 come from? Good question. I must admit that single stepping
through default_face_height_and_width didn't make this clear to me. In
other words: If I set a second breakpoint at the next line, i.e.
if (Dynarr_length (dla) >= 1)
modeline = Dynarr_atp (dla, 0)->modeline;
dl = Dynarr_atp (dla, modeline);
then fheight already has a value of 14 (which is my current default font
size and thus correct), so it seems like default_face_height_and_width
returns the correct value after its first pass. But pressing PgDown a
second time still does not scroll, although one should think that fheight
is non-zero now. In fact, my debugger shows a value of +804392872 when
stopping again at the first breakpoint (overflow?). Continue to the 2nd
breakpoint and fheight == 14 again.
Don't know if this is of great help; let me know what I can do to provide
any further information.
if (value > 0)
{
/* Go for partial display line scrolling. This just means bumping
the clip by a reasonable amount and redisplaying, everything else
remains unchanged. */
if (!NILP (Vwindow_pixel_scroll_increment)
&&
Dynarr_length (dla) >= (1 + modeline)
&&
(dl->ascent - dl->top_clip) - fheight * value > 0)
{
WINDOW_TEXT_TOP_CLIP (w) += value * fheight;
MARK_WINDOWS_CHANGED (w);
[Your XEmacs is probably not scrolling because this if statement is
true. Could you please find out why (fheight == 0 is the only
reason I can think of).]
Looks like that ...
Markus