Commit f43dd834 authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(struct window): Add vscroll.

(struct window): New member cursor_off_p.
(struct window): Remove phys_cursor_glyph.
(struct window): New members phys_cursor_ascent and
phys_cursor_descent.
(struct window): New flag pseudo_window_p.
(struct window): Add left_margin_width, right_margin_width.
New member last_cursor.
(WINDOW_LEFT_MARGIN): Remove FRAME_LEFT_SCROLL_BAR.
(WINDOW_TO_FRAME_VPOS): Convert window vpos
to frame vpos.
(WINDOW_TO_FRAME_HPOS): Convert window hpos to frame hpos.
(FRAME_TO_WINDOW_VPOS): Convert frame vpos to window vpos.
(FRAME_TO_WINDOW_HPOS): Convert frame hpos to window hpos.
(WINDOW_TOPMOST_P): Added.
(struct window): Rewrittenf for new glyphs.
parent 82641697
......@@ -18,6 +18,10 @@ 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. */
#ifndef WINDOW_H_INCLUDED
#define WINDOW_H_INCLUDED
#include "dispextern.h"
/* Windows are allocated as if they were vectors, but then the
Lisp data type is changed to Lisp_Window. They are garbage
......@@ -72,6 +76,15 @@ one and the same, so its prev and next members are nil.
A dead window has its buffer, hchild, and vchild windows all nil. */
struct cursor_pos
{
/* Pixel position. These are always window relative. */
int x, y;
/* Glyph matrix position. */
int hpos, vpos;
};
struct window
{
/* The first two fields are really the header of a vector */
......@@ -139,25 +152,27 @@ struct window
it yet, or if the frame doesn't have any scroll bars, this is nil. */
Lisp_Object vertical_scroll_bar;
/* Width of left and right marginal areas. A value of nil means
no margin. */
Lisp_Object left_margin_width;
Lisp_Object right_margin_width;
/* The rest are currently not used or only half used */
/* Frame coords of point at that time */
Lisp_Object last_point_x;
Lisp_Object last_point_y;
/* Frame coords of mark as of last time display completed */
/* May be nil if mark does not exist or was not on frame */
Lisp_Object last_mark_x;
Lisp_Object last_mark_y;
/* Number of characters in buffer past bottom of window,
as of last redisplay that finished. */
/* Z - the buffer position of the last glyph in the current matrix
of W. Only valid if WINDOW_END_VALID is not nil. */
Lisp_Object window_end_pos;
/* Glyph matrix row of the last glyph in the current matrix
of W. Only valid if WINDOW_END_VALID is not nil. */
Lisp_Object window_end_vpos;
/* t if window_end_pos is truly valid.
This is nil if nontrivial redisplay is preempted
since in that case the frame image that window_end_pos
did not get onto the frame. */
Lisp_Object window_end_valid;
/* Vertical position (relative to window top) of that buffer position
of the first of those characters */
Lisp_Object window_end_vpos;
/* Non-nil means must regenerate mode line of this window */
Lisp_Object update_mode_line;
/* Non-nil means current value of `start'
......@@ -185,13 +200,66 @@ struct window
/* If redisplay in this window goes beyond this buffer position,
must run the redisplay-end-trigger-hook. */
Lisp_Object redisplay_end_trigger;
};
/* No Lisp data may follow below this point without changing
mark_object in alloc.c. The member current_matrix must be the
first non-Lisp member. */
/* Glyph matrices. */
struct glyph_matrix *current_matrix;
struct glyph_matrix *desired_matrix;
/* Cursor position as of last update that completed without
pause. This is the position of last_point. */
struct cursor_pos last_cursor;
/* Intended cursor position. This is a position within the
glyph matrix. */
struct cursor_pos cursor;
/* Where the cursor actually is. */
struct cursor_pos phys_cursor;
/* Cursor type last drawn on the window. Used for X frames; -1
initially. */
int phys_cursor_type;
/* This is handy for undrawing the cursor. */
int phys_cursor_ascent, phys_cursor_height;
/* Non-zero means the cursor is currently displayed. This can be
set to zero by functions overpainting the cursor image. */
unsigned phys_cursor_on_p : 1;
/* 0 means cursor is logically on, 1 means it's off. Used for
blinking cursor. */
unsigned cursor_off_p : 1;
/* Value of cursor_off_p as of the last redisplay. */
unsigned last_cursor_off_p : 1;
/* 1 means desired matrix has been build and window must be
updated in update_frame. */
unsigned must_be_updated_p : 1;
/* Flag indicating that this window is not a real one.
Currently only used for menu bar windows of frames. */
unsigned pseudo_window_p : 1;
/* Amount by which lines of this window are scrolled in
y-direction (smooth scrolling). */
int vscroll;
/* Z_BYTE - the buffer position of the last glyph in the current matrix
of W. Only valid if WINDOW_END_VALID is not nil. */
int window_end_bytepos;
};
/* 1 if W is a minibuffer window. */
#define MINI_WINDOW_P(W) (!EQ ((W)->mini_p, Qnil))
#define MINI_WINDOW_P(W) (!EQ ((W)->mini_p, Qnil))
/* Return the frame column at which the text in window W starts.
/* Return the window column at which the text in window W starts.
This is different from the `left' field because it does not include
a left-hand scroll bar if any. */
......@@ -199,23 +267,21 @@ struct window
(XFASTINT ((W)->left) \
+ FRAME_LEFT_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME (W))))
/* Return the frame column before window W ends.
/* Return the window column before which window W ends.
This includes a right-hand scroll bar, if any. */
#define WINDOW_RIGHT_EDGE(W) \
(XFASTINT ((W)->left) + XFASTINT ((W)->width))
/* Return the frame column before which the text in window W ends.
/* Return the window column before which the text in window W ends.
This is different from WINDOW_RIGHT_EDGE because it does not include
a scroll bar or window-separating line on the right edge. */
#define WINDOW_RIGHT_MARGIN(W) \
(WINDOW_RIGHT_EDGE (W) \
- (! FRAME_HAS_VERTICAL_SCROLL_BARS (XFRAME (WINDOW_FRAME (W))) \
? ((WINDOW_RIGHTMOST_P (W)) ? 0 : 1) \
: FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (W))) \
? FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (W))) \
: 0))
#define WINDOW_RIGHT_MARGIN(W) \
(WINDOW_RIGHT_EDGE (W) \
- (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (W))) \
? FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (W))) \
: 0))
/* 1 if window W takes up the full width of its frame. */
......@@ -227,6 +293,7 @@ struct window
#define WINDOW_RIGHTMOST_P(W) \
(WINDOW_RIGHT_EDGE (W) == FRAME_WINDOW_WIDTH (XFRAME (WINDOW_FRAME (W))))
/* This is the window in which the terminal's cursor should
be left when nothing is being done with it. This must
always be a leaf window, and its buffer is selected by
......@@ -249,31 +316,40 @@ extern int window_select_count;
extern Lisp_Object minibuf_window;
/* Non-nil => window to for C-M-v to scroll
when the minibuffer is selected. */
/* Non-nil => window to for C-M-v to scroll when the minibuffer is
selected. */
extern Lisp_Object Vminibuf_scroll_window;
/* nil or a symbol naming the window system
under which emacs is running
('x is the only current possibility) */
/* Nil or a symbol naming the window system under which emacs is
running ('x is the only current possibility) */
extern Lisp_Object Vwindow_system;
/* Version number of X windows: 10, 11 or nil. */
extern Lisp_Object Vwindow_system_version;
/* Window that the mouse is over (nil if no mouse support). */
extern Lisp_Object Vmouse_window;
/* Last mouse-click event (nil if no mouse support). */
extern Lisp_Object Vmouse_event;
EXFUN (Fnext_window, 3);
EXFUN (Fselect_window, 1);
EXFUN (Fdisplay_buffer, 3);
EXFUN (Fset_window_buffer, 2);
EXFUN (Fset_window_hscroll, 2);
EXFUN (Fwindow_hscroll, 1);
EXFUN (Fset_window_vscroll, 2);
EXFUN (Fwindow_vscroll, 1);
EXFUN (Fset_window_margins, 3);
extern Lisp_Object make_window P_ ((void));
extern void delete_window P_ ((Lisp_Object));
extern Lisp_Object window_from_coordinates P_ ((struct frame *, int, int, int *));
extern Lisp_Object window_from_coordinates P_ ((struct frame *, int, int, int *, int));
EXFUN (Fwindow_dedicated_p, 1);
extern int window_height P_ ((Lisp_Object));
extern int window_width P_ ((Lisp_Object));
......@@ -282,39 +358,61 @@ extern void set_window_width P_ ((Lisp_Object, int, int));
extern void change_window_height P_ ((int, int));
extern void delete_all_subwindows P_ ((struct window *));
/* Make WINDOW display BUFFER as its contents. RUN_HOOKS_P non-zero
means it's allowed to run hooks. See make_frame for a case where
it's not allowed. */
void set_window_buffer P_ ((Lisp_Object window, Lisp_Object buffer,
int run_hooks_p));
/* Prompt to display in front of the minibuffer contents. */
extern Lisp_Object minibuf_prompt;
/* The visual width of the above. */
extern int minibuf_prompt_width;
/* Message to display instead of minibuffer contents.
This is what the functions error and message make,
and command echoing uses it as well. It overrides the
minibuf_prompt as well as the buffer. */
/* Message to display instead of minibuffer contents. This is what
the functions error and message make, and command echoing uses it
as well. It overrides the minibuf_prompt as well as the buffer. */
extern char *echo_area_glyphs;
/* A Lisp string to display instead of mini-buffer contents, analogous
to echo_area_glyphs. If this is a string, display that string.
Otherwise, if echo_area_glyphs is non-null, display that. */
extern Lisp_Object echo_area_message;
/* This is the length of the message in echo_area_glyphs. */
extern int echo_area_glyphs_length;
/* Value of echo_area_glyphs when it was last acted on.
If this is nonzero, there is a message on the frame
in the minibuffer and it should be erased as soon
as it is no longer requested to appear. */
/* Value of echo_area_glyphs when it was last acted on. If this is
nonzero, there is a message on the frame in the minibuffer and it
should be erased as soon as it is no longer requested to appear. */
extern char *previous_echo_glyphs;
/* This is the window where the echo area message was displayed.
It is always a minibuffer window, but it may not be the
same window currently active as a minibuffer. */
extern Lisp_Object previous_echo_area_message;
/* This is the window where the echo area message was displayed. It
is always a minibuffer window, but it may not be the same window
currently active as a minibuffer. */
extern Lisp_Object echo_area_window;
/* Depth in recursive edits. */
extern int command_loop_level;
/* Depth in minibuffer invocations. */
extern int minibuf_level;
/* true iff we should redraw the mode lines on the next redisplay. */
extern int update_mode_lines;
/* Minimum value of GPT - BEG since last redisplay that finished. */
......@@ -325,28 +423,41 @@ extern int beg_unchanged;
extern int end_unchanged;
/* MODIFF as of last redisplay that finished;
if it matches MODIFF, beg_unchanged and end_unchanged
contain no useful information. */
/* MODIFF as of last redisplay that finished; if it matches MODIFF,
beg_unchanged and end_unchanged contain no useful information. */
extern int unchanged_modified;
/* BUF_OVERLAY_MODIFF of current buffer, as of last redisplay that finished;
if it matches BUF_OVERLAY_MODIFF, beg_unchanged and end_unchanged
contain no useful information. */
/* BUF_OVERLAY_MODIFF of current buffer, as of last redisplay that
finished; if it matches BUF_OVERLAY_MODIFF, beg_unchanged and
end_unchanged contain no useful information. */
extern int overlay_unchanged_modified;
/* Nonzero if BEGV - BEG or Z - ZV of current buffer has changed
since last redisplay that finished. */
/* Nonzero if BEGV - BEG or Z - ZV of current buffer has changed since
last redisplay that finished. */
extern int clip_changed;
/* Nonzero if window sizes or contents have changed
since last redisplay that finished */
/* Nonzero if window sizes or contents have changed since last
redisplay that finished */
extern int windows_or_buffers_changed;
/* Number of windows displaying the selected buffer.
Normally this is 1, but it can be more. */
/* Number of windows displaying the selected buffer. Normally this is
1, but it can be more. */
extern int buffer_shared;
/* If *ROWS or *COLS are too small a size for FRAME, set them to the
minimum allowable size. */
extern void check_frame_size P_ ((struct frame *frame, int *rows, int *cols));
/* Return a pointer to the glyph W's physical cursor is on. Value is
null if W's current matrix is invalid, so that no meaningfull glyph
can be returned. */
struct glyph *get_phys_cursor_glyph P_ ((struct window *w));
#endif /* not WINDOW_H_INCLUDED */
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