summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog72
-rw-r--r--src/alloc.c15
-rw-r--r--src/frame.c123
-rw-r--r--src/lisp.h4
-rw-r--r--src/minibuf.c9
-rw-r--r--src/window.c504
-rw-r--r--src/window.h10
7 files changed, 420 insertions, 317 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c9c739dde9a..1d5e3f2ddbd 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,7 @@
2011-06-06 Paul Eggert <eggert@cs.ucla.edu>
+ Integer overflow fixes.
+
Check for overflow when converting integer to cons and back.
* charset.c (Fdefine_charset_internal, Fdecode_char):
Use cons_to_unsigned to catch overflow.
@@ -75,6 +77,52 @@
(access_keymap): NATNUMP -> INTEGERP, since the integer must be
nonnegative.
+2011-06-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * window.h (Fwindow_frame): Declare.
+
+2011-06-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * alloc.c: Simplify handling of large-request failures (Bug#8800).
+ (SPARE_MEMORY): Always define.
+ (LARGE_REQUEST): Remove.
+ (memory_full): Use SPARE_MEMORY rather than LARGE_REQUEST.
+
+2011-06-06 Martin Rudalics <rudalics@gmx.at>
+
+ * lisp.h: Move EXFUNS for Fframe_root_window,
+ Fframe_first_window and Fset_frame_selected_window to window.h.
+
+ * window.h: Move EXFUNS for Fframe_root_window,
+ Fframe_first_window and Fset_frame_selected_window here from
+ lisp.h.
+
+ * frame.c (Fwindow_frame, Fframe_first_window)
+ (Fframe_root_window, Fframe_selected_window)
+ (Fset_frame_selected_window): Move to window.c.
+ (Factive_minibuffer_window): Move to minibuf.c.
+ (Fother_visible_frames_p): New function.
+
+ * minibuf.c (Factive_minibuffer_window): Move here from frame.c.
+
+ * window.c (decode_window, decode_any_window): Move up in code.
+ (Fwindowp, Fwindow_live_p): Rewrite doc-strings.
+ (inhibit_frame_unsplittable): Remove unused variable.
+ (Fwindow_buffer): Move up and rewrite doc-string.
+ (Fwindow_parent, Fwindow_vchild, Fwindow_hchild, Fwindow_next)
+ (Fwindow_prev): New functions.
+ (Fwindow_frame): Move here from frame.c. Accept any window as
+ argument.
+ (Fframe_root_window, Fframe_first_window)
+ (Fframe_selected_window): Move here from frame.c. Accept frame
+ or arbitrary window as argument. Update doc-strings.
+ (Fminibuffer_window): Move up in code.
+ (Fwindow_minibuffer_p): Move up in code and simplify.
+ (Fset_frame_selected_window): Move here from frame.c.
+ Marginal rewrite.
+ (Fselected_window, select_window, Fselect_window): Move up in
+ code. Minor doc-string fixes.
+
2011-06-06 Paul Eggert <eggert@cs.ucla.edu>
* alloc.c (memory_full) [SYSTEM_MALLOC]: Port to MacOS (Bug#8800).
@@ -110,8 +158,8 @@
* xselect.c (x_clipboard_manager_save): Remove redundant arg.
(x_clipboard_manager_save): Add return value.
- (x_clipboard_manager_error_1, x_clipboard_manager_error_2): New
- error handlers.
+ (x_clipboard_manager_error_1, x_clipboard_manager_error_2):
+ New error handlers.
(x_clipboard_manager_save_frame, x_clipboard_manager_save_all):
Obey Vx_select_enable_clipboard_manager. Catch errors in
x_clipboard_manager_save (Bug#8779).
@@ -139,8 +187,8 @@
(bidi_fetch_char, bidi_fetch_char_advance): New functions.
(bidi_cache_search, bidi_cache_iterator_state)
(bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak)
- (bidi_level_of_next_char, bidi_move_to_visually_next): Support
- character positions inside a run of characters covered by a
+ (bidi_level_of_next_char, bidi_move_to_visually_next):
+ Support character positions inside a run of characters covered by a
display string.
(bidi_paragraph_init, bidi_resolve_explicit_1)
(bidi_level_of_next_char): Call bidi_fetch_char and
@@ -151,8 +199,8 @@
definitions.
(bidi_explicit_dir_char): Lookup character type in bidi_type_table,
instead of using explicit *_CHAR codes.
- (bidi_resolve_explicit, bidi_resolve_weak): Use
- FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
+ (bidi_resolve_explicit, bidi_resolve_weak):
+ Use FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
bidirectional text is supported only in multibyte buffers.
(bidi_init_it): Accept additional argument FRAME_WINDOW_P and use
it to initialize the frame_window_p member of struct bidi_it.
@@ -170,8 +218,8 @@
(single_display_spec_intangible_p): Function deleted.
(display_prop_intangible_p): Reimplement to call
handle_display_spec instead of single_display_spec_intangible_p.
- Accept 3 additional arguments needed by handle_display_spec. This
- fixes incorrect cursor motion across display property with complex
+ Accept 3 additional arguments needed by handle_display_spec.
+ This fixes incorrect cursor motion across display property with complex
values: lists, `(when COND...)' forms, etc.
(single_display_spec_string_p): Support property values that are
lists with the argument STRING its top-level element.
@@ -188,8 +236,8 @@
the display property will replace the characters it covers.
(Fcurrent_bidi_paragraph_direction): Initialize the nchars and
frame_window_p members of struct bidi_it.
- (compute_display_string_pos, compute_display_string_end): New
- functions.
+ (compute_display_string_pos, compute_display_string_end):
+ New functions.
(push_it): Accept second argument POSITION, where pop_it should
jump to continue iteration.
(reseat_1): Initialize bidi_it.disp_pos.
@@ -200,8 +248,8 @@
* dispextern.h (struct bidi_it): New member frame_window_p.
(bidi_init_it): Update prototypes.
(display_prop_intangible_p): Update prototype.
- (compute_display_string_pos, compute_display_string_end): Declare
- prototypes.
+ (compute_display_string_pos, compute_display_string_end):
+ Declare prototypes.
(struct bidi_it): New members nchars and disp_pos. ch_len is now
EMACS_INT.
diff --git a/src/alloc.c b/src/alloc.c
index d9e00c3aeb4..cfbb79b2e61 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -190,17 +190,10 @@ static int total_free_floats, total_floats;
static char *spare_memory[7];
-#ifndef SYSTEM_MALLOC
-/* Amount of spare memory to keep in large reserve block. */
+/* Amount of spare memory to keep in large reserve block, or to see
+ whether this much is available when malloc fails on a larger request. */
#define SPARE_MEMORY (1 << 14)
-#endif
-
-#ifdef SYSTEM_MALLOC
-# define LARGE_REQUEST (1 << 14)
-#else
-# define LARGE_REQUEST SPARE_MEMORY
-#endif
/* Number of extra blocks malloc should get when it needs more core. */
@@ -3289,9 +3282,9 @@ memory_full (size_t nbytes)
{
/* Do not go into hysterics merely because a large request failed. */
int enough_free_memory = 0;
- if (LARGE_REQUEST < nbytes)
+ if (SPARE_MEMORY < nbytes)
{
- void *p = malloc (LARGE_REQUEST);
+ void *p = malloc (SPARE_MEMORY);
if (p)
{
free (p);
diff --git a/src/frame.c b/src/frame.c
index 6008ba9567a..68984a68d52 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -904,111 +904,6 @@ DEFUN ("selected-frame", Fselected_frame, Sselected_frame, 0, 0, 0,
return selected_frame;
}
-DEFUN ("window-frame", Fwindow_frame, Swindow_frame, 1, 1, 0,
- doc: /* Return the frame object that window WINDOW is on. */)
- (Lisp_Object window)
-{
- CHECK_LIVE_WINDOW (window);
- return XWINDOW (window)->frame;
-}
-
-DEFUN ("frame-first-window", Fframe_first_window, Sframe_first_window, 0, 1, 0,
- doc: /* Returns the topmost, leftmost window of FRAME.
-If omitted, FRAME defaults to the currently selected frame. */)
- (Lisp_Object frame)
-{
- Lisp_Object w;
-
- if (NILP (frame))
- w = SELECTED_FRAME ()->root_window;
- else
- {
- CHECK_LIVE_FRAME (frame);
- w = XFRAME (frame)->root_window;
- }
- while (NILP (XWINDOW (w)->buffer))
- {
- if (! NILP (XWINDOW (w)->hchild))
- w = XWINDOW (w)->hchild;
- else if (! NILP (XWINDOW (w)->vchild))
- w = XWINDOW (w)->vchild;
- else
- abort ();
- }
- return w;
-}
-
-DEFUN ("active-minibuffer-window", Factive_minibuffer_window,
- Sactive_minibuffer_window, 0, 0, 0,
- doc: /* Return the currently active minibuffer window, or nil if none. */)
- (void)
-{
- return minibuf_level ? minibuf_window : Qnil;
-}
-
-DEFUN ("frame-root-window", Fframe_root_window, Sframe_root_window, 0, 1, 0,
- doc: /* Returns the root-window of FRAME.
-If omitted, FRAME defaults to the currently selected frame. */)
- (Lisp_Object frame)
-{
- Lisp_Object window;
-
- if (NILP (frame))
- window = SELECTED_FRAME ()->root_window;
- else
- {
- CHECK_LIVE_FRAME (frame);
- window = XFRAME (frame)->root_window;
- }
-
- return window;
-}
-
-DEFUN ("frame-selected-window", Fframe_selected_window,
- Sframe_selected_window, 0, 1, 0,
- doc: /* Return the selected window of FRAME.
-FRAME defaults to the currently selected frame. */)
- (Lisp_Object frame)
-{
- Lisp_Object window;
-
- if (NILP (frame))
- window = SELECTED_FRAME ()->selected_window;
- else
- {
- CHECK_LIVE_FRAME (frame);
- window = XFRAME (frame)->selected_window;
- }
-
- return window;
-}
-
-DEFUN ("set-frame-selected-window", Fset_frame_selected_window,
- Sset_frame_selected_window, 2, 3, 0,
- doc: /* Set selected window of FRAME to WINDOW.
-If FRAME is nil, use the selected frame. If FRAME is the
-selected frame, this makes WINDOW the selected window.
-Optional argument NORECORD non-nil means to neither change the
-order of recently selected windows nor the buffer list.
-Return WINDOW. */)
- (Lisp_Object frame, Lisp_Object window, Lisp_Object norecord)
-{
- if (NILP (frame))
- frame = selected_frame;
-
- CHECK_LIVE_FRAME (frame);
- CHECK_LIVE_WINDOW (window);
-
- if (! EQ (frame, WINDOW_FRAME (XWINDOW (window))))
- error ("In `set-frame-selected-window', WINDOW is not on FRAME");
-
- if (EQ (frame, selected_frame))
- return Fselect_window (window, norecord);
-
- return XFRAME (frame)->selected_window = window;
-}
-
-
DEFUN ("frame-list", Fframe_list, Sframe_list,
0, 0, 0,
doc: /* Return a list of all live frames. */)
@@ -1265,6 +1160,17 @@ other_visible_frames (FRAME_PTR f)
return 1;
}
+DEFUN ("other-visible-frames-p", Fother_visible_frames_p, Sother_visible_frames_p, 0, 1, 0,
+ doc: /* Return t if there are other visible frames beside FRAME.
+FRAME defaults to the selected frame. */)
+ (Lisp_Object frame)
+{
+ if (NILP (frame))
+ frame = selected_frame;
+ CHECK_LIVE_FRAME (frame);
+ return other_visible_frames (XFRAME (frame)) ? Qt : Qnil;
+}
+
/* Delete FRAME. When FORCE equals Qnoelisp, delete FRAME
unconditionally. x_connection_closed and delete_terminal use
this. Any other value of FORCE implements the semantics
@@ -4605,7 +4511,6 @@ automatically. See also `mouse-autoselect-window'. */);
staticpro (&Vframe_list);
- defsubr (&Sactive_minibuffer_window);
defsubr (&Sframep);
defsubr (&Sframe_live_p);
defsubr (&Swindow_system);
@@ -4613,14 +4518,10 @@ automatically. See also `mouse-autoselect-window'. */);
defsubr (&Shandle_switch_frame);
defsubr (&Sselect_frame);
defsubr (&Sselected_frame);
- defsubr (&Swindow_frame);
- defsubr (&Sframe_root_window);
- defsubr (&Sframe_first_window);
- defsubr (&Sframe_selected_window);
- defsubr (&Sset_frame_selected_window);
defsubr (&Sframe_list);
defsubr (&Snext_frame);
defsubr (&Sprevious_frame);
+ defsubr (&Sother_visible_frames_p);
defsubr (&Sdelete_frame);
defsubr (&Smouse_position);
defsubr (&Smouse_pixel_position);
diff --git a/src/lisp.h b/src/lisp.h
index 1c1e3ec3708..c5f810a0746 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3215,16 +3215,12 @@ extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
extern Lisp_Object frame_buffer_predicate (Lisp_Object);
EXFUN (Fselect_frame, 2);
EXFUN (Fselected_frame, 0);
-EXFUN (Fwindow_frame, 1);
-EXFUN (Fframe_root_window, 1);
-EXFUN (Fframe_first_window, 1);
EXFUN (Fmake_frame_visible, 1);
EXFUN (Ficonify_frame, 1);
EXFUN (Fframe_parameter, 2);
EXFUN (Fmodify_frame_parameters, 2);
EXFUN (Fraise_frame, 1);
EXFUN (Fredirect_frame_focus, 2);
-EXFUN (Fset_frame_selected_window, 3);
extern Lisp_Object frame_buffer_list (Lisp_Object);
extern void frames_discard_buffer (Lisp_Object);
extern void set_frame_buffer_list (Lisp_Object, Lisp_Object);
diff --git a/src/minibuf.c b/src/minibuf.c
index ba8729bdff2..8f1987298b3 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -143,6 +143,14 @@ choose_minibuf_frame_1 (Lisp_Object ignore)
return Qnil;
}
+DEFUN ("active-minibuffer-window", Factive_minibuffer_window,
+ Sactive_minibuffer_window, 0, 0, 0,
+ doc: /* Return the currently active minibuffer window, or nil if none. */)
+ (void)
+{
+ return minibuf_level ? minibuf_window : Qnil;
+}
+
DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
Sset_minibuffer_window, 1, 1, 0,
doc: /* Specify which minibuffer window to use for the minibuffer.
@@ -2181,6 +2189,7 @@ properties. */);
doc: /* Minibuffer keymap used for reading Lisp expressions. */);
Vread_expression_map = Qnil;
+ defsubr (&Sactive_minibuffer_window);
defsubr (&Sset_minibuffer_window);
defsubr (&Sread_from_minibuffer);
defsubr (&Seval_minibuffer);
diff --git a/src/window.c b/src/window.c
index bc9f31e03e8..4e8b98a3237 100644
--- a/src/window.c
+++ b/src/window.c
@@ -94,76 +94,376 @@ static Lisp_Object select_window (Lisp_Object, Lisp_Object, int);
This value is always the same as
FRAME_SELECTED_WINDOW (selected_frame). */
-
Lisp_Object selected_window;
/* A list of all windows for use by next_window and Fwindow_list.
Functions creating or deleting windows should invalidate this cache
by setting it to nil. */
-
Lisp_Object Vwindow_list;
/* The mini-buffer window of the selected frame.
Note that you cannot test for mini-bufferness of an arbitrary window
by comparing against this; but you can test for mini-bufferness of
the selected window. */
-
Lisp_Object minibuf_window;
/* Non-nil means it is the window whose mode line should be
shown as the selected window when the minibuffer is selected. */
-
Lisp_Object minibuf_selected_window;
/* Hook run at end of temp_output_buffer_show. */
-
static Lisp_Object Qtemp_buffer_show_hook;
/* Incremented for each window created. */
-
static int sequence_number;
/* Nonzero after init_window_once has finished. */
-
static int window_initialized;
/* Hook to run when window config changes. */
-
static Lisp_Object Qwindow_configuration_change_hook;
-/* Incremented by 1 whenever a window is deleted. */
+/* Incremented by 1 whenever a window is deleted. */
static int window_deletion_count;
/* Used by the function window_scroll_pixel_based */
-
static int window_scroll_pixel_based_preserve_x;
static int window_scroll_pixel_based_preserve_y;
/* Same for window_scroll_line_based. */
-
static int window_scroll_preserve_hpos;
static int window_scroll_preserve_vpos;
+
+static struct window *
+decode_window (register Lisp_Object window)
+{
+ if (NILP (window))
+ return XWINDOW (selected_window);
-#if 0 /* This isn't used anywhere. */
-/* Nonzero means we can split a frame even if it is "unsplittable". */
-static int inhibit_frame_unsplittable;
-#endif
+ CHECK_LIVE_WINDOW (window);
+ return XWINDOW (window);
+}
+
+static struct window *
+decode_any_window (register Lisp_Object window)
+{
+ if (NILP (window))
+ return XWINDOW (selected_window);
+
+ CHECK_WINDOW (window);
+ return XWINDOW (window);
+}
-
DEFUN ("windowp", Fwindowp, Swindowp, 1, 1, 0,
- doc: /* Return t if OBJECT is a window. */)
+ doc: /* Return t if OBJECT is a window and nil otherwise. */)
(Lisp_Object object)
{
return WINDOWP (object) ? Qt : Qnil;
}
DEFUN ("window-live-p", Fwindow_live_p, Swindow_live_p, 1, 1, 0,
- doc: /* Return t if OBJECT is a window which is currently visible. */)
+ doc: /* Return t if OBJECT is a live window and nil otherwise.
+A live window is a window that displays a buffer. */)
(Lisp_Object object)
{
return WINDOW_LIVE_P (object) ? Qt : Qnil;
}
+
+/* Frames and windows. */
+DEFUN ("window-frame", Fwindow_frame, Swindow_frame, 1, 1, 0,
+ doc: /* Return the frame that window WINDOW is on.
+WINDOW can be any window and defaults to the selected one. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->frame;
+}
+
+DEFUN ("frame-root-window", Fframe_root_window, Sframe_root_window, 0, 1, 0,
+ doc: /* Return the root window of FRAME_OR_WINDOW.
+If omitted, FRAME_OR_WINDOW defaults to the currently selected frame.
+Else if FRAME_OR_WINDOW denotes any window, return the root window of
+that window's frame. If FRAME_OR_WINDOW denotes a live frame, return
+the root window of that frame. */)
+ (Lisp_Object frame_or_window)
+{
+ Lisp_Object window;
+
+ if (NILP (frame_or_window))
+ window = SELECTED_FRAME ()->root_window;
+ else if (WINDOWP (frame_or_window))
+ window = XFRAME (WINDOW_FRAME (XWINDOW (frame_or_window)))->root_window;
+ else
+ {
+ CHECK_LIVE_FRAME (frame_or_window);
+ window = XFRAME (frame_or_window)->root_window;
+ }
+
+ return window;
+}
+
+DEFUN ("minibuffer-window", Fminibuffer_window, Sminibuffer_window, 0, 1, 0,
+ doc: /* Return the window used now for minibuffers.
+If the optional argument FRAME is specified, return the minibuffer window
+used by that frame. */)
+ (Lisp_Object frame)
+{
+ if (NILP (frame))
+ frame = selected_frame;
+ CHECK_LIVE_FRAME (frame);
+ return FRAME_MINIBUF_WINDOW (XFRAME (frame));
+}
+
+DEFUN ("window-minibuffer-p", Fwindow_minibuffer_p,
+ Swindow_minibuffer_p, 0, 1, 0,
+ doc: /* Return non-nil if WINDOW is a minibuffer window.
+WINDOW can be any window and defaults to the selected one. */)
+ (Lisp_Object window)
+{
+ return MINI_WINDOW_P (decode_any_window (window)) ? Qt : Qnil;
+}
+
+/* Don't move this to window.el - this must be a safe routine. */
+DEFUN ("frame-first-window", Fframe_first_window, Sframe_first_window, 0, 1, 0,
+ doc: /* Return the topmost, leftmost live window on FRAME_OR_WINDOW.
+If omitted, FRAME_OR_WINDOW defaults to the currently selected frame.
+Else if FRAME_OR_WINDOW denotes any window, return the first window of
+that window's frame. If FRAME_OR_WINDOW denotes a live frame, return
+the first window of that frame. */)
+ (Lisp_Object frame_or_window)
+{
+ Lisp_Object window;
+
+ if (NILP (frame_or_window))
+ window = SELECTED_FRAME ()->root_window;
+ else if (WINDOWP (frame_or_window))
+ window = XFRAME (WINDOW_FRAME (XWINDOW (frame_or_window)))->root_window;
+ else
+ {
+ CHECK_LIVE_FRAME (frame_or_window);
+ window = XFRAME (frame_or_window)->root_window;
+ }
+
+ while (NILP (XWINDOW (window)->buffer))
+ {
+ if (! NILP (XWINDOW (window)->hchild))
+ window = XWINDOW (window)->hchild;
+ else if (! NILP (XWINDOW (window)->vchild))
+ window = XWINDOW (window)->vchild;
+ else
+ abort ();
+ }
+
+ return window;
+}
+
+DEFUN ("frame-selected-window", Fframe_selected_window,
+ Sframe_selected_window, 0, 1, 0,
+ doc: /* Return the selected window of FRAME_OR_WINDOW.
+If omitted, FRAME_OR_WINDOW defaults to the currently selected frame.
+Else if FRAME_OR_WINDOW denotes any window, return the selected window
+of that window's frame. If FRAME_OR_WINDOW denotes a live frame, return
+the selected window of that frame. */)
+ (Lisp_Object frame_or_window)
+{
+ Lisp_Object window;
+
+ if (NILP (frame_or_window))
+ window = SELECTED_FRAME ()->selected_window;
+ else if (WINDOWP (frame_or_window))
+ window = XFRAME (WINDOW_FRAME (XWINDOW (frame_or_window)))->selected_window;
+ else
+ {
+ CHECK_LIVE_FRAME (frame_or_window);
+ window = XFRAME (frame_or_window)->selected_window;
+ }
+
+ return window;
+}
+
+DEFUN ("set-frame-selected-window", Fset_frame_selected_window,
+ Sset_frame_selected_window, 2, 3, 0,
+ doc: /* Set selected window of FRAME to WINDOW.
+FRAME must be a live frame and defaults to the selected one. If FRAME
+is the selected frame, this makes WINDOW the selected window. Optional
+argument NORECORD non-nil means to neither change the order of recently
+selected windows nor the buffer list. WINDOW must denote a live window.
+Return WINDOW. */)
+ (Lisp_Object frame, Lisp_Object window, Lisp_Object norecord)
+{
+ if (NILP (frame))
+ frame = selected_frame;
+
+ CHECK_LIVE_FRAME (frame);
+ CHECK_LIVE_WINDOW (window);
+
+ if (! EQ (frame, WINDOW_FRAME (XWINDOW (window))))
+ error ("In `set-frame-selected-window', WINDOW is not on FRAME");
+
+ if (EQ (frame, selected_frame))
+ return Fselect_window (window, norecord);
+ else
+ return XFRAME (frame)->selected_window = window;
+}
+
+DEFUN ("selected-window", Fselected_window, Sselected_window, 0, 0, 0,
+ doc: /* Return the selected window.
+The selected window is the window in which the standard cursor for
+selected windows appears and to which many commands apply. */)
+ (void)
+{
+ return selected_window;
+}
+
+/* If select_window is called with inhibit_point_swap non-zero it will
+ not store point of the old selected window's buffer back into that
+ window's pointm slot. This is needed by Fset_window_configuration to
+ avoid that the display routine is called with selected_window set to
+ Qnil causing a subsequent crash. */
+static Lisp_Object
+select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
+{
+ register struct window *w;
+ register struct window *ow;
+ struct frame *sf;
+
+ CHECK_LIVE_WINDOW (window);
+
+ w = XWINDOW (window);
+ w->frozen_window_start_p = 0;
+
+ if (NILP (norecord))
+ {
+ ++window_select_count;
+ XSETFASTINT (w->use_time, window_select_count);
+ record_buffer (w->buffer);
+ }
+
+ if (EQ (window, selected_window) && !inhibit_point_swap)
+ return window;
+
+ sf = SELECTED_FRAME ();
+ if (XFRAME (WINDOW_FRAME (w)) != sf)
+ {
+ XFRAME (WINDOW_FRAME (w))->selected_window = window;
+ /* Use this rather than Fhandle_switch_frame
+ so that FRAME_FOCUS_FRAME is moved appropriately as we
+ move around in the state where a minibuffer in a separate
+ frame is active. */
+ Fselect_frame (WINDOW_FRAME (w), norecord);
+ /* Fselect_frame called us back so we've done all the work already. */
+ eassert (EQ (window, selected_window));
+ return window;
+ }
+ else
+ sf->selected_window = window;
+
+ /* Store the current buffer's actual point into the
+ old selected window. It belongs to that window,
+ and when the window is not selected, must be in the window. */
+ if (!inhibit_point_swap)
+ {
+ ow = XWINDOW (selected_window);
+ if (! NILP (ow->buffer))
+ set_marker_both (ow->pointm, ow->buffer,
+ BUF_PT (XBUFFER (ow->buffer)),
+ BUF_PT_BYTE (XBUFFER (ow->buffer)));
+ }
+
+ selected_window = window;
+
+ Fset_buffer (w->buffer);
+
+ BVAR (XBUFFER (w->buffer), last_selected_window) = window;
+
+ /* Go to the point recorded in the window.
+ This is important when the buffer is in more
+ than one window. It also matters when
+ redisplay_window has altered point after scrolling,
+ because it makes the change only in the window. */
+ {
+ register EMACS_INT new_point = marker_position (w->pointm);
+ if (new_point < BEGV)
+ SET_PT (BEGV);
+ else if (new_point > ZV)
+ SET_PT (ZV);
+ else
+ SET_PT (new_point);
+ }
+
+ windows_or_buffers_changed++;
+ return window;
+}
+
+DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0,
+ doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer.
+Also make WINDOW's buffer current and make WINDOW the frame's selected
+window. Return WINDOW.
+
+Optional second arg NORECORD non-nil means do not put this buffer at the
+front of the buffer list and do not make this window the most recently
+selected one.
+
+Note that the main editor command loop sets the current buffer to the
+buffer of the selected window before each command. */)
+ (register Lisp_Object window, Lisp_Object norecord)
+{
+ return select_window (window, norecord, 0);
+}
+
+DEFUN ("window-buffer", Fwindow_buffer, Swindow_buffer, 0, 1, 0,
+ doc: /* Return the buffer that WINDOW is displaying.
+WINDOW can be any window and defaults to the selected one.
+If WINDOW is an internal window return nil. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->buffer;
+}
+
+DEFUN ("window-parent", Fwindow_parent, Swindow_parent, 0, 1, 0,
+ doc: /* Return WINDOW's parent window.
+WINDOW can be any window and defaults to the selected one.
+Return nil if WINDOW has no parent. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->parent;
+}
+
+DEFUN ("window-vchild", Fwindow_vchild, Swindow_vchild, 0, 1, 0,
+ doc: /* Return WINDOW's first vertical child window.
+WINDOW can be any window and defaults to the selected one.
+Return nil if WINDOW has no vertical child. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->vchild;
+}
+
+DEFUN ("window-hchild", Fwindow_hchild, Swindow_hchild, 0, 1, 0,
+ doc: /* Return WINDOW's first horizontal child window.
+WINDOW can be any window and defaults to the selected one.
+Return nil if WINDOW has no horizontal child. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->hchild;
+}
+
+DEFUN ("window-next", Fwindow_next, Swindow_next, 0, 1, 0,
+ doc: /* Return WINDOW's right sibling window.
+WINDOW can be any window and defaults to the selected one.
+Return nil if WINDOW has no right sibling. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->next;
+}
+DEFUN ("window-prev", Fwindow_prev, Swindow_prev, 0, 1, 0,
+ doc: /* Return WINDOW's left sibling window.
+WINDOW can be any window and defaults to the selected one.
+Return nil if WINDOW has no left sibling. */)
+ (Lisp_Object window)
+{
+ return decode_any_window (window)->prev;
+}
+
Lisp_Object
make_window (void)
{
@@ -217,36 +517,6 @@ make_window (void)
return val;
}
-DEFUN ("selected-window", Fselected_window, Sselected_window, 0, 0, 0,
- doc: /* Return the window that the cursor now appears in and commands apply to. */)
- (void)
-{
- return selected_window;
-}
-
-DEFUN ("minibuffer-window", Fminibuffer_window, Sminibuffer_window, 0, 1, 0,
- doc: /* Return the window used now for minibuffers.
-If the optional argument FRAME is specified, return the minibuffer window
-used by that frame. */)
- (Lisp_Object frame)
-{
- if (NILP (frame))
- frame = selected_frame;
- CHECK_LIVE_FRAME (frame);
- return FRAME_MINIBUF_WINDOW (XFRAME (frame));
-}
-
-DEFUN ("window-minibuffer-p", Fwindow_minibuffer_p,
- Swindow_minibuffer_p, 0, 1, 0,
- doc: /* Return non-nil if WINDOW is a minibuffer window.
-WINDOW defaults to the selected window. */)
- (Lisp_Object window)
-{
- struct window *w = decode_window (window);
- return MINI_WINDOW_P (w) ? Qt : Qnil;
-}
-
-
DEFUN ("pos-visible-in-window-p", Fpos_visible_in_window_p,
Spos_visible_in_window_p, 0, 3, 0,
doc: /* Return non-nil if position POS is currently on the frame in WINDOW.
@@ -424,34 +694,6 @@ Return nil if window display is not up-to-date. In that case, use
-static struct window *
-decode_window (register Lisp_Object window)
-{
- if (NILP (window))
- return XWINDOW (selected_window);
-
- CHECK_LIVE_WINDOW (window);
- return XWINDOW (window);
-}
-
-static struct window *
-decode_any_window (register Lisp_Object window)
-{
- if (NILP (window))
- return XWINDOW (selected_window);
-
- CHECK_WINDOW (window);
- return XWINDOW (window);
-}
-
-DEFUN ("window-buffer", Fwindow_buffer, Swindow_buffer, 0, 1, 0,
- doc: /* Return the buffer that WINDOW is displaying.
-WINDOW defaults to the selected window. */)
- (Lisp_Object window)
-{
- return decode_window (window)->buffer;
-}
-
DEFUN ("window-height", Fwindow_height, Swindow_height, 0, 1, 0,
doc: /* Return the number of lines in WINDOW.
WINDOW defaults to the selected window.
@@ -3496,106 +3738,6 @@ This function runs `window-scroll-functions' before running
return Qnil;
}
-/* If select_window is called with inhibit_point_swap non-zero it will
- not store point of the old selected window's buffer back into that
- window's pointm slot. This is needed by Fset_window_configuration to
- avoid that the display routine is called with selected_window set to
- Qnil causing a subsequent crash. */
-
-static Lisp_Object
-select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
-{
- register struct window *w;
- register struct window *ow;
- struct frame *sf;
-
- CHECK_LIVE_WINDOW (window);
-
- w = XWINDOW (window);
- w->frozen_window_start_p = 0;
-
- if (NILP (norecord))
- {
- ++window_select_count;
- XSETFASTINT (w->use_time, window_select_count);
- record_buffer (w->buffer);
- }
-
- if (EQ (window, selected_window) && !inhibit_point_swap)
- return window;
-
- sf = SELECTED_FRAME ();
- if (XFRAME (WINDOW_FRAME (w)) != sf)
- {
- XFRAME (WINDOW_FRAME (w))->selected_window = window;
- /* Use this rather than Fhandle_switch_frame
- so that FRAME_FOCUS_FRAME is moved appropriately as we
- move around in the state where a minibuffer in a separate
- frame is active. */
- Fselect_frame (WINDOW_FRAME (w), norecord);
- /* Fselect_frame called us back so we've done all the work already. */
- eassert (EQ (window, selected_window));
- return window;
- }
- else
- sf->selected_window = window;
-
- /* Store the current buffer's actual point into the
- old selected window. It belongs to that window,
- and when the window is not selected, must be in the window. */
- if (!inhibit_point_swap)
- {
- ow = XWINDOW (selected_window);
- if (! NILP (ow->buffer))
- set_marker_both (ow->pointm, ow->buffer,
- BUF_PT (XBUFFER (ow->buffer)),
- BUF_PT_BYTE (XBUFFER (ow->buffer)));
- }
-
- selected_window = window;
-
- Fset_buffer (w->buffer);
-
- BVAR (XBUFFER (w->buffer), last_selected_window) = window;
-
- /* Go to the point recorded in the window.
- This is important when the buffer is in more
- than one window. It also matters when
- redisplay_window has altered point after scrolling,
- because it makes the change only in the window. */
- {
- register EMACS_INT new_point = marker_position (w->pointm);
- if (new_point < BEGV)
- SET_PT (BEGV);
- else if (new_point > ZV)
- SET_PT (ZV);
- else
- SET_PT (new_point);
- }
-
- windows_or_buffers_changed++;
- return window;
-}
-
-
-/* Note that selected_window can be nil when this is called from
- Fset_window_configuration. */
-
-DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0,
- doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer.
-If WINDOW is not already selected, make WINDOW's buffer current
-and make WINDOW the frame's selected window. Return WINDOW.
-Optional second arg NORECORD non-nil means do not put this buffer
-at the front of the list of recently selected ones and do not
-make this window the most recently selected one.
-
-Note that the main editor command loop selects the buffer of the
-selected window before each command. */)
- (register Lisp_Object window, Lisp_Object norecord)
-{
- return select_window (window, norecord, 0);
-}
-
static Lisp_Object
select_window_norecord (Lisp_Object window)
{
@@ -7125,9 +7267,19 @@ frame to be redrawn only if it is a tty frame. */);
defsubr (&Swindow_minibuffer_p);
defsubr (&Swindowp);
defsubr (&Swindow_live_p);
+ defsubr (&Swindow_frame);
+ defsubr (&Sframe_root_window);
+ defsubr (&Sframe_first_window);
+ defsubr (&Sframe_selected_window);
+ defsubr (&Sset_frame_selected_window);
defsubr (&Spos_visible_in_window_p);
defsubr (&Swindow_line_height);
defsubr (&Swindow_buffer);
+ defsubr (&Swindow_parent);
+ defsubr (&Swindow_vchild);
+ defsubr (&Swindow_hchild);
+ defsubr (&Swindow_next);
+ defsubr (&Swindow_prev);
defsubr (&Swindow_height);
defsubr (&Swindow_width);
defsubr (&Swindow_full_width_p);
diff --git a/src/window.h b/src/window.h
index b1f6560445e..96e30d98d24 100644
--- a/src/window.h
+++ b/src/window.h
@@ -844,11 +844,15 @@ struct glyph *get_phys_cursor_glyph (struct window *w);
extern Lisp_Object Qwindowp, Qwindow_live_p;
extern Lisp_Object Vwindow_list;
-EXFUN (Fselected_window, 0);
-EXFUN (Fwindow_minibuffer_p, 1);
-EXFUN (Fdelete_window, 1);
EXFUN (Fwindow_buffer, 1);
+EXFUN (Fwindow_frame, 1);
EXFUN (Fget_buffer_window, 2);
+EXFUN (Fwindow_minibuffer_p, 1);
+EXFUN (Fselected_window, 0);
+EXFUN (Fframe_root_window, 1);
+EXFUN (Fframe_first_window, 1);
+EXFUN (Fset_frame_selected_window, 3);
+EXFUN (Fdelete_window, 1);
EXFUN (Fset_window_configuration, 1);
EXFUN (Fcurrent_window_configuration, 1);
extern int compare_window_configurations (Lisp_Object, Lisp_Object, int);