annotate lisp/window.el @ 4981:4aebb0131297

Cleanups/renaming of EXTERNAL_TO_C_STRING and friends -------------------- ChangeLog entries follow: -------------------- modules/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c: * postgresql/postgresql.c (CHECK_LIVE_CONNECTION): * postgresql/postgresql.c (Fpq_connectdb): * postgresql/postgresql.c (Fpq_connect_start): * postgresql/postgresql.c (Fpq_lo_import): * postgresql/postgresql.c (Fpq_lo_export): * ldap/eldap.c (Fldap_open): * ldap/eldap.c (Fldap_search_basic): * ldap/eldap.c (Fldap_add): * ldap/eldap.c (Fldap_modify): * ldap/eldap.c (Fldap_delete): * canna/canna_api.c (Fcanna_initialize): * canna/canna_api.c (Fcanna_store_yomi): * canna/canna_api.c (Fcanna_parse): * canna/canna_api.c (Fcanna_henkan_begin): EXTERNAL_TO_C_STRING returns its argument instead of storing it in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar things happen to related macros. See entry in src/ChangeLog. More Mule-izing of postgresql.c. Extract out common code between `pq-connectdb' and `pq-connect-start'. Fix places that signal an error string using a formatted string to instead follow the standard and have a fixed reason followed by the particular error message stored as one of the frobs. src/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * console-msw.c (write_string_to_mswindows_debugging_output): * console-msw.c (Fmswindows_message_box): * console-x.c (x_perhaps_init_unseen_key_defaults): * console.c: * database.c (dbm_get): * database.c (dbm_put): * database.c (dbm_remove): * database.c (berkdb_get): * database.c (berkdb_put): * database.c (berkdb_remove): * database.c (Fopen_database): * device-gtk.c (gtk_init_device): * device-msw.c (msprinter_init_device_internal): * device-msw.c (msprinter_default_printer): * device-msw.c (msprinter_init_device): * device-msw.c (sync_printer_with_devmode): * device-msw.c (Fmsprinter_select_settings): * device-x.c (sanity_check_geometry_resource): * device-x.c (Dynarr_add_validified_lisp_string): * device-x.c (x_init_device): * device-x.c (Fx_put_resource): * device-x.c (Fx_valid_keysym_name_p): * device-x.c (Fx_set_font_path): * dialog-msw.c (push_lisp_string_as_unicode): * dialog-msw.c (handle_directory_dialog_box): * dialog-msw.c (handle_file_dialog_box): * dialog-x.c (dbox_descriptor_to_widget_value): * editfns.c (Fformat_time_string): * editfns.c (Fencode_time): * editfns.c (Fset_time_zone_rule): * emacs.c (make_argc_argv): * emacs.c (Fdump_emacs): * emodules.c (emodules_load): * eval.c: * eval.c (maybe_signal_error_1): * event-msw.c (Fdde_alloc_advise_item): * event-msw.c (mswindows_dde_callback): * event-msw.c (mswindows_wnd_proc): * fileio.c (report_error_with_errno): * fileio.c (Fsysnetunam): * fileio.c (Fdo_auto_save): * font-mgr.c (extract_fcapi_string): * font-mgr.c (Ffc_config_app_font_add_file): * font-mgr.c (Ffc_config_app_font_add_dir): * font-mgr.c (Ffc_config_filename): * frame-gtk.c (gtk_set_frame_text_value): * frame-gtk.c (gtk_create_widgets): * frame-msw.c (mswindows_init_frame_1): * frame-msw.c (mswindows_set_title_from_ibyte): * frame-msw.c (msprinter_init_frame_3): * frame-x.c (x_set_frame_text_value): * frame-x.c (x_set_frame_properties): * frame-x.c (start_drag_internal_1): * frame-x.c (x_cde_transfer_callback): * frame-x.c (x_create_widgets): * glyphs-eimage.c (my_jpeg_output_message): * glyphs-eimage.c (jpeg_instantiate): * glyphs-eimage.c (gif_instantiate): * glyphs-eimage.c (png_instantiate): * glyphs-eimage.c (tiff_instantiate): * glyphs-gtk.c (xbm_instantiate_1): * glyphs-gtk.c (gtk_xbm_instantiate): * glyphs-gtk.c (gtk_xpm_instantiate): * glyphs-gtk.c (gtk_xface_instantiate): * glyphs-gtk.c (cursor_font_instantiate): * glyphs-gtk.c (gtk_redisplay_widget): * glyphs-gtk.c (gtk_widget_instantiate_1): * glyphs-gtk.c (gtk_add_tab_item): * glyphs-msw.c (mswindows_xpm_instantiate): * glyphs-msw.c (bmp_instantiate): * glyphs-msw.c (mswindows_resource_instantiate): * glyphs-msw.c (xbm_instantiate_1): * glyphs-msw.c (mswindows_xbm_instantiate): * glyphs-msw.c (mswindows_xface_instantiate): * glyphs-msw.c (mswindows_redisplay_widget): * glyphs-msw.c (mswindows_widget_instantiate): * glyphs-msw.c (add_tree_item): * glyphs-msw.c (add_tab_item): * glyphs-msw.c (mswindows_combo_box_instantiate): * glyphs-msw.c (mswindows_widget_query_string_geometry): * glyphs-x.c (x_locate_pixmap_file): * glyphs-x.c (xbm_instantiate_1): * glyphs-x.c (x_xbm_instantiate): * glyphs-x.c (extract_xpm_color_names): * glyphs-x.c (x_xpm_instantiate): * glyphs-x.c (x_xface_instantiate): * glyphs-x.c (autodetect_instantiate): * glyphs-x.c (safe_XLoadFont): * glyphs-x.c (cursor_font_instantiate): * glyphs-x.c (x_redisplay_widget): * glyphs-x.c (Fchange_subwindow_property): * glyphs-x.c (x_widget_instantiate): * glyphs-x.c (x_tab_control_redisplay): * glyphs.c (pixmap_to_lisp_data): * gui-x.c (menu_separator_style_and_to_external): * gui-x.c (add_accel_and_to_external): * gui-x.c (button_item_to_widget_value): * hpplay.c (player_error_internal): * hpplay.c (play_sound_file): * hpplay.c (play_sound_data): * intl.c (Fset_current_locale): * lisp.h: * menubar-gtk.c (gtk_xemacs_set_accel_keys): * menubar-msw.c (populate_menu_add_item): * menubar-msw.c (populate_or_checksum_helper): * menubar-x.c (menu_item_descriptor_to_widget_value_1): * nt.c (init_user_info): * nt.c (get_long_basename): * nt.c (nt_get_resource): * nt.c (init_mswindows_environment): * nt.c (get_cached_volume_information): * nt.c (mswindows_readdir): * nt.c (read_unc_volume): * nt.c (mswindows_stat): * nt.c (mswindows_getdcwd): * nt.c (mswindows_executable_type): * nt.c (Fmswindows_short_file_name): * ntplay.c (nt_play_sound_file): * objects-gtk.c: * objects-gtk.c (gtk_valid_color_name_p): * objects-gtk.c (gtk_initialize_font_instance): * objects-gtk.c (gtk_font_list): * objects-msw.c (font_enum_callback_2): * objects-msw.c (parse_font_spec): * objects-x.c (x_parse_nearest_color): * objects-x.c (x_valid_color_name_p): * objects-x.c (x_initialize_font_instance): * objects-x.c (x_font_instance_truename): * objects-x.c (x_font_list): * objects-xlike-inc.c (XFUN): * objects-xlike-inc.c (xft_find_charset_font): * process-nt.c (mswindows_report_winsock_error): * process-nt.c (nt_create_process): * process-nt.c (get_internet_address): * process-nt.c (nt_open_network_stream): * process-unix.c: * process-unix.c (allocate_pty): * process-unix.c (get_internet_address): * process-unix.c (unix_canonicalize_host_name): * process-unix.c (unix_open_network_stream): * realpath.c: * select-common.h (lisp_data_to_selection_data): * select-gtk.c (symbol_to_gtk_atom): * select-gtk.c (atom_to_symbol): * select-msw.c (symbol_to_ms_cf): * select-msw.c (mswindows_register_selection_data_type): * select-x.c (symbol_to_x_atom): * select-x.c (x_atom_to_symbol): * select-x.c (hack_motif_clipboard_selection): * select-x.c (Fx_store_cutbuffer_internal): * sound.c (Fplay_sound_file): * sound.c (Fplay_sound): * sound.h (sound_perror): * sysdep.c: * sysdep.c (qxe_allocating_getcwd): * sysdep.c (qxe_execve): * sysdep.c (copy_in_passwd): * sysdep.c (qxe_getpwnam): * sysdep.c (qxe_ctime): * sysdll.c (dll_open): * sysdll.c (dll_function): * sysdll.c (dll_variable): * sysdll.c (search_linked_libs): * sysdll.c (dll_error): * sysfile.h: * sysfile.h (PATHNAME_CONVERT_OUT_TSTR): * sysfile.h (PATHNAME_CONVERT_OUT_UTF_8): * sysfile.h (PATHNAME_CONVERT_OUT): * sysfile.h (LISP_PATHNAME_CONVERT_OUT): * syswindows.h (ITEXT_TO_TSTR): * syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR): * syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT): * syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN): * syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR): * text.h: * text.h (eicpy_ext_len): * text.h (enum new_dfc_src_type): * text.h (EXTERNAL_TO_ITEXT): * text.h (GET_STRERROR): * tooltalk.c (check_status): * tooltalk.c (Fadd_tooltalk_message_arg): * tooltalk.c (Fadd_tooltalk_pattern_attribute): * tooltalk.c (Fadd_tooltalk_pattern_arg): * win32.c (tstr_to_local_file_format): * win32.c (mswindows_lisp_error_1): * win32.c (mswindows_report_process_error): * win32.c (Fmswindows_shell_execute): * win32.c (mswindows_read_link_1): Changes involving external/internal format conversion, mostly code cleanup and renaming. 1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL that stored its result in a parameter. The new version of LISP_STRING_TO_EXTERNAL returns its result through the return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL. Use the new-style macros throughout the code. 2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL, in keeping with overall naming rationalization involving Itext and related types. Macros involved in previous two: EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC LISP_STRING_TO_EXTERNAL LISP_STRING_TO_EXTERNAL_MALLOC LISP_STRING_TO_TSTR C_STRING_TO_TSTR -> ITEXT_TO_TSTR TSTR_TO_C_STRING -> TSTR_TO_ITEXT The following four still return their values through parameters, since they have more than one value to return: C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL LISP_STRING_TO_SIZED_EXTERNAL C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC LISP_STRING_TO_SIZED_EXTERNAL_MALLOC Sometimes additional casts had to be inserted, since the old macros played strange games and completely defeated the type system of the store params. 3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT occurred with calls to one of the convenience macros listed above, or to make_extstring(). 4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway) and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT. 4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something like LISP_STRING_TO_EXTERNAL(..., Qfile_name). 5. Eliminate some temporary variables that are no longer necessary now that we return a value rather than storing it into a variable. 6. Some Mule-izing in database.c. 7. Error functions: -- A bit of code cleanup in maybe_signal_error_1. -- Eliminate report_file_type_error; it's just an alias for signal_error_2 with params in a different order. -- Fix some places in the hostname-handling code that directly inserted externally-retrieved error strings into the supposed ASCII "reason" param instead of doing the right thing and sticking text descriptive of what was going on in "reason" and putting the external message in a frob. 8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one or two other places. 9. Some code cleanup in copy_in_passwd() in sysdep.c. 10. Fix a real bug due to accidental variable shadowing in tstr_to_local_file_format() in win32.c.
author Ben Wing <ben@xemacs.org>
date Fri, 05 Feb 2010 11:02:24 -0600
parents bd28481bb0e1
children f00192e1cd49 308d34e9f07d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; window.el --- XEmacs window commands aside from those written in C.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1985, 1989, 1993-94, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1995, 1996 Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Keywords: frames, extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; along with XEmacs; see the file COPYING. If not, write to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; Free Software Foundation, 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;;; Synched up with: Emacs/Mule zeta.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;;;; Window tree functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
36 ;; XEmacs addition, to expose WINDOW.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
37 (defun only-window-p (&optional window nomini which-frames which-devices)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
38 "Return non-nil if WINDOW is the only window in some context,
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
39 normally its frame. Optional arg NOMINI non-nil means don't count the
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
40 minibuffer even if it is active.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
42 The optional argument WHICH-FRAMES changes the frames that are considered:
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
43
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
44 WHICH-FRAMES nil or omitted means count only WINDOW's frame,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 plus the minibuffer it uses (which may be on another frame).
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
46 \(But, for all values of WHICH-FRAMES, see the documentation for the
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
47 WHICH-DEVICES argument.)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
48 WHICH-FRAMES = `visible' means include windows on all visible frames
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
49 WHICH-FRAMES = 0 means include windows on all visible and iconified frames.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
50 WHICH-FRAMES = t means include windows on all frames including invisible frames.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
51 If WHICH-FRAMES is any other value, count only the selected frame.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
53 The optional third argument WHICH-DEVICES further clarifies on which
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
54 devices to search for frames as specified by WHICH-FRAMES. This value
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
55 is only meaningful if WHICH-FRAMES is non-nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
56 If nil or omitted, search all devices on the selected console.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
57 If a device, only search that device.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
58 If a console, search all devices on that console.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
59 If a device type, search all devices of that type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
60 If `window-system', search all devices on window-system consoles.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
61 Any other non-nil value means search all devices."
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
62 (let ((base-window (or window (selected-window))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
63 (if (and nomini (eq base-window
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
64 (minibuffer-window (window-frame base-window))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (setq base-window (next-window base-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (eq base-window
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
67 (next-window base-window (if nomini 'arg) which-frames which-devices))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
69 (defun one-window-p (&optional nomini which-frames which-devices)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
70 "Return the result of calling `only-window-p' on the selected window.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
71
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
72 See that function's documentation for the meaning of the NOMINI,
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
73 WHICH-FRAMES and WHICH-DEVICES arguments."
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
74 (only-window-p (selected-window) nomini which-frames which-devices))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
75
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
76 (defun walk-windows (function &optional minibuf which-frames which-devices)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
77 "Cycle through all visible windows, calling FUNCTION for each one.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
78 FUNCTION is called with a window as argument.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 Optional second arg MINIBUF t means count the minibuffer window even
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 if not active. MINIBUF nil or omitted means count the minibuffer iff
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 it is active. MINIBUF neither t nor nil means not to count the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 minibuffer even if it is active.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 Several frames may share a single minibuffer; if the minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 counts, all windows on all frames that share that minibuffer count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 too. Therefore, when a separate minibuffer frame is active,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 `walk-windows' includes the windows in the frame from which you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 entered the minibuffer, as well as the minibuffer window. But if the
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
90 minibuffer does not count, only the selected window counts.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
92 By default, only the windows in the selected frame are included.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
93 The optional argument WHICH-FRAMES changes this behavior:
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
94 WHICH-FRAMES nil or omitted means cycle within the frames as specified above.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
95 WHICH-FRAMES = `visible' means include windows on all visible frames.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
96 WHICH-FRAMES = 0 means include windows on all visible and iconified frames.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
97 WHICH-FRAMES = t means include windows on all frames including invisible frames.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 Anything else means restrict to WINDOW's frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
100 The optional fourth argument WHICH-DEVICES further clarifies on which
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
101 devices to search for frames as specified by WHICH-FRAMES. This value
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
102 is only meaningful if WHICH-FRAMES is non-nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
103 If nil or omitted, search all devices on the selected console.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
104 If a device, only search that device.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
105 If a console, search all devices on that console.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
106 If a device type, search all devices of that type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
107 If `window-system', search all devices on window-system consoles.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
108 Any other non-nil value means search all devices."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ;; If we start from the minibuffer window, don't fail to come back to it.
1279
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
110 (let ((arg (cond
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
111 ((framep which-frames) which-frames)
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
112 ((devicep which-devices) which-devices)
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
113 (t nil))))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
114 (if (window-minibuffer-p (selected-window arg))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
115 (setq minibuf t))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
116 ;; Note that, like next-window & previous-window, this behaves a little
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
117 ;; strangely if the selected window is on an invisible frame: it hits
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
118 ;; some of the windows on that frame, and all windows on visible frames.
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
119 (let* ((walk-windows-start (selected-window arg))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
120 (walk-windows-current walk-windows-start))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
121 (while (progn
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
122 (setq walk-windows-current
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
123 (next-window walk-windows-current minibuf which-frames
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
124 which-devices))
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
125 (funcall function walk-windows-current)
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 1133
diff changeset
126 (not (eq walk-windows-current walk-windows-start)))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 ;; The old XEmacs definition of the above clause. It's more correct in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 ;; that it will never hit a window that's already been hit even if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 ;; do something odd like `delete-other-windows', but has the problem
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 ;; that it conses. (This may be called repeatedly, from lazy-lock
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 ;; for example.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 ; (let* ((walk-windows-history nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 ; (walk-windows-current (selected-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 ; (while (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 ; (setq walk-windows-current
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
136 ; (next-window walk-windows-current minibuf which-frames
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
137 ; which-devices))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 ; (not (memq walk-windows-current walk-windows-history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 ; (setq walk-windows-history (cons walk-windows-current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 ; walk-windows-history))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
141 ; (funcall function walk-windows-current))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
143 (defun get-window-with-predicate (predicate &optional minibuf
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
144 all-frames default)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
145 "Return a window satisfying PREDICATE.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
146
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
147 This function cycles through all visible windows using `walk-windows',
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
148 calling PREDICATE on each one. PREDICATE is called with a window as
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
149 argument. The first window for which PREDICATE returns a non-nil
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
150 value is returned. If no window satisfies PREDICATE, DEFAULT is
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
151 returned.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
152
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
153 Optional second arg MINIBUF t means count the minibuffer window even
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
154 if not active. MINIBUF nil or omitted means count the minibuffer iff
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
155 it is active. MINIBUF neither t nor nil means not to count the
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
156 minibuffer even if it is active.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
157
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
158 Several frames may share a single minibuffer; if the minibuffer
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
159 counts, all windows on all frames that share that minibuffer count
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
160 too. Therefore, if you are using a separate minibuffer frame
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
161 and the minibuffer is active and MINIBUF says it counts,
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
162 `walk-windows' includes the windows in the frame from which you
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
163 entered the minibuffer, as well as the minibuffer window.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
164
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
165 ALL-FRAMES is the optional third argument.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
166 ALL-FRAMES nil or omitted means cycle within the frames as specified above.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
167 ALL-FRAMES = `visible' means include windows on all visible frames.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
168 ALL-FRAMES = 0 means include windows on all visible and iconified frames.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
169 ALL-FRAMES = t means include windows on all frames including invisible frames.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
170 If ALL-FRAMES is a frame, it means include windows on that frame.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
171 Anything else means restrict to the selected frame."
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
172 (catch 'found
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
173 (walk-windows #'(lambda (window)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
174 (when (funcall predicate window)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
175 (throw 'found window)))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
176 minibuf all-frames)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
177 default))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
178
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
179 (defalias 'some-window 'get-window-with-predicate)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
180
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (defun minibuffer-window-active-p (window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 "Return t if WINDOW (a minibuffer window) is now active."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (eq window (active-minibuffer-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (defmacro save-selected-window (&rest body)
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
186 "Execute BODY, then select the window that was selected before BODY.
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
187 The value returned is the value of the last form in BODY."
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
188 (let ((old-window (gensym "ssw")))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
189 `(let ((,old-window (selected-window)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
190 (unwind-protect
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
191 (progn ,@body)
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
192 (when (window-live-p ,old-window)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 444
diff changeset
193 (select-window ,old-window))))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
194
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
195 (defmacro with-selected-window (window &rest body)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
196 "Execute forms in BODY with WINDOW as the selected window.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
197 The value returned is the value of the last form in BODY."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 `(save-selected-window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
199 (select-window ,window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 ,@body))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
1133
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
202 (defmacro save-window-excursion (&rest body)
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
203 "Execute body, preserving window sizes and contents.
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
204 Restores which buffer appears in which window, where display starts,
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
205 as well as the current buffer.
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
206 Does not restore the value of point in current buffer."
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
207 (let ((window-config (gensym 'window-config)))
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
208 `(let ((,window-config (current-window-configuration)))
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
209 (unwind-protect
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
210 (progn ,@body)
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
211 (set-window-configuration ,window-config)))))
960da99ad52b [xemacs-hg @ 2002-12-02 12:27:18 by michaels]
michaels
parents: 1127
diff changeset
212
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (defun count-windows (&optional minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 "Return the number of visible windows.
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
215 This counts the windows in the selected frame and (if the minibuffer is
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
216 to be counted) its minibuffer frame (if that's not the same frame).
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
217 The optional arg MINIBUF non-nil means count the minibuffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 even if it is inactive."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (let ((count 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (walk-windows (function (lambda (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (setq count (+ count 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
225 (defun window-safely-shrinkable-p (&optional window)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
226 "Non-nil if the WINDOW can be shrunk without shrinking other windows.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
227 If WINDOW is nil or omitted, it defaults to the currently selected window."
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
228 (save-selected-window
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
229 (when window (select-window window))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
230 (or (and (not (eq window (frame-first-window)))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
231 (= (car (window-pixel-edges))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
232 (car (window-pixel-edges (previous-window)))))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
233 (= (car (window-pixel-edges))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
234 (car (window-pixel-edges (next-window)))))))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
235
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (defun balance-windows ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 "Make all visible windows the same height (approximately)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (let ((count -1) levels newsizes size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 ;FSFmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 ;;; Don't count the lines that are above the uppermost windows.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 ;;; (These are the menu bar lines, if any.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;(mbl (nth 1 (window-edges (frame-first-window (selected-frame))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 ;; Find all the different vpos's at which windows start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 ;; then count them. But ignore levels that differ by only 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (let (tops (prev-top -2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (walk-windows (function (lambda (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (setq tops (cons (nth 1 (window-pixel-edges w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 tops))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 'nomini)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 (setq tops (sort tops '<))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (while tops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (if (> (car tops) (1+ prev-top))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (setq prev-top (car tops)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 count (1+ count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (setq levels (cons (cons (car tops) count) levels))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (setq tops (cdr tops)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (setq count (1+ count))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;; Subdivide the frame into that many vertical levels.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 ;FSFmacs (setq size (/ (- (frame-height) mbl) count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (setq size (/ (window-pixel-height (frame-root-window)) count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (walk-windows (function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (lambda (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (select-window w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (let ((newtop (cdr (assq (nth 1 (window-pixel-edges))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 levels)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (newbot (or (cdr (assq
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (+ (window-pixel-height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (nth 1 (window-pixel-edges)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 levels))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 (setq newsizes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (cons (cons w (* size (- newbot newtop)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 newsizes)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 'nomini)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 (walk-windows (function (lambda (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (select-window w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 (let ((newsize (cdr (assq w newsizes))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 (enlarge-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 (/ (- newsize (window-pixel-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 (face-height 'default))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 'nomini)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 ;;; I think this should be the default; I think people will prefer it--rms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 (defcustom split-window-keep-point t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 "*If non-nil, split windows keeps the original point in both children.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 This is often more convenient for editing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 If nil, adjust point in each of the two windows to minimize redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 This is convenient on slow terminals, but point can move strangely."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 :group 'windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (defun split-window-vertically (&optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 "Split current window into two windows, one above the other.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 The uppermost window gets ARG lines and the other gets the rest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 Negative arg means select the size of the lowermost window instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 With no argument, split equally or close to it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 Both windows display the same buffer now current.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
730
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
301 If the variable `split-window-keep-point' is non-nil, both new windows
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 will get the same value of point as the current window. This is often
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 more convenient for editing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
305 Otherwise, we choose window starts so as to minimize the amount of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 redisplay; this is convenient on slow terminals. The new selected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 window is the one that the current value of point appears in. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 value of point can change if the text around point is hidden by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 new mode line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 Programs should probably use split-window instead of this."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (let ((old-w (selected-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (old-point (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (size (and arg (prefix-numeric-value arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (window-full-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 new-w bottom moved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 (and size (< size 0) (setq size (+ (window-height) size)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 (setq new-w (split-window nil size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (or split-window-keep-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (set-buffer (window-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 (goto-char (window-start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (setq moved (vertical-motion (window-height)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (set-window-start new-w (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (if (> (point) (window-point new-w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (set-window-point new-w (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (and (= moved (window-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 (setq window-full-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (vertical-motion -1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (setq bottom (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (and window-full-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (<= bottom (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (set-window-point old-w (1- bottom)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 (and window-full-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 (<= (window-start new-w) old-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (set-window-point new-w old-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (select-window new-w)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 new-w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (defun split-window-horizontally (&optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 "Split current window into two windows side by side.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 This window becomes the leftmost of the two, and gets ARG columns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 Negative arg means select the size of the rightmost window instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 No arg means split equally."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (let ((size (and arg (prefix-numeric-value arg))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (and size (< size 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (setq size (+ (window-width) size)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 (split-window nil size t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (defun enlarge-window-horizontally (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 "Make current window ARG columns wider."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (enlarge-window arg t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (defun shrink-window-horizontally (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 "Make current window ARG columns narrower."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (shrink-window arg t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
365 (defun window-buffer-height (window)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
366 "Return the height (in screen lines) of the buffer that WINDOW is displaying."
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
367 (with-current-buffer (window-buffer window)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
368 (max 1
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
369 (count-screen-lines (point-min) (point-max)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
370 ;; If buffer ends with a newline, ignore it when
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
371 ;; counting height unless point is after it.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
372 (eobp)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
373 window))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
374 ;; XEmacs change; accept BUFFER.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
375 (defun count-screen-lines (&optional beg end count-final-newline
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
376 window buffer)
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
377 "Return the number of screen lines in the region.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
378 The number of screen lines may be different from the number of actual lines,
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
379 due to line breaking, display table, etc.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
380
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
381 Optional arguments BEG and END default to `point-min' and `point-max'
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
382 respectively.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
383
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
384 If region ends with a newline, ignore it unless optional third argument
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
385 COUNT-FINAL-NEWLINE is non-nil.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
386
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
387 The optional fourth argument WINDOW specifies the window used for obtaining
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
388 parameters such as width, horizontal scrolling, and so on. The default is
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
389 to use the selected window's parameters.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
390
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
391 Optional argument BUFFER is the buffer to check, and defaults to the current
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
392 buffer. See `vertical-motion' for some caveats on the differences between
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
393 this behaviour and that of GNU Emacs."
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
394 (unless beg
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
395 (setq beg (point-min buffer)))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
396 (unless end
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
397 (setq end (point-max buffer)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
398 (unless buffer
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
399 (setq buffer (current-buffer)))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
400 (if (= beg end)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
401 0
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
402 (save-excursion
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
403 (save-restriction
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
404 (let ((old-window-buffer (window-buffer window)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
405 (unwind-protect
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
406 (progn
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
407 (set-window-buffer window buffer)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
408 (set-buffer buffer)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
409 (widen)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
410 (narrow-to-region (min beg end)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
411 (if (and (not count-final-newline)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
412 (= ?\n (char-before (max beg end))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
413 (1- (max beg end))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
414 (max beg end)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
415 (goto-char (point-min))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
416 (1+ (vertical-motion (buffer-size) window)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
417 (set-window-buffer window old-window-buffer)))))))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
418
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
419 (defun fit-window-to-buffer (&optional window max-height min-height)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
420 "Make WINDOW the right height to display its contents exactly.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
421 If WINDOW is omitted or nil, it defaults to the selected window.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
422 If the optional argument MAX-HEIGHT is supplied, it is the maximum height
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
423 the window is allowed to be, defaulting to the frame height.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
424 If the optional argument MIN-HEIGHT is supplied, it is the minimum
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
425 height the window is allowed to be, defaulting to `window-min-height'.
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
426
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
427 The heights in MAX-HEIGHT and MIN-HEIGHT include the mode-line and/or
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
428 header-line."
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
429 (interactive)
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
430
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
431 (when (null window)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
432 (setq window (selected-window)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
433 (when (null max-height)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
434 (setq max-height (frame-height (window-frame window))))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
435
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
436 (let* ((buf
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
437 ;; Buffer that is displayed in WINDOW
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
438 (window-buffer window))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
439 (window-height
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
440 ;; The current height of WINDOW
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
441 (window-height window))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
442 (desired-height
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
443 ;; The height necessary to show the buffer displayed by WINDOW
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
444 ;; (`count-screen-lines' always works on the current buffer).
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
445 ;; XEmacs; it does in GNU, we provide a BUFFER argument, but we're
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
446 ;; not changing the implementation.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
447 (with-current-buffer buf
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
448 (+ (count-screen-lines)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
449 ;; If the buffer is empty, (count-screen-lines) is
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
450 ;; zero. But, even in that case, we need one text line
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
451 ;; for cursor.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
452 (if (= (point-min) (point-max))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
453 1 0)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
454 ;; For non-minibuffers, count the mode-line, if any
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
455 (if (and (not (window-minibuffer-p window))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
456 mode-line-format)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
457 1 0)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
458 ;; Count the header-line, if any
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
459 ;; XEmacs change; we don't have header-line-format.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
460 ;; (if header-line-format 1 0))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
461 (if (specifier-instance top-gutter) 1 0))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
462 (delta
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
463 ;; Calculate how much the window height has to change to show
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
464 ;; desired-height lines, constrained by MIN-HEIGHT and MAX-HEIGHT.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
465 (- (max (min desired-height max-height)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
466 (or min-height window-min-height))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
467 window-height)))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
468
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
469 ;; Don't try to redisplay with the cursor at the end
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
470 ;; on its own line--that would force a scroll and spoil things.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
471 (when (with-current-buffer buf
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
472 (and (eobp) (bolp) (not (bobp))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
473 (set-window-point window (1- (window-point window))))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
474
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
475 ;; Adjust WINDOW to the nominally correct size (which may actually
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
476 ;; be slightly off because of variable height text, etc).
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
477 (unless (zerop delta)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
478 (enlarge-window delta nil window))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
479
4506
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
480 ;; Check if the last line is surely fully visible. If not,
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
481 ;; enlarge the window.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
482 (let ((end (with-current-buffer buf
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
483 (save-excursion
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
484 (goto-char (point-max))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
485 (when (and (bolp) (not (bobp)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
486 ;; Don't include final newline
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
487 (backward-char 1))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
488 (when truncate-lines
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
489 ;; If line-wrapping is turned off, test the
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
490 ;; beginning of the last line for visibility
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
491 ;; instead of the end, as the end of the line
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
492 ;; could be invisible by virtue of extending past
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
493 ;; the edge of the window.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
494 (forward-line 0))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
495 (point))))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
496 ;; XEmacs change; bind window-pixel-vscroll-increment, we don't
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
497 ;; have #'set-window-vscroll.
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
498 (window-pixel-scroll-increment 0))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
499 ; (set-window-vscroll window 0)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
500 (while (and (< desired-height max-height)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
501 (= desired-height (window-height window))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
502 (not (pos-visible-in-window-p end window)))
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
503 (enlarge-window 1 nil window)
bd28481bb0e1 Port #'window-buffer-height, #'fit-window-to-buffer, & window, buf, functions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1279
diff changeset
504 (setq desired-height (1+ desired-height))))))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 730
diff changeset
505
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 (defun shrink-window-if-larger-than-buffer (&optional window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 "Shrink the WINDOW to be as small as possible to display its contents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 Do not shrink to less than `window-min-height' lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 Do nothing if the buffer contains more lines than the present window height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 or if some of the window's contents are scrolled out of view,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 or if the window is not the full width of the frame,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 or if the window is the only window of its frame."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (or window (setq window (selected-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (set-buffer (window-buffer window))
1127
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
517 (let ((test-pos
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (- (point-max)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 ;; If buffer ends with a newline, ignore it when counting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 ;; height unless point is after it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (if (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (eq ?\n (char-after (1- (point-max)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 1 0)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
524 (mini (frame-property (window-frame window) 'minibuffer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (if (and (< 1 (let ((frame (selected-frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (select-frame (window-frame window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (count-windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (select-frame frame))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 ;; check to make sure that the window is the full width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 ;; of the frame
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
532 (window-leftmost-p window)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
533 (window-rightmost-p window)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ;; The whole buffer must be visible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (pos-visible-in-window-p (point-min) window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 ;; The frame must not be minibuffer-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (not (eq mini 'only)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (progn
1127
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
539 (goto-char (point-min))
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
540 (while (and (pos-visible-in-window-p test-pos window)
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
541 (> (window-height window) window-min-height))
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
542 (shrink-window 1 nil window))
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
543 (if (not (pos-visible-in-window-p test-pos window))
68f6865bee47 [xemacs-hg @ 2002-11-28 12:38:16 by michaels]
michaels
parents: 800
diff changeset
544 (enlarge-window 1 nil window)))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (defun kill-buffer-and-window ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 "Kill the current buffer and delete the selected window."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (let ((buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (delete-window (selected-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (kill-buffer buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (error "Aborted")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
730
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
555 (defun quit-window (&optional kill window)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
556 "Quit the current buffer. Bury it, and maybe delete the selected frame.
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
557 \(The frame is deleted if it is contains a dedicated window for the buffer.)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
558 With a prefix argument, kill the buffer instead.
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
559
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
560 Noninteractively, if KILL is non-nil, then kill the current buffer,
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
561 otherwise bury it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
730
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
563 If WINDOW is non-nil, it specifies a window; we delete that window,
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
564 and the buffer that is killed or buried is the one in that window."
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
565 (interactive "P")
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
566 (let ((buffer (window-buffer window))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
567 (frame (window-frame (or window (selected-window))))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
568 (window-solitary
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
569 (save-selected-window
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
570 (if window
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
571 (select-window window))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
572 (one-window-p t)))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
573 window-handled)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
574
730
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
575 (save-selected-window
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
576 (if window
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
577 (select-window window))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
578 (or (window-minibuffer-p)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
579 (window-dedicated-p (selected-window))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
580 (switch-to-buffer (other-buffer))))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
581
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
582 ;; Get rid of the frame, if it has just one dedicated window
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
583 ;; and other visible frames exist.
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
584 (and (or (window-minibuffer-p) (window-dedicated-p window))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
585 (delq frame (visible-frame-list))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
586 window-solitary
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
587 (if (and (eq default-minibuffer-frame frame)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
588 (= 1 (length (minibuffer-frame-list))))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
589 (setq window nil)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
590 (delete-frame frame)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
591 (setq window-handled t)))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
592
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
593 ;; Deal with the buffer.
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
594 (if kill
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
595 (kill-buffer buffer)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
596 (bury-buffer buffer))
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
597
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
598 ;; Maybe get rid of the window.
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
599 (and window (not window-handled) (not window-solitary)
3e321319c5ba [xemacs-hg @ 2002-01-12 00:19:50 by janv]
janv
parents: 460
diff changeset
600 (delete-window window))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 ;;; window.el ends here