#include "dispextern.h"
#include "termhooks.h"
+#include "window.h"
INLINE_HEADER_BEGIN
-#ifndef FRAME_INLINE
-# define FRAME_INLINE INLINE
-#endif
enum vertical_scroll_bar_type
{
Lisp_Object menu_bar_window;
#endif
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
/* A window used to display the tool-bar of a frame. */
Lisp_Object tool_bar_window;
+ /* Desired and current contents displayed in that window. */
+ Lisp_Object desired_tool_bar_string;
+ Lisp_Object current_tool_bar_string;
+#endif
+
/* Desired and current tool-bar items. */
Lisp_Object tool_bar_items;
tool bar only supports top. */
Lisp_Object tool_bar_position;
- /* Desired and current contents displayed in tool_bar_window. */
- Lisp_Object desired_tool_bar_string;
- Lisp_Object current_tool_bar_string;
-
/* Beyond here, there should be no more Lisp_Object components. */
/* Cache of realized faces. */
Clear the frame in clear_garbaged_frames if set. */
unsigned resized_p : 1;
- /* Set to non-zero in when we want for force a flush_display in
- update_frame, usually after resizing the frame. */
- unsigned force_flush_display_p : 1;
-
/* Set to non-zero if the default face for the frame has been
realized. Reset to zero whenever the default face changes.
Used to see the difference between a font change and face change. */
/* Set to non-zero when current redisplay has updated frame. */
unsigned updated_p : 1;
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
/* Set to non-zero to minimize tool-bar height even when
auto-resize-tool-bar is set to grow-only. */
unsigned minimize_tool_bar_window_p : 1;
+#endif
#if defined (USE_GTK) || defined (HAVE_NS)
/* Nonzero means using a tool bar that comes from the toolkit. */
unsigned external_tool_bar : 1;
#endif
+ /* Nonzero means that fonts have been loaded since the last glyph
+ matrix adjustments. */
+ unsigned fonts_changed : 1;
+
+ /* Nonzero means that cursor type has been changed. */
+ unsigned cursor_type_changed : 1;
+
+ /* True if it needs to be redisplayed. */
+ unsigned redisplay : 1;
+
/* Margin at the top of the frame. Used to display the tool-bar. */
int tool_bar_lines;
+ /* Pixel height of tool bar. */
+ int tool_bar_height;
+
int n_tool_bar_rows;
int n_tool_bar_items;
- /* A buffer for decode_mode_line. */
+ /* 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 */
+ /* See do_line_insertion_deletion_costs for info on these arrays. */
+ /* Cost of inserting 1 line on this frame. */
int *insert_line_cost;
- /* Cost of deleting 1 line on this frame */
+ /* Cost of deleting 1 line on this frame. */
int *delete_line_cost;
- /* Cost of inserting n lines on this frame */
+ /* Cost of inserting n lines on this frame. */
int *insert_n_lines_cost;
- /* Cost of deleting n lines on this frame */
+ /* Cost of deleting n lines on this frame. */
int *delete_n_lines_cost;
- /* Size of this frame, excluding fringes, scroll bars etc.,
- in units of canonical characters. */
- int text_lines, text_cols;
+ /* Text width of this frame (excluding fringes, scroll bars and
+ internal border width) and text height (excluding internal border
+ width) in units of canonical characters. */
+ int text_cols, text_lines;
- /* Total size of this frame (i.e. its native window), in units of
- canonical characters. */
- int total_lines, total_cols;
+ /* Total width of this frame (including fringes and scroll bars) in
+ units of canonical characters. */
+ int total_cols;
- /* New text height and width for pending size change.
- 0 if no change pending. */
- int new_text_lines, new_text_cols;
+ /* Text width of this frame (excluding fringes, scroll bars and
+ internal border width) and text height (excluding internal border
+ width) in pixels. */
+ int text_width, text_height;
+
+ /* New text height and width for pending size change. 0 if no change
+ pending. These values represent pixels or canonical character units
+ according to the value of new_pixelwise and correlate to the the
+ text width/height of the frame. */
+ int new_width, new_height;
+
+ /* Whether new_height and new_width shall be interpreted
+ in pixels. */
+ bool new_pixelwise;
/* Pixel position of the frame window (x and y offsets in root window). */
int left_pos, top_pos;
- /* Size of the frame window in pixels. */
- int pixel_height, pixel_width;
+ /* Size of the frame window (including internal border widths) in
+ pixels. */
+ int pixel_width, pixel_height;
/* These many pixels are the difference between the outer window (i.e. the
- left and top of the window manager decoration) and FRAME_X_WINDOW. */
+ left and top of the window manager decoration) and FRAME_X_WINDOW. */
int x_pixels_diff, y_pixels_diff;
/* This is the gravity value for the specified window position. */
a highlighting is displayed inside the internal border. */
int internal_border_width;
+ /* Width of borders between this frame's windows. */
+ int right_divider_width;
+ int bottom_divider_width;
+
/* Canonical X unit. Width of default font, in pixels. */
int column_width;
enum output_method output_method;
/* The terminal device that this frame uses. If this is NULL, then
- the frame has been deleted. */
+ the frame has been deleted. */
struct terminal *terminal;
/* Device-dependent, frame-local auxiliary data used for displaying
the contents. When the frame is deleted, this data is deleted as
- well. */
+ well. */
union output_data
{
- struct tty_output *tty; /* termchar.h */
- struct x_output *x; /* xterm.h */
- struct w32_output *w32; /* w32term.h */
- struct ns_output *ns; /* nsterm.h */
+ struct tty_output *tty; /* From termchar.h. */
+ struct x_output *x; /* From xterm.h. */
+ struct w32_output *w32; /* From w32term.h. */
+ struct ns_output *ns; /* From nsterm.h. */
intptr_t nothing;
}
output_data;
- /* List of font-drivers available on the frame. */
+ /* List of font-drivers available on the frame. */
struct font_driver_list *font_driver_list;
/* List of data specific to font-driver and frame, but common to
faces. */
/* The extra width (in pixels) currently allotted for fringes. */
int left_fringe_width, right_fringe_width;
- /* See FULLSCREEN_ enum below */
+ /* See FULLSCREEN_ enum below. */
enum fullscreen_type want_fullscreen;
/* Number of lines of menu bar. */
int menu_bar_lines;
+ /* Pixel height of menubar. */
+ int menu_bar_height;
+
+#if defined (HAVE_X_WINDOWS)
+ /* Used by x_wait_for_event when watching for an X event on this frame. */
+ int wait_event_type;
+#endif
+
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
|| defined (HAVE_NS) || defined (USE_GTK)
/* Nonzero means using a menu bar that comes from the X toolkit. */
- unsigned int external_menu_bar : 1;
+ unsigned external_menu_bar : 1;
#endif
/* Next two bitfields are mutually exclusive. They might both be
/* Nonzero if the frame is currently displayed; we check
it to see if we should bother updating the frame's contents.
- Note that, since invisible frames aren't updated, whenever a
- frame becomes visible again, it must be marked as garbaged.
-
On ttys and on Windows NT/9X, to avoid wasting effort updating
visible frames that are actually completely obscured by other
windows on the display, we bend the meaning of visible slightly:
if equal to 2, then the frame is obscured - we still consider
it to be "visible" as seen from lisp, but we don't bother
- updating it. We must take care to garbage the frame when it
- ceases to be obscured though. See SET_FRAME_VISIBLE below. */
+ updating it. */
unsigned visible : 2;
/* Nonzero if the frame is currently iconified. Do not
/* Nonzero if this frame should be redrawn. */
unsigned garbaged : 1;
- /* True if frame actually has a minibuffer window on it.
- 0 if using a minibuffer window that isn't on this frame. */
- unsigned has_minibuffer : 1;
-
/* 0 means, if this frame has just one window,
show no modeline for that window. */
unsigned wants_modeline : 1;
/* Nonzero if the mouse has moved on this display device
since the last time we checked. */
- unsigned mouse_moved :1;
+ unsigned mouse_moved : 1;
- /* Nonzero means that the pointer is invisible. */
- unsigned pointer_invisible :1;
+ /* Nonzero means that the pointer is invisible. */
+ unsigned pointer_invisible : 1;
/* Nonzero means that all windows except mini-window and
selected window on this frame have frozen window starts. */
/* Most code should use these functions to set Lisp fields in struct frame. */
-FRAME_INLINE void
+INLINE void
fset_buffer_list (struct frame *f, Lisp_Object val)
{
f->buffer_list = val;
}
-FRAME_INLINE void
+INLINE void
fset_buried_buffer_list (struct frame *f, Lisp_Object val)
{
f->buried_buffer_list = val;
}
-FRAME_INLINE void
+INLINE void
fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
{
f->condemned_scroll_bars = val;
}
-FRAME_INLINE void
-fset_current_tool_bar_string (struct frame *f, Lisp_Object val)
-{
- f->current_tool_bar_string = val;
-}
-FRAME_INLINE void
-fset_desired_tool_bar_string (struct frame *f, Lisp_Object val)
-{
- f->desired_tool_bar_string = val;
-}
-FRAME_INLINE void
+INLINE void
fset_face_alist (struct frame *f, Lisp_Object val)
{
f->face_alist = val;
}
-FRAME_INLINE void
+INLINE void
fset_focus_frame (struct frame *f, Lisp_Object val)
{
f->focus_frame = val;
}
-FRAME_INLINE void
+INLINE void
fset_icon_name (struct frame *f, Lisp_Object val)
{
f->icon_name = val;
}
-FRAME_INLINE void
+INLINE void
fset_menu_bar_items (struct frame *f, Lisp_Object val)
{
f->menu_bar_items = val;
}
-FRAME_INLINE void
+INLINE void
fset_menu_bar_vector (struct frame *f, Lisp_Object val)
{
f->menu_bar_vector = val;
}
#if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
-FRAME_INLINE void
+INLINE void
fset_menu_bar_window (struct frame *f, Lisp_Object val)
{
f->menu_bar_window = val;
}
#endif
-FRAME_INLINE void
+INLINE void
fset_name (struct frame *f, Lisp_Object val)
{
f->name = val;
}
-FRAME_INLINE void
+INLINE void
fset_param_alist (struct frame *f, Lisp_Object val)
{
f->param_alist = val;
}
-FRAME_INLINE void
+INLINE void
fset_root_window (struct frame *f, Lisp_Object val)
{
f->root_window = val;
}
-FRAME_INLINE void
+INLINE void
fset_scroll_bars (struct frame *f, Lisp_Object val)
{
f->scroll_bars = val;
}
-FRAME_INLINE void
+INLINE void
fset_selected_window (struct frame *f, Lisp_Object val)
{
f->selected_window = val;
}
-FRAME_INLINE void
+INLINE void
fset_title (struct frame *f, Lisp_Object val)
{
f->title = val;
}
-FRAME_INLINE void
+INLINE void
fset_tool_bar_items (struct frame *f, Lisp_Object val)
{
f->tool_bar_items = val;
}
-FRAME_INLINE void
+INLINE void
fset_tool_bar_position (struct frame *f, Lisp_Object val)
{
f->tool_bar_position = val;
}
-FRAME_INLINE void
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
+INLINE void
fset_tool_bar_window (struct frame *f, Lisp_Object val)
{
f->tool_bar_window = val;
}
+INLINE void
+fset_current_tool_bar_string (struct frame *f, Lisp_Object val)
+{
+ f->current_tool_bar_string = val;
+}
+INLINE void
+fset_desired_tool_bar_string (struct frame *f, Lisp_Object val)
+{
+ f->desired_tool_bar_string = val;
+}
+#endif /* HAVE_WINDOW_SYSTEM && !USE_GTK && !HAVE_NS */
#define NUMVAL(X) ((INTEGERP (X) || FLOATP (X)) ? XFLOATINT (X) : -1)
-FRAME_INLINE double
+INLINE double
default_pixels_per_inch_x (void)
{
Lisp_Object v = (CONSP (Vdisplay_pixels_per_inch)
return NUMVAL (v) > 0 ? NUMVAL (v) : 72.0;
}
-FRAME_INLINE double
+INLINE double
default_pixels_per_inch_y (void)
{
Lisp_Object v = (CONSP (Vdisplay_pixels_per_inch)
#define FRAME_NS_P(f) ((f)->output_method == output_ns)
#endif
-/* Dots per inch of the screen the frame F is on. */
-
-#ifdef HAVE_X_WINDOWS
-#define FRAME_RES_X(f) \
- (eassert (FRAME_X_P (f)), FRAME_X_DISPLAY_INFO (f)->resx)
-#define FRAME_RES_Y(f) \
- (eassert (FRAME_X_P (f)), FRAME_X_DISPLAY_INFO (f)->resy)
-#endif
-
-#ifdef HAVE_NTGUI
-#define FRAME_RES_X(f) \
- (eassert (FRAME_W32_P (f)), FRAME_W32_DISPLAY_INFO (f)->resx)
-#define FRAME_RES_Y(f) \
- (eassert (FRAME_W32_P (f)), FRAME_W32_DISPLAY_INFO (f)->resy)
-#endif
-
-#ifdef HAVE_NS
-#define FRAME_RES_X(f) \
- (eassert (FRAME_NS_P (f)), FRAME_NS_DISPLAY_INFO (f)->resx)
-#define FRAME_RES_Y(f) \
- (eassert (FRAME_NS_P (f)), FRAME_NS_DISPLAY_INFO (f)->resy)
-#endif
-
-/* Defaults when no window system available. */
-
-#ifndef FRAME_RES_X
-#define FRAME_RES_X(f) default_pixels_per_inch_x ()
-#define FRAME_RES_Y(f) default_pixels_per_inch_y ()
-#endif
-
/* FRAME_WINDOW_P tests whether the frame is a window, and is
defined to be the predicate for the window system being used. */
#define FRAME_WINDOW_P(f) ((void) (f), 0)
#endif
+/* Dots per inch of the screen the frame F is on. */
+
+#ifdef HAVE_WINDOW_SYSTEM
+
+#define FRAME_RES_X(f) \
+ (eassert (FRAME_WINDOW_P (f)), FRAME_DISPLAY_INFO (f)->resx)
+#define FRAME_RES_Y(f) \
+ (eassert (FRAME_WINDOW_P (f)), FRAME_DISPLAY_INFO (f)->resy)
+
+#else /* !HAVE_WINDOW_SYSTEM */
+
+/* Defaults when no window system available. */
+
+#define FRAME_RES_X(f) default_pixels_per_inch_x ()
+#define FRAME_RES_Y(f) default_pixels_per_inch_y ()
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
/* Return a pointer to the structure holding information about the
region of text, if any, that is currently shown in mouse-face on
frame F. We need to define two versions because a TTY-only build
- does not have FRAME_X_DISPLAY_INFO. */
+ does not have FRAME_DISPLAY_INFO. */
#ifdef HAVE_WINDOW_SYSTEM
# define MOUSE_HL_INFO(F) \
(FRAME_WINDOW_P(F) \
- ? &FRAME_X_DISPLAY_INFO(F)->mouse_highlight \
+ ? &FRAME_DISPLAY_INFO(F)->mouse_highlight \
: &(F)->output_data.tty->display_info->mouse_highlight)
#else
# define MOUSE_HL_INFO(F) \
#define FRAME_MINIBUF_ONLY_P(f) \
EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f))
-/* 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)
+/* Nonzero if frame F contains it's own minibuffer window. Frame always has
+ minibuffer window, but it could use minibuffer window of another frame. */
+#define FRAME_HAS_MINIBUF_P(f) \
+ (WINDOWP (f->minibuffer_window) \
+ && XFRAME (XWINDOW (f->minibuffer_window)->frame) == f)
+
+/* Pixel width of frame F. */
+#define FRAME_PIXEL_WIDTH(f) ((f)->pixel_width)
/* Pixel height of frame F, including non-toolkit menu bar and
non-toolkit tool bar lines. */
#define FRAME_PIXEL_HEIGHT(f) ((f)->pixel_height)
-/* Pixel width of frame F. */
-#define FRAME_PIXEL_WIDTH(f) ((f)->pixel_width)
+/* Width of frame F, measured in canonical character columns,
+ not including scroll bars if any. */
+#define FRAME_COLS(f) (f)->text_cols
/* Height of frame F, measured in canonical lines, including
non-toolkit menu bar and non-toolkit tool bar lines. */
#define FRAME_LINES(f) (f)->text_lines
-/* Width of frame F, measured in canonical character columns,
- not including scroll bars if any. */
-#define FRAME_COLS(f) (f)->text_cols
+/* Width of frame F, measured in pixels not including the width for
+ fringes, scroll bar, and internal borders. */
+#define FRAME_TEXT_WIDTH(f) (f)->text_width
+
+/* Height of frame F, measured in pixels not including the height
+ for internal borders. */
+#define FRAME_TEXT_HEIGHT(f) (f)->text_height
/* Number of lines of frame F used for menu bar.
This is relevant on terminal frames and on
These lines are counted in FRAME_LINES. */
#define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
+/* Pixel height of frame F's menu bar. */
+#define FRAME_MENU_BAR_HEIGHT(f) (f)->menu_bar_height
+
/* Nonzero if this frame should display a tool bar
in a way that does not use any text lines. */
#if defined (USE_GTK) || defined (HAVE_NS)
#endif
/* Number of lines of frame F used for the tool-bar. */
-
#define FRAME_TOOL_BAR_LINES(f) (f)->tool_bar_lines
+/* Pixel height of frame F's tool-bar. */
+#define FRAME_TOOL_BAR_HEIGHT(f) (f)->tool_bar_height
/* Lines above the top-most window in frame F. */
-
#define FRAME_TOP_MARGIN(F) \
(FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
-/* Pixel height of the top margin above. */
-
-#define FRAME_TOP_MARGIN_HEIGHT(f) \
- (FRAME_TOP_MARGIN (f) * FRAME_LINE_HEIGHT (f))
+/* Pixel height of frame F's top margin. */
+#define FRAME_TOP_MARGIN_HEIGHT(F) \
+ (FRAME_MENU_BAR_HEIGHT (F) + FRAME_TOOL_BAR_HEIGHT (F))
/* Nonzero if this frame should display a menu bar
in a way that does not use any text lines. */
#define FRAME_ICONIFIED_P(f) (f)->iconified
/* Mark frame F as currently garbaged. */
-#define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1)
+#define SET_FRAME_GARBAGED(f) \
+ (frame_garbaged = true, fset_redisplay (f), f->garbaged = true)
/* Nonzero if frame F is currently garbaged. */
#define FRAME_GARBAGED_P(f) (f)->garbaged
#define FRAME_LEFT_SCROLL_BAR_AREA_WIDTH(f) \
(FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f) \
- ? (FRAME_CONFIG_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)) \
+ ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f) \
: 0)
/* Width of a scroll bar in frame F, measured in columns (characters),
#define FRAME_RIGHT_SCROLL_BAR_AREA_WIDTH(f) \
(FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (f) \
- ? (FRAME_CONFIG_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)) \
+ ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f) \
: 0)
/* Actual width of a scroll bar in frame F, measured in columns. */
#define FRAME_SCROLL_BAR_AREA_WIDTH(f) \
(FRAME_HAS_VERTICAL_SCROLL_BARS (f) \
- ? (FRAME_CONFIG_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)) \
+ ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f) \
: 0)
/* Total width of frame F, in columns (characters),
including the width used by scroll bars if any. */
-
#define FRAME_TOTAL_COLS(f) ((f)->total_cols)
-/* Set the width of frame F to VAL.
- VAL is the width of a full-frame window,
- not including scroll bars and fringes. */
-
-#define SET_FRAME_COLS(f, val) \
- (FRAME_COLS (f) = (val), \
- (f)->total_cols = FRAME_TOTAL_COLS_ARG (f, FRAME_COLS (f)))
-
-/* Given a value WIDTH for frame F's nominal width,
- return the value that FRAME_TOTAL_COLS should have. */
-
-#define FRAME_TOTAL_COLS_ARG(f, width) \
- ((width) \
- + FRAME_SCROLL_BAR_COLS (f) \
- + FRAME_FRINGE_COLS (f))
+/* Set the character widths of frame F. WIDTH specifies a nominal
+ character text width. */
+#define SET_FRAME_COLS(f, width) \
+ ((f)->text_cols = (width), \
+ (f)->total_cols = ((width) \
+ + FRAME_SCROLL_BAR_COLS (f) \
+ + FRAME_FRINGE_COLS (f)))
+
+/* Set the pixel widths of frame F. WIDTH specifies a nominal pixel
+ text width. */
+#define SET_FRAME_WIDTH(f, width) \
+ ((f)->text_width = (width), \
+ (f)->pixel_width = ((width) \
+ + FRAME_SCROLL_BAR_AREA_WIDTH (f) \
+ + FRAME_TOTAL_FRINGE_WIDTH (f) \
+ + 2 * FRAME_INTERNAL_BORDER_WIDTH (f)))
+
+/* Set the pixel heights of frame F. HEIGHT specifies a nominal pixel
+ text width. */
+#define SET_FRAME_HEIGHT(f, height) \
+ ((f)->text_height = (height), \
+ (f)->pixel_height = ((height) \
+ + 2 * FRAME_INTERNAL_BORDER_WIDTH (f)))
/* Maximum + 1 legitimate value for FRAME_CURSOR_X. */
} \
} while (0)
-/* Set visibility of frame F, marking F as garbaged if needed. */
+/* Set visibility of frame F.
+ We call redisplay_other_windows to make sure the frame gets redisplayed
+ if some changes were applied to it while it wasn't visible (and hence
+ wasn't redisplayed). */
-#define SET_FRAME_VISIBLE(f, v) \
- (((f)->visible == 0 || ((f)->visible == 2)) \
- && ((v) == 1) ? SET_FRAME_GARBAGED (f) : 0, \
- (f)->visible = (eassert (0 <= (v) && (v) <= 2), (v)))
+INLINE void
+SET_FRAME_VISIBLE (struct frame *f, int v)
+{
+ eassert (0 <= v && v <= 2);
+ if (v == 1 && f->visible != 1)
+ redisplay_other_windows ();
+ f->visible = v;
+}
/* Set iconify of frame F. */
#define SET_FRAME_ICONIFIED(f, i) \
(f)->iconified = (eassert (0 <= (i) && (i) <= 1), (i))
+extern Lisp_Object selected_frame;
extern Lisp_Object Qframep, Qframe_live_p;
extern Lisp_Object Qtty, Qtty_type;
extern Lisp_Object Qtty_color_mode;
/* Nonzero means there is at least one garbaged frame. */
extern bool frame_garbaged;
-extern struct frame *last_nonminibuf_frame;
-
extern void set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
extern struct frame *decode_window_system_frame (Lisp_Object);
extern struct frame *decode_live_frame (Lisp_Object);
extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object);
extern Lisp_Object Vframe_list;
-\f
-/* The currently selected frame. */
-
-extern Lisp_Object selected_frame;
/* Value is a pointer to the selected frame. If the selected frame
isn't live, abort. */
#define FRAME_TOTAL_FRINGE_WIDTH(F) \
(FRAME_LEFT_FRINGE_WIDTH (F) + FRAME_RIGHT_FRINGE_WIDTH (F))
-
/* Pixel-width of internal border lines */
-
#define FRAME_INTERNAL_BORDER_WIDTH(F) ((F)->internal_border_width)
+/* Pixel-size of window border lines */
+#define FRAME_RIGHT_DIVIDER_WIDTH(F) ((F)->right_divider_width)
+#define FRAME_BOTTOM_DIVIDER_WIDTH(F) ((F)->bottom_divider_width)
+
#else /* not HAVE_WINDOW_SYSTEM */
#define FRAME_FRINGE_COLS(F) 0
#define FRAME_LEFT_FRINGE_WIDTH(F) 0
#define FRAME_RIGHT_FRINGE_WIDTH(F) 0
#define FRAME_INTERNAL_BORDER_WIDTH(F) 0
+#define FRAME_RIGHT_DIVIDER_WIDTH(F) 0
+#define FRAME_BOTTOM_DIVIDER_WIDTH(F) 0
#endif /* not HAVE_WINDOW_SYSTEM */
-
-
-
\f
/***********************************************************************
Conversion between canonical units and pixels
Return the upper/left pixel position of the character cell on frame F
at ROW/COL. */
-#define FRAME_LINE_TO_PIXEL_Y(f, row) \
+#define FRAME_LINE_TO_PIXEL_Y(f, row) \
(((row) < FRAME_TOP_MARGIN (f) ? 0 : FRAME_INTERNAL_BORDER_WIDTH (f)) \
+ (row) * FRAME_LINE_HEIGHT (f))
-#define FRAME_COL_TO_PIXEL_X(f, col) \
- (FRAME_INTERNAL_BORDER_WIDTH (f) \
+#define FRAME_COL_TO_PIXEL_X(f, col) \
+ (FRAME_INTERNAL_BORDER_WIDTH (f) \
+ (col) * FRAME_COLUMN_WIDTH (f))
/* Return the pixel width/height of frame F if it has
COLS columns/LINES rows. */
#define FRAME_TEXT_COLS_TO_PIXEL_WIDTH(f, cols) \
- (FRAME_COL_TO_PIXEL_X (f, cols) \
- + (f)->scroll_bar_actual_width \
- + FRAME_TOTAL_FRINGE_WIDTH (f) \
+ (FRAME_COL_TO_PIXEL_X (f, cols) \
+ + FRAME_SCROLL_BAR_AREA_WIDTH (f) \
+ + FRAME_TOTAL_FRINGE_WIDTH (f) \
+ FRAME_INTERNAL_BORDER_WIDTH (f))
#define FRAME_TEXT_LINES_TO_PIXEL_HEIGHT(f, lines) \
- ((lines) * FRAME_LINE_HEIGHT (f) \
+ ((lines) * FRAME_LINE_HEIGHT (f) \
+ 2 * FRAME_INTERNAL_BORDER_WIDTH (f))
-
/* Return the row/column (zero-based) of the character cell containing
the pixel on FRAME at Y/X. */
-#define FRAME_PIXEL_Y_TO_LINE(f, y) \
- (((y) < FRAME_TOP_MARGIN_HEIGHT (f) \
- ? (y) \
+#define FRAME_PIXEL_Y_TO_LINE(f, y) \
+ (((y) < FRAME_TOP_MARGIN_HEIGHT (f) \
+ ? (y) \
: ((y) < FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \
? (y) - (FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \
- /* Arrange for the division to round down. */ \
- + FRAME_LINE_HEIGHT (f) - 1) \
- : (y) - FRAME_INTERNAL_BORDER_WIDTH (f))) \
+ /* Arrange for the division to round down. */ \
+ + FRAME_LINE_HEIGHT (f) - 1) \
+ : (y) - FRAME_INTERNAL_BORDER_WIDTH (f))) \
/ FRAME_LINE_HEIGHT (f))
-#define FRAME_PIXEL_X_TO_COL(f, x) \
+#define FRAME_PIXEL_X_TO_COL(f, x) \
(((x) - FRAME_INTERNAL_BORDER_WIDTH (f)) \
/ FRAME_COLUMN_WIDTH (f))
/* How many columns/rows of text can we fit in WIDTH/HEIGHT pixels on
frame F? */
-#define FRAME_PIXEL_WIDTH_TO_TEXT_COLS(f, width) \
- (FRAME_PIXEL_X_TO_COL (f, ((width) \
- - FRAME_INTERNAL_BORDER_WIDTH (f) \
- - FRAME_TOTAL_FRINGE_WIDTH (f) \
- - (f)->scroll_bar_actual_width)))
+#define FRAME_PIXEL_WIDTH_TO_TEXT_COLS(f, width) \
+ (FRAME_PIXEL_X_TO_COL (f, ((width) \
+ - FRAME_INTERNAL_BORDER_WIDTH (f) \
+ - FRAME_TOTAL_FRINGE_WIDTH (f) \
+ - FRAME_SCROLL_BAR_AREA_WIDTH (f)))) \
-#define FRAME_PIXEL_HEIGHT_TO_TEXT_LINES(f, height) \
- (FRAME_PIXEL_Y_TO_LINE (f, ((height) \
+#define FRAME_PIXEL_HEIGHT_TO_TEXT_LINES(f, height) \
+ (FRAME_PIXEL_Y_TO_LINE (f, ((height) \
- FRAME_INTERNAL_BORDER_WIDTH (f))))
+/* Return the pixel width/height of frame F with a text size of
+ width/height. */
+
+#define FRAME_TEXT_TO_PIXEL_WIDTH(f, width) \
+ ((width) \
+ + FRAME_SCROLL_BAR_AREA_WIDTH (f) \
+ + FRAME_TOTAL_FRINGE_WIDTH (f) \
+ + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))
+
+#define FRAME_TEXT_TO_PIXEL_HEIGHT(f, height) \
+ ((height) + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))
+
+/* Return the text width/height of frame F with a pixel size of
+ width/height. */
+
+#define FRAME_PIXEL_TO_TEXT_WIDTH(f, width) \
+ ((width) \
+ - FRAME_SCROLL_BAR_AREA_WIDTH (f) \
+ - FRAME_TOTAL_FRINGE_WIDTH (f) \
+ - 2 * FRAME_INTERNAL_BORDER_WIDTH (f))
+
+#define FRAME_PIXEL_TO_TEXT_HEIGHT(f, height) \
+ ((height) - 2 * FRAME_INTERNAL_BORDER_WIDTH (f))
+
+/* Value is the smallest width of any character in any font on frame F. */
+
+#define FRAME_SMALLEST_CHAR_WIDTH(f) \
+ FRAME_DISPLAY_INFO (f)->smallest_char_width
+
+/* Value is the smallest height of any font on frame F. */
+
+#define FRAME_SMALLEST_FONT_HEIGHT(f) \
+ FRAME_DISPLAY_INFO (f)->smallest_font_height
/***********************************************************************
Frame Parameters
extern Lisp_Object Qbackground_color, Qforeground_color;
extern Lisp_Object Qicon, Qicon_name, Qicon_type, Qicon_left, Qicon_top;
extern Lisp_Object Qinternal_border_width;
+extern Lisp_Object Qright_divider_width, Qbottom_divider_width;
extern Lisp_Object Qtooltip;
extern Lisp_Object Qmenu_bar_lines, Qtool_bar_lines, Qtool_bar_position;
extern Lisp_Object Qmouse_color;
extern void x_set_border_width (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_internal_border_width (struct frame *, Lisp_Object,
Lisp_Object);
+extern void x_set_right_divider_width (struct frame *, Lisp_Object,
+ Lisp_Object);
+extern void x_set_bottom_divider_width (struct frame *, Lisp_Object,
+ Lisp_Object);
extern void x_set_visibility (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_autoraise (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_autolower (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_scroll_bar_width (struct frame *, Lisp_Object,
Lisp_Object);
-extern Lisp_Object x_icon_type (struct frame *);
-
extern long x_figure_window_size (struct frame *, Lisp_Object, bool);
extern void x_set_alpha (struct frame *, Lisp_Object, Lisp_Object);
extern void set_frame_menubar (struct frame *f, bool first_time, bool deep_p);
extern void x_set_window_size (struct frame *f, int change_grav,
- int cols, int rows);
-extern void x_sync (struct frame *);
+ int width, int height, bool pixelwise);
extern Lisp_Object x_get_focus_frame (struct frame *);
extern void x_set_mouse_position (struct frame *f, int h, int v);
extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y);
extern void x_iconify_frame (struct frame *f);
extern void x_set_frame_alpha (struct frame *f);
extern void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
-extern void x_set_tool_bar_lines (struct frame *f,
- Lisp_Object value,
- Lisp_Object oldval);
+extern void x_set_tool_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
extern void x_activate_menubar (struct frame *);
extern void x_real_positions (struct frame *, int *, int *);
-extern int x_bitmap_icon (struct frame *, Lisp_Object);
-extern void x_set_menu_bar_lines (struct frame *,
- Lisp_Object,
- Lisp_Object);
extern void free_frame_menubar (struct frame *);
extern void x_free_frame_resources (struct frame *);
#if !defined USE_X_TOOLKIT
extern char *x_get_resource_string (const char *, const char *);
#endif
-#endif
+extern void x_sync (struct frame *);
+#endif /* HAVE_X_WINDOWS */
extern void x_query_colors (struct frame *f, XColor *, int);
extern void x_query_color (struct frame *f, XColor *);
+extern void x_focus_frame (struct frame *);
+
+#ifndef HAVE_NS
+
+extern int x_bitmap_icon (struct frame *, Lisp_Object);
+
+/* Set F's bitmap icon, if specified among F's parameters. */
+
+INLINE void
+x_set_bitmap_icon (struct frame *f)
+{
+ Lisp_Object obj = assq_no_quit (Qicon_type, f->param_alist);
+
+ if (CONSP (obj))
+ x_bitmap_icon (f, XCDR (obj));
+}
+
+#endif /* !HAVE_NS */
#endif /* HAVE_WINDOW_SYSTEM */
-\f
+
+INLINE void
+flush_frame (struct frame *f)
+{
+ struct redisplay_interface *rif = FRAME_RIF (f);
+
+ if (rif && rif->flush_display)
+ rif->flush_display (f);
+}
+
/***********************************************************************
Multimonitor data
***********************************************************************/