/* Interface definitions for display code.
- Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- 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>. */
#ifdef HAVE_X_WINDOWS
typedef struct x_display_info Display_Info;
+typedef XImage * XImagePtr;
+typedef XImagePtr XImagePtr_or_DC;
#define NativeRectangle XRectangle
#endif
#ifdef HAVE_NTGUI
#include "w32gui.h"
typedef struct w32_display_info Display_Info;
+typedef XImage *XImagePtr;
+typedef HDC XImagePtr_or_DC;
#endif
-#ifdef HAVE_CARBON
+#ifdef MAC_OS
#include "macgui.h"
typedef struct mac_display_info Display_Info;
+/* Mac equivalent of XImage. */
+typedef Pixmap XImagePtr;
+typedef XImagePtr XImagePtr_or_DC;
#endif
#ifndef NativeRectangle
#define NativeRectangle int
#endif
-
/* Structure forward declarations. Some are here because function
prototypes below reference structure types before their definition
in this file. Some are here because not every file including
ON_LEFT_FRINGE,
ON_RIGHT_FRINGE,
ON_LEFT_MARGIN,
- ON_RIGHT_MARGIN
+ ON_RIGHT_MARGIN,
+ ON_SCROLL_BAR
};
/* Number of bits allocated to store fringe bitmap numbers. */
-#define FRINGE_ID_BITS 8
+#define FRINGE_ID_BITS 16
\f
#define GLYPH_DEBUG 0
#endif
+/* If XASSERTS is non-zero, additional consistency checks are activated.
+ Turn it off by defining the macro XASSERTS to zero. */
+
+#ifndef XASSERTS
+#define XASSERTS 0
+#endif
+
/* Macros to include code only if GLYPH_DEBUG != 0. */
#if GLYPH_DEBUG
#define IF_DEBUG(X) X
-#define xassert(X) do {if (!(X)) abort ();} while (0)
#else
#define IF_DEBUG(X) (void) 0
+#endif
+
+#if XASSERTS
+#define xassert(X) do {if (!(X)) abort ();} while (0)
+#else
#define xassert(X) (void) 0
#endif
};
+/* Structure describing how to use partial glyphs (images slicing) */
+
+struct glyph_slice
+{
+ unsigned x : 16;
+ unsigned y : 16;
+ unsigned width : 16;
+ unsigned height : 16;
+};
+
+
/* Glyphs.
Be extra careful when changing this structure! Esp. make sure that
#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
w32_char_font_type. Otherwise it equals FONT_TYPE_UNKNOWN. */
unsigned font_type : 3;
+ struct glyph_slice slice;
+
/* A union of sub-structures for different glyph types. */
union
{
#define CHAR_GLYPH_SPACE_P(GLYPH) \
(GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH)
+/* Are glyph slices of glyphs *X and *Y equal */
+
+#define GLYPH_SLICE_EQUAL_P(X, Y) \
+ ((X)->slice.x == (Y)->slice.x \
+ && (X)->slice.y == (Y)->slice.y \
+ && (X)->slice.width == (Y)->slice.width \
+ && (X)->slice.height == (Y)->slice.height)
+
/* Are glyphs *X and *Y displayed equal? */
#define GLYPH_EQUAL_P(X, Y) \
((X)->type == (Y)->type \
&& (X)->u.val == (Y)->u.val \
+ && GLYPH_SLICE_EQUAL_P (X, Y) \
&& (X)->face_id == (Y)->face_id \
&& (X)->padding_p == (Y)->padding_p \
&& (X)->left_box_line_p == (Y)->left_box_line_p \
frames. It may be < 0 in case of completely invisible rows. */
int visible_height;
+ /* Extra line spacing added after this row. Do not consider this
+ in last row when checking if row is fully visible. */
+ int extra_line_spacing;
+
/* Hash code. This hash code is available as soon as the row
is constructed, i.e. after a call to display_line. */
unsigned hash;
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;
- /* Face of the left fringe glyph. */
- unsigned left_user_fringe_face_id : FACE_ID_BITS;
-
/* Right fringe bitmap number (enum fringe_bitmap_type). */
unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
- /* Face of the right fringe glyph. */
- unsigned right_user_fringe_face_id : FACE_ID_BITS;
-
/* Left fringe bitmap number (enum fringe_bitmap_type). */
unsigned left_fringe_bitmap : FRINGE_ID_BITS;
- /* Face of the left fringe glyph. */
- unsigned left_fringe_face_id : FACE_ID_BITS;
-
/* Right fringe bitmap number (enum fringe_bitmap_type). */
unsigned right_fringe_bitmap : FRINGE_ID_BITS;
+ /* Face of the left fringe glyph. */
+ unsigned left_user_fringe_face_id : FACE_ID_BITS;
+
+ /* Face of the right fringe glyph. */
+ unsigned right_user_fringe_face_id : FACE_ID_BITS;
+
+ /* Face of the left fringe glyph. */
+ unsigned left_fringe_face_id : FACE_ID_BITS;
+
/* Face of the right fringe glyph. */
unsigned right_fringe_face_id : FACE_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;
/* 1 means this row currently shows the cursor in the right fringe. */
unsigned cursor_in_fringe_p : 1;
+ /* 1 means the last glyph in the row is part of an ellipsis. */
+ unsigned ends_in_ellipsis_p : 1;
+
/* Non-zero means display a bitmap on X frames indicating that this
the first line of the buffer. */
unsigned indicate_bob_p : 1;
#define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p)
+
+/* Helper macros */
+
+#define MR_PARTIALLY_VISIBLE(ROW) \
+ ((ROW)->height != (ROW)->visible_height)
+
+#define MR_PARTIALLY_VISIBLE_AT_TOP(W, ROW) \
+ ((ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W)))
+
+#define MR_PARTIALLY_VISIBLE_AT_BOTTOM(W, ROW) \
+ (((ROW)->y + (ROW)->height - (ROW)->extra_line_spacing) \
+ > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W)))
+
/* Non-zero if ROW is not completely visible in window W. */
-#define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW) \
- ((ROW)->height != (ROW)->visible_height)
+#define MATRIX_ROW_PARTIALLY_VISIBLE_P(W, ROW) \
+ (MR_PARTIALLY_VISIBLE ((ROW)) \
+ && (MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)) \
+ || MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW))))
+
+
/* Non-zero if ROW is partially visible at the top of window W. */
#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \
- (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \
- && (ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W)))
+ (MR_PARTIALLY_VISIBLE ((ROW)) \
+ && MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)))
/* Non-zero if ROW is partially visible at the bottom of window W. */
-#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \
- (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \
- && (ROW)->y + (ROW)->height > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W)))
+#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \
+ (MR_PARTIALLY_VISIBLE ((ROW)) \
+ && MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW)))
/* Return the bottom Y + 1 of ROW. */
or a control char, or an overlay string. */
#define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \
- ((ROW)->end.dpvec_index >= 0 \
+ ((ROW)->end.dpvec_index > 0 \
|| (ROW)->end.overlay_string_index >= 0 \
|| (ROW)->ends_in_middle_of_char_p)
/* Non-zero if ROW starts in the middle of a character. See above. */
#define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW) \
- ((ROW)->start.dpvec_index >= 0 \
+ ((ROW)->start.dpvec_index > 0 \
|| (ROW)->starts_in_middle_of_char_p \
|| ((ROW)->start.overlay_string_index >= 0 \
&& (ROW)->start.string_pos.charpos > 0))
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(HAVE_CARBON)
+#if defined(HAVE_X_WINDOWS) || defined(MAC_OS)
GC gc;
#endif
#if defined(HAVE_NTGUI)
/* Image, if any. */
struct image *img;
+ /* Slice */
+ struct glyph_slice slice;
+
+ /* Non-null means the horizontal clipping region starts from the
+ left edge of *clip_head, and ends with the right edge of
+ *clip_tail, not including their overhangs. */
+ struct glyph_string *clip_head, *clip_tail;
+
struct glyph_string *next, *prev;
};
CURSOR_FACE_ID,
MOUSE_FACE_ID,
MENU_FACE_ID,
+ VERTICAL_BORDER_FACE_ID,
BASIC_FACE_ID_SENTINEL
};
width and height of the bitmap, DH is the height adjustment (if
bitmap is periodic). X and Y are frame coordinates of the area to
display the bitmap, DY is relative offset of the bitmap into that
- area. BX, NX, BY, NY specifies the area to clear if the bitmap
+ area. BX, NX, BY, NY specifies the area to clear if the bitmap
does not fill the entire area. FACE is the fringe face. */
struct draw_fringe_bitmap_params
};
+struct it_slice
+{
+ Lisp_Object x;
+ Lisp_Object y;
+ Lisp_Object width;
+ 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,
+ GET_FROM_COMPOSITION,
+ GET_FROM_STRING,
+ GET_FROM_C_STRING,
+ GET_FROM_IMAGE,
+ GET_FROM_STRETCH,
+ NUM_IT_METHODS
+};
+
+#define IT_STACK_SIZE 4
+
struct it
{
/* The window in which we iterate over current_buffer (or a string). */
/* The window's frame. */
struct frame *f;
- /* Function to call to load this structure with the next display
- element. */
- int (* method) P_ ((struct it *it));
+ /* Method to use to load this structure with the next display element. */
+ enum it_method method;
/* The next position at which to check for face changes, invisible
text, overlay strings, end of text etc., which see. */
Don't handle some `display' properties in these strings. */
unsigned string_from_display_prop_p : 1;
+ /* When METHOD == next_element_from_display_vector,
+ this is 1 if we're doing an ellipsis. Otherwise meaningless. */
+ unsigned ellipsis_p : 1;
+
/* Display table in effect or null for none. */
struct Lisp_Char_Table *dp;
means that no such character is involved. */
int dpvec_char_len;
+ /* Face id to use for all characters in display vector. -1 if unused. */
+ int dpvec_face_id;
+
/* Face id of the iterator saved in case a glyph from dpvec contains
a face. The face is restored when all glyphs from dpvec have
been delivered. */
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 3
+#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;
+
+ /* 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;
skipped due to selective display. */
unsigned face_before_selective_p : 1;
+ /* If 1, adjust current glyph so it does not increase current row
+ descent/ascent (line-height property). Reset after this glyph. */
+ unsigned constrain_row_ascent_descent_p : 1;
+
/* The ID of the default face to use. One of DEFAULT_FACE_ID,
MODE_LINE_FACE_ID, etc, depending on what we are displaying. */
int base_face_id;
/* If what == IT_IMAGE, the id of the image to display. */
int image_id;
+ /* Values from `slice' property. */
+ struct it_slice slice;
+
/* Value of the `space-width' property, if any; nil if none. */
Lisp_Object space_width;
/* Object and position where the current display element came from.
Object can be a Lisp string in case the current display element
- comes from an overlay string, or it is buffer. Position is
- a position in object. */
+ comes from an overlay string, or it is buffer. It may also be nil
+ during mode-line update. Position is a position in object. */
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;
line, if the window has one. */
int last_visible_y;
- /* Additional space in pixels between lines (for window systems
- only.) */
+ /* Default amount of additional space in pixels between lines (for
+ window systems only.) */
int extra_line_spacing;
+ /* Max extra line spacing added in this row. */
+ int max_extra_line_spacing;
+
+ /* Override font height information for this glyph.
+ Used if override_ascent >= 0. Cleared after this glyph. */
+ int override_ascent, override_descent, override_boff;
+
/* If non-null, glyphs are produced in glyph_row with each call to
produce_glyphs. */
struct glyph_row *glyph_row;
/* Left fringe bitmap number (enum fringe_bitmap_type). */
unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
- /* Face of the left fringe glyph. */
- unsigned left_user_fringe_face_id : FACE_ID_BITS;
-
/* Right fringe bitmap number (enum fringe_bitmap_type). */
unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
+ /* Face of the left fringe glyph. */
+ unsigned left_user_fringe_face_id : FACE_ID_BITS;
+
/* Face of the right fringe glyph. */
unsigned right_user_fringe_face_id : FACE_ID_BITS;
};
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
int (*encode_char) P_ ((int c, XChar2b *char2b,
struct font_info *font_into, int *two_byte_p));
-/* Compute left and right overhang of glyph string S.
+/* Compute left and right overhang of glyph string S.
A NULL pointer if platform does not support this. */
void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s));
void (*draw_vertical_window_border) P_ ((struct window *w,
int x, int y0, int y1));
-/* Shift display of frame F to make room for inserted glyphs.
+/* Shift display of frame F to make room for inserted glyphs.
The area at pixel (X,Y) of width WIDTH and height HEIGHT is
shifted right by SHIFT_BY pixels. */
void (*shift_glyphs_for_insert) P_ ((struct frame *f,
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 Lisp_Object Vshow_trailing_whitespace;
extern int mode_line_in_non_selected_windows;
extern int redisplaying_p;
-extern Lisp_Object Vimage_types;
extern void add_to_log P_ ((char *, Lisp_Object, Lisp_Object));
extern int help_echo_showing_p;
extern int current_mode_line_height, current_header_line_height;
extern Lisp_Object help_echo_string, help_echo_window;
-extern Lisp_Object help_echo_object, previous_help_echo_string;
+extern Lisp_Object help_echo_object, previous_help_echo_string;
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,
+ /* XFontStruct */ void *, int, int *));
#ifdef HAVE_WINDOW_SYSTEM
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 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));
/* Defined in fringe.c */
-int valid_fringe_bitmap_id_p (int);
+int lookup_fringe_bitmap (Lisp_Object);
void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
-void draw_window_fringes P_ ((struct window *));
+int draw_window_fringes P_ ((struct window *, int));
int update_window_fringes P_ ((struct window *, int));
void compute_fringe_widths P_ ((struct frame *, 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
extern void x_destroy_all_bitmaps P_ ((Display_Info *));
extern int x_create_bitmap_mask P_ ((struct frame * , int));
+extern Lisp_Object x_find_image_file P_ ((Lisp_Object));
void x_kill_gs_process P_ ((Pixmap, struct frame *));
struct image_cache *make_image_cache P_ ((void));
int lookup_image P_ ((struct frame *, Lisp_Object));
unsigned long image_background P_ ((struct image *, struct frame *,
- XImage *ximg));
+ XImagePtr_or_DC ximg));
int image_background_transparent P_ ((struct image *, struct frame *,
- XImage *mask));
+ XImagePtr_or_DC mask));
+
+int image_ascent P_ ((struct image *, struct face *, struct glyph_slice *));
#endif
void prepare_face_for_display P_ ((struct frame *, struct face *));
int xstricmp P_ ((const unsigned char *, const unsigned char *));
int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *));
-int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
+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
extern Lisp_Object buffer_posn_from_coords P_ ((struct window *,
int *, int *,
struct display_pos *,
- Lisp_Object *,
+ Lisp_Object *,
int *, int *, int *, int *));
extern Lisp_Object mode_line_string P_ ((struct window *, enum window_part,
int *, int *, int *,
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));