/* Interface definitions for display code.
- Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004, 2005
- Free Software Foundation, Inc.
+ Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2005, 2006, 2007, 2008
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
/* New redisplay written by Gerd Moellmann <gerd@gnu.org>. */
#define FACE_ID_BITS 21
- /* Face of the glyph. */
+ /* Face of the glyph. This is a realized face ID,
+ an index in the face cache of the frame. */
unsigned face_id : FACE_ID_BITS;
/* Type of font used to display the character glyph. May be used to
position of the next row. */
struct display_pos end;
+ /* Non-zero means the overlay arrow bitmap is on this line.
+ -1 means use default overlay arrow bitmap, else
+ it specifies actual fringe bitmap number. */
+ int overlay_arrow_bitmap;
+
/* Left fringe bitmap number (enum fringe_bitmap_type). */
unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
unsigned truncated_on_left_p : 1;
unsigned truncated_on_right_p : 1;
- /* 1 means the overlay arrow is on this line. */
- unsigned overlay_arrow_p : 1;
-
/* 1 means that this row displays a continued line, i.e. it has a
continuation mark at the right side. */
unsigned continued_p : 1;
stipple pattern. */
unsigned stippled_p : 1;
- /* 1 means only the foreground of this glyph string must be drawn,
- and we should use the physical height of the line this glyph
- string appears in as clip rect. */
- unsigned for_overlaps_p : 1;
+#define OVERLAPS_PRED (1 << 0)
+#define OVERLAPS_SUCC (1 << 1)
+#define OVERLAPS_BOTH (OVERLAPS_PRED | OVERLAPS_SUCC)
+#define OVERLAPS_ERASED_CURSOR (1 << 2)
+ /* Non-zero means only the foreground of this glyph string must be
+ drawn, and we should use the physical height of the line this
+ glyph string appears in as clip rect. If the value is
+ OVERLAPS_ERASED_CURSOR, the clip rect is restricted to the rect
+ of the erased cursor. OVERLAPS_PRED and OVERLAPS_SUCC mean we
+ draw overlaps with the preceding and the succeeding rows,
+ respectively. */
+ unsigned for_overlaps : 3;
/* The GC to use for drawing this glyph string. */
#if defined(HAVE_X_WINDOWS) || defined(MAC_OS)
CURSOR_FACE_ID,
MOUSE_FACE_ID,
MENU_FACE_ID,
+ VERTICAL_BORDER_FACE_ID,
BASIC_FACE_ID_SENTINEL
};
Lisp_Object height;
};
+/* Input sources for fetching characters or data to display.
+ The input source is found in the `method' field. */
+
enum it_method {
GET_FROM_BUFFER = 0,
GET_FROM_DISPLAY_VECTOR,
NUM_IT_METHODS
};
+#define IT_STACK_SIZE 4
+
struct it
{
/* The window in which we iterate over current_buffer (or a string). */
position in overlay strings etc. */
struct display_pos current;
+ /* Total number of overlay strings to process. This can be >
+ OVERLAY_STRING_CHUNK_SIZE. */
+ int n_overlay_strings;
+
/* Vector of overlays to process. Overlay strings are processed
OVERLAY_STRING_CHUNK_SIZE at a time. */
#define OVERLAY_STRING_CHUNK_SIZE 16
Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
- /* Total number of overlay strings to process. This can be >
- OVERLAY_STRING_CHUNK_SIZE. */
- int n_overlay_strings;
+ /* For each overlay string, the overlay it came from. */
+ Lisp_Object string_overlays[OVERLAY_STRING_CHUNK_SIZE];
/* If non-nil, a Lisp string being processed. If
current.overlay_string_index >= 0, this is an overlay string from
pos. */
Lisp_Object string;
+ /* If non-nil, we are processing a string that came
+ from a `display' property given by an overlay. */
+ Lisp_Object from_overlay;
+
/* Stack of saved values. New entries are pushed when we begin to
process an overlay string or a string from a `glyph' property.
Entries are popped when we return to deliver display elements
from what we previously had. */
struct iterator_stack_entry
{
- int stop_charpos;
- int face_id;
Lisp_Object string;
- struct display_pos pos;
- int end_charpos;
int string_nchars;
+ int end_charpos;
+ int stop_charpos;
+ int face_id;
+
+ /* Save values specific to a given method. */
+ union {
+ /* method == GET_FROM_IMAGE */
+ struct {
+ Lisp_Object object;
+ struct it_slice slice;
+ int image_id;
+ } image;
+ /* method == GET_FROM_COMPOSITION */
+ struct {
+ Lisp_Object object;
+ int c, len;
+ int cmp_id, cmp_len;
+ } comp;
+ /* method == GET_FROM_STRETCH */
+ struct {
+ Lisp_Object object;
+ } stretch;
+ } u;
+
+ /* current text and display positions. */
+ struct text_pos position;
+ struct display_pos current;
+ Lisp_Object from_overlay;
enum glyph_row_area area;
+ enum it_method method;
unsigned multibyte_p : 1;
unsigned string_from_display_prop_p : 1;
unsigned display_ellipsis_p : 1;
- struct it_slice slice;
+
+ /* properties from display property that are reset by another display property. */
Lisp_Object space_width;
- short voffset;
Lisp_Object font_height;
+ short voffset;
}
- stack[2];
+ stack[IT_STACK_SIZE];
/* Stack pointer. */
int sp;
- /* Setting of buffer-local variable selective-display-ellipsis. */
- unsigned selective_display_ellipsis_p : 1;
-
- /* 1 means control characters are translated into the form `^C'
- where the `^' can be replaced by a display table entry. */
- unsigned ctl_arrow_p : 1;
-
/* -1 means selective display hides everything between a \r and the
next newline; > 0 means hide lines indented more than that value. */
int selective;
/* Face to use. */
int face_id;
+ /* Setting of buffer-local variable selective-display-ellipsis. */
+ unsigned selective_display_ellipsis_p : 1;
+
+ /* 1 means control characters are translated into the form `^C'
+ where the `^' can be replaced by a display table entry. */
+ unsigned ctl_arrow_p : 1;
+
+ /* 1 means lines are truncated. */
+ unsigned truncate_lines_p : 1;
+
/* Non-zero means that the current face has a box. */
unsigned face_box_p : 1;
/* 1 means overlay strings at end_charpos have been processed. */
unsigned overlay_strings_at_end_processed_p : 1;
+ /* 1 means to ignore overlay strings at current pos, as they have
+ already been processed. */
+ unsigned ignore_overlay_strings_at_pos_p : 1;
+
/* 1 means the actual glyph is not available in the current
system. */
unsigned glyph_not_available_p : 1;
Lisp_Object object;
struct text_pos position;
- /* 1 means lines are truncated. */
- unsigned truncate_lines_p : 1;
-
/* Number of columns per \t. */
short tab_width;
This function is called from redraw_overlapping_rows after
desired rows have been made current. */
void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row,
- enum glyph_row_area area));
+ enum glyph_row_area area, int));
#ifdef HAVE_WINDOW_SYSTEM
if necessary. */
unsigned long background;
+ /* Foreground and background colors of the frame on which the image
+ is created. */
+ unsigned long frame_foreground, frame_background;
+
/* True if this image has a `transparent' background -- that is, is
uses an image mask. The accessor macro for this is
`IMAGE_BACKGROUND_TRANSPARENT'. */
#define DEFAULT_IMAGE_WIDTH 30
#define DEFAULT_IMAGE_HEIGHT 30
+ /* Top/left and bottom/right corner pixel of actual image data.
+ Used by four_corners_best to consider the real image data,
+ rather than looking at the optional image margin. */
+ int corners[4];
+#define TOP_CORNER 0
+#define LEFT_CORNER 1
+#define BOT_CORNER 2
+#define RIGHT_CORNER 3
+
/* Percent of image height used as ascent. A value of
CENTERED_IMAGE_ASCENT means draw the image centered on the
line. */
/* Help string. */
TOOL_BAR_ITEM_HELP,
+ /* Icon file name of right to left image when an RTL locale is used. */
+ TOOL_BAR_ITEM_RTL_IMAGE,
+
/* Sentinel = number of slots in tool_bar_items occupied by one
tool-bar item. */
TOOL_BAR_ITEM_NSLOTS
int display_prop_intangible_p P_ ((Lisp_Object));
void resize_echo_area_exactly P_ ((void));
int resize_mini_window P_ ((struct window *, int));
-int try_window P_ ((Lisp_Object, struct text_pos));
+int try_window P_ ((Lisp_Object, struct text_pos, int));
void window_box P_ ((struct window *, int, int *, int *, int *, int *));
int window_box_height P_ ((struct window *));
int window_text_bottom_y P_ ((struct window *));
void pixel_to_glyph_coords P_ ((struct frame *, int, int, int *, int *,
NativeRectangle *, int));
int glyph_to_pixel_coords P_ ((struct window *, int, int, int *, int *));
+void remember_mouse_glyph P_ ((struct frame *, int, int, NativeRectangle *));
+
void mark_window_display_accurate P_ ((Lisp_Object, int));
void redisplay_preserve_echo_area P_ ((int));
-void set_cursor_from_row P_ ((struct window *, struct glyph_row *,
- struct glyph_matrix *, int, int, int, int));
+int set_cursor_from_row P_ ((struct window *, struct glyph_row *,
+ struct glyph_matrix *, int, int, int, int));
void init_iterator P_ ((struct it *, struct window *, int,
int, struct glyph_row *, enum face_id));
void init_iterator_to_row_start P_ ((struct it *, struct window *,
extern int help_echo_pos;
extern struct frame *last_mouse_frame;
extern int last_tool_bar_item;
-extern int mouse_autoselect_window;
+extern Lisp_Object Vmouse_autoselect_window;
+extern int unibyte_display_via_language_environment;
+
extern void reseat_at_previous_visible_line_start P_ ((struct it *));
extern int calc_pixel_width_or_height P_ ((double *, struct it *, Lisp_Object,
extern struct cursor_pos output_cursor;
extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *,
- enum glyph_row_area));
+ enum glyph_row_area, int));
extern void draw_phys_cursor_glyph P_ ((struct window *,
struct glyph_row *,
enum draw_glyphs_face));
-extern int get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *,
- struct glyph *, int *));
+extern void get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *,
+ struct glyph *, int *, int *, int *));
extern void erase_phys_cursor P_ ((struct window *));
extern void display_and_set_cursor P_ ((struct window *,
int, int, int, int, int));
extern void x_draw_vertical_border P_ ((struct window *w));
extern void frame_to_window_pixel_xy P_ ((struct window *, int *, int *));
+extern int get_glyph_string_clip_rects P_ ((struct glyph_string *,
+ NativeRectangle *, int));
extern void get_glyph_string_clip_rect P_ ((struct glyph_string *,
NativeRectangle *nr));
extern Lisp_Object find_hot_spot P_ ((Lisp_Object, int, int));
void w32_init_fringe P_ ((void));
void w32_reset_fringes P_ ((void));
#endif
+#ifdef MAC_OS
+void mac_init_fringe P_ ((void));
+#endif
/* Defined in image.c */
extern int x_create_bitmap_from_data P_ ((struct frame *, char *,
unsigned int, unsigned int));
extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object));
+#if defined (HAVE_XPM) && defined (HAVE_X_WINDOWS)
+extern int x_create_bitmap_from_xpm_data P_ ((struct frame *f, char **bits));
+#endif
#ifndef x_destroy_bitmap
extern void x_destroy_bitmap P_ ((struct frame *, int));
#endif
int lookup_named_face P_ ((struct frame *, Lisp_Object, int, int));
int smaller_face P_ ((struct frame *, int, int));
int face_with_height P_ ((struct frame *, int, int));
-int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int));
+int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int, int));
void init_frame_faces P_ ((struct frame *));
void free_frame_faces P_ ((struct frame *));
void recompute_basic_faces P_ ((struct frame *));
int face_at_buffer_position P_ ((struct window *, int, int, int, int *,
int, int));
+int face_for_overlay_string P_ ((struct window *, int, int,
+ int, int *,
+ int, int, Lisp_Object));
int face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int,
int, int *, enum face_id, int));
int merge_faces P_ ((struct frame *, Lisp_Object, int, int));
int compute_char_face P_ ((struct frame *, int, Lisp_Object));
void free_all_realized_faces P_ ((Lisp_Object));
extern Lisp_Object Qforeground_color, Qbackground_color;
+extern Lisp_Object Qframe_set_background_mode;
extern char unspecified_fg[], unspecified_bg[];
void free_realized_multibyte_face P_ ((struct frame *, int));
EXFUN (Fx_hide_tip, 0);
extern void start_hourglass P_ ((void));
extern void cancel_hourglass P_ ((void));
+extern int hourglass_started P_ ((void));
extern int display_hourglass_p;
/* Returns the background color of IMG, calculating one heuristically if
void do_pending_window_change P_ ((int));
void change_frame_size P_ ((struct frame *, int, int, int, int, int));
void bitch_at_user P_ ((void));
-Lisp_Object sit_for P_ ((int, int, int, int, int));
void init_display P_ ((void));
void syms_of_display P_ ((void));
extern Lisp_Object Qredisplay_dont_pause;
+GLYPH spec_glyph_lookup_face P_ ((struct window *, GLYPH));
/* Defined in term.c */
extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object));
extern void tty_setup_colors P_ ((int));
extern void term_init P_ ((char *));
-extern void fatal P_ ((/* char *, ... */));
void cursor_to P_ ((int, int));
extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long));