- /* Set window markers at start of visible range. */
- if (XMARKER (w->start)->buffer == 0)
- set_marker_restricted (w->start, make_number (0), w->buffer);
- if (XMARKER (w->pointm)->buffer == 0)
- set_marker_restricted (w->pointm,
- make_number (BUF_PT (XBUFFER (w->buffer))),
- w->buffer);
- w->start_at_line_beg = Qt;
+ if (!NILP (XBUFFER (p->buffer)->name))
+ /* If saved buffer is alive, install it. */
+ {
+ w->buffer = p->buffer;
+ w->start_at_line_beg = p->start_at_line_beg;
+ set_marker_restricted (w->start,
+ Fmarker_position (p->start),
+ w->buffer);
+ set_marker_restricted (w->pointm,
+ Fmarker_position (p->pointm),
+ w->buffer);
+ Fset_marker (XBUFFER (w->buffer)->mark,
+ Fmarker_position (p->mark), w->buffer);
+
+ /* As documented in Fcurrent_window_configuration, don't
+ save the location of point in the buffer which was current
+ when the window configuration was recorded. */
+ if (!EQ (p->buffer, new_current_buffer) &&
+ XBUFFER (p->buffer) == current_buffer)
+ Fgoto_char (w->pointm);
+ }
+ else if (NILP (XBUFFER (w->buffer)->name))
+ /* Else if window's old buffer is dead too, get a live one. */
+ {
+ w->buffer = Fcdr (Fcar (Vbuffer_alist));
+ /* This will set the markers to beginning of visible
+ range. */
+ set_marker_restricted (w->start, make_number (0), w->buffer);
+ set_marker_restricted (w->pointm, make_number (0),w->buffer);
+ w->start_at_line_beg = Qt;
+ }
+ else
+ /* Keeping window's old buffer; make sure the markers
+ are real. Else if window's old buffer is dead too,
+ get a live one. */
+ {
+ /* Set window markers at start of visible range. */
+ if (XMARKER (w->start)->buffer == 0)
+ set_marker_restricted (w->start, make_number (0),
+ w->buffer);
+ if (XMARKER (w->pointm)->buffer == 0)
+ set_marker_restricted (w->pointm,
+ (make_number
+ (BUF_PT (XBUFFER (w->buffer)))),
+ w->buffer);
+ w->start_at_line_beg = Qt;
+ }