but control characters have two -- a ^ and a letter -- and other
non-printing characters (those displayed in octal) have four. */
+/* WARNING! In compare_runes (one of the most heavily used functions)
+ two runes are compared. So please be careful with changes to this
+ structure. See comments in compare_runes.
+
+ #### This should really be made smaller.
+*/
+
typedef struct rune rune;
struct rune
{
each of the face properties in this
particular window. */
- short xpos; /* horizontal starting position in pixels */
- short width; /* pixel width of rune */
-
-
Bufpos bufpos; /* buffer position this rune is displaying;
for the modeline, the value here is a
Charcount, but who's looking? */
/* #### Chuck, what does it mean for a rune
to cover a range of pos? I don't get
this. */
- unsigned int cursor_type :3; /* is this rune covered by the cursor? */
- unsigned int type :3; /* type of rune object */
+ /* #### This isn't used as an rvalue anywhere!
+ remove! */
+
+
+ short xpos; /* horizontal starting position in pixels */
+ short width; /* pixel width of rune */
+
+
+ unsigned char cursor_type; /* is this rune covered by the cursor? */
+ unsigned char type; /* type of rune object */
+ /* We used to do bitfields here, but if I
+ (JV) count correctly that doesn't matter
+ for the size of the structure. All the bit
+ fiddling _does_ slow down redisplay by
+ about 10%. So don't do that */
union /* Information specific to the type of rune */
{
+ /* #### GLyps are are. Is it really necessary to waste 8 bytes on every
+ rune for that?! */
/* DGLYPH */
struct
{
/* HLINE */
struct
{
- int thickness; /* how thick to make hline */
- int yoffset; /* how far down from top of line to put top */
+ short thickness; /* how thick to make hline */
+ short yoffset; /* how far down from top of line to put top */
} hline;
} object; /* actual rune object */
};
pixel-row itself, I think. */
unsigned short clip; /* amount of bottom of line to clip
in pixels.*/
+ unsigned short top_clip; /* amount of top of line to clip
+ in pixels.*/
Bufpos bufpos; /* first buffer position on line */
Bufpos end_bufpos; /* last buffer position on line */
Charcount offset; /* adjustment to bufpos vals */
};
#define DISPLAY_LINE_HEIGHT(dl) \
-(dl->ascent + dl->descent - dl->clip)
+(dl->ascent + dl->descent - (dl->clip + dl->top_clip))
#define DISPLAY_LINE_YPOS(dl) \
-(dl->ypos - dl->ascent)
+(dl->ypos - (dl->ascent - dl->top_clip))
+#define DISPLAY_LINE_YEND(dl) \
+((dl->ypos + dl->descent) - dl->clip)
typedef struct
{
Dynarr_declare (display_line);
} display_line_dynarr;
+/* The following two structures are used to represent an area to
+displayed and where to display it. Using these two structures all
+combinations of clipping and position can be accommodated. */
+
+/* This represents an area to be displayed into. */
+typedef struct display_box display_box;
+struct display_box
+{
+ int xpos; /* absolute horizontal position of area */
+ int ypos; /* absolute vertical position of area */
+ int width, height;
+};
+
+/* This represents the area from a glyph to be displayed. */
+typedef struct display_glyph_area display_glyph_area;
+struct display_glyph_area
+{
+ int xoffset; /* horizontal offset of the glyph, +ve means
+ display the glyph with x offset by xoffset,
+ -ve means display starting xoffset into the
+ glyph. */
+ int yoffset; /* vertical offset of the glyph, +ve means
+ display the glyph with y offset by yoffset,
+ -ve means display starting xoffset into the
+ glyph. */
+ int width, height; /* width and height of glyph to display. */
+};
+
/* It could be argued that the following two structs belong in
extents.h, but they're only used by redisplay and it simplifies
the header files to put them here. */
unsigned int invisible_ellipses_already_displayed:1;
};
+#define EDGE_TOP 1
+#define EDGE_LEFT 2
+#define EDGE_BOTTOM 4
+#define EDGE_RIGHT 8
+#define EDGE_ALL (EDGE_TOP | EDGE_LEFT | EDGE_BOTTOM | EDGE_RIGHT)
+
\f
/*************************************************************************/
/* change flags */
extern int subwindows_changed;
extern int subwindows_changed_set;
+/* True if any displayed subwindow is in need of updating
+ somewhere. */
+extern int subwindows_state_changed;
+extern int subwindows_state_changed_set;
+
/* True if an icon is in need of updating somewhere. */
extern int icon_changed;
extern int icon_changed_set;
#define MARK_GUTTER_CHANGED MARK_TYPE_CHANGED (gutter)
#define MARK_GLYPHS_CHANGED MARK_TYPE_CHANGED (glyphs)
#define MARK_SUBWINDOWS_CHANGED MARK_TYPE_CHANGED (subwindows)
+#define MARK_SUBWINDOWS_STATE_CHANGED MARK_TYPE_CHANGED (subwindows_state)
+
+
+#define CLASS_RESET_CHANGED_FLAGS(p) do { \
+ (p)->buffers_changed = 0; \
+ (p)->clip_changed = 0; \
+ (p)->extents_changed = 0; \
+ (p)->faces_changed = 0; \
+ (p)->frame_changed = 0; \
+ (p)->icon_changed = 0; \
+ (p)->menubar_changed = 0; \
+ (p)->modeline_changed = 0; \
+ (p)->point_changed = 0; \
+ (p)->toolbar_changed = 0; \
+ (p)->gutter_changed = 0; \
+ (p)->glyphs_changed = 0; \
+ (p)->subwindows_changed = 0; \
+ (p)->subwindows_state_changed = 0; \
+ (p)->windows_changed = 0; \
+ (p)->windows_structure_changed = 0; \
+} while (0)
+
+#define GLOBAL_RESET_CHANGED_FLAGS do { \
+ buffers_changed = 0; \
+ clip_changed = 0; \
+ extents_changed = 0; \
+ faces_changed = 0; \
+ frame_changed = 0; \
+ icon_changed = 0; \
+ menubar_changed = 0; \
+ modeline_changed = 0; \
+ point_changed = 0; \
+ toolbar_changed = 0; \
+ gutter_changed = 0; \
+ glyphs_changed = 0; \
+ subwindows_changed = 0; \
+ subwindows_state_changed = 0; \
+ windows_changed = 0; \
+ windows_structure_changed = 0; \
+} while (0)
+
+#define CLASS_REDISPLAY_FLAGS_CHANGEDP(p) \
+ ( (p)->buffers_changed || \
+ (p)->clip_changed || \
+ (p)->extents_changed || \
+ (p)->faces_changed || \
+ (p)->frame_changed || \
+ (p)->icon_changed || \
+ (p)->menubar_changed || \
+ (p)->modeline_changed || \
+ (p)->point_changed || \
+ (p)->toolbar_changed || \
+ (p)->gutter_changed || \
+ (p)->glyphs_changed || \
+ (p)->size_changed || \
+ (p)->subwindows_changed || \
+ (p)->subwindows_state_changed || \
+ (p)->windows_changed || \
+ (p)->windows_structure_changed )
+
+#define GLOBAL_REDISPLAY_FLAGS_CHANGEDP \
+ ( buffers_changed || \
+ clip_changed || \
+ extents_changed || \
+ faces_changed || \
+ frame_changed || \
+ icon_changed || \
+ menubar_changed || \
+ modeline_changed || \
+ point_changed || \
+ toolbar_changed || \
+ gutter_changed || \
+ glyphs_changed || \
+ size_changed || \
+ subwindows_changed || \
+ subwindows_state_changed || \
+ windows_changed || \
+ windows_structure_changed )
+
/* Anytime a console, device or frame is added or deleted we need to reset
these flags. */
-#define RESET_CHANGED_SET_FLAGS \
- do { \
- buffers_changed_set = 0; \
- clip_changed_set = 0; \
- extents_changed_set = 0; \
- icon_changed_set = 0; \
- menubar_changed_set = 0; \
- modeline_changed_set = 0; \
- point_changed_set = 0; \
- toolbar_changed_set = 0; \
- gutter_changed_set = 0; \
- glyphs_changed_set = 0; \
- subwindows_changed_set = 0; \
- } while (0)
+#define RESET_CHANGED_SET_FLAGS do { \
+ buffers_changed_set = 0; \
+ clip_changed_set = 0; \
+ extents_changed_set = 0; \
+ icon_changed_set = 0; \
+ menubar_changed_set = 0; \
+ modeline_changed_set = 0; \
+ point_changed_set = 0; \
+ toolbar_changed_set = 0; \
+ gutter_changed_set = 0; \
+ glyphs_changed_set = 0; \
+ subwindows_changed_set = 0; \
+ subwindows_state_changed_set = 0; \
+} while (0)
\f
/*************************************************************************/
int window_half_pixpos (struct window *w);
void redisplay_echo_area (void);
void free_display_structs (struct window_mirror *mir);
-Bufbyte *generate_formatted_string (struct window *w, Lisp_Object format_str,
- Lisp_Object result_str, face_index findex,
- int type);
+void free_display_lines (display_line_dynarr *dla);
void generate_displayable_area (struct window *w, Lisp_Object disp_string,
int xpos, int ypos, int width, int height,
display_line_dynarr* dl,
Bufpos start_pos, face_index default_face);
+/* `generate_title_string' in frame.c needs this */
+void generate_formatted_string_db (Lisp_Object format_str,
+ Lisp_Object result_str,
+ struct window *w,
+ struct display_line *dl,
+ struct display_block *db,
+ face_index findex,
+ int min_pixpos, int max_pixpos, int type);
int real_current_modeline_height (struct window *w);
int pixel_to_glyph_translation (struct frame *f, int x_coord,
int y_coord, int *col, int *row,
Lisp_Object *obj1, Lisp_Object *obj2);
void glyph_to_pixel_translation (struct window *w, int char_x,
int char_y, int *pix_x, int *pix_y);
-void mark_redisplay (void (*) (Lisp_Object));
+void mark_redisplay (void);
int point_in_line_start_cache (struct window *w, Bufpos point,
int min_past);
int point_would_be_visible (struct window *w, Bufpos startp,
int get_next_display_block (layout_bounds bounds,
display_block_dynarr *dba, int start_pos,
int *next_start);
-void redisplay_output_subwindow (struct window *w, struct display_line *dl,
- Lisp_Object image_instance, int xpos,
- int xoffset, int start_pixpos, int width,
- face_index findex, int cursor_start,
- int cursor_width, int cursor_height);
+void redisplay_output_layout (struct window *w,
+ Lisp_Object image_instance,
+ struct display_box* db, struct display_glyph_area* dga,
+ face_index findex, int cursor_start, int cursor_width,
+ int cursor_height);
+void redisplay_output_subwindow (struct window *w,
+ Lisp_Object image_instance,
+ struct display_box* db, struct display_glyph_area* dga,
+ face_index findex, int cursor_start, int cursor_width,
+ int cursor_height);
void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height);
+void redisplay_output_pixmap (struct window *w,
+ Lisp_Object image_instance,
+ struct display_box* db, struct display_glyph_area* dga,
+ face_index findex, int cursor_start, int cursor_width,
+ int cursor_height, int offset_bitmap);
+int redisplay_calculate_display_boxes (struct display_line *dl, int xpos,
+ int xoffset, int start_pixpos, int width,
+ struct display_box* dest,
+ struct display_glyph_area* src);
+int redisplay_normalize_glyph_area (struct display_box* dest,
+ struct display_glyph_area* glyphsrc);
void redisplay_clear_to_window_end (struct window *w, int ypos1, int ypos2);
void redisplay_clear_region (Lisp_Object window, face_index findex, int x,
int y, int width, int height);
void redisplay_update_line (struct window *w, int first_line,
int last_line, int update_values);
void redisplay_output_window (struct window *w);
+void bevel_modeline (struct window *w, struct display_line *dl);
int redisplay_move_cursor (struct window *w, Bufpos new_point,
int no_output_end);
void redisplay_redraw_cursor (struct frame *f, int run_begin_end_meths);