X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8a450f0a7e90608a5f2165b580e60fc248f104a8..e58e5c503fb525017b04a11bfae8ccddf04f3df0:/src/window.c diff --git a/src/window.c b/src/window.c index 36d0c89bc4..96cafc5820 100644 --- a/src/window.c +++ b/src/window.c @@ -273,7 +273,6 @@ make_window () XSETWINDOW (val, p); XSETFASTINT (p->last_point, 0); p->frozen_window_start_p = 0; - p->height_fixed_p = 0; p->last_cursor_off_p = p->cursor_off_p = 0; p->left_margin_cols = Qnil; p->right_margin_cols = Qnil; @@ -683,7 +682,10 @@ coordinates_in_window (w, x, y) /* Outside any interesting column? */ if (*x < left_x || *x > right_x) - return ON_SCROLL_BAR; + { + *y -= top_y; + return ON_SCROLL_BAR; + } lmargin_width = window_box_width (w, LEFT_MARGIN_AREA); rmargin_width = window_box_width (w, RIGHT_MARGIN_AREA); @@ -740,9 +742,9 @@ coordinates_in_window (w, x, y) ? (*x < right_x - WINDOW_RIGHT_FRINGE_WIDTH (w)) : (*x >= right_x - rmargin_width))) { - *x -= right_x; - if (!WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)) - *x -= WINDOW_RIGHT_FRINGE_WIDTH (w); + *x -= right_x - rmargin_width; + if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)) + *x += WINDOW_RIGHT_FRINGE_WIDTH (w); *y -= top_y; return ON_RIGHT_MARGIN; } @@ -754,7 +756,7 @@ coordinates_in_window (w, x, y) } /* Everything special ruled out - must be on text area */ - *x -= left_x + WINDOW_LEFT_FRINGE_WIDTH (w); + *x -= text_left; *y -= top_y; return ON_TEXT; } @@ -1030,7 +1032,8 @@ if it isn't already recorded. */) if (! NILP (update) && ! (! NILP (w->window_end_valid) - && XFASTINT (w->last_modified) >= MODIFF)) + && XFASTINT (w->last_modified) >= MODIFF) + && !noninteractive) { struct text_pos startp; struct it it; @@ -2438,27 +2441,22 @@ window_fixed_size_p (w, width_p, check_siblings_p) } else if (BUFFERP (w->buffer)) { - if (w->height_fixed_p && !width_p) - fixed_p = 1; - else - { - struct buffer *old = current_buffer; - Lisp_Object val; + struct buffer *old = current_buffer; + Lisp_Object val; - current_buffer = XBUFFER (w->buffer); - val = find_symbol_value (Qwindow_size_fixed); - current_buffer = old; + current_buffer = XBUFFER (w->buffer); + val = find_symbol_value (Qwindow_size_fixed); + current_buffer = old; - fixed_p = 0; - if (!EQ (val, Qunbound)) - { - fixed_p = !NILP (val); + fixed_p = 0; + if (!EQ (val, Qunbound)) + { + fixed_p = !NILP (val); - if (fixed_p - && ((EQ (val, Qheight) && width_p) - || (EQ (val, Qwidth) && !width_p))) - fixed_p = 0; - } + if (fixed_p + && ((EQ (val, Qheight) && width_p) + || (EQ (val, Qwidth) && !width_p))) + fixed_p = 0; } /* Can't tell if this one is resizable without looking at @@ -6231,6 +6229,84 @@ usage: (save-window-excursion BODY ...) */) return unbind_to (count, val); } + + +/*********************************************************************** + Window Split Tree + ***********************************************************************/ + +static Lisp_Object +window_tree (w) + struct window *w; +{ + Lisp_Object tail = Qnil; + Lisp_Object result = Qnil; + + while (w) + { + Lisp_Object wn; + + XSETWINDOW (wn, w); + if (!NILP (w->hchild)) + wn = Fcons (Qnil, Fcons (Fwindow_edges (wn), + window_tree (XWINDOW (w->hchild)))); + else if (!NILP (w->vchild)) + wn = Fcons (Qt, Fcons (Fwindow_edges (wn), + window_tree (XWINDOW (w->vchild)))); + + if (NILP (result)) + { + result = tail = Fcons (wn, Qnil); + } + else + { + XSETCDR (tail, Fcons (wn, Qnil)); + tail = XCDR (tail); + } + + w = NILP (w->next) ? 0 : XWINDOW (w->next); + } + + return result; +} + + + +DEFUN ("window-tree", Fwindow_tree, Swindow_tree, + 0, 1, 0, + doc: /* Return the window tree for frame FRAME. + +The return value is a list of the form (ROOT MINI), where ROOT +represents the window tree of the frame's root window, and MINI +is the frame's minibuffer window. + +If the root window is not split, ROOT is the root window itself. +Otherwise, ROOT is a list (DIR EDGES W1 W2 ...) where DIR is nil for a +horizontal split, and t for a vertical split, EDGES gives the combined +size and position of the subwindows in the split, and the rest of the +elements are the subwindows in the split. Each of the subwindows may +again be a window or a list representing a window split, and so on. +EDGES is a list \(LEFT TOP RIGHT BOTTOM) as returned by `window-edges'. + +If FRAME is nil or omitted, return information on the currently +selected frame. */) + (frame) + Lisp_Object frame; +{ + FRAME_PTR f; + + if (NILP (frame)) + frame = selected_frame; + + CHECK_FRAME (frame); + f = XFRAME (frame); + + if (!FRAME_LIVE_P (f)) + return Qnil; + + return window_tree (XWINDOW (FRAME_ROOT_WINDOW (f))); +} + /*********************************************************************** Marginal Areas @@ -7037,6 +7113,7 @@ The selected frame is the one whose configuration has changed. */); defsubr (&Sset_window_configuration); defsubr (&Scurrent_window_configuration); defsubr (&Ssave_window_excursion); + defsubr (&Swindow_tree); defsubr (&Sset_window_margins); defsubr (&Swindow_margins); defsubr (&Sset_window_fringes);