X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fwindow.c;h=94be607e7a2fc4486db93f8a5661e407da1cd3fd;hp=c8eb2a8fb11370219642b10f4605615eb8d49f16;hb=14ac73276fa152e8f0b74602792afc0b9c3236c9;hpb=21db8709c0c2dcedbd278c7fe571290d5ce80a71 diff --git a/src/window.c b/src/window.c index c8eb2a8..94be607 100644 --- a/src/window.c +++ b/src/window.c @@ -50,6 +50,8 @@ Lisp_Object Qscrollbar_instances; #endif #endif +extern int allow_deletion_of_last_visible_frame; + EXFUN (Fnext_window, 4); static int window_pixel_width_to_char_width (struct window *w, @@ -123,6 +125,8 @@ Fixnum next_screen_context_lines; /* List of freed window configurations with 1 - 10 windows. */ static Lisp_Object Vwindow_configuration_free_list[10]; +Lisp_Object Qtruncate_partial_width_windows; + #define SET_LAST_MODIFIED(w, cache_too) \ do { \ (w)->last_modified[CURRENT_DISP] = Qzero; \ @@ -488,7 +492,7 @@ real_window (struct window_mirror *mir, int no_abort) Lisp_Object retval = real_window_internal (mir->frame->root_window, mir->frame->root_mirror, mir); if (NILP (retval) && !no_abort) - abort (); + ABORT (); return retval; } @@ -550,7 +554,7 @@ window_display_lines (struct window *w, int which) update_frame_window_mirror (XFRAME (w->frame)); t = find_window_mirror (w); if (!t) - abort (); + ABORT (); if (which == CURRENT_DISP) return t->current_display_lines; @@ -560,7 +564,7 @@ window_display_lines (struct window *w, int which) /* The CMOTION_DISP display lines are global. */ return cmotion_display_lines; else - abort (); + ABORT (); return 0; /* shut up compiler */ } @@ -574,7 +578,7 @@ window_display_buffer (struct window *w) update_frame_window_mirror (XFRAME (w->frame)); t = find_window_mirror (w); if (!t) - abort (); + ABORT (); return t->buffer; } @@ -588,7 +592,7 @@ set_window_display_buffer (struct window *w, struct buffer *b) update_frame_window_mirror (XFRAME (w->frame)); t = find_window_mirror (w); if (!t) - abort (); + ABORT (); t->buffer = b; } @@ -724,7 +728,8 @@ window_truncation_on (struct window *w) /* If truncate_partial_width_windows is true and the window is not the full width of the frame it is truncated. */ - if (truncate_partial_width_windows + if (!NILP (symbol_value_in_buffer (Qtruncate_partial_width_windows, + w->buffer)) && !(window_is_leftmost (w) && window_is_rightmost (w))) return 1; @@ -918,7 +923,7 @@ window_modeline_height (struct window *w) modeline_height = (Dynarr_atp (dla, 0)->ascent + Dynarr_atp (dla, 0)->descent); else - /* This should be an abort except I'm not yet 100% + /* This should be an ABORT except I'm not yet 100% confident that it won't ever get hit (though I haven't been able to trigger it). It is extremely unlikely to cause any noticeable problem and even if @@ -1804,7 +1809,7 @@ unshow_buffer (struct window *w) Lisp_Object buf = w->buffer; if (XBUFFER (buf) != XMARKER (w->pointm[CURRENT_DISP])->buffer) - abort (); + ABORT (); /* FSF disables this check, so I'll do it too. I hope it won't break things. --ben */ @@ -2106,9 +2111,13 @@ will automatically call `save-buffers-kill-emacs'.) else if (!NILP (w->vchild)) delete_all_subwindows (XWINDOW (w->vchild)); + /* Warning: mark_window_as_deleted calls window_unmap_subwindows and + therefore redisplay, so it requires the mirror structure to be + correct. We must dirty the mirror before it is called. */ + f->mirror_dirty = 1; + mark_window_as_deleted (w); - f->mirror_dirty = 1; return Qnil; } @@ -2614,7 +2623,7 @@ window_loop (enum window_loop type, We can't just wait until we hit the first window again, because it might be deleted. */ - last_window = Fprevious_window (w, mini ? Qt : Qnil, frame_arg, Qt); + last_window = Fprevious_window (w, mini ? Qt : Qnil, frame_arg, device); best_window = Qnil; for (;;) @@ -2629,7 +2638,17 @@ window_loop (enum window_loop type, /* Given the outstanding quality of the rest of this code, I feel no shame about putting this piece of shit in. */ if (++lose_lose >= 500) - return Qnil; + { + /* Call to ABORT() added by Darryl Okahata (16 Nov. 2001), + at Ben's request, to catch any remaining bugs. + + If you find that XEmacs is ABORTing here, and you + need to be up and running ASAP, it should be safe to + comment out the following ABORT(), as long as you + leave the "break;" alone. */ + ABORT(); + break; /* <--- KEEP THIS HERE! Do not delete! */ + } /* Note that we do not pay attention here to whether the frame is visible, since Fnext_window skips non-visible frames @@ -2689,7 +2708,7 @@ window_loop (enum window_loop type, case UNDEDICATE_BUFFER: { - if ((XBUFFER (p->buffer) == XBUFFER (obj)) && (p->dedicated)) + if ((XBUFFER (p->buffer) == XBUFFER (obj))) p->dedicated = Qnil; break; } @@ -2714,7 +2733,8 @@ window_loop (enum window_loop type, of its own, kill the frame. */ if (EQ (w, FRAME_ROOT_WINDOW (f)) && !NILP (p->dedicated) - && other_visible_frames (f)) + && (allow_deletion_of_last_visible_frame + || other_visible_frames (f))) { /* Skip the other windows on this frame. There might be one, the minibuffer! */ @@ -2777,7 +2797,7 @@ window_loop (enum window_loop type, } default: - abort (); + ABORT (); } if (EQ (w, last_window)) @@ -2875,7 +2895,7 @@ Any other non-nil value means search all devices. w = window_loop (GET_LRU_WINDOW, Qnil, 0, which_frames, 1, which_devices); /* At this point we damn well better have found something. */ - if (NILP (w)) abort (); + if (NILP (w)) ABORT (); #endif return w; @@ -3168,7 +3188,8 @@ Any other non-nil value means search all devices. if (!NILP (XWINDOW (window)->dedicated) && EQ (window, FRAME_ROOT_WINDOW (XFRAME (frame))) - && other_visible_frames (XFRAME (frame))) + && (allow_deletion_of_last_visible_frame + || other_visible_frames (XFRAME (frame)))) { delete_frame_internal (XFRAME (frame), 0, 0, 0); /* GC */ } @@ -3641,8 +3662,9 @@ make_dummy_parent (Lisp_Object window) DEFUN ("split-window", Fsplit_window, 0, 3, "", /* Split WINDOW, putting SIZE lines in the first of the pair. WINDOW defaults to the selected one and SIZE to half its size. -If optional third arg HORFLAG is non-nil, split side by side -and put SIZE columns in the first of the pair. +If optional third arg HORFLAG is non-nil, split side by side and put +SIZE columns in the first of the pair. The newly created window is +returned. */ (window, size, horflag)) { @@ -3666,7 +3688,7 @@ and put SIZE columns in the first of the pair. /* In the new scheme, we are symmetric with respect to separators so there is no need to do weird things here. */ { - psize = WINDOW_WIDTH (o) >> 1; + psize = (WINDOW_WIDTH (o) + window_divider_width (o)) >> 1; csize = window_pixel_width_to_char_width (o, psize, 0); } else @@ -3778,7 +3800,7 @@ and put SIZE columns in the first of the pair. XFRAME (p->frame)->mirror_dirty = 1; /* do this last (after the window is completely initialized and the mirror-dirty flag is set) so that specifier recomputation - caused as a result of this will work properly and not abort. */ + caused as a result of this will work properly and not ABORT. */ Fset_window_buffer (new, o->buffer, Qt); return new; } @@ -5708,7 +5730,7 @@ by `current-window-configuration' (which see). if (FRAME_LIVE_P (f)) { /* Do this before calling recompute_all_cached_specifiers_in_window() - so that things like redisplay_redraw_cursor() won't abort due + so that things like redisplay_redraw_cursor() won't ABORT due to no window mirror present. */ f->mirror_dirty = 1; @@ -5776,7 +5798,7 @@ saved_window_index (Lisp_Object window, struct window_config *config, int lim) if (EQ (SAVED_WINDOW_N (config, j)->window, window)) return j; } - abort (); + ABORT (); return 0; /* suppress compiler warning */ } @@ -6097,6 +6119,8 @@ syms_of_window (void) /* Qother in general.c */ #endif + DEFSYMBOL (Qtruncate_partial_width_windows); + DEFSUBR (Fselected_window); DEFSUBR (Flast_nonminibuf_window); DEFSUBR (Fminibuffer_window);