# HG changeset patch # User Gerd Moellmann # Date 932593432 0 # Node ID 429ec2c075e4c1f7e4ff1f5adea575289ee2fcc3 # Parent b52cdabf92531af9db69ef3decff116b614556f6 (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. diff -r b52cdabf9253 -r 429ec2c075e4 src/window.h --- a/src/window.h Wed Jul 21 21:43:52 1999 +0000 +++ b/src/window.h Wed Jul 21 21:43:52 1999 +0000 @@ -18,6 +18,10 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ (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 @@ #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 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 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 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 */