diff options
| author | Martin Rudalics | 2014-07-27 15:21:30 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2014-07-27 15:21:30 +0200 |
| commit | 3477e27021dbe9366c3c1aaba80feb72f1138b29 (patch) | |
| tree | c1ebfb6695e8d7f90ddad1a5bfaaf353be677514 /src/window.h | |
| parent | 11fb71017b03f01a7e9e2db24973e756a41e16ec (diff) | |
| download | emacs-3477e27021dbe9366c3c1aaba80feb72f1138b29.tar.gz emacs-3477e27021dbe9366c3c1aaba80feb72f1138b29.zip | |
Complete pixelwise frame/window resizing, add horizontal scrollbar support.
* frame.el (frame-notice-user-settings): Rewrite using
frame-initial-frame-tool-bar-height.
* menu-bar.el (menu-bar-horizontal-scroll-bar)
(menu-bar-no-horizontal-scroll-bar): New functions.
(menu-bar-showhide-scroll-bar-menu): Add bindings for horizontal
scroll bars.
* scroll-bar.el (scroll-bar-lines)
(set-horizontal-scroll-bar-mode)
(get-horizontal-scroll-bar-mode, horizontal-scroll-bar-mode)
(scroll-bar-horizontal-drag-1, scroll-bar-horizontal-drag)
(scroll-bar-toolkit-horizontal-scroll): New functions.
(horizontal-scroll-bar-mode)
(previous-horizontal-scroll-bar-mode)
(horizontal-scroll-bar-mode-explicit): New variables.
(horizontal-scroll-bar-mode): New option.
(toggle-horizontal-scroll-bar): Do something.
(top-level): Bind horizontal-scroll-bar mouse-1.
* startup.el (tool-bar-originally-present): Remove variable.
(command-line): Don't set tool-bar-originally-present.
* window.el (window-min-height): Update doc-string.
(window--dump-frame): Dump horizontal scroll bar values.
(window--min-size-1): Handle minibuffer window separately.
Count in margins and horizontal scroll bar. Return safe value
iff IGNORE equals 'safe.
(frame-windows-min-size): New function (used by frame resizing
routines).
(fit-frame-to-buffer, fit-window-to-buffer): Count in horizontal
scroll bars.
(window--sanitize-window-sizes): New function.
(window-split-min-size): Remove.
(split-window): Count divider-width. Don't use
`window-split-min-size' any more. Reword error messages.
Sanitize windows sizes after splitting.
* buffer.h (struct buffer): New fields scroll_bar_height and
horizontal_scroll_bar_type.
* buffer.c (bset_scroll_bar_height)
(bset_horizontal_scroll_bar_type): New functions.
(Fbuffer_swap_text): Handle old_pointm field.
(init_buffer_once): Set defaults for scroll_bar_height and
horizontal_scroll_bar_type.
(syms_of_buffer): New variables scroll_bar_height and
horizontal_scroll_bar_type.
* dispextern.h (window_part): Rename ON_SCROLL_BAR to
ON_VERTICAL_SCROLL_BAR. Add ON_HORIZONTAL_SCROLL_BAR.
(set_vertical_scroll_bar): Remove prototype.
(x_change_tool_bar_height): Add prototype.
* dispnew.c (adjust_frame_glyphs_for_frame_redisplay)
(window_to_frame_vpos, update_frame_1, scrolling, init_display):
Use FRAME_TOTAL_COLS and FRAME_TOTAL_LINES instead of FRAME_COLS
and FRAME_LINES.
(adjust_frame_glyphs_for_window_redisplay): Rearrange lines.
(update_window): Start mode_line_row->y after horizontal scroll
bar.
(change_frame_size_1): Call adjust_frame_size.
(init_display): When changing the size of a tty frame do not
pass height of menu bar.
(Qframe_windows_min_size): New symbol.
* frame.h (struct frame): List tool bar fields after menu bar
fields. Add official, total_lines, horizontal_scroll_bars,
config_scroll_bar_height and config_scroll_bar_lines fields.
(FRAME_HAS_HORIZONTAL_SCROLL_BARS)
(FRAME_CONFIG_SCROLL_BAR_HEIGHT, FRAME_CONFIG_SCROLL_BAR_LINES)
(FRAME_SCROLL_BAR_AREA_HEIGHT, FRAME_SCROLL_BAR_COLS)
(FRAME_SCROLL_BAR_LINES, FRAME_TOTAL_LINES, SET_FRAME_LINES)
(FRAME_WINDOWS_HEIGHT): New macros.
(SET_FRAME_HEIGHT, FRAME_TEXT_LINES_TO_PIXEL_HEIGHT)
(FRAME_PIXEL_Y_TO_LINE, FRAME_PIXEL_HEIGHT_TO_TEXT_LINES)
(FRAME_TEXT_TO_PIXEL_HEIGHT): Separately count top margin and
horizontal scroll bar.
(frame_inhibit_resize, adjust_frame_size)
(frame_windows_min_size): Add declarations.
(Qscroll_bar_height, Qhorizontal_scroll_bars)
(x_set_scroll_bar_default_height, x_set_left_fringe)
(x_set_right_fringe, x_set_vertical_scroll_bars)
(x_set_horizontal_scroll_bars, x_set_scroll_bar_width)
(x_set_scroll_bar_height): Add external declarations.
* frame.c: (frame_inhibit_resize, frame_windows_min_size)
(adjust_frame_size): New functions.
(make_frame): Initial horizontal_scroll_bars field. Use
SET_FRAME_LINES. Don't allow horizontal scroll bar in
minibuffer window.
(make_initial_frame, make_terminal_frame): No horizontal scroll
bar in initial and terminal frames. Use adjust_frame_size.
(Fframe_total_cols): Fix doc-string.
(Fframe_total_lines, Fscroll_bar_height): New Lisp functions.
(Fset_frame_height, Fset_frame_width, Fset_frame_size): Rewrite
using adjust_frame_size.
(Qscroll_bar_height, Qhorizontal_scroll_bars)
(Qframe_windows_min_size): New symbols.
(x_set_frame_parameters): Remove call of check_frame_size.
(x_report_frame_params): Return scroll_bar_height value.
(x_set_left_fringe, x_set_right_fringe): New functions.
(adjust_frame_height, x_set_internal_border_width)
(x_set_fringe_width): Remove.
(x_set_internal_border_width, x_set_vertical_scroll_bars)
(x_set_scroll_bar_width, x_set_right_divider_width)
(x_set_bottom_divider_width): Rewrite using adjust_frame_size.
(x_set_horizontal_scroll_bars, x_set_scroll_bar_height): New
functions.
(x_figure_window_size): Rewrite to make frame display the
expected number of lines.
(Vdefault_frame_scroll_bars): Rewrite doc-string.
(Vdefault_frame_horizontal_scroll_bars)
(Vframe_initial_frame_tool_bar_height)
(frame_inhibit_implied_resize): New variables.
* fringe.c (compute_fringe_widths): Remove.
* gtkutil.h (YG_SB_MIN, YG_SB_MAX, YG_SB_RANGE): Define.
(xg_create_horizontal_scroll_bar)
(xg_update_horizontal_scrollbar_pos)
(xg_set_toolkit_horizontal_scroll_bar_thumb)
(xg_get_default_scrollbar_height)
(xg_clear_under_internal_border): Extern.
* gtkutil.c (xg_frame_resized): Don't call
do_pending_window_change.
(xg_frame_set_char_size): Use adjust_frame_size.
(style_changed_cb): Call update_theme_scrollbar_height and
x_set_scroll_bar_default_height.
(x_wm_set_size_hint): Don't call check_frame_size.
(update_theme_scrollbar_height)
(xg_get_default_scrollbar_height)
(xg_create_horizontal_scroll_bar)
(xg_update_horizontal_scrollbar_pos)
(xg_set_toolkit_horizontal_scroll_bar_thumb): New functions.
(xg_create_scroll_bar): Set horizontal slot of bar.
(xg_initialize): Call update_theme_scrollbar_height.
(xg_clear_under_internal_border): No more static.
* insdel.c (adjust_suspend_auto_hscroll): New function.
(adjust_markers_for_delete, adjust_markers_for_insert)
(adjust_markers_for_replace): Call adjust_suspend_auto_hscroll.
* keyboard.c (readable_events, discard_mouse_events)
(make_lispy_event): Handle horizontal scroll bar click events.
(Fsuspend_emacs): When changing the size of a tty frame do not
pass height of menu bar.
(Qbefore_handle, Qhorizontal_handle, Qafter_handle, Qleft)
(Qright, Qleftmost, Qrightmost): New symbols.
* menu.c (Fx_popup_dialog): Use FRAME_TOTAL_LINES instead of
FRAME_LINES.
* minibuf.c (read_minibuf): Initialize suspend_auto_hscroll.
* nsfns.m (x_set_internal_border_width): New function.
* nsterm.m (ns_draw_fringe_bitmap, ns_set_vertical_scroll_bar):
Remove extended fringe code.
(x_set_window_size, x_new_font): Don't call
compute_fringe_widths.
* term.c (Fresume_tty): When changing the size of a tty frame do
not pass height of menu bar.
(clear_tty_hooks, set_tty_hooks): Clear
horizontal_scroll_bar_hook.
(init_tty): Frame has no horizontal scroll bars.
* termhooks.h (enum scroll_bar_part): Add scroll_bar_move_ratio,
scroll_bar_before_handle, scroll_bar_horizontal_handle,
scroll_bar_after_handle, scroll_bar_left_arrow,
scroll_bar_right_arrow, scroll_bar_to_leftmost and
scroll_bar_to_rightmost entries.
(enum event_kind): Add HORIZONTAL_SCROLL_BAR_CLICK_EVENT
(struct terminal): Add set_horizontal_scroll_bar_hook.
* w32console.c (initialize_w32_display): Clear
horizontal_scroll_bar_hook.
* w32fns.c (x_set_mouse_color): Use FRAME_W32_DISPLAY instead of
FRAME_X_DISPLAY.
(x_clear_under_internal_border, x_set_internal_border_width):
New functions.
(x_set_menu_bar_lines): Rewrite using frame_inhibit_resize. Set
windows_or_buffers_changed when adding the menu bar.
(x_set_tool_bar_lines): Rewrite using adjust_frame_size.
(x_change_tool_bar_height, x_set_scroll_bar_default_height)
(w32_createhscrollbar): New functions.
(w32_createscrollbar): Rename to w32_createvscrollbar.
(w32_createwindow): Init WND_HSCROLLBAR_INDEX.
(w32_name_of_message): Replace WM_EMACS_CREATESCROLLBAR by
WM_EMACS_CREATEVSCROLLBAR and WM_EMACS_CREATEHSCROLLBAR. Add
WM_EMACS_SHOWCURSOR.
(w32_wnd_proc): Handle WM_HSCROLL case. In WM_WINDOWPOSCHANGING
case do not artificially impose WM size hints. Handle
WM_EMACS_SHOWCURSOR case. Replace WM_EMACS_CREATESCROLLBAR case
by WM_EMACS_CREATEVSCROLLBAR and WM_EMACS_CREATEHSCROLLBAR
cases.
(my_create_tip_window): Replace WND_SCROLLBAR_INDEX by
WND_VSCROLLBAR_INDEX and WND_HSCROLLBAR_INDEX.
(unwind_create_frame_1): Remove.
(Fx_create_frame): Make both scrollbars the system standard
width and height. Use official field of frame structure to
inhibit running window-configuration-change-hook.
(x_create_tip_frame): Call SET_FRAME_LINES and change_frame_size
pixelwise. Handle frame's official field.
(w32_frame_parm_handlers): Remove x_set_fringe_width
entries. Add x_set_scroll_bar_height,
x_set_horizontal_scroll_bars, x_set_left_fringe and
x_set_right_fringe.
* w32inevt.c (resize_event, maybe_generate_resize_event): Do not
pass height of menu bar to change_frame_size.
* w32menu.c (set_frame_menubar): Rewrite using
frame_inhibit_resize.
* w32term.h (struct w32_display_info): Add
horizontal_scroll_bar_cursor and cursor_display_counter.
(struct scroll_bar): Add horizontal.
(HORIZONTAL_SCROLL_BAR_INSIDE_HEIGHT)
(HORIZONTAL_SCROLL_BAR_LEFT_RANGE)
(HORIZONTAL_SCROLL_BAR_INSIDE_WIDTH)
(HORIZONTAL_SCROLL_BAR_LEFT_BORDER)
(HORIZONTAL_SCROLL_BAR_RIGHT_BORDER)
(HORIZONTAL_SCROLL_BAR_TOP_BORDER)
(HORIZONTAL_SCROLL_BAR_BOTTOM_BORDER)
(HORIZONTAL_SCROLL_BAR_MIN_HANDLE): New macros.
(WM_EMACS_CREATEVSCROLLBAR, WM_EMACS_CREATEHSCROLLBAR): Define
instead of WM_EMACS_CREATESCROLLBAR.
(WND_VSCROLLBAR_INDEX, WND_HSCROLLBAR_INDEX): Define instead of
WND_SCROLLBAR_INDEX.
* w32term.c (horizontal_scroll_bar_min_handle)
(horizontal_scroll_bar_left_border)
(horizontal_scroll_bar_right_border): New integers.
(x_set_frame_alpha): Replace x_highlight_frame by
w32_focus_frame.
(x_window_to_scroll_bar): New argument "type". Update callers
accordingly.
(w32_set_horizontal_scroll_bar_thumb)
(x_horizontal_scroll_bar_report_motion)
(w32_set_horizontal_scroll_bar)
(w32_horizontal_scroll_bar_handle_click)
(x_horizontal_scroll_bar_report_motion): New functions.
(w32_mouse_position): Discriminate horizontal and vertical
scrollbar cases.
(my_create_scrollbar): Replace with two new functions
my_create_vscrollbar and my_create_hscrollbar.
(x_scroll_bar_create): New argument "horizontal". Update
callers accordingly.
(x_scroll_bar_remove, w32_condemn_scroll_bars)
(w32_redeem_scroll_bar, x_scroll_bar_clear): Handle horizontal
scroll bar case.
(w32_read_socket): Handle WM_HSCROLL cae.
(x_new_font): Don't recompute fringe widths. Use
frame_inhibit_resize. Calculate new menu bar height iff we
build without toolkit. Always clear under internal border.
(x_set_window_size): Don't check frame size or recompute
fringes. Reset fullscreen status before applying sizes. Always
resize as requested by pixelwise argument. Don't call
do_pending_window_change.
(x_wm_set_size_hint): Add call for FRAME_SCROLL_BAR_AREA_HEIGHT.
(w32_initialize_display_info): Initialize dpyinfo's
horizontal_scroll_bar_cursor entry.
(w32_create_terminal): Add set_horizontal_scroll_bar_hook.
(w32_initialize): Init horizontal_scroll_bar_min_handle and
horizontal_scroll_bar_left_border.
(w32fullscreen_hook): Intermittently resize window to normal
when switching from fullscreen to maximized state.
(run_window_configuration_change_hook): Don't run it if frame is
not official yet.
(unwind_change_frame): Remove.
(Fset_window_configuration): Rewrite using frame's official field.
* widget.c (set_frame_size): Don't call compute_fringe_widths.
(EmacsFrameSetCharSize): Obey frame_inhibit_resize.
* window.h (struct window): New fields old_pointm,
horizontal_scroll_bar, horizontal_scroll_bar_type, hscroll_whole,
scroll_bar_height and suspend_auto_hscroll.
(wset_horizontal_scroll_bar, wset_horizontal_scroll_bar_type):
New functions.
(sanitize_window_sizes): Extern.
(MINI_NON_ONLY_WINDOW_P, MINI_ONLY_WINDOW_P, WINDOW_PSEUDO_P)
(WINDOW_TOPMOST_P, WINDOW_HAS_HORIZONTAL_SCROLL_BAR)
(WINDOW_CONFIG_SCROLL_BAR_HEIGHT)
(WINDOW_CONFIG_SCROLL_BAR_LINES)
(WINDOW_SCROLL_BAR_LINES, WINDOW_SCROLL_BAR_AREA_HEIGHT): New
macros.
(WINDOW_LEFT_FRINGE_COLS, WINDOW_RIGHT_FRINGE_COLS)
(WINDOW_FRINGE_COLS, WINDOW_FRINGE_EXTENDED_P): Remove macros.
(WINDOW_VERTICAL_SCROLL_BAR_TYPE)
(WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT)
(WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT)
(WINDOW_HAS_VERTICAL_SCROLL_BAR): Minor rewrite.
(WINDOW_BOX_HEIGHT_NO_MODE_LINE, WINDOW_BOX_TEXT_HEIGHT)
(WINDOW_SCROLL_BAR_AREA_Y): Count in scroll bar height.
* window.c (wset_old_pointm, Fwindow_scroll_bar_height)
(Fwindow_old_point, sanitize_window_sizes): New functions.
(Qwindow_sanitize_window_sizes): New symbol.
(window_body_height): Count in horizontal scroll bar.
(set_window_hscroll, Fscroll_left, Fscroll_right): Set
suspend_auto_hscroll slot.
(Fwindow_inside_edges): Count fringes pixelwise.
(coordinates_in_window, Fcoordinates_in_window_p): Consider
horizontal scroll bar.
(check_frame_size, adjust_window_margins): Remove functions and
corresponding calls.
(set_window_buffer): Initialize old_pointm and horizontal scroll
bars.
(temp_output_buffer_show): Reset hscroll related fields.
Initialize old_pointm.
(make_parent_window): Initialize old_pointm.
(make_window): Initialize old_pointm, horizontal scroll bar type,
and scroll bar height.
(resize_frame_windows): Don't count top margin in new sizes.
Don't use safe sizes when shrinking a frame; let the window
manager do the clipping.
(Fsplit_window_internal): Inherit horizontal scroll bar type and
height.
(Fdelete_window_internal): Unchain old_pointm marker.
(window_scroll_pixel_based, Fscroll_other_window): Adjust
old_pointm.
(Fwindow_text_width, Fwindow_text_height): New argument
"pixelwise".
(struct saved_window): New fields, old_pointm, hscroll_whole,
suspend_auto_hscroll, scroll_bar_height and
horizontal_scroll_bar_type.
(Fset_window_configuration, save_window_save): Set new fields of
saved_window.
(apply_window_adjustment): Don't call adjust_window_margins.
(set_window_margins): Don't change margins if new sizes don't
fit into window.
(set_window_scroll_bars): New argument "horizontal_type".
Handle horizontal scroll bars. Don't change scroll bars if they
don't fit into window.
(Fset_window_scroll_bars): New argument "horizontal_type".
(Fwindow_scroll_bars): Return values for horizontal scroll bars.
(compare_window_configurations): Compare horizontal scroll bar
settings.
* xdisp.c (window_text_bottom_y, window_box_height): Count in
horizontal scroll bar height.
(pixel_to_glyph_coords, init_xdisp): Use FRAME_TOTAL_LINES
instead of FRAME_LINES.
(remember_mouse_glyph): Case ON_SCROLL_BAR changed to
ON_VERTICAL_SCROLL_BAR.
(with_echo_area_buffer): Initialize old_pointm.
(with_echo_area_buffer_unwind_data): Store old_pointm values in
vector.
(unwind_with_echo_area_buffer): Handle old_pointm.
(update_tool_bar): Set do_update when the tool bar window has at
least one line (since this is what the user sets).
(MAX_FRAME_TOOL_BAR_HEIGHT): Remove macro.
(redisplay_tool_bar): Return early when toolbar has zero lines.
Call x_change_tool_bar_height. Don't use max_tool_bar_height.
(hscroll_window_tree): Handle suspension of auto_hscroll and
old_pointm.
(set_horizontal_scroll_bar): New function.
(redisplay_window): Set ignore_mouse_drag_p when tool bar has
more than one line. Handle horizontal scroll bars.
(note_mouse_highlight): Handle horizontal scrol bars.
(expose_frame): Set dimensions of XRectangle from frame's text
sizes.
(Vvoid_text_area_pointer): Update doc-string.
* xfns.c (x_set_menu_bar_lines): Use adjust_frame_size.
(x_change_tool_bar_height, x_set_scroll_bar_default_height)
(x_set_internal_border_width): New functions.
(x_set_tool_bar_lines): Call x_change_tool_bar_height.
(unwind_create_frame_1): Remove.
(Fx_create_frame): Handle horizontal scroll bars. Use official
field of frame structure to inhibit running
window-configuration-change-hook.
(x_create_tip_frame): Call SET_FRAME_LINES and change_frame_size
pixelwise. Handle frame's official field.
(x_frame_parm_handlers): Add x_set_scroll_bar_height,
x_set_horizontal_scroll_bars, x_set_left_fringe,
x_set_right_fringe.
* xmenu.c (update_frame_menubar, free_frame_menubar): Use
adjust_frame_size.
* xterm.h (struct x_display_info): Add
horizontal_scroll_bar_cursor and Xatom_Horizontal_Scrollbar
slots.
(struct scroll_bar): Add horizontal slot.
(HORIZONTAL_SCROLL_BAR_INSIDE_HEIGHT)
(HORIZONTAL_SCROLL_BAR_LEFT_RANGE)
(HORIZONTAL_SCROLL_BAR_INSIDE_WIDTH): New macros.
(HORIZONTAL_SCROLL_BAR_LEFT_BORDER)
(HORIZONTAL_SCROLL_BAR_RIGHT_BORDER)
(HORIZONTAL_SCROLL_BAR_TOP_BORDER)
(HORIZONTAL_SCROLL_BAR_BOTTOM_BORDER)
(HORIZONTAL_SCROLL_BAR_MIN_HANDLE): Define.
(x_clear_under_internal_border): Remove.
* xterm.c (XTmouse_position): Handle horizontal scroll bars.
(x_window_to_scroll_bar): New argument TYPE. Update callers.
(x_send_scroll_bar_event, x_scroll_bar_create): New arguments
HORIZONTAL. Update callers.
(horizontal_action_hook_id): New action hook id.
(x_horizontal_scroll_bar_to_input_event)
(x_create_horizontal_toolkit_scroll_bar)
(xt_horizontal_action_hook)
(x_set_toolkit_horizontal_scroll_bar_thumb)
(XTset_horizontal_scroll_bar, x_net_wm_state)
(x_horizontal_scroll_bar_report_motion): New functions.
(xg_scroll_callback, x_scroll_bar_handle_click): Handle
horizontal scroll bars.
(SCROLL_BAR_HORIZONTAL_NAME): Define.
(XTset_vertical_scroll_bar): Attempt to clear areas not covered
by scroll bar.
(XTcondemn_scroll_bars, XTredeem_scroll_bar): Rewrite. Handle
horizontal scroll bars.
(handle_one_xevent): Handle horizontal scroll bar events. Call
x_net_wm_state.
(x_set_window_size_1, x_wm_set_size_hint): Don't call
check_frame_size.
(x_set_window_size): Don't call check_frame_size and
do_pending_window_change.
(x_term_init): Init horizontal_scroll_bar_cursor display info.
(x_create_terminal): Add set_horizontal_scroll_bar_hook.
(x_scroll_bar_set_handle): Add some checks when calling
x_clear_area.
Diffstat (limited to 'src/window.h')
| -rw-r--r-- | src/window.h | 297 |
1 files changed, 182 insertions, 115 deletions
diff --git a/src/window.h b/src/window.h index b9c2b1f5ba8..cdf8da93138 100644 --- a/src/window.h +++ b/src/window.h | |||
| @@ -128,21 +128,37 @@ struct window | |||
| 128 | each one can have its own value of point. */ | 128 | each one can have its own value of point. */ |
| 129 | Lisp_Object pointm; | 129 | Lisp_Object pointm; |
| 130 | 130 | ||
| 131 | /* A marker pointing to where in the text point was in this window | ||
| 132 | at the time of last redisplay. The value is saved for the | ||
| 133 | selected window too. */ | ||
| 134 | Lisp_Object old_pointm; | ||
| 135 | |||
| 131 | /* No permanent meaning; used by save-window-excursion's | 136 | /* No permanent meaning; used by save-window-excursion's |
| 132 | bookkeeping. */ | 137 | bookkeeping. */ |
| 133 | Lisp_Object temslot; | 138 | Lisp_Object temslot; |
| 134 | 139 | ||
| 135 | /* This window's vertical scroll bar. This field is only for use | 140 | /* This window's vertical scroll bar. This field is only for use by |
| 136 | by the window-system-dependent code which implements the | 141 | the window-system-dependent code which implements the scroll |
| 137 | scroll bars; it can store anything it likes here. If this | 142 | bars; it can store anything it likes here. If this window is |
| 138 | window is newly created and we haven't displayed a scroll bar in | 143 | newly created and we haven't displayed a scroll bar in it yet, or |
| 139 | it yet, or if the frame doesn't have any scroll bars, this is nil. */ | 144 | if the frame doesn't have any scroll bars, this is nil. */ |
| 140 | Lisp_Object vertical_scroll_bar; | 145 | Lisp_Object vertical_scroll_bar; |
| 141 | 146 | ||
| 142 | /* Type of vertical scroll bar. A value of nil means | 147 | /* Type of vertical scroll bar. A value of nil means |
| 143 | no scroll bar. A value of t means use frame value. */ | 148 | no scroll bar. A value of t means use frame value. */ |
| 144 | Lisp_Object vertical_scroll_bar_type; | 149 | Lisp_Object vertical_scroll_bar_type; |
| 145 | 150 | ||
| 151 | /* This window's horizontal scroll bar. This field is only for use | ||
| 152 | by the window-system-dependent code which implements the scroll | ||
| 153 | bars; it can store anything it likes here. If this window is | ||
| 154 | newly created and we haven't displayed a scroll bar in it yet, or | ||
| 155 | if the frame doesn't have any scroll bars, this is nil. */ | ||
| 156 | Lisp_Object horizontal_scroll_bar; | ||
| 157 | |||
| 158 | /* Type of horizontal scroll bar. A value of nil means | ||
| 159 | no scroll bar. A value of t means use frame value. */ | ||
| 160 | Lisp_Object horizontal_scroll_bar_type; | ||
| 161 | |||
| 146 | /* Display-table to use for displaying chars in this window. | 162 | /* Display-table to use for displaying chars in this window. |
| 147 | Nil means use the buffer's own display-table. */ | 163 | Nil means use the buffer's own display-table. */ |
| 148 | Lisp_Object display_table; | 164 | Lisp_Object display_table; |
| @@ -209,6 +225,10 @@ struct window | |||
| 209 | the user has set, by set-window-hscroll for example. */ | 225 | the user has set, by set-window-hscroll for example. */ |
| 210 | ptrdiff_t min_hscroll; | 226 | ptrdiff_t min_hscroll; |
| 211 | 227 | ||
| 228 | /* Maximum line length in pixels within window bound by size of | ||
| 229 | window (set up by set_horizontal_scroll_bar). */ | ||
| 230 | ptrdiff_t hscroll_whole; | ||
| 231 | |||
| 212 | /* Displayed buffer's text modification events counter as of last time | 232 | /* Displayed buffer's text modification events counter as of last time |
| 213 | display completed. */ | 233 | display completed. */ |
| 214 | EMACS_INT last_modified; | 234 | EMACS_INT last_modified; |
| @@ -282,6 +302,10 @@ struct window | |||
| 282 | A value of -1 means use frame values. */ | 302 | A value of -1 means use frame values. */ |
| 283 | int scroll_bar_width; | 303 | int scroll_bar_width; |
| 284 | 304 | ||
| 305 | /* Pixel height of scroll bars. | ||
| 306 | A value of -1 means use frame values. */ | ||
| 307 | int scroll_bar_height; | ||
| 308 | |||
| 285 | /* Effective height of the mode line, or -1 if not known. */ | 309 | /* Effective height of the mode line, or -1 if not known. */ |
| 286 | int mode_line_height; | 310 | int mode_line_height; |
| 287 | 311 | ||
| @@ -355,6 +379,10 @@ struct window | |||
| 355 | /* True if it needs to be redisplayed. */ | 379 | /* True if it needs to be redisplayed. */ |
| 356 | bool_bf redisplay : 1; | 380 | bool_bf redisplay : 1; |
| 357 | 381 | ||
| 382 | /* True if auto hscrolling is currently suspended in this | ||
| 383 | window. */ | ||
| 384 | bool_bf suspend_auto_hscroll : 1; | ||
| 385 | |||
| 358 | /* Amount by which lines of this window are scrolled in | 386 | /* Amount by which lines of this window are scrolled in |
| 359 | y-direction (smooth scrolling). */ | 387 | y-direction (smooth scrolling). */ |
| 360 | int vscroll; | 388 | int vscroll; |
| @@ -403,6 +431,18 @@ wset_vertical_scroll_bar (struct window *w, Lisp_Object val) | |||
| 403 | } | 431 | } |
| 404 | 432 | ||
| 405 | INLINE void | 433 | INLINE void |
| 434 | wset_horizontal_scroll_bar (struct window *w, Lisp_Object val) | ||
| 435 | { | ||
| 436 | w->horizontal_scroll_bar = val; | ||
| 437 | } | ||
| 438 | |||
| 439 | INLINE void | ||
| 440 | wset_horizontal_scroll_bar_type (struct window *w, Lisp_Object val) | ||
| 441 | { | ||
| 442 | w->horizontal_scroll_bar_type = val; | ||
| 443 | } | ||
| 444 | |||
| 445 | INLINE void | ||
| 406 | wset_prev_buffers (struct window *w, Lisp_Object val) | 446 | wset_prev_buffers (struct window *w, Lisp_Object val) |
| 407 | { | 447 | { |
| 408 | w->prev_buffers = val; | 448 | w->prev_buffers = val; |
| @@ -415,8 +455,17 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 415 | } | 455 | } |
| 416 | 456 | ||
| 417 | /* True if W is a minibuffer window. */ | 457 | /* True if W is a minibuffer window. */ |
| 458 | #define MINI_WINDOW_P(W) ((W)->mini) | ||
| 418 | 459 | ||
| 419 | #define MINI_WINDOW_P(W) ((W)->mini) | 460 | /* 1 if W is a non-only minibuffer window. */ |
| 461 | /* The first check is redundant and the second overly complicated. */ | ||
| 462 | #define MINI_NON_ONLY_WINDOW_P(W) \ | ||
| 463 | (MINI_WINDOW_P (W) \ | ||
| 464 | && (EQ (W->prev, FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))) | ||
| 465 | |||
| 466 | /* 1 if W is a minibuffer-only window. */ | ||
| 467 | #define MINI_ONLY_WINDOW_P(W) \ | ||
| 468 | (MINI_WINDOW_P (W) && NILP (W->prev)) | ||
| 420 | 469 | ||
| 421 | /* General window layout: | 470 | /* General window layout: |
| 422 | 471 | ||
| @@ -460,16 +509,17 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 460 | #define WINDOW_VERTICAL_COMBINATION_P(W) \ | 509 | #define WINDOW_VERTICAL_COMBINATION_P(W) \ |
| 461 | (WINDOWP ((W)->contents) && !(W)->horizontal) | 510 | (WINDOWP ((W)->contents) && !(W)->horizontal) |
| 462 | 511 | ||
| 463 | #define WINDOW_XFRAME(W) \ | 512 | /* WINDOW's XFRAME. */ |
| 464 | (XFRAME (WINDOW_FRAME ((W)))) | 513 | #define WINDOW_XFRAME(W) (XFRAME (WINDOW_FRAME ((W)))) |
| 465 | 514 | ||
| 466 | /* Return the canonical column width of the frame of window W. */ | 515 | /* Whether WINDOW is a pseudo window. */ |
| 516 | #define WINDOW_PSEUDO_P(W) ((W)->pseudo_window_p) | ||
| 467 | 517 | ||
| 518 | /* Return the canonical column width of the frame of window W. */ | ||
| 468 | #define WINDOW_FRAME_COLUMN_WIDTH(W) \ | 519 | #define WINDOW_FRAME_COLUMN_WIDTH(W) \ |
| 469 | (FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W)))) | 520 | (FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W)))) |
| 470 | 521 | ||
| 471 | /* Return the canonical column width of the frame of window W. */ | 522 | /* Return the canonical column width of the frame of window W. */ |
| 472 | |||
| 473 | #define WINDOW_FRAME_LINE_HEIGHT(W) \ | 523 | #define WINDOW_FRAME_LINE_HEIGHT(W) \ |
| 474 | (FRAME_LINE_HEIGHT (WINDOW_XFRAME ((W)))) | 524 | (FRAME_LINE_HEIGHT (WINDOW_XFRAME ((W)))) |
| 475 | 525 | ||
| @@ -613,6 +663,10 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 613 | #define WINDOW_LEFTMOST_P(W) \ | 663 | #define WINDOW_LEFTMOST_P(W) \ |
| 614 | (WINDOW_LEFT_PIXEL_EDGE (W) == 0) | 664 | (WINDOW_LEFT_PIXEL_EDGE (W) == 0) |
| 615 | 665 | ||
| 666 | /* True if window W's has no other windows above in its frame. */ | ||
| 667 | #define WINDOW_TOPMOST_P(W) \ | ||
| 668 | (WINDOW_TOP_PIXEL_EDGE (W) == 0) | ||
| 669 | |||
| 616 | /* True if window W's has no other windows to its right in its frame. */ | 670 | /* True if window W's has no other windows to its right in its frame. */ |
| 617 | #define WINDOW_RIGHTMOST_P(W) \ | 671 | #define WINDOW_RIGHTMOST_P(W) \ |
| 618 | (WINDOW_RIGHT_PIXEL_EDGE (W) \ | 672 | (WINDOW_RIGHT_PIXEL_EDGE (W) \ |
| @@ -629,7 +683,6 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 629 | /* Return the frame column at which the text (or left fringe) in | 683 | /* Return the frame column at which the text (or left fringe) in |
| 630 | window W starts. This is different from the `LEFT_EDGE' because it | 684 | window W starts. This is different from the `LEFT_EDGE' because it |
| 631 | does not include a left-hand scroll bar if any. */ | 685 | does not include a left-hand scroll bar if any. */ |
| 632 | |||
| 633 | #define WINDOW_BOX_LEFT_EDGE_COL(W) \ | 686 | #define WINDOW_BOX_LEFT_EDGE_COL(W) \ |
| 634 | (WINDOW_LEFT_EDGE_COL (W) \ | 687 | (WINDOW_LEFT_EDGE_COL (W) \ |
| 635 | + WINDOW_LEFT_SCROLL_BAR_COLS (W)) | 688 | + WINDOW_LEFT_SCROLL_BAR_COLS (W)) |
| @@ -644,7 +697,6 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 644 | /* Return the window column before which the text in window W ends. | 697 | /* Return the window column before which the text in window W ends. |
| 645 | This is different from WINDOW_RIGHT_EDGE_COL because it does not | 698 | This is different from WINDOW_RIGHT_EDGE_COL because it does not |
| 646 | include a scroll bar or window-separating line on the right edge. */ | 699 | include a scroll bar or window-separating line on the right edge. */ |
| 647 | |||
| 648 | #define WINDOW_BOX_RIGHT_EDGE_COL(W) \ | 700 | #define WINDOW_BOX_RIGHT_EDGE_COL(W) \ |
| 649 | (WINDOW_RIGHT_EDGE_COL (W) \ | 701 | (WINDOW_RIGHT_EDGE_COL (W) \ |
| 650 | - WINDOW_RIGHT_SCROLL_BAR_COLS (W)) | 702 | - WINDOW_RIGHT_SCROLL_BAR_COLS (W)) |
| @@ -706,114 +758,108 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 706 | #define WINDOW_FRINGES_WIDTH(W) \ | 758 | #define WINDOW_FRINGES_WIDTH(W) \ |
| 707 | (WINDOW_LEFT_FRINGE_WIDTH (W) + WINDOW_RIGHT_FRINGE_WIDTH (W)) | 759 | (WINDOW_LEFT_FRINGE_WIDTH (W) + WINDOW_RIGHT_FRINGE_WIDTH (W)) |
| 708 | 760 | ||
| 709 | /* Widths of fringes in columns. */ | ||
| 710 | #define WINDOW_FRINGE_COLS(W) \ | ||
| 711 | ((W->left_fringe_width >= 0 \ | ||
| 712 | && W->right_fringe_width >= 0) \ | ||
| 713 | ? ((WINDOW_FRINGES_WIDTH (W) \ | ||
| 714 | + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ | ||
| 715 | / WINDOW_FRAME_COLUMN_WIDTH (W)) \ | ||
| 716 | : FRAME_FRINGE_COLS (WINDOW_XFRAME (W))) | ||
| 717 | |||
| 718 | #define WINDOW_LEFT_FRINGE_COLS(W) \ | ||
| 719 | ((WINDOW_LEFT_FRINGE_WIDTH ((W)) \ | ||
| 720 | + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ | ||
| 721 | / WINDOW_FRAME_COLUMN_WIDTH (W)) | ||
| 722 | |||
| 723 | #define WINDOW_RIGHT_FRINGE_COLS(W) \ | ||
| 724 | ((WINDOW_RIGHT_FRINGE_WIDTH ((W)) \ | ||
| 725 | + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ | ||
| 726 | / WINDOW_FRAME_COLUMN_WIDTH (W)) | ||
| 727 | |||
| 728 | /* Are fringes outside display margins in window W. */ | 761 | /* Are fringes outside display margins in window W. */ |
| 729 | #define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W) \ | 762 | #define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W) \ |
| 730 | ((W)->fringes_outside_margins) | 763 | ((W)->fringes_outside_margins) |
| 731 | 764 | ||
| 732 | /* Say whether scroll bars are currently enabled for window W, | 765 | /* Say whether vertical scroll bars are currently enabled for window W, |
| 733 | and which side they are on. */ | 766 | and which side they are on. */ |
| 734 | #define WINDOW_VERTICAL_SCROLL_BAR_TYPE(w) \ | 767 | #define WINDOW_VERTICAL_SCROLL_BAR_TYPE(W) \ |
| 735 | (EQ (w->vertical_scroll_bar_type, Qt) \ | 768 | (WINDOW_PSEUDO_P (W) \ |
| 736 | ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (w)) \ | 769 | ? vertical_scroll_bar_none \ |
| 737 | : EQ (w->vertical_scroll_bar_type, Qleft) \ | 770 | : EQ (W->vertical_scroll_bar_type, Qt) \ |
| 771 | ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (W)) \ | ||
| 772 | : EQ (W->vertical_scroll_bar_type, Qleft) \ | ||
| 738 | ? vertical_scroll_bar_left \ | 773 | ? vertical_scroll_bar_left \ |
| 739 | : EQ (w->vertical_scroll_bar_type, Qright) \ | 774 | : EQ (W->vertical_scroll_bar_type, Qright) \ |
| 740 | ? vertical_scroll_bar_right \ | 775 | ? vertical_scroll_bar_right \ |
| 741 | : vertical_scroll_bar_none) \ | 776 | : vertical_scroll_bar_none) |
| 742 | 777 | ||
| 743 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR(w) \ | 778 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(W) \ |
| 744 | (EQ (w->vertical_scroll_bar_type, Qt) \ | 779 | (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_left) |
| 745 | ? FRAME_HAS_VERTICAL_SCROLL_BARS (WINDOW_XFRAME (w)) \ | 780 | |
| 746 | : !NILP (w->vertical_scroll_bar_type)) | 781 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(W) \ |
| 747 | 782 | (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_right) | |
| 748 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(w) \ | 783 | |
| 749 | (EQ (w->vertical_scroll_bar_type, Qt) \ | 784 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR(W) \ |
| 750 | ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (WINDOW_XFRAME (w)) \ | 785 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \ |
| 751 | : EQ (w->vertical_scroll_bar_type, Qleft)) | 786 | || WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W)) |
| 752 | 787 | ||
| 753 | #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w) \ | 788 | /* Say whether horizontal scroll bars are currently enabled for window |
| 754 | (EQ (w->vertical_scroll_bar_type, Qt) \ | 789 | W. Horizontal scrollbars exist for toolkit versions only. */ |
| 755 | ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w)) \ | 790 | #if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NTGUI) |
| 756 | : EQ (w->vertical_scroll_bar_type, Qright)) | 791 | #define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) \ |
| 792 | ((WINDOW_PSEUDO_P (W) || MINI_NON_ONLY_WINDOW_P (W)) \ | ||
| 793 | ? false \ | ||
| 794 | : EQ (W->horizontal_scroll_bar_type, Qt) \ | ||
| 795 | ? FRAME_HAS_HORIZONTAL_SCROLL_BARS (WINDOW_XFRAME (W)) \ | ||
| 796 | : EQ (W->horizontal_scroll_bar_type, Qbottom) \ | ||
| 797 | ? true \ | ||
| 798 | : false) | ||
| 799 | #else | ||
| 800 | #define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) false | ||
| 801 | #endif | ||
| 757 | 802 | ||
| 758 | /* Width that a scroll bar in window W should have, if there is one. | 803 | /* Width that a scroll bar in window W should have, if there is one. |
| 759 | Measured in pixels. If scroll bars are turned off, this is still | 804 | Measured in pixels. If scroll bars are turned off, this is still |
| 760 | nonzero. */ | 805 | nonzero. */ |
| 761 | #define WINDOW_CONFIG_SCROLL_BAR_WIDTH(w) \ | 806 | #define WINDOW_CONFIG_SCROLL_BAR_WIDTH(W) \ |
| 762 | (w->scroll_bar_width >= 0 \ | 807 | (W->scroll_bar_width >= 0 \ |
| 763 | ? w->scroll_bar_width \ | 808 | ? W->scroll_bar_width \ |
| 764 | : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (w))) | 809 | : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (W))) |
| 765 | 810 | ||
| 766 | /* Width that a scroll bar in window W should have, if there is one. | 811 | /* Width that a scroll bar in window W should have, if there is one. |
| 767 | Measured in columns (characters). If scroll bars are turned off, | 812 | Measured in columns (characters). If scroll bars are turned off, |
| 768 | this is still nonzero. */ | 813 | this is still nonzero. */ |
| 769 | #define WINDOW_CONFIG_SCROLL_BAR_COLS(w) \ | 814 | #define WINDOW_CONFIG_SCROLL_BAR_COLS(W) \ |
| 770 | (w->scroll_bar_width >= 0 \ | 815 | (W->scroll_bar_width >= 0 \ |
| 771 | ? ((w->scroll_bar_width \ | 816 | ? ((W->scroll_bar_width \ |
| 772 | + WINDOW_FRAME_COLUMN_WIDTH (w) - 1) \ | 817 | + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ |
| 773 | / WINDOW_FRAME_COLUMN_WIDTH (w)) \ | 818 | / WINDOW_FRAME_COLUMN_WIDTH (W)) \ |
| 774 | : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (w))) | 819 | : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (W))) |
| 775 | 820 | ||
| 776 | /* Width of left scroll bar in window W, measured in columns | 821 | /* Width of left scroll bar in window W, measured in columns |
| 777 | (characters). If scroll bars are on the right in this frame, or | 822 | (characters). If scroll bars are on the right in this frame, or |
| 778 | there are no scroll bars, value is 0. */ | 823 | there are no scroll bars, value is 0. */ |
| 779 | #define WINDOW_LEFT_SCROLL_BAR_COLS(w) \ | 824 | #define WINDOW_LEFT_SCROLL_BAR_COLS(W) \ |
| 780 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ | 825 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \ |
| 781 | ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w)) \ | 826 | ? (WINDOW_CONFIG_SCROLL_BAR_COLS (W)) \ |
| 782 | : 0) | 827 | : 0) |
| 783 | 828 | ||
| 784 | /* Width of right scroll bar in window W, measured in columns | 829 | /* Width of right scroll bar in window W, measured in columns |
| 785 | (characters). If scroll bars are on the left in this frame, or there | 830 | (characters). If scroll bars are on the left in this frame, or there |
| 786 | are no scroll bars, value is 0. */ | 831 | are no scroll bars, value is 0. */ |
| 787 | #define WINDOW_RIGHT_SCROLL_BAR_COLS(w) \ | 832 | #define WINDOW_RIGHT_SCROLL_BAR_COLS(W) \ |
| 788 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \ | 833 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \ |
| 789 | ? WINDOW_CONFIG_SCROLL_BAR_COLS (w) \ | 834 | ? WINDOW_CONFIG_SCROLL_BAR_COLS (W) \ |
| 790 | : 0) | 835 | : 0) |
| 791 | 836 | ||
| 792 | /* Width of a scroll bar in window W, measured in columns. */ | 837 | /* Width of a scroll bar in window W, measured in columns. */ |
| 793 | #define WINDOW_SCROLL_BAR_COLS(w) \ | 838 | #define WINDOW_SCROLL_BAR_COLS(W) \ |
| 794 | (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \ | 839 | (WINDOW_HAS_VERTICAL_SCROLL_BAR (W) \ |
| 795 | ? WINDOW_CONFIG_SCROLL_BAR_COLS (w) \ | 840 | ? WINDOW_CONFIG_SCROLL_BAR_COLS (W) \ |
| 796 | : 0) | 841 | : 0) |
| 797 | 842 | ||
| 798 | /* Width of a left scroll bar area in window W, measured in pixels. */ | 843 | /* Width of a left scroll bar area in window W, measured in pixels. */ |
| 799 | #define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(w) \ | 844 | #define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(W) \ |
| 800 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ | 845 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \ |
| 801 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \ | 846 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \ |
| 802 | : 0) | 847 | : 0) |
| 803 | 848 | ||
| 804 | /* Width of a right scroll bar area in window W, measured in pixels. */ | 849 | /* Width of a right scroll bar area in window W, measured in pixels. */ |
| 805 | #define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(w) \ | 850 | #define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(W) \ |
| 806 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \ | 851 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \ |
| 807 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \ | 852 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \ |
| 808 | : 0) | 853 | : 0) |
| 809 | 854 | ||
| 810 | /* Width of scroll bar area in window W, measured in pixels. */ | 855 | /* Width of scroll bar area in window W, measured in pixels. */ |
| 811 | #define WINDOW_SCROLL_BAR_AREA_WIDTH(w) \ | 856 | #define WINDOW_SCROLL_BAR_AREA_WIDTH(W) \ |
| 812 | (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \ | 857 | (WINDOW_HAS_VERTICAL_SCROLL_BAR (W) \ |
| 813 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \ | 858 | ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \ |
| 814 | : 0) | 859 | : 0) |
| 815 | 860 | ||
| 816 | /* Return the frame position where the scroll bar of window W starts. */ | 861 | /* Return the frame position where the vertical scroll bar of window W |
| 862 | starts. */ | ||
| 817 | #define WINDOW_SCROLL_BAR_AREA_X(W) \ | 863 | #define WINDOW_SCROLL_BAR_AREA_X(W) \ |
| 818 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \ | 864 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \ |
| 819 | ? WINDOW_BOX_RIGHT_EDGE_X (W) \ | 865 | ? WINDOW_BOX_RIGHT_EDGE_X (W) \ |
| @@ -829,6 +875,36 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 829 | ? 0 \ | 875 | ? 0 \ |
| 830 | : FRAME_BOTTOM_DIVIDER_WIDTH (WINDOW_XFRAME (W))) | 876 | : FRAME_BOTTOM_DIVIDER_WIDTH (WINDOW_XFRAME (W))) |
| 831 | 877 | ||
| 878 | /* Height that a scroll bar in window W should have, if there is one. | ||
| 879 | Measured in pixels. If scroll bars are turned off, this is still | ||
| 880 | nonzero. */ | ||
| 881 | #define WINDOW_CONFIG_SCROLL_BAR_HEIGHT(W) \ | ||
| 882 | (W->scroll_bar_height >= 0 \ | ||
| 883 | ? W->scroll_bar_height \ | ||
| 884 | : FRAME_CONFIG_SCROLL_BAR_HEIGHT (WINDOW_XFRAME (W))) | ||
| 885 | |||
| 886 | /* Height that a scroll bar in window W should have, if there is one. | ||
| 887 | Measured in lines (characters). If scroll bars are turned off, this | ||
| 888 | is still nonzero. */ | ||
| 889 | #define WINDOW_CONFIG_SCROLL_BAR_LINES(W) \ | ||
| 890 | (W->scroll_bar_height >= 0 \ | ||
| 891 | ? ((W->scroll_bar_height \ | ||
| 892 | + WINDOW_FRAME_LINE_HEIGHT (W) - 1) \ | ||
| 893 | / WINDOW_FRAME_LINE_HEIGHT (W)) \ | ||
| 894 | : FRAME_CONFIG_SCROLL_BAR_LINES (WINDOW_XFRAME (W))) | ||
| 895 | |||
| 896 | /* Height of a scroll bar in window W, measured in columns. */ | ||
| 897 | #define WINDOW_SCROLL_BAR_LINES(W) \ | ||
| 898 | (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \ | ||
| 899 | ? WINDOW_CONFIG_SCROLL_BAR_LINES (W) \ | ||
| 900 | : 0) | ||
| 901 | |||
| 902 | /* Height of scroll bar area in window W, measured in pixels. */ | ||
| 903 | #define WINDOW_SCROLL_BAR_AREA_HEIGHT(W) \ | ||
| 904 | (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \ | ||
| 905 | ? WINDOW_CONFIG_SCROLL_BAR_HEIGHT (W) \ | ||
| 906 | : 0) | ||
| 907 | |||
| 832 | /* Height in pixels, and in lines, of the mode line. | 908 | /* Height in pixels, and in lines, of the mode line. |
| 833 | May be zero if W doesn't have a mode line. */ | 909 | May be zero if W doesn't have a mode line. */ |
| 834 | #define WINDOW_MODE_LINE_HEIGHT(W) \ | 910 | #define WINDOW_MODE_LINE_HEIGHT(W) \ |
| @@ -837,67 +913,63 @@ wset_next_buffers (struct window *w, Lisp_Object val) | |||
| 837 | : 0) | 913 | : 0) |
| 838 | 914 | ||
| 839 | #define WINDOW_MODE_LINE_LINES(W) \ | 915 | #define WINDOW_MODE_LINE_LINES(W) \ |
| 840 | (!! WINDOW_WANTS_MODELINE_P ((W))) | 916 | (!! WINDOW_WANTS_MODELINE_P (W)) |
| 841 | 917 | ||
| 842 | /* Height in pixels, and in lines, of the header line. | 918 | /* Height in pixels, and in lines, of the header line. |
| 843 | Zero if W doesn't have a header line. */ | 919 | Zero if W doesn't have a header line. */ |
| 844 | #define WINDOW_HEADER_LINE_HEIGHT(W) \ | 920 | #define WINDOW_HEADER_LINE_HEIGHT(W) \ |
| 845 | (WINDOW_WANTS_HEADER_LINE_P ((W)) \ | 921 | (WINDOW_WANTS_HEADER_LINE_P (W) \ |
| 846 | ? CURRENT_HEADER_LINE_HEIGHT (W) \ | 922 | ? CURRENT_HEADER_LINE_HEIGHT (W) \ |
| 847 | : 0) | 923 | : 0) |
| 848 | 924 | ||
| 849 | #define WINDOW_HEADER_LINE_LINES(W) \ | 925 | #define WINDOW_HEADER_LINE_LINES(W) \ |
| 850 | (!! WINDOW_WANTS_HEADER_LINE_P ((W))) | 926 | (!! WINDOW_WANTS_HEADER_LINE_P (W)) |
| 851 | 927 | ||
| 852 | /* Pixel height of window W without mode line and bottom divider. */ | 928 | /* Pixel height of window W without mode line, bottom scroll bar and |
| 929 | bottom divider. */ | ||
| 853 | #define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \ | 930 | #define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \ |
| 854 | (WINDOW_PIXEL_HEIGHT ((W)) \ | 931 | (WINDOW_PIXEL_HEIGHT (W) \ |
| 855 | - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \ | 932 | - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \ |
| 856 | - WINDOW_MODE_LINE_HEIGHT ((W))) | 933 | - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \ |
| 934 | - WINDOW_MODE_LINE_HEIGHT (W)) | ||
| 857 | 935 | ||
| 858 | /* Pixel height of window W without mode and header line and bottom | 936 | /* Pixel height of window W without mode and header line and bottom |
| 859 | divider. */ | 937 | divider. */ |
| 860 | #define WINDOW_BOX_TEXT_HEIGHT(W) \ | 938 | #define WINDOW_BOX_TEXT_HEIGHT(W) \ |
| 861 | (WINDOW_PIXEL_HEIGHT ((W)) \ | 939 | (WINDOW_PIXEL_HEIGHT ((W)) \ |
| 862 | - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \ | 940 | - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \ |
| 863 | - WINDOW_MODE_LINE_HEIGHT ((W)) \ | 941 | - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \ |
| 864 | - WINDOW_HEADER_LINE_HEIGHT ((W))) | 942 | - WINDOW_MODE_LINE_HEIGHT (W) \ |
| 943 | - WINDOW_HEADER_LINE_HEIGHT (W)) | ||
| 944 | |||
| 945 | /* Return the frame position where the horizontal scroll bar of window W | ||
| 946 | starts. */ | ||
| 947 | #define WINDOW_SCROLL_BAR_AREA_Y(W) \ | ||
| 948 | (WINDOW_TOP_EDGE_Y (W) \ | ||
| 949 | + (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \ | ||
| 950 | ? WINDOW_BOX_HEIGHT_NO_MODE_LINE (W) : 0)) | ||
| 865 | 951 | ||
| 866 | /* Convert window W relative pixel X to frame pixel coordinates. */ | 952 | /* Convert window W relative pixel X to frame pixel coordinates. */ |
| 867 | #define WINDOW_TO_FRAME_PIXEL_X(W, X) \ | 953 | #define WINDOW_TO_FRAME_PIXEL_X(W, X) \ |
| 868 | ((X) + WINDOW_BOX_LEFT_EDGE_X ((W))) | 954 | ((X) + WINDOW_BOX_LEFT_EDGE_X ((W))) |
| 869 | 955 | ||
| 870 | /* Convert window W relative pixel Y to frame pixel coordinates. */ | 956 | /* Convert window W relative pixel Y to frame pixel coordinates. */ |
| 871 | #define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \ | 957 | #define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \ |
| 872 | ((Y) + WINDOW_TOP_EDGE_Y ((W))) | 958 | ((Y) + WINDOW_TOP_EDGE_Y (W)) |
| 873 | 959 | ||
| 874 | /* Convert frame relative pixel X to window relative pixel X. */ | 960 | /* Convert frame relative pixel X to window relative pixel X. */ |
| 875 | #define FRAME_TO_WINDOW_PIXEL_X(W, X) \ | 961 | #define FRAME_TO_WINDOW_PIXEL_X(W, X) \ |
| 876 | ((X) - WINDOW_BOX_LEFT_EDGE_X ((W))) | 962 | ((X) - WINDOW_BOX_LEFT_EDGE_X ((W))) |
| 877 | 963 | ||
| 878 | /* Convert frame relative pixel Y to window relative pixel Y. */ | 964 | /* Convert frame relative pixel Y to window relative pixel Y. */ |
| 879 | #define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \ | 965 | #define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \ |
| 880 | ((Y) - WINDOW_TOP_EDGE_Y ((W))) | 966 | ((Y) - WINDOW_TOP_EDGE_Y (W)) |
| 881 | 967 | ||
| 882 | /* Convert a text area relative x-position in window W to frame X | 968 | /* Convert a text area relative x-position in window W to frame X |
| 883 | pixel coordinates. */ | 969 | pixel coordinates. */ |
| 884 | #define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \ | 970 | #define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \ |
| 885 | (window_box_left ((W), TEXT_AREA) + (X)) | 971 | (window_box_left ((W), TEXT_AREA) + (X)) |
| 886 | 972 | ||
| 887 | /* True if the background of the window W's fringe that is adjacent to | ||
| 888 | a scroll bar is extended to the gap between the fringe and the bar. */ | ||
| 889 | |||
| 890 | #define WINDOW_FRINGE_EXTENDED_P(w) \ | ||
| 891 | (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ | ||
| 892 | ? (WINDOW_LEFTMOST_P (w) \ | ||
| 893 | && WINDOW_LEFT_FRINGE_WIDTH (w) \ | ||
| 894 | && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) \ | ||
| 895 | || WINDOW_LEFT_MARGIN_COLS (w) == 0)) \ | ||
| 896 | : (WINDOW_RIGHTMOST_P (w) \ | ||
| 897 | && WINDOW_RIGHT_FRINGE_WIDTH (w) \ | ||
| 898 | && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) \ | ||
| 899 | || WINDOW_RIGHT_MARGIN_COLS (w) == 0))) | ||
| 900 | |||
| 901 | /* This is the window in which the terminal's cursor should be left when | 973 | /* This is the window in which the terminal's cursor should be left when |
| 902 | nothing is being done with it. This must always be a leaf window, and its | 974 | nothing is being done with it. This must always be a leaf window, and its |
| 903 | buffer is selected by the top level editing loop at the end of each command. | 975 | buffer is selected by the top level editing loop at the end of each command. |
| @@ -981,11 +1053,6 @@ extern void bset_update_mode_line (struct buffer *b); | |||
| 981 | above already does it, so it's only needed in unusual cases. */ | 1053 | above already does it, so it's only needed in unusual cases. */ |
| 982 | extern void redisplay_other_windows (void); | 1054 | extern void redisplay_other_windows (void); |
| 983 | 1055 | ||
| 984 | /* If *ROWS or *COLS are too small a size for FRAME, set them to the | ||
| 985 | minimum allowable size. */ | ||
| 986 | |||
| 987 | extern void check_frame_size (struct frame *frame, int *width, int *height, bool pixelwise); | ||
| 988 | |||
| 989 | /* Return a pointer to the glyph W's physical cursor is on. Value is | 1056 | /* Return a pointer to the glyph W's physical cursor is on. Value is |
| 990 | null if W's current matrix is invalid, so that no meaningful glyph | 1057 | null if W's current matrix is invalid, so that no meaningful glyph |
| 991 | can be returned. */ | 1058 | can be returned. */ |
| @@ -1010,7 +1077,6 @@ struct glyph *get_phys_cursor_glyph (struct window *w); | |||
| 1010 | CHECK_TYPE (WINDOW_LIVE_P (WINDOW), Qwindow_live_p, WINDOW) | 1077 | CHECK_TYPE (WINDOW_LIVE_P (WINDOW), Qwindow_live_p, WINDOW) |
| 1011 | 1078 | ||
| 1012 | /* These used to be in lisp.h. */ | 1079 | /* These used to be in lisp.h. */ |
| 1013 | |||
| 1014 | extern Lisp_Object Qwindow_live_p; | 1080 | extern Lisp_Object Qwindow_live_p; |
| 1015 | extern Lisp_Object Vwindow_list; | 1081 | extern Lisp_Object Vwindow_list; |
| 1016 | 1082 | ||
| @@ -1024,6 +1090,7 @@ extern int window_body_width (struct window *w, bool); | |||
| 1024 | extern void temp_output_buffer_show (Lisp_Object); | 1090 | extern void temp_output_buffer_show (Lisp_Object); |
| 1025 | extern void replace_buffer_in_windows (Lisp_Object); | 1091 | extern void replace_buffer_in_windows (Lisp_Object); |
| 1026 | extern void replace_buffer_in_windows_safely (Lisp_Object); | 1092 | extern void replace_buffer_in_windows_safely (Lisp_Object); |
| 1093 | extern Lisp_Object sanitize_window_sizes (Lisp_Object, Lisp_Object); | ||
| 1027 | /* This looks like a setter, but it is a bit special. */ | 1094 | /* This looks like a setter, but it is a bit special. */ |
| 1028 | extern void wset_buffer (struct window *, Lisp_Object); | 1095 | extern void wset_buffer (struct window *, Lisp_Object); |
| 1029 | extern bool window_outdated (struct window *); | 1096 | extern bool window_outdated (struct window *); |