diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-09-25 16:15:16 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-09-25 16:15:16 -0400 |
commit | 650c20f1ca4e07591a727e1cfcc74b3363d15985 (patch) | |
tree | 85d11f6437cde22f410c25e0e5f71a3131ebd07d /src/window.h | |
parent | 8869332684c2302b5ba1ead4568bbc7ba1c0183e (diff) | |
parent | 4b85ae6a24380fb67a3315eaec9233f17a872473 (diff) | |
download | emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.gz emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.bz2 emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.zip |
Merge 'master' into noverlay
Diffstat (limited to 'src/window.h')
-rw-r--r-- | src/window.h | 300 |
1 files changed, 192 insertions, 108 deletions
diff --git a/src/window.h b/src/window.h index 324d30b57f9..b5d0c69ab52 100644 --- a/src/window.h +++ b/src/window.h @@ -1,5 +1,5 @@ /* Window definitions for GNU Emacs. - Copyright (C) 1985-1986, 1993, 1995, 1997-2017 Free Software + Copyright (C) 1985-1986, 1993, 1995, 1997-2022 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -24,57 +24,69 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ INLINE_HEADER_BEGIN -/* Windows are allocated as if they were vectors, but then the -Lisp data type is changed to Lisp_Window. They are garbage -collected along with the vectors. +/* Windows are allocated as if they were vectors, but then the Lisp +data type is changed to Lisp_Window. They are garbage collected along +with the vectors. All windows in use are arranged into a tree, with pointers up and down. -Windows that are leaves of the tree are actually displayed -and show the contents of buffers. Windows that are not leaves -are used for representing the way groups of leaf windows are -arranged on the frame. Leaf windows never become non-leaves. -They are deleted only by calling delete-window on them (but -this can be done implicitly). Combination windows can be created -and deleted at any time. - -A leaf window has a buffer stored in contents field and markers in its start -and pointm fields. Non-leaf windows have nil in the latter two fields. - -Non-leaf windows are either vertical or horizontal combinations. - -A vertical combination window has children that are arranged on the frame -one above the next. Its contents field points to the uppermost child. -The parent field of each of the children points to the vertical -combination window. The next field of each child points to the -child below it, or is nil for the lowest child. The prev field -of each child points to the child above it, or is nil for the -highest child. - -A horizontal combination window has children that are side by side. -Its contents field points to the leftmost child. In each child -the next field points to the child to the right and the prev field -points to the child to the left. - -The children of a vertical combination window may be leaf windows -or horizontal combination windows. The children of a horizontal -combination window may be leaf windows or vertical combination windows. - -At the top of the tree are two windows which have nil as parent. -The second of these is minibuf_window. The first one manages all -the frame area that is not minibuffer, and is called the root window. -Different windows can be the root at different times; -initially the root window is a leaf window, but if more windows -are created then that leaf window ceases to be root and a newly -made combination window becomes root instead. - -In any case, on screens which have an ordinary window and a -minibuffer, prev of the minibuf window is the root window and next of -the root window is the minibuf window. On minibufferless screens or -minibuffer-only screens, the root window and the minibuffer window are -one and the same, so its prev and next members are nil. - -A dead window has its contents field set to nil. */ +Windows that are leaves of the tree are actually displayed and show +the contents of buffers. Windows that are not leaves are used for +representing the way groups of leaf windows are arranged on the frame. +Leaf windows never become non-leaves. They are deleted only by +calling `delete-window' on them (but this can be done implicitly). +Non-leaf windows never become leaf windows and can be created and +deleted at any time by the window management code. Non-leaf windows +can be seen but not directly manipulated by Lisp functions. + +A leaf window has a buffer stored in its contents field and markers in +its 'start' and 'pointm' fields. Non-leaf windows have nil in the +latter two fields. Non-leaf windows are either vertical or horizontal +combinations. + +A vertical combination window has children that are arranged on the +frame one above the next. Its 'contents' field points to the +uppermost child. The 'parent' field of each of the children points to +the vertical combination window. The 'next' field of each child +points to the child below it, or is nil for the lowest child. The +'prev' field of each child points to the child above it, or is nil for +the highest child. + +A horizontal combination window has children that are arranged side by +side. Its 'contents' field points to the leftmost child. In each +child the 'next' field points to the child to the right and the 'prev' +field points to the child to the left. + +On each frame there are at least one and at most two windows which +have nil as parent. The second of these, if present, is the frame's +minibuffer window and shows the minibuffer or the echo area. The +first one manages the remaining frame area and is called the frame's +root window. Different windows can be the root at different times; +initially the root window is a leaf window, but if more windows are +created, then that leaf window ceases to be root and a newly made +combination window becomes the root instead. + +On frames which have an ordinary window and a minibuffer window, +'prev' of the minibuffer window is the root window and 'next' of the +root window is the minibuffer window. On minibuffer-less frames there +is only a root window and 'next' of the root window is nil. On +minibuffer-only frames, the root window and the minibuffer window are +one and the same, so its 'prev' and 'next' members are nil. In any +case, 'prev' of a root window and 'next' of a minibuffer window are +always nil. + +In Lisp parlance, leaf windows are called "live windows" and non-leaf +windows are called "internal windows". Together, live and internal +windows form the set of "valid windows". A window that has been +deleted is considered "dead" regardless of whether it formerly was a +leaf or a non-leaf window. A dead window has its 'contents' field set +to nil. + +Frames may also contain pseudo windows, windows that are not exposed +directly to Lisp code. Pseudo windows are currently either used to +display the menu bar or the tool bar (when Emacs uses toolkits that +don't display their own menu bar and tool bar) or a tooltip in a +tooltip frame (when tooltips are not display by the toolkit). */ struct cursor_pos { @@ -88,34 +100,53 @@ struct cursor_pos struct window { /* This is for Lisp; the terminal code does not refer to it. */ - struct vectorlike_header header; + union vectorlike_header header; /* The frame this window is on. */ Lisp_Object frame; - /* Following (to right or down) and preceding (to left or up) child - at same level of tree. */ + /* Following (to right or down) and preceding (to left or up) + child at same level of tree. Whether this is left/right or + up/down is determined by the parent window's 'horizontal' flag, + see below. On a frame that is neither a minibuffer-only nor a + minibuffer-less frame, 'next' of the root window points to the + frame's minibuffer window and 'prev' of the minibuffer window + points to the frame's root window. In all other cases, 'next' + of the root window and 'prev' of the minibuffer window, if + present, are nil. 'prev' of the root window and 'next' of the + minibuffer window are always nil. */ Lisp_Object next; Lisp_Object prev; - /* The window this one is a child of. */ + /* The window this one is a child of. For the root and a + minibuffer window this is always nil. */ Lisp_Object parent; - /* The normal size of the window. These are fractions, but we do - not use C doubles to avoid creating new Lisp_Float objects while - interfacing Lisp in Fwindow_normal_size. */ + /* The "normal" size of the window. These are fractions, but we + do not use C doubles to avoid creating new Lisp_Float objects + while interfacing Lisp in Fwindow_normal_size. */ Lisp_Object normal_lines; Lisp_Object normal_cols; - /* New sizes of the window. Note that Lisp code may set new_normal - to something beyond an integer, so C int can't be used here. */ + /* The new sizes of the window as proposed by the window resizing + functions. Note that Lisp code may set new_normal to something + beyond an integer, so C int can't be used here. */ Lisp_Object new_total; Lisp_Object new_normal; Lisp_Object new_pixel; - /* May be buffer, window, or nil. */ + /* For a leaf window or a tooltip window this is the buffer shown + in the window; for a combination window this is the first of + its child windows; for a pseudo window showing the menu bar or + tool bar this is nil. It is a buffer for a minibuffer window + as well. */ Lisp_Object contents; + /* The old buffer of this window, set to this window's buffer by + run_window_change_functions every time it sees this window. + Unused for internal windows. */ + Lisp_Object old_buffer; + /* A marker pointing to where in the text to start displaying. BIDI Note: This is the _logical-order_ start, i.e. the smallest buffer position visible in the window, not necessarily the @@ -168,19 +199,17 @@ struct window and Qt, so bitfield can't be used here. */ Lisp_Object dedicated; - /* If redisplay in this window goes beyond this buffer position, - must run the redisplay-end-trigger-hook. */ - Lisp_Object redisplay_end_trigger; - /* t means this window's child windows are not (re-)combined. */ Lisp_Object combination_limit; /* An alist with parameters. */ Lisp_Object window_parameters; - /* 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. */ + /* The help echo text for this window. Qnil if there's none. */ + Lisp_Object mode_line_help_echo; + + /* No Lisp data may follow this point; mode_line_help_echo must be + the last Lisp member. */ /* Glyph matrices. */ struct glyph_matrix *current_matrix; @@ -188,7 +217,7 @@ struct window /* The two Lisp_Object fields below are marked in a special way, which is why they're placed after `current_matrix'. */ - /* Alist of <buffer, window-start, window-point> triples listing + /* A list of <buffer, window-start, window-point> triples listing buffers previously shown in this window. */ Lisp_Object prev_buffers; /* List of buffers re-shown in this window. */ @@ -200,6 +229,14 @@ struct window /* Unique number of window assigned when it was created. */ EMACS_INT sequence_number; + /* The change stamp of this window. Set to 0 when the window is + created, it is set to its frame's change stamp every time + run_window_change_functions is run on that frame with this + window live. It is left alone when the window exists only + within a window configuration. Not useful for internal + windows. */ + int change_stamp; + /* The upper left corner pixel coordinates of this window, as integers relative to upper left corner of frame = 0, 0. */ int pixel_left; @@ -214,10 +251,13 @@ struct window int pixel_width; int pixel_height; - /* The pixel sizes of the window at the last time - `window-size-change-functions' was run. */ - int pixel_width_before_size_change; - int pixel_height_before_size_change; + /* The pixel and pixel body sizes of the window at the last time + run_window_change_functions was run with this window live. Not + useful for internal windows. */ + int old_pixel_width; + int old_pixel_height; + int old_body_pixel_width; + int old_body_pixel_height; /* The size of the window. */ int total_cols; @@ -236,11 +276,11 @@ struct window /* Displayed buffer's text modification events counter as of last time display completed. */ - EMACS_INT last_modified; + modiff_count last_modified; /* Displayed buffer's overlays modification events counter as of last complete update. */ - EMACS_INT last_overlay_modified; + modiff_count last_overlay_modified; /* Value of point at that time. Since this is a position in a buffer, it should be positive. */ @@ -317,6 +357,9 @@ struct window /* Effective height of the header line, or -1 if not known. */ int header_line_height; + /* Effective height of the tab line, or -1 if not known. */ + int tab_line_height; + /* Z - the buffer position of the last glyph in the current matrix of W. Only valid if window_end_valid is true. */ ptrdiff_t window_end_pos; @@ -370,13 +413,22 @@ struct window bool_bf must_be_updated_p : 1; /* Flag indicating that this window is not a real one. - Currently only used for menu bar windows of frames. */ + Currently only used for menu bar windows, for tool bar windows, + and for tooltips. */ bool_bf pseudo_window_p : 1; /* True means fringes are drawn outside display margins. Otherwise draw them between margin areas and text. */ bool_bf fringes_outside_margins : 1; + /* True if this window's fringe specifications are persistent, + i.e., always survive Fset_window_buffer. */ + bool_bf fringes_persistent : 1; + + /* True if this window's scroll bar specifications are persistent, + i.e., always survive Fset_window_buffer. */ + bool_bf scroll_bars_persistent : 1; + /* True if window_end_pos and window_end_vpos are truly valid. This is false if nontrivial redisplay is preempted since in that case the frame image that window_end_pos did not get onto the frame. */ @@ -389,6 +441,10 @@ struct window window. */ bool_bf suspend_auto_hscroll : 1; + /* True if vscroll should be preserved while forcing the start due + to a frozen window. */ + bool_bf preserve_vscroll_p : 1; + /* Amount by which lines of this window are scrolled in y-direction (smooth scrolling). */ int vscroll; @@ -396,7 +452,7 @@ struct window /* Z_BYTE - buffer position of the last glyph in the current matrix of W. Should be nonnegative, and only valid if window_end_valid is true. */ ptrdiff_t window_end_bytepos; - }; + } GCALIGNED_STRUCT; INLINE bool WINDOWP (Lisp_Object a) @@ -414,7 +470,7 @@ INLINE struct window * XWINDOW (Lisp_Object a) { eassert (WINDOWP (a)); - return XUNTAG (a, Lisp_Vectorlike); + return XUNTAG (a, Lisp_Vectorlike, struct window); } /* Most code should use these functions to set Lisp fields in struct @@ -438,9 +494,9 @@ wset_prev (struct window *w, Lisp_Object val) } INLINE void -wset_redisplay_end_trigger (struct window *w, Lisp_Object val) +wset_mode_line_help_echo (struct window *w, Lisp_Object val) { - w->redisplay_end_trigger = val; + w->mode_line_help_echo = val; } INLINE void @@ -544,7 +600,14 @@ wset_next_buffers (struct window *w, Lisp_Object val) #define WINDOW_BUFFER(W) \ (WINDOW_LEAF_P(W) \ ? (W)->contents \ - : Qnil) \ + : Qnil) + +/* Local value of variable V in window W's buffer. Nil if W has no + buffer. */ +#define WINDOW_BUFFER_LOCAL_VALUE(V, W) \ + (BUFFERP ((W)->contents) \ + ? buffer_local_value(V, (W)->contents) \ + : Qnil) /* Return the canonical column width of the frame of window W. */ #define WINDOW_FRAME_COLUMN_WIDTH(W) \ @@ -598,7 +661,7 @@ wset_next_buffers (struct window *w, Lisp_Object val) #define WINDOW_RIGHTMOST_P(W) \ (WINDOW_RIGHT_PIXEL_EDGE (W) \ == (WINDOW_RIGHT_PIXEL_EDGE \ - (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \ + (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) /* True if window W has no other windows below it on its frame (the minibuffer window is not counted in this respect unless W itself is a @@ -606,13 +669,13 @@ wset_next_buffers (struct window *w, Lisp_Object val) #define WINDOW_BOTTOMMOST_P(W) \ (WINDOW_BOTTOM_PIXEL_EDGE (W) \ == (WINDOW_BOTTOM_PIXEL_EDGE \ - (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \ + (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) /* True if window W takes up the full width of its frame. */ #define WINDOW_FULL_WIDTH_P(W) \ (WINDOW_PIXEL_WIDTH (W) \ == (WINDOW_PIXEL_WIDTH \ - (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \ + (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) /* Width of right divider of window W. */ #define WINDOW_RIGHT_DIVIDER_WIDTH(W) \ @@ -638,7 +701,7 @@ wset_next_buffers (struct window *w, Lisp_Object val) (WINDOW_LEFT_EDGE_COL (W) + WINDOW_TOTAL_COLS (W)) /* Return the canonical frame line at which window W starts. - This includes a header line, if any. */ + This includes a header/tab line, if any. */ #define WINDOW_TOP_EDGE_LINE(W) (W)->top_line /* Return the canonical frame line before which window W ends. @@ -656,7 +719,7 @@ wset_next_buffers (struct window *w, Lisp_Object val) (WINDOW_LEFT_PIXEL_EDGE (W) + WINDOW_PIXEL_WIDTH (W)) /* Return the top pixel edge at which window W starts. - This includes a header line, if any. */ + This includes a header/tab line, if any. */ #define WINDOW_TOP_PIXEL_EDGE(W) (W)->pixel_top /* Return the bottom pixel edge before which window W ends. @@ -686,8 +749,17 @@ wset_next_buffers (struct window *w, Lisp_Object val) #define WINDOW_MENU_BAR_P(W) false #endif +/* True if W is a tab bar window. */ +#if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_PGTK) +# define WINDOW_TAB_BAR_P(W) \ + (WINDOWP (WINDOW_XFRAME (W)->tab_bar_window) \ + && (W) == XWINDOW (WINDOW_XFRAME (W)->tab_bar_window)) +#else +# define WINDOW_TAB_BAR_P(W) false +#endif + /* True if W is a tool bar window. */ -#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_TOOL_BAR) #define WINDOW_TOOL_BAR_P(W) \ (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \ && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window)) @@ -697,13 +769,13 @@ wset_next_buffers (struct window *w, Lisp_Object val) /* Return the frame y-position at which window W starts. */ #define WINDOW_TOP_EDGE_Y(W) \ - (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ + (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \ + WINDOW_TOP_PIXEL_EDGE (W)) /* Return the frame y-position before which window W ends. */ #define WINDOW_BOTTOM_EDGE_Y(W) \ - (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ + (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \ + WINDOW_BOTTOM_PIXEL_EDGE (W)) @@ -809,7 +881,9 @@ wset_next_buffers (struct window *w, Lisp_Object val) W. Horizontal scrollbars exist for toolkit versions only. */ #if USE_HORIZONTAL_SCROLL_BARS #define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) \ - ((WINDOW_PSEUDO_P (W) || MINI_NON_ONLY_WINDOW_P (W)) \ + ((WINDOW_PSEUDO_P (W) \ + || (MINI_WINDOW_P (W) \ + && !EQ (W->horizontal_scroll_bar_type, Qbottom))) \ ? false \ : EQ (W->horizontal_scroll_bar_type, Qt) \ ? FRAME_HAS_HORIZONTAL_SCROLL_BARS (WINDOW_XFRAME (W)) \ @@ -935,6 +1009,16 @@ wset_next_buffers (struct window *w, Lisp_Object val) #define WINDOW_HEADER_LINE_LINES(W) \ window_wants_header_line (W) +/* Height in pixels of the tab line. + Zero if W doesn't have a tab line. */ +#define WINDOW_TAB_LINE_HEIGHT(W) \ + (window_wants_tab_line (W) \ + ? CURRENT_TAB_LINE_HEIGHT (W) \ + : 0) + +#define WINDOW_TAB_LINE_LINES(W) \ + window_wants_tab_line (W) + /* Pixel height of window W without mode line, bottom scroll bar and bottom divider. */ #define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \ @@ -943,14 +1027,15 @@ wset_next_buffers (struct window *w, Lisp_Object val) - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \ - WINDOW_MODE_LINE_HEIGHT (W)) -/* Pixel height of window W without mode and header line and bottom +/* Pixel height of window W without mode and header/tab line and bottom divider. */ #define WINDOW_BOX_TEXT_HEIGHT(W) \ (WINDOW_PIXEL_HEIGHT ((W)) \ - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \ - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \ - WINDOW_MODE_LINE_HEIGHT (W) \ - - WINDOW_HEADER_LINE_HEIGHT (W)) + - WINDOW_HEADER_LINE_HEIGHT (W) \ + - WINDOW_TAB_LINE_HEIGHT (W)) /* Return the frame position where the horizontal scroll bar of window W starts. */ @@ -1007,15 +1092,15 @@ extern Lisp_Object minibuf_selected_window; extern Lisp_Object make_window (void); extern Lisp_Object window_from_coordinates (struct frame *, int, int, - enum window_part *, bool); -extern void resize_frame_windows (struct frame *, int, bool, bool); + enum window_part *, bool, bool); +extern void resize_frame_windows (struct frame *, int, bool); extern void restore_window_configuration (Lisp_Object); extern void delete_all_child_windows (Lisp_Object); -extern void grow_mini_window (struct window *, int, bool); -extern void shrink_mini_window (struct window *, bool); +extern void grow_mini_window (struct window *, int); +extern void shrink_mini_window (struct window *); extern int window_relative_x_coord (struct window *, enum window_part, int); -void run_window_size_change_functions (Lisp_Object); +void run_window_change_functions (void); /* Make WINDOW display BUFFER. RUN_HOOKS_P means it's allowed to run hooks. See make_frame for a case where it's not allowed. */ @@ -1029,14 +1114,6 @@ void set_window_buffer (Lisp_Object window, Lisp_Object buffer, extern Lisp_Object echo_area_window; -/* Depth in recursive edits. */ - -extern EMACS_INT command_loop_level; - -/* Depth in minibuffer invocations. */ - -extern EMACS_INT minibuf_level; - /* Non-zero if we should redraw the mode lines on the next redisplay. Usually set to a unique small integer so we can track the main causes of full redisplays in `redisplay--mode-lines-cause'. */ @@ -1058,6 +1135,7 @@ extern void wset_redisplay (struct window *w); extern void fset_redisplay (struct frame *f); extern void bset_redisplay (struct buffer *b); extern void bset_update_mode_line (struct buffer *b); +extern void wset_update_mode_line (struct window *w); /* Call this to tell redisplay to look for other windows than selected-window that need to be redisplayed. Calling one of the *set_redisplay functions above already does it, so it's only needed in unusual cases. */ @@ -1071,7 +1149,7 @@ struct glyph *get_phys_cursor_glyph (struct window *w); /* True if WINDOW is a valid window. */ #define WINDOW_VALID_P(WINDOW) \ - (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents)) \ + (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents)) /* A window of any sort, leaf or interior, is "valid" if its contents slot is non-nil. */ @@ -1093,25 +1171,31 @@ extern Lisp_Object window_list (void); extern Lisp_Object window_parameter (struct window *, Lisp_Object parameter); extern struct window *decode_live_window (Lisp_Object); extern struct window *decode_any_window (Lisp_Object); -extern bool compare_window_configurations (Lisp_Object, Lisp_Object, bool); extern void mark_window_cursors_off (struct window *); extern bool window_wants_mode_line (struct window *); extern bool window_wants_header_line (struct window *); +extern bool window_wants_tab_line (struct window *); extern int window_internal_height (struct window *); -extern int window_body_width (struct window *w, bool); +enum window_body_unit + { + WINDOW_BODY_IN_CANONICAL_CHARS, + WINDOW_BODY_IN_PIXELS, + WINDOW_BODY_IN_REMAPPED_CHARS + }; +extern int window_body_width (struct window *w, enum window_body_unit); +extern int window_body_height (struct window *w, enum window_body_unit); enum margin_unit { MARGIN_IN_LINES, MARGIN_IN_PIXELS }; extern int window_scroll_margin (struct window *, enum margin_unit); extern void temp_output_buffer_show (Lisp_Object); extern void replace_buffer_in_windows (Lisp_Object); extern void replace_buffer_in_windows_safely (Lisp_Object); -extern void sanitize_window_sizes (Lisp_Object horizontal); /* This looks like a setter, but it is a bit special. */ extern void wset_buffer (struct window *, Lisp_Object); extern bool window_outdated (struct window *); +extern ptrdiff_t window_point (struct window *w); extern void init_window_once (void); extern void init_window (void); extern void syms_of_window (void); -extern void keys_of_window (void); /* Move cursor to row/column position VPOS/HPOS, pixel coordinates Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y are window-relative pixel positions. This is always done during |