X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fframe.c;h=7549f4e4d48276d2dea06a41bbe038520cf85275;hb=78a8a6b480e23a07e0428b83434efc4c7bbb3946;hp=ac5b9c6c3359693facd85491f4693bb24daf272c;hpb=2fd9701a4f902054649dde9143a3f77809afee8f;p=chise%2Fxemacs-chise.git- diff --git a/src/frame.c b/src/frame.c index ac5b9c6..7549f4e 100644 --- a/src/frame.c +++ b/src/frame.c @@ -130,8 +130,6 @@ mark_frame (Lisp_Object obj) #define MARKED_SLOT(x) mark_object (f->x) #include "frameslots.h" - mark_subwindow_cachels (f->subwindow_cachels); - if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */ MAYBE_FRAMEMETH (f, mark_frame, (f)); @@ -208,7 +206,7 @@ allocate_frame_core (Lisp_Object device) f->last_nonminibuf_window = root_window; /* cache of subwindows visible on frame */ - f->subwindow_cachels = Dynarr_new (subwindow_cachel); + f->subwindow_instance_cache = make_weak_list (WEAK_LIST_SIMPLE); /* associated exposure ignore list */ f->subwindow_exposures = 0; @@ -466,7 +464,6 @@ See `set-frame-properties', `default-x-frame-plist', and #endif reset_face_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f))); reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f))); - reset_subwindow_cachels (f); change_frame_size (f, f->height, f->width, 0); } @@ -1553,6 +1550,12 @@ delete_frame_internal (struct frame *f, int force, free_frame_toolbars (f); #endif free_frame_gutters (f); + /* Unfortunately deleting the frame will also delete the parent of + all of the subwindow instances current on the frame. I think this + can lead to bad things when trying to finalize the + instances. Thus we loop over the instance cache calling the + finalize method for each instance. */ + free_frame_subwindow_instance_cache (f); /* This must be done before the window and window_mirror structures are freed. The scrollbar information is attached to them. */ @@ -1564,11 +1567,7 @@ delete_frame_internal (struct frame *f, int force, f->root_window = Qnil; /* clear out the cached glyph information */ - if (f->subwindow_cachels) - { - Dynarr_free (f->subwindow_cachels); - f->subwindow_cachels = 0; - } + f->subwindow_instance_cache = Qnil; /* Remove the frame now from the list. This way, any events generated on this frame by the maneuvers below will disperse themselves. */ @@ -2264,8 +2263,9 @@ The following symbols etc. have predefined meanings: minibuffer Gives the minibuffer behavior for this frame. Either t (frame has its own minibuffer), `only' (frame is - a minibuffer-only frame), or a window (frame uses that - window, which is on another frame, as the minibuffer). + a minibuffer-only frame), `none' (frame has no minibuffer) + or a window (frame uses that window, which is on another + frame, as the minibuffer). unsplittable If non-nil, frame cannot be split by `display-buffer'. @@ -2279,7 +2279,13 @@ The following symbols etc. have predefined meanings: left-toolbar-visible-p, right-toolbar-visible-p, toolbar-buttons-captioned-p, top-toolbar-border-width, bottom-toolbar-border-width, left-toolbar-border-width, right-toolbar-border-width, - modeline-shadow-thickness, has-modeline-p + modeline-shadow-thickness, has-modeline-p, + default-gutter, top-gutter, bottom-gutter, left-gutter, right-gutter, + default-gutter-height, default-gutter-width, top-gutter-height, + bottom-gutter-height, left-gutter-width, right-gutter-width, + default-gutter-visible-p, top-gutter-visible-p, bottom-gutter-visible-p, + left-gutter-visible-p, right-gutter-visible-p, top-gutter-border-width, + bottom-gutter-border-width, left-gutter-border-width, right-gutter-border-width, [Giving the name of any built-in specifier variable is equivalent to calling `set-specifier' on the specifier, with a locale of FRAME. Giving the name to `frame-property' @@ -2871,9 +2877,6 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth) - FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) - 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f); - new_pixheight -= - (FRAME_TOP_GUTTER_BOUNDS (f) + FRAME_BOTTOM_GUTTER_BOUNDS (f)); - new_pixwidth += + FRAME_THEORETICAL_LEFT_TOOLBAR_WIDTH (f) + 2 * FRAME_THEORETICAL_LEFT_TOOLBAR_BORDER_WIDTH (f) @@ -2886,9 +2889,6 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth) - FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) - 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f); - new_pixwidth -= - (FRAME_LEFT_GUTTER_BOUNDS (f) + FRAME_RIGHT_GUTTER_BOUNDS (f)); - /* Adjust the width for the end glyph which may be a different width than the default character width. */ { @@ -2910,6 +2910,12 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth) if (new_pixheight) { + /* Adjust for gutters here so that we always get set + properly. */ + new_pixheight -= + (FRAME_TOP_GUTTER_BOUNDS (f) + + FRAME_BOTTOM_GUTTER_BOUNDS (f)); + XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top = FRAME_TOP_BORDER_END (f) + FRAME_TOP_GUTTER_BOUNDS (f); @@ -2955,6 +2961,12 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth) if (new_pixwidth) { + /* Adjust for gutters here so that we always get set + properly. */ + new_pixwidth -= + (FRAME_LEFT_GUTTER_BOUNDS (f) + + FRAME_RIGHT_GUTTER_BOUNDS (f)); + XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_left = FRAME_LEFT_BORDER_END (f) + FRAME_LEFT_GUTTER_BOUNDS (f); set_window_pixwidth (FRAME_ROOT_WINDOW (f), new_pixwidth, 0);