Commit 3b83d631 authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(FRAME_TOOLBAR_LINES): New.

(FRAME_TOP_MARGIN): New.
(struct frame): Add toolbar-related members.
(FRAME_WINDOW_WIDTH_ARG): Add bitmap area widths.
(CHECK_FRAME): Give this macro a C-statement form!
(CHECK_LIVE_FRAME): Ditto.
(FRAME_FACE_CACHE): New.
(struct frame): Add member face_cache.
(FRAME_FLAGS_AREA_COLS): New.
(FRAME_FLAGS_AREA_WIDTH): New.
(struct frame): New member menu_bar_window.
(struct frame): Add trunc_area_pixel_width, and _cols.
(struct frame): Cursor-related stuff removed.
(FRAME_SCROLL_BAR_WIDTH): Removed.
(FRAME_WINDOW_WIDTH_ARG): Don't add scroll bar width.
(FRAME_CURSOR_X): Removed.
(FRAME_CURSOR_Y): Ditto.
(struct frame): Remove old glyphs, add new.
parent 8720a429
......@@ -21,22 +21,33 @@ Boston, MA 02111-1307, USA. */
/* Miscellanea. */
/* Nonzero means don't assume anything about current
contents of actual terminal frame */
/* Nonzero means don't assume anything about current contents of
actual terminal frame */
extern int frame_garbaged;
/* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
print. */
extern int message_buf_print;
/* The structure representing a frame. */
enum output_method
{ output_termcap, output_x_window, output_msdos_raw, output_w32 };
{
output_termcap,
output_x_window,
output_msdos_raw,
output_w32
};
enum vertical_scroll_bar_type
{ vertical_scroll_bar_none, vertical_scroll_bar_left, vertical_scroll_bar_right };
{
vertical_scroll_bar_none,
vertical_scroll_bar_left,
vertical_scroll_bar_right
};
struct frame
{
......@@ -127,18 +138,46 @@ struct frame
/* List of buffers viewed in this frame, for other-buffer. */
Lisp_Object buffer_list;
/* A dummy window used to display menu bars under X when no X
toolkit support is available. */
Lisp_Object menu_bar_window;
/* A window used to display the toolbar of a frame. */
Lisp_Object toolbar_window;
/* Desired and current toolbar items. */
Lisp_Object desired_toolbar_items, current_toolbar_items;
/* Desired and current contents displayed in toolbar_window. */
Lisp_Object desired_toolbar_string, current_toolbar_string;
/* beyond here, there should be no more Lisp_Object components. */
/* Cache of realized faces. */
struct face_cache *face_cache;
/* A buffer to hold the frame's name. We can't use the Lisp string's
pointer (`name', above) because it might get relocated. */
/* A buffer to hold the frame's name. We can't use the Lisp
string's pointer (`name', above) because it might get relocated. */
char *namebuf;
/* glyphs as they appear on the frame */
struct frame_glyphs *current_glyphs;
/* Glyph pool and matrix. */
struct glyph_pool *current_pool;
struct glyph_pool *desired_pool;
struct glyph_matrix *desired_matrix;
struct glyph_matrix *current_matrix;
/* 1 means that glyphs on this frame have been initialized so it can
be used for output. */
unsigned glyphs_initialized_p : 1;
/* glyphs we'd like to appear on the frame */
struct frame_glyphs *desired_glyphs;
/* Margin at the top of the frame. Used to display the toolbar. */
int toolbar_lines;
int n_desired_toolbar_items;
int n_current_toolbar_items;
/* A buffer for decode_mode_line. */
char *decode_mode_spec_buffer;
/* See do_line_insertion_deletion_costs for info on these arrays. */
/* Cost of inserting 1 line on this frame */
......@@ -150,29 +189,11 @@ struct frame
/* Cost of deleting n lines on this frame */
int *delete_n_lines_cost;
/* glyphs for the mode line */
struct frame_glyphs *temp_glyphs;
/* Intended cursor position of this frame.
Measured in characters, counting from upper left corner
within the frame. */
int cursor_x;
int cursor_y;
/* Actual cursor position of this frame, and the character under it.
(Not used for terminal frames.) */
int phys_cursor_x;
int phys_cursor_y;
/* This is handy for undrawing the cursor, because current_glyphs is
not always accurate when in do_scrolling. */
GLYPH phys_cursor_glyph;
/* Nonzero means the cursor is displayed. */
int phys_cursor_on;
/* Size of this frame, in units of characters. */
EMACS_INT height;
EMACS_INT width;
EMACS_INT window_width;
EMACS_INT window_height;
/* New height and width for pending size change. 0 if no change pending. */
int new_height, new_width;
......@@ -186,7 +207,13 @@ struct frame
it is defined in xterm.h.
struct w32_output is used for W32 window frames;
it is defined in w32term.h. */
union output_data { struct x_output *x; struct w32_output *w32; int nothing; } output_data;
union output_data
{
struct x_output *x;
struct w32_output *w32;
int nothing;
}
output_data;
#ifdef MULTI_KBOARD
/* A pointer to the kboard structure associated with this frame.
......@@ -298,6 +325,9 @@ struct frame
int scroll_bar_pixel_width;
int scroll_bar_cols;
/* Width of area for drawing truncation marks and overlay arrow. */
int trunc_area_pixel_width, trunc_area_cols;
/* The baud rate that was used to calculate costs for this frame. */
int cost_calculation_baud_rate;
......@@ -333,6 +363,7 @@ typedef struct frame *FRAME_PTR;
/* FRAME_WINDOW_P tests whether the frame is a window, and is
defined to be the predicate for the window system being used. */
#ifdef HAVE_X_WINDOWS
#define FRAME_WINDOW_P(f) FRAME_X_P (f)
#endif
......@@ -353,19 +384,6 @@ typedef struct frame *FRAME_PTR;
/* Nonzero if frame F contains a minibuffer window.
(If this is 0, F must use some other minibuffer window.) */
#define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer)
/* This points to the structure which describes the contents
currently displayed on frame F. See dispextern.h. */
#define FRAME_CURRENT_GLYPHS(f) (f)->current_glyphs
/* This points to the structure which describes the contents
intended to be displayed on frame F. See dispextern.h. */
#define FRAME_DESIRED_GLYPHS(f) (f)->desired_glyphs
#define FRAME_TEMP_GLYPHS(f) (f)->temp_glyphs
#define SET_GLYPHS_FRAME(glyphs,frame) ((glyphs)->frame = (frame))
/* Height of frame F, measured in character lines. */
#define FRAME_HEIGHT(f) (f)->height
/* Width of frame F, measured in character columns,
......@@ -378,6 +396,15 @@ typedef struct frame *FRAME_PTR;
These lines are counted in FRAME_HEIGHT. */
#define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
/* Number of lines of frame F used for the toolbar. */
#define FRAME_TOOLBAR_LINES(f) (f)->toolbar_lines
/* Lines above the top-most window in frame F. */
#define FRAME_TOP_MARGIN(F) \
(FRAME_MENU_BAR_LINES (F) + FRAME_TOOLBAR_LINES (F))
/* Nonzero if this frame should display a menu bar
in a way that does not use any text lines. */
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
......@@ -385,12 +412,6 @@ typedef struct frame *FRAME_PTR;
#else
#define FRAME_EXTERNAL_MENU_BAR(f) 0
#endif
/* Current cursor position for frame F. */
#define FRAME_CURSOR_X(f) (f)->cursor_x
#define FRAME_CURSOR_Y(f) (f)->cursor_y
/* Nonzero if frame F is currently visible. */
#define FRAME_VISIBLE_P(f) ((f)->visible != 0)
/* Nonzero if frame F is currently visible but hidden. */
......@@ -487,8 +508,10 @@ typedef struct frame *FRAME_PTR;
/* Given a value WIDTH for frame F's nominal width,
return the value that FRAME_WINDOW_WIDTH should have. */
#define FRAME_WINDOW_WIDTH_ARG(f, width) \
((width) + FRAME_SCROLL_BAR_WIDTH (f))
#define FRAME_WINDOW_WIDTH_ARG(f, width) \
((width) \
+ FRAME_SCROLL_BAR_WIDTH (f) \
+ 2 * FRAME_FLAGS_AREA_COLS (f))
/* Maximum + 1 legitimate value for FRAME_CURSOR_X. */
#define FRAME_CURSOR_X_LIMIT(f) \
......@@ -502,9 +525,14 @@ typedef struct frame *FRAME_PTR;
#define FRAME_COST_BAUD_RATE(f) ((f)->cost_calculation_baud_rate)
#define FRAME_FONTSET_DATA(f) ((f)->fontset_data)
/* Return a pointer to the face cache of frame F. */
#define FRAME_FACE_CACHE(F) (F)->face_cache
/* Return the size of message_buf of the frame F. We multiply the
width of the frame by 4 because multi-byte form may require at most
4-byte for a character. */
#define FRAME_MESSAGE_BUF_SIZE(f) (((int) (f)->width) * 4)
/* Emacs's redisplay code could become confused if a frame's
......@@ -530,24 +558,26 @@ typedef struct frame *FRAME_PTR;
Also, if a frame used to be invisible, but has just become visible,
it must be marked as garbaged, since redisplay hasn't been keeping
up its contents. */
#define FRAME_SAMPLE_VISIBILITY(f) \
(((f)->async_visible && (f)->visible != (f)->async_visible) ? \
SET_FRAME_GARBAGED (f) : 0, \
(f)->visible = (f)->async_visible, \
(f)->iconified = (f)->async_iconified)
#define CHECK_FRAME(x, i) \
{ \
if (! FRAMEP (x)) \
x = wrong_type_argument (Qframep, (x)); \
}
#define CHECK_FRAME(x, i) \
if (! FRAMEP (x)) \
x = wrong_type_argument (Qframep, (x)); \
else \
(void) 0
#define CHECK_LIVE_FRAME(x, i) \
{ \
if (! FRAMEP (x) \
|| ! FRAME_LIVE_P (XFRAME (x))) \
x = wrong_type_argument (Qframe_live_p, (x)); \
}
if (! FRAMEP (x) \
|| ! FRAME_LIVE_P (XFRAME (x))) \
x = wrong_type_argument (Qframe_live_p, (x)); \
else \
(void) 0
/* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a
`for' loop which iterates over the elements of Vframe_list. The
......@@ -559,6 +589,7 @@ typedef struct frame *FRAME_PTR;
This macro is a holdover from a time when multiple frames weren't always
supported. An alternate definition of the macro would expand to
something which executes the statement once. */
#define FOR_EACH_FRAME(list_var, frame_var) \
for ((list_var) = Vframe_list; \
(CONSP (list_var) \
......@@ -593,6 +624,7 @@ extern Lisp_Object Vterminal_frame;
use for text. If the window touches the right edge of the frame,
we have extra space allocated for it. Otherwise, the scroll bar
takes over the window's rightmost columns. */
#define WINDOW_VERTICAL_SCROLL_BAR_COLUMN(w) \
(FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (w))) ? \
(((XINT ((w)->left) + XINT ((w)->width)) \
......@@ -604,4 +636,89 @@ extern Lisp_Object Vterminal_frame;
/* Return the height in lines of the vertical scroll bar in w. If the
window has a mode line, don't make the scroll bar extend that far. */
#define WINDOW_VERTICAL_SCROLL_BAR_HEIGHT(w) (window_internal_height (w))
/***********************************************************************
Display-related Macros
***********************************************************************/
/* Canonical y-unit on frame F. This value currently equals the line
height of the frame. Terminal specific header files are expected
to define the macro FRAME_LINE_HEIGHT. */
#define CANON_Y_UNIT(F) \
(FRAME_WINDOW_P (F) ? FRAME_LINE_HEIGHT (F) : 1)
/* Canonical x-unit on frame F. This is currently equal to the width
of the default font of F. Terminal specific headers are expected
to define the macro FRAME_DEFAULT_FONT_WIDTH. */
#define CANON_X_UNIT(F) \
(FRAME_WINDOW_P (F) ? FRAME_DEFAULT_FONT_WIDTH (F) : 1)
/* Pixel width of areas used to display truncation marks, continuation
marks, overlay arrows. This is 0 for terminal frames. Other
terminal headers must define FRAME_X_TRUNC_WIDTH. */
#ifdef HAVE_WINDOW_SYSTEM
#define FRAME_FLAGS_AREA_COLS(F) \
(FRAME_WINDOW_P ((F)) ? FRAME_X_FLAGS_AREA_COLS ((F)) : 0)
#define FRAME_FLAGS_AREA_WIDTH(F) \
(FRAME_FLAGS_AREA_COLS ((F)) * CANON_X_UNIT ((F)))
#else
#define FRAME_FLAGS_AREA_WIDTH(F) 0
#define FRAME_FLAGS_AREA_COLS(F) 0
#endif
/***********************************************************************
Conversion between canonical units and pixels
***********************************************************************/
/* Canonical x-values are fractions of CANON_X_UNIT, canonical y-unit
are fractions of CANON_Y_UNIT of a frame. Both are represented as
Lisp numbers, i.e. integers or floats. */
/* Convert canonical value X to pixels. F is the frame whose
canonical char width is to be used. X must be a Lisp integer or
float. Value is a C integer. */
#define PIXEL_X_FROM_CANON_X(F, X) \
(INTEGERP (X) \
? XINT (X) * CANON_X_UNIT (F) \
: (int) (XFLOAT (X)->data * CANON_X_UNIT (F)))
/* Convert canonical value Y to pixels. F is the frame whose
canonical character height is to be used. X must be a Lisp integer
or float. Value is a C integer. */
#define PIXEL_Y_FROM_CANON_Y(F, Y) \
(INTEGERP (Y) \
? XINT (Y) * CANON_Y_UNIT (F) \
: (int) (XFLOAT (Y)->data * CANON_Y_UNIT (F)))
/* Convert pixel-value X to canonical units. F is the frame whose
canonical character width is to be used. X is a C integer. Result
is a Lisp float if X is not a multiple of the canon width,
otherwise it's a Lisp integer. */
#define CANON_X_FROM_PIXEL_X(F, X) \
((X) % CANON_X_UNIT (F) != 0 \
? make_float ((double) (X) / CANON_X_UNIT (F)) \
: make_number ((X) / CANON_X_UNIT (F)))
/* Convert pixel-value Y to canonical units. F is the frame whose
canonical character height is to be used. Y is a C integer.
Result is a Lisp float if Y is not a multiple of the canon width,
otherwise it's a Lisp integer. */
#define CANON_Y_FROM_PIXEL_Y(F, Y) \
((Y) % CANON_Y_UNIT (F) \
? make_float ((double) (Y) / CANON_Y_UNIT (F)) \
: make_number ((Y) / CANON_Y_UNIT (F)))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment