#include "faces.h"
#include "frame.h"
#include "glyphs.h"
+#include "gutter.h"
#include "menubar.h"
#include "redisplay.h"
#include "scrollbar.h"
Lisp_Object Qborder_width;
Lisp_Object Qframep, Qframe_live_p;
-Lisp_Object Qframe_x_p, Qframe_tty_p;
Lisp_Object Qdelete_frame;
Lisp_Object Qframe_title_format, Vframe_title_format;
Lisp_Object Qframe_being_created;
static void store_minibuf_frame_prop (struct frame *f, Lisp_Object val);
+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;
EXFUN (Fset_frame_properties, 2);
\f
static Lisp_Object
-mark_frame (Lisp_Object obj, void (*markobj) (Lisp_Object))
+mark_frame (Lisp_Object obj)
{
struct frame *f = XFRAME (obj);
-#define MARKED_SLOT(x) ((void) (markobj (f->x)));
+#define MARKED_SLOT(x) mark_object (f->x)
#include "frameslots.h"
- mark_subwindow_cachels (f->subwindow_cachels, markobj);
+ mark_subwindow_cachels (f->subwindow_cachels);
if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */
- MAYBE_FRAMEMETH (f, mark_frame, (f, markobj));
+ MAYBE_FRAMEMETH (f, mark_frame, (f));
return Qnil;
}
}
DEFINE_LRECORD_IMPLEMENTATION ("frame", frame,
- mark_frame, print_frame, 0, 0, 0,
+ mark_frame, print_frame, 0, 0, 0, 0,
struct frame);
\f
static void
nuke_all_frame_slots (struct frame *f)
{
-#define MARKED_SLOT(x) f->x = Qnil;
+#define MARKED_SLOT(x) f->x = Qnil
#include "frameslots.h"
}
/* cache of subwindows visible on frame */
f->subwindow_cachels = Dynarr_new (subwindow_cachel);
+ /* associated exposure ignore list */
+ f->subwindow_exposures = 0;
+ f->subwindow_exposures_tail = 0;
+
/* Choose a buffer for the frame's root window. */
XWINDOW (root_window)->buffer = Qt;
{
update_frame_window_mirror (f);
- if (initialized)
+ if (initialized && !DEVICE_STREAM_P (d))
{
if (!NILP (f->minibuffer_window))
reset_face_cachels (XWINDOW (f->minibuffer_window));
reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
reset_subwindow_cachels (f);
change_frame_size (f, f->height, f->width, 0);
+
}
MAYBE_FRAMEMETH (f, init_frame_2, (f, props));
Fset_frame_properties (frame, props);
MAYBE_FRAMEMETH (f, init_frame_3, (f));
+ /* now initialise the gutters, this won't change the frame size
+ so is ok here. */
+ if (!DEVICE_STREAM_P (d))
+ init_frame_gutters (f);
+
/* Hallelujah, praise the lord. */
f->init_finished = 1;
{
#ifdef HAVE_TOOLBARS
if (!EQ (f->last_nonminibuf_window, window))
- MARK_TOOLBAR_CHANGED;
+ {
+ MARK_TOOLBAR_CHANGED;
+ MARK_GUTTER_CHANGED;
+ }
#endif
f->last_nonminibuf_window = window;
}
#ifdef HAVE_TOOLBARS
free_frame_toolbars (f);
#endif
+ free_frame_gutters (f);
/* This must be done before the window and window_mirror structures
are freed. The scrollbar information is attached to them. */
struct window *w;
int pix_x, pix_y;
- CHECK_WINDOW (window);
+ CHECK_LIVE_WINDOW (window);
CHECK_INT (x);
CHECK_INT (y);
{
struct window *w;
- CHECK_WINDOW (window);
+ CHECK_LIVE_WINDOW (window);
CHECK_INT (x);
CHECK_INT (y);
window = FRAME_SELECTED_WINDOW (f);
- egw = max (glyph_width (Vcontinuation_glyph, Vdefault_face, 0, window),
- glyph_width (Vtruncation_glyph, Vdefault_face, 0, window));
+ egw = max (glyph_width (Vcontinuation_glyph, window),
+ glyph_width (Vtruncation_glyph, window));
egw = max (egw, cpw);
bdr = 2 * f->internal_border_width;
obw = FRAME_SCROLLBAR_WIDTH (f) + FRAME_THEORETICAL_LEFT_TOOLBAR_WIDTH (f) +
{
int adjustment, trunc_width, cont_width;
- trunc_width = glyph_width (Vtruncation_glyph, Vdefault_face, 0,
+ trunc_width = glyph_width (Vtruncation_glyph,
FRAME_SELECTED_WINDOW (f));
- cont_width = glyph_width (Vcontinuation_glyph, Vdefault_face, 0,
+ cont_width = glyph_width (Vcontinuation_glyph,
FRAME_SELECTED_WINDOW (f));
adjustment = max (trunc_width, cont_width);
adjustment = max (adjustment, font_width);
}
\f
+/* The caller is responsible for freeing the returned string. */
+static Bufbyte *
+generate_title_string (struct window *w, Lisp_Object format_str,
+ face_index findex, int type)
+{
+ struct display_line *dl;
+ struct display_block *db;
+ int elt = 0;
+
+ dl = &title_string_display_line;
+ db = get_display_block_from_line (dl, TEXT);
+ Dynarr_reset (db->runes);
+
+ generate_formatted_string_db (format_str, Qnil, w, dl, db, findex, 0,
+ -1, type);
+
+ Dynarr_reset (title_string_emchar_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);
+ elt++;
+ }
+
+ return
+ convert_emchar_string_into_malloced_string
+ (Dynarr_atp (title_string_emchar_dynarr, 0),
+ Dynarr_length (title_string_emchar_dynarr), 0);
+}
+
void
update_frame_title (struct frame *f)
{
if (HAS_FRAMEMETH_P (f, set_title_from_bufbyte))
{
- title = generate_formatted_string (w, title_format, Qnil,
- DEFAULT_INDEX, CURRENT_DISP);
+ title = generate_title_string (w, title_format,
+ DEFAULT_INDEX, CURRENT_DISP);
FRAMEMETH (f, set_title_from_bufbyte, (f, title));
}
if (title)
xfree (title);
- title = generate_formatted_string (w, icon_format, Qnil,
- DEFAULT_INDEX, CURRENT_DISP);
+ title = generate_title_string (w, icon_format,
+ DEFAULT_INDEX, CURRENT_DISP);
}
FRAMEMETH (f, set_icon_name_from_bufbyte, (f, title));
}
}
\f
+/***************************************************************************/
+/* */
+/* initialization */
+/* */
+/***************************************************************************/
+
+void
+init_frame (void)
+{
+#ifndef PDUMP
+ if (!initialized)
+#endif
+ {
+ title_string_emchar_dynarr = Dynarr_new (Emchar);
+ xzero (title_string_display_line);
+ }
+}
+
void
syms_of_frame (void)
{
defsymbol (&Qframep, "framep");
defsymbol (&Qframe_live_p, "frame-live-p");
- defsymbol (&Qframe_x_p, "frame-x-p");
- defsymbol (&Qframe_tty_p, "frame-tty-p");
defsymbol (&Qdelete_frame, "delete-frame");
defsymbol (&Qsynchronize_minibuffers, "synchronize-minibuffers");
defsymbol (&Qbuffer_predicate, "buffer-predicate");
This is the same format as `modeline-format' with the exception that
%- is ignored.
*/ );
- Vframe_title_format = Fpurecopy (build_string ("%S: %b"));
+ Vframe_title_format = build_string ("%S: %b");
DEFVAR_LISP ("frame-icon-title-format", &Vframe_icon_title_format /*
Controls the title of the icon corresponding to the selected frame.
See also the variable `frame-title-format'.
*/ );
- Vframe_icon_title_format = Fpurecopy (build_string ("%b"));
+ Vframe_icon_title_format = build_string ("%b");
DEFVAR_LISP ("default-frame-name", &Vdefault_frame_name /*
The default name to assign to newly-created frames.
This must be a string.
*/ );
#ifndef INFODOCK
- Vdefault_frame_name = Fpurecopy (build_string ("emacs"));
+ Vdefault_frame_name = build_string ("emacs");
#else
- Vdefault_frame_name = Fpurecopy (build_string ("InfoDock"));
+ Vdefault_frame_name = build_string ("InfoDock");
#endif
DEFVAR_LISP ("default-frame-plist", &Vdefault_frame_plist /*