static struct display_line title_string_display_line;
/* Used by generate_title_string. Global because they get used so much that
the dynamic allocation time adds up. */
-static Emchar_dynarr *title_string_emchar_dynarr;
+static Charc_dynarr *title_string_charc_dynarr;
\f
static Lisp_Object
#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));
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;
#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);
}
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. */
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. */
generate_formatted_string_db (format_str, Qnil, w, dl, db, findex, 0,
-1, type);
- Dynarr_reset (title_string_emchar_dynarr);
+ Dynarr_reset (title_string_charc_dynarr);
while (elt < Dynarr_length (db->runes))
{
if (Dynarr_atp (db->runes, elt)->type == RUNE_CHAR)
- Dynarr_add (title_string_emchar_dynarr,
- Dynarr_atp (db->runes, elt)->object.chr.ch);
+ Dynarr_add (title_string_charc_dynarr,
+ Dynarr_atp (db->runes, elt)->object.cglyph);
elt++;
}
return
- convert_emchar_string_into_malloced_string
- (Dynarr_atp (title_string_emchar_dynarr, 0),
- Dynarr_length (title_string_emchar_dynarr), 0);
+ convert_charc_string_into_malloced_string
+ (Dynarr_atp (title_string_charc_dynarr, 0),
+ Dynarr_length (title_string_charc_dynarr), 0);
}
void
if (!initialized)
#endif
{
- title_string_emchar_dynarr = Dynarr_new (Emchar);
+ title_string_charc_dynarr = Dynarr_new (Charc);
xzero (title_string_display_line);
}
}