Mercurial > vim
annotate src/window.c @ 32445:48b95cef8fa2 v9.0.1554
patch 9.0.1554: code for handling 'switchbuf' is repeated
Commit: https://github.com/vim/vim/commit/e42c27d9e8a18e3786f13f17663914cdd0f63f9e
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sun May 14 17:24:22 2023 +0100
patch 9.0.1554: code for handling 'switchbuf' is repeated
Problem: Code for handling 'switchbuf' is repeated.
Solution: Add a function to handle 'switchbuf'. (Yegappan Lakshmanan,
closes #12397)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 14 May 2023 18:30:05 +0200 |
parents | bfc23ba1bba5 |
children | 87f59a64efab |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
10013
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read a list of people who contributed. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 #include "vim.h" | |
11 | |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
12 static void cmd_with_count(char *cmd, char_u *bufp, size_t bufsize, long Prenum); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
13 static void win_init(win_T *newp, win_T *oldp, int flags); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
14 static void win_init_some(win_T *newp, win_T *oldp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
15 static void frame_comp_pos(frame_T *topfrp, int *row, int *col); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
16 static void frame_setheight(frame_T *curfrp, int height); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
17 static void frame_setwidth(frame_T *curfrp, int width); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
18 static void win_exchange(long); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
19 static void win_rotate(int, int); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
20 static void win_totop(int size, int flags); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
21 static void win_equal_rec(win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height); |
26117
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
22 static void trigger_winclosed(win_T *win); |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
23 static win_T *win_free_mem(win_T *win, int *dirp, tabpage_T *tp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
24 static frame_T *win_altframe(win_T *win, tabpage_T *tp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
25 static tabpage_T *alt_tabpage(void); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
26 static win_T *frame2win(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
27 static int frame_has_win(frame_T *frp, win_T *wp); |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
28 static void win_fix_scroll(int resize); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
29 static void win_fix_cursor(int normal); |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
30 static void frame_new_height(frame_T *topfrp, int height, int topfirst, int wfh); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
31 static int frame_fixed_height(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
32 static int frame_fixed_width(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
33 static void frame_add_statusline(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
34 static void frame_new_width(frame_T *topfrp, int width, int leftfirst, int wfw); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
35 static void frame_add_vsep(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
36 static int frame_minwidth(frame_T *topfrp, win_T *next_curwin); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
37 static void frame_fix_width(win_T *wp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
38 static int win_alloc_firstwin(win_T *oldwin); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
39 static void new_frame(win_T *wp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
40 static tabpage_T *alloc_tabpage(void); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
41 static int leave_tabpage(buf_T *new_curbuf, int trigger_leave_autocmds); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
42 static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, int trigger_enter_autocmds, int trigger_leave_autocmds); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
43 static void frame_fix_height(win_T *wp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
44 static int frame_minheight(frame_T *topfrp, win_T *next_curwin); |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17670
diff
changeset
|
45 static int may_open_tabpage(void); |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
46 static int win_enter_ext(win_T *wp, int flags); |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
47 static void win_free(win_T *wp, tabpage_T *tp); |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17670
diff
changeset
|
48 static void win_append(win_T *after, win_T *wp); |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
49 static void frame_append(frame_T *after, frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
50 static void frame_insert(frame_T *before, frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
51 static void frame_remove(frame_T *frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
52 static void win_goto_ver(int up, long count); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
53 static void win_goto_hor(int left, long count); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
54 static void frame_add_height(frame_T *frp, int n); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
55 static void last_status_rec(frame_T *fr, int statusline); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
56 |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
57 static void make_snapshot_rec(frame_T *fr, frame_T **frp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
58 static void clear_snapshot(tabpage_T *tp, int idx); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
59 static void clear_snapshot_rec(frame_T *fr); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
60 static int check_snapshot_rec(frame_T *sn, frame_T *fr); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
61 static win_T *restore_snapshot_rec(frame_T *sn, frame_T *fr); |
28688
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
62 static win_T *get_snapshot_curwin(int idx); |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
63 |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
64 static int frame_check_height(frame_T *topfrp, int height); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
65 static int frame_check_width(frame_T *topfrp, int width); |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
66 |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7677
diff
changeset
|
67 static win_T *win_alloc(win_T *after, int hidden); |
7 | 68 |
27752
c1d1639b52dd
patch 8.2.4402: missing parenthesis may cause unexpected problems
Bram Moolenaar <Bram@vim.org>
parents:
27659
diff
changeset
|
69 #define NOWIN ((win_T *)-1) // non-existing window |
7 | 70 |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
71 #define ROWS_AVAIL (Rows - p_ch - tabline_height()) |
826 | 72 |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
73 // flags for win_enter_ext() |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
74 #define WEE_UNDO_SYNC 0x01 |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
75 #define WEE_CURWIN_INVALID 0x02 |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
76 #define WEE_TRIGGER_NEW_AUTOCMDS 0x04 |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
77 #define WEE_TRIGGER_ENTER_AUTOCMDS 0x08 |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
78 #define WEE_TRIGGER_LEAVE_AUTOCMDS 0x10 |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
79 #define WEE_ALLOW_PARSE_MESSAGES 0x20 |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
80 |
826 | 81 static char *m_onlyone = N_("Already only one window"); |
82 | |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
83 // When non-zero splitting a window is forbidden. Used to avoid that nasty |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
84 // autocommands mess up the window structure. |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
85 static int split_disallowed = 0; |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
86 |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
87 // When non-zero closing a window is forbidden. Used to avoid that nasty |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
88 // autocommands mess up the window structure. |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
89 static int close_disallowed = 0; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
90 |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
91 /* |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
92 * Disallow changing the window layout (split window, close window, move |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
93 * window). Resizing is still allowed. |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
94 * Used for autocommands that temporarily use another window and need to |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
95 * make sure the previously selected window is still there. |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
96 * Must be matched with exactly one call to window_layout_unlock()! |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
97 */ |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
98 static void |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
99 window_layout_lock(void) |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
100 { |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
101 ++split_disallowed; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
102 ++close_disallowed; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
103 } |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
104 |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
105 static void |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
106 window_layout_unlock(void) |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
107 { |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
108 --split_disallowed; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
109 --close_disallowed; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
110 } |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
111 |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
112 /* |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
113 * When the window layout cannot be changed give an error and return TRUE. |
31150
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
114 * "cmd" indicates the action being performed and is used to pick the relevant |
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
115 * error message. |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
116 */ |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
117 int |
31150
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
118 window_layout_locked(enum CMD_index cmd) |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
119 { |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
120 if (split_disallowed > 0 || close_disallowed > 0) |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
121 { |
31150
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
122 if (close_disallowed == 0 && cmd == CMD_tabnew) |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
123 emsg(_(e_cannot_split_window_when_closing_buffer)); |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
124 else |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
125 emsg(_(e_not_allowed_to_change_window_layout_in_this_autocmd)); |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
126 return TRUE; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
127 } |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
128 return FALSE; |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
129 } |
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
130 |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
131 // #define WIN_DEBUG |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
132 #ifdef WIN_DEBUG |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
133 /* |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
134 * Call this method to log the current window layout. |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
135 */ |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
136 static void |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
137 log_frame_layout(frame_T *frame) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
138 { |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
139 ch_log(NULL, "layout %s, wi: %d, he: %d, wwi: %d, whe: %d, id: %d", |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
140 frame->fr_layout == FR_LEAF ? "LEAF" |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
141 : frame->fr_layout == FR_ROW ? "ROW" : "COL", |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
142 frame->fr_width, |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
143 frame->fr_height, |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
144 frame->fr_win == NULL ? -1 : frame->fr_win->w_width, |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
145 frame->fr_win == NULL ? -1 : frame->fr_win->w_height, |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
146 frame->fr_win == NULL ? -1 : frame->fr_win->w_id); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
147 if (frame->fr_child != NULL) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
148 { |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
149 ch_log(NULL, "children"); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
150 log_frame_layout(frame->fr_child); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
151 if (frame->fr_next != NULL) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
152 ch_log(NULL, "END of children"); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
153 } |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
154 if (frame->fr_next != NULL) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
155 log_frame_layout(frame->fr_next); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
156 } |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
157 #endif |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
158 |
7 | 159 /* |
27805
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
160 * Return the current window, unless in the cmdline window and "prevwin" is |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
161 * set, then return "prevwin". |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
162 */ |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
163 win_T * |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
164 prevwin_curwin(void) |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
165 { |
30645
101f08b49ed3
patch 9.0.0657: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30624
diff
changeset
|
166 // In cmdwin, the alternative buffer should be used. |
101f08b49ed3
patch 9.0.0657: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30624
diff
changeset
|
167 return is_in_cmdwin() && prevwin != NULL ? prevwin : curwin; |
27805
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
168 } |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
169 |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
170 /* |
32445
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
171 * If the 'switchbuf' option contains "useopen" or "usetab", then try to jump |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
172 * to a window containing "buf". |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
173 * Returns the pointer to the window that was jumped to or NULL. |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
174 */ |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
175 win_T * |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
176 swbuf_goto_win_with_buf(buf_T *buf) |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
177 { |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
178 win_T *wp = NULL; |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
179 |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
180 if (buf == NULL) |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
181 return wp; |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
182 |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
183 // If 'switchbuf' contains "useopen": jump to first window in the current |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
184 // tab page containing "buf" if one exists. |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
185 if (swb_flags & SWB_USEOPEN) |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
186 wp = buf_jump_open_win(buf); |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
187 |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
188 // If 'switchbuf' contains "usetab": jump to first window in any tab page |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
189 // containing "buf" if one exists. |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
190 if (wp == NULL && (swb_flags & SWB_USETAB)) |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
191 wp = buf_jump_open_tab(buf); |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
192 |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
193 return wp; |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
194 } |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
195 |
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
196 /* |
15933
b2423b31266f
patch 8.1.0972: cannot switch from terminal window to next tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
197 * All CTRL-W window commands are handled here, called from normal_cmd(). |
7 | 198 */ |
199 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
200 do_window( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
201 int nchar, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
202 long Prenum, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
203 int xchar) // extra char from ":wincmd gx" or NUL |
7 | 204 { |
205 long Prenum1; | |
206 win_T *wp; | |
207 char_u *ptr; | |
681 | 208 linenr_T lnum = -1; |
7 | 209 #ifdef FEAT_FIND_ID |
210 int type = FIND_DEFINE; | |
211 int len; | |
212 #endif | |
213 char_u cbuf[40]; | |
214 | |
19271
ebeeb4b4a1fa
patch 8.2.0194: some commands can cause problems in terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
19265
diff
changeset
|
215 if (ERROR_IF_ANY_POPUP_WINDOW) |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
216 return; |
7 | 217 |
30645
101f08b49ed3
patch 9.0.0657: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30624
diff
changeset
|
218 #define CHECK_CMDWIN \ |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
219 do { \ |
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
220 if (cmdwin_type != 0) \ |
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
221 { \ |
25064
8f2262c72178
patch 8.2.3069: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
24216
diff
changeset
|
222 emsg(_(e_invalid_in_cmdline_window)); \ |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
223 return; \ |
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
224 } \ |
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
225 } while (0) |
7 | 226 |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
227 Prenum1 = Prenum == 0 ? 1 : Prenum; |
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
228 |
7 | 229 switch (nchar) |
230 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
231 // split current window in two parts, horizontally |
7 | 232 case 'S': |
233 case Ctrl_S: | |
234 case 's': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
235 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
236 reset_VIsual_and_resel(); // stop Visual mode |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
237 // When splitting the quickfix window open a new buffer in it, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
238 // don't replicate the quickfix buffer. |
635 | 239 if (bt_quickfix(curbuf)) |
240 goto newwindow; | |
7 | 241 #ifdef FEAT_GUI |
242 need_mouse_correct = TRUE; | |
243 #endif | |
7009 | 244 (void)win_split((int)Prenum, 0); |
7 | 245 break; |
246 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
247 // split current window in two parts, vertically |
7 | 248 case Ctrl_V: |
249 case 'v': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
250 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
251 reset_VIsual_and_resel(); // stop Visual mode |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
252 // When splitting the quickfix window open a new buffer in it, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
253 // don't replicate the quickfix buffer. |
1664 | 254 if (bt_quickfix(curbuf)) |
255 goto newwindow; | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
256 #ifdef FEAT_GUI |
7 | 257 need_mouse_correct = TRUE; |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
258 #endif |
7009 | 259 (void)win_split((int)Prenum, WSP_VERT); |
7 | 260 break; |
261 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
262 // split current window and edit alternate file |
7 | 263 case Ctrl_HAT: |
264 case '^': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
265 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
266 reset_VIsual_and_resel(); // stop Visual mode |
15006
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
267 |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
268 if (buflist_findnr(Prenum == 0 |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
269 ? curwin->w_alt_fnum : Prenum) == NULL) |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
270 { |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
271 if (Prenum == 0) |
25064
8f2262c72178
patch 8.2.3069: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
24216
diff
changeset
|
272 emsg(_(e_no_alternate_file)); |
15006
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
273 else |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26532
diff
changeset
|
274 semsg(_(e_buffer_nr_not_found), Prenum); |
15006
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
275 break; |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
276 } |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
277 |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
278 if (!curbuf_locked() && win_split(0, 0) == OK) |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
279 (void)buflist_getfile( |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
280 Prenum == 0 ? curwin->w_alt_fnum : Prenum, |
1fd8e32532f7
patch 8.1.0514: CTRL-W ^ does not work when alternate buffer has no name
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
281 (linenr_T)0, GETF_ALT, FALSE); |
7 | 282 break; |
283 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
284 // open new window |
7 | 285 case Ctrl_N: |
286 case 'n': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
287 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
288 reset_VIsual_and_resel(); // stop Visual mode |
635 | 289 newwindow: |
7 | 290 if (Prenum) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
291 // window height |
1664 | 292 vim_snprintf((char *)cbuf, sizeof(cbuf) - 5, "%ld", Prenum); |
7 | 293 else |
294 cbuf[0] = NUL; | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
295 #if defined(FEAT_QUICKFIX) |
1664 | 296 if (nchar == 'v' || nchar == Ctrl_V) |
297 STRCAT(cbuf, "v"); | |
298 #endif | |
7 | 299 STRCAT(cbuf, "new"); |
300 do_cmdline_cmd(cbuf); | |
301 break; | |
302 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
303 // quit current window |
7 | 304 case Ctrl_Q: |
305 case 'q': | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
306 reset_VIsual_and_resel(); // stop Visual mode |
6432 | 307 cmd_with_count("quit", cbuf, sizeof(cbuf), Prenum); |
6398 | 308 do_cmdline_cmd(cbuf); |
7 | 309 break; |
310 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
311 // close current window |
7 | 312 case Ctrl_C: |
313 case 'c': | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
314 reset_VIsual_and_resel(); // stop Visual mode |
6432 | 315 cmd_with_count("close", cbuf, sizeof(cbuf), Prenum); |
6398 | 316 do_cmdline_cmd(cbuf); |
7 | 317 break; |
318 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
319 #if defined(FEAT_QUICKFIX) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
320 // close preview window |
7 | 321 case Ctrl_Z: |
322 case 'z': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
323 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
324 reset_VIsual_and_resel(); // stop Visual mode |
7 | 325 do_cmdline_cmd((char_u *)"pclose"); |
326 break; | |
327 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
328 // cursor to preview window |
7 | 329 case 'P': |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
330 FOR_ALL_WINDOWS(wp) |
7 | 331 if (wp->w_p_pvw) |
332 break; | |
333 if (wp == NULL) | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
334 emsg(_(e_there_is_no_preview_window)); |
7 | 335 else |
336 win_goto(wp); | |
337 break; | |
338 #endif | |
339 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
340 // close all but current window |
7 | 341 case Ctrl_O: |
342 case 'o': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
343 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
344 reset_VIsual_and_resel(); // stop Visual mode |
6432 | 345 cmd_with_count("only", cbuf, sizeof(cbuf), Prenum); |
6398 | 346 do_cmdline_cmd(cbuf); |
7 | 347 break; |
348 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
349 // cursor to next window with wrap around |
7 | 350 case Ctrl_W: |
351 case 'w': | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
352 // cursor to previous window with wrap around |
7 | 353 case 'W': |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
354 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
355 if (ONE_WINDOW && Prenum != 1) // just one window |
7 | 356 beep_flush(); |
357 else | |
358 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
359 if (Prenum) // go to specified window |
7 | 360 { |
361 for (wp = firstwin; --Prenum > 0; ) | |
362 { | |
363 if (wp->w_next == NULL) | |
364 break; | |
365 else | |
366 wp = wp->w_next; | |
367 } | |
368 } | |
369 else | |
370 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
371 if (nchar == 'W') // go to previous window |
7 | 372 { |
373 wp = curwin->w_prev; | |
374 if (wp == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
375 wp = lastwin; // wrap around |
7 | 376 } |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
377 else // go to next window |
7 | 378 { |
379 wp = curwin->w_next; | |
380 if (wp == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
381 wp = firstwin; // wrap around |
7 | 382 } |
383 } | |
384 win_goto(wp); | |
385 } | |
386 break; | |
387 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
388 // cursor to window below |
7 | 389 case 'j': |
390 case K_DOWN: | |
391 case Ctrl_J: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
392 CHECK_CMDWIN; |
7 | 393 win_goto_ver(FALSE, Prenum1); |
394 break; | |
395 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
396 // cursor to window above |
7 | 397 case 'k': |
398 case K_UP: | |
399 case Ctrl_K: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
400 CHECK_CMDWIN; |
7 | 401 win_goto_ver(TRUE, Prenum1); |
402 break; | |
403 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
404 // cursor to left window |
7 | 405 case 'h': |
406 case K_LEFT: | |
407 case Ctrl_H: | |
408 case K_BS: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
409 CHECK_CMDWIN; |
7 | 410 win_goto_hor(TRUE, Prenum1); |
411 break; | |
412 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
413 // cursor to right window |
7 | 414 case 'l': |
415 case K_RIGHT: | |
416 case Ctrl_L: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
417 CHECK_CMDWIN; |
7 | 418 win_goto_hor(FALSE, Prenum1); |
419 break; | |
420 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
421 // move window to new tab page |
826 | 422 case 'T': |
20737
0b4a9642b39c
patch 8.2.0921: CTRL-W T in cmdline window causes trouble
Bram Moolenaar <Bram@vim.org>
parents:
20711
diff
changeset
|
423 CHECK_CMDWIN; |
1906 | 424 if (one_window()) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15490
diff
changeset
|
425 msg(_(m_onlyone)); |
826 | 426 else |
427 { | |
428 tabpage_T *oldtab = curtab; | |
429 tabpage_T *newtab; | |
430 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
431 // First create a new tab with the window, then go back to |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
432 // the old tab and close the window there. |
944 | 433 wp = curwin; |
826 | 434 if (win_new_tabpage((int)Prenum) == OK |
435 && valid_tabpage(oldtab)) | |
436 { | |
437 newtab = curtab; | |
4354 | 438 goto_tabpage_tp(oldtab, TRUE, TRUE); |
826 | 439 if (curwin == wp) |
440 win_close(curwin, FALSE); | |
441 if (valid_tabpage(newtab)) | |
4354 | 442 goto_tabpage_tp(newtab, TRUE, TRUE); |
826 | 443 } |
444 } | |
445 break; | |
446 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
447 // cursor to top-left window |
7 | 448 case 't': |
449 case Ctrl_T: | |
450 win_goto(firstwin); | |
451 break; | |
452 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
453 // cursor to bottom-right window |
7 | 454 case 'b': |
455 case Ctrl_B: | |
456 win_goto(lastwin); | |
457 break; | |
458 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
459 // cursor to last accessed (previous) window |
7 | 460 case 'p': |
461 case Ctrl_P: | |
8833
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
462 if (!win_valid(prevwin)) |
7 | 463 beep_flush(); |
464 else | |
465 win_goto(prevwin); | |
466 break; | |
467 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
468 // exchange current and next window |
7 | 469 case 'x': |
470 case Ctrl_X: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
471 CHECK_CMDWIN; |
7 | 472 win_exchange(Prenum); |
473 break; | |
474 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
475 // rotate windows downwards |
7 | 476 case Ctrl_R: |
477 case 'r': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
478 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
479 reset_VIsual_and_resel(); // stop Visual mode |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
480 win_rotate(FALSE, (int)Prenum1); // downwards |
7 | 481 break; |
482 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
483 // rotate windows upwards |
7 | 484 case 'R': |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
485 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
486 reset_VIsual_and_resel(); // stop Visual mode |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
487 win_rotate(TRUE, (int)Prenum1); // upwards |
7 | 488 break; |
489 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
490 // move window to the very top/bottom/left/right |
7 | 491 case 'K': |
492 case 'J': | |
493 case 'H': | |
494 case 'L': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
495 CHECK_CMDWIN; |
7 | 496 win_totop((int)Prenum, |
497 ((nchar == 'H' || nchar == 'L') ? WSP_VERT : 0) | |
498 | ((nchar == 'H' || nchar == 'K') ? WSP_TOP : WSP_BOT)); | |
499 break; | |
500 | |
30009
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
501 // make all windows the same width and/or height |
7 | 502 case '=': |
30009
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
503 { |
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
504 int mod = cmdmod.cmod_split & (WSP_VERT | WSP_HOR); |
7 | 505 #ifdef FEAT_GUI |
30009
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
506 need_mouse_correct = TRUE; |
7 | 507 #endif |
30009
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
508 win_equal(NULL, FALSE, |
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
509 mod == WSP_VERT ? 'v' : mod == WSP_HOR ? 'h' : 'b'); |
b97a870a7c63
patch 9.0.0342: ":wincmd =" equalizes in two directions
Bram Moolenaar <Bram@vim.org>
parents:
30005
diff
changeset
|
510 } |
7 | 511 break; |
512 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
513 // increase current window height |
7 | 514 case '+': |
515 #ifdef FEAT_GUI | |
516 need_mouse_correct = TRUE; | |
517 #endif | |
518 win_setheight(curwin->w_height + (int)Prenum1); | |
519 break; | |
520 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
521 // decrease current window height |
7 | 522 case '-': |
523 #ifdef FEAT_GUI | |
524 need_mouse_correct = TRUE; | |
525 #endif | |
526 win_setheight(curwin->w_height - (int)Prenum1); | |
527 break; | |
528 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
529 // set current window height |
7 | 530 case Ctrl__: |
531 case '_': | |
532 #ifdef FEAT_GUI | |
533 need_mouse_correct = TRUE; | |
534 #endif | |
535 win_setheight(Prenum ? (int)Prenum : 9999); | |
536 break; | |
537 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
538 // increase current window width |
7 | 539 case '>': |
540 #ifdef FEAT_GUI | |
541 need_mouse_correct = TRUE; | |
542 #endif | |
543 win_setwidth(curwin->w_width + (int)Prenum1); | |
544 break; | |
545 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
546 // decrease current window width |
7 | 547 case '<': |
548 #ifdef FEAT_GUI | |
549 need_mouse_correct = TRUE; | |
550 #endif | |
551 win_setwidth(curwin->w_width - (int)Prenum1); | |
552 break; | |
553 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
554 // set current window width |
7 | 555 case '|': |
556 #ifdef FEAT_GUI | |
557 need_mouse_correct = TRUE; | |
558 #endif | |
559 win_setwidth(Prenum != 0 ? (int)Prenum : 9999); | |
560 break; | |
561 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
562 // jump to tag and split window if tag exists (in preview window) |
7 | 563 #if defined(FEAT_QUICKFIX) |
564 case '}': | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
565 CHECK_CMDWIN; |
7 | 566 if (Prenum) |
567 g_do_tagpreview = Prenum; | |
568 else | |
569 g_do_tagpreview = p_pvh; | |
12674
e769c912fcd9
patch 8.0.1215: newer gcc warns for implicit fallthrough
Christian Brabandt <cb@256bit.org>
parents:
12564
diff
changeset
|
570 #endif |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
571 // FALLTHROUGH |
7 | 572 case ']': |
573 case Ctrl_RSB: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
574 CHECK_CMDWIN; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
575 // keep Visual mode, can select words to use as a tag |
7 | 576 if (Prenum) |
577 postponed_split = Prenum; | |
578 else | |
579 postponed_split = -1; | |
6251 | 580 #ifdef FEAT_QUICKFIX |
6264 | 581 if (nchar != '}') |
582 g_do_tagpreview = 0; | |
6251 | 583 #endif |
6239 | 584 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
585 // Execute the command right here, required when "wincmd ]" |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
586 // was used in a function. |
7 | 587 do_nv_ident(Ctrl_RSB, NUL); |
31437
ede2bd5f3426
patch 9.0.1051: after a failed CTRL-W ] next command splits window
Bram Moolenaar <Bram@vim.org>
parents:
31384
diff
changeset
|
588 postponed_split = 0; |
7 | 589 break; |
590 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
591 // edit file name under cursor in a new window |
7 | 592 case 'f': |
681 | 593 case 'F': |
7 | 594 case Ctrl_F: |
820 | 595 wingotofile: |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
596 CHECK_CMDWIN; |
31227
1a9e44a45614
patch 9.0.0947: invalid memory access in substitute with function
Bram Moolenaar <Bram@vim.org>
parents:
31190
diff
changeset
|
597 if (check_text_or_curbuf_locked(NULL)) |
1a9e44a45614
patch 9.0.0947: invalid memory access in substitute with function
Bram Moolenaar <Bram@vim.org>
parents:
31190
diff
changeset
|
598 break; |
344 | 599 |
681 | 600 ptr = grab_file_name(Prenum1, &lnum); |
7 | 601 if (ptr != NULL) |
602 { | |
9349
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
603 tabpage_T *oldtab = curtab; |
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
604 win_T *oldwin = curwin; |
29853
31c598083364
patch 9.0.0265: no good reason why the "gf" command isn't in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
29849
diff
changeset
|
605 #ifdef FEAT_GUI |
7 | 606 need_mouse_correct = TRUE; |
29853
31c598083364
patch 9.0.0265: no good reason why the "gf" command isn't in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
29849
diff
changeset
|
607 #endif |
7 | 608 setpcmark(); |
32429
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
609 |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
610 // If 'switchbuf' is set to 'useopen' or 'usetab' and the |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
611 // file is already opened in a window, then jump to it. |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
612 wp = NULL; |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
613 if ((swb_flags & (SWB_USEOPEN | SWB_USETAB)) |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
614 && cmdmod.cmod_tab == 0) |
32445
48b95cef8fa2
patch 9.0.1554: code for handling 'switchbuf' is repeated
Bram Moolenaar <Bram@vim.org>
parents:
32429
diff
changeset
|
615 wp = swbuf_goto_win_with_buf(buflist_findname_exp(ptr)); |
32429
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
616 |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
617 if (wp == NULL && win_split(0, 0) == OK) |
7 | 618 { |
2583 | 619 RESET_BINDING(curwin); |
9349
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
620 if (do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, |
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
621 ECMD_HIDE, NULL) == FAIL) |
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
622 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
623 // Failed to open the file, close the window |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
624 // opened for it. |
9349
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
625 win_close(curwin, FALSE); |
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
626 goto_tabpage_win(oldtab, oldwin); |
b24900b73f90
commit https://github.com/vim/vim/commit/5d2ca0402954ff79b73d9c86cc16c8a6454b75a7
Christian Brabandt <cb@256bit.org>
parents:
9223
diff
changeset
|
627 } |
32429
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
628 else |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
629 wp = curwin; |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
630 } |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
631 |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
632 if (wp != NULL && nchar == 'F' && lnum >= 0) |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
633 { |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
634 curwin->w_cursor.lnum = lnum; |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
635 check_cursor_lnum(); |
bfc23ba1bba5
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'
Bram Moolenaar <Bram@vim.org>
parents:
32363
diff
changeset
|
636 beginline(BL_SOL | BL_FIX); |
7 | 637 } |
638 vim_free(ptr); | |
639 } | |
640 break; | |
641 | |
642 #ifdef FEAT_FIND_ID | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
643 // Go to the first occurrence of the identifier under cursor along path in a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
644 // new window -- webb |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
645 case 'i': // Go to any match |
7 | 646 case Ctrl_I: |
647 type = FIND_ANY; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
648 // FALLTHROUGH |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
649 case 'd': // Go to definition, using 'define' |
7 | 650 case Ctrl_D: |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
651 CHECK_CMDWIN; |
7 | 652 if ((len = find_ident_under_cursor(&ptr, FIND_IDENT)) == 0) |
653 break; | |
28913
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
654 |
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
655 // Make a copy, if the line was changed it will be freed. |
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
656 ptr = vim_strnsave(ptr, len); |
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
657 if (ptr == NULL) |
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
658 break; |
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
659 |
7 | 660 find_pattern_in_path(ptr, 0, len, TRUE, |
661 Prenum == 0 ? TRUE : FALSE, type, | |
662 Prenum1, ACTION_SPLIT, (linenr_T)1, (linenr_T)MAXLNUM); | |
28913
22f743798f84
patch 8.2.4979: accessing freed memory when line is flushed
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
663 vim_free(ptr); |
7 | 664 curwin->w_set_curswant = TRUE; |
665 break; | |
666 #endif | |
667 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
668 // Quickfix window only: view the result under the cursor in a new split. |
14397
19d99d9e670c
patch 8.1.0213: CTRL-W CR does not work properly in a quickfix window
Christian Brabandt <cb@256bit.org>
parents:
14093
diff
changeset
|
669 #if defined(FEAT_QUICKFIX) |
170 | 670 case K_KENTER: |
671 case CAR: | |
672 if (bt_quickfix(curbuf)) | |
14397
19d99d9e670c
patch 8.1.0213: CTRL-W CR does not work properly in a quickfix window
Christian Brabandt <cb@256bit.org>
parents:
14093
diff
changeset
|
673 qf_view_result(TRUE); |
19d99d9e670c
patch 8.1.0213: CTRL-W CR does not work properly in a quickfix window
Christian Brabandt <cb@256bit.org>
parents:
14093
diff
changeset
|
674 break; |
170 | 675 #endif |
676 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
677 // CTRL-W g extended commands |
7 | 678 case 'g': |
679 case Ctrl_G: | |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
680 CHECK_CMDWIN; |
7 | 681 #ifdef USE_ON_FLY_SCROLL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
682 dont_scroll = TRUE; // disallow scrolling here |
7 | 683 #endif |
684 ++no_mapping; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
685 ++allow_keys; // no mapping for xchar, but allow key codes |
7 | 686 if (xchar == NUL) |
1389 | 687 xchar = plain_vgetc(); |
7 | 688 LANGMAP_ADJUST(xchar, TRUE); |
689 --no_mapping; | |
690 --allow_keys; | |
691 (void)add_to_showcmd(xchar); | |
30825
c7983f593fa7
patch 9.0.0747: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
692 |
7 | 693 switch (xchar) |
694 { | |
695 #if defined(FEAT_QUICKFIX) | |
696 case '}': | |
697 xchar = Ctrl_RSB; | |
698 if (Prenum) | |
699 g_do_tagpreview = Prenum; | |
700 else | |
701 g_do_tagpreview = p_pvh; | |
12674
e769c912fcd9
patch 8.0.1215: newer gcc warns for implicit fallthrough
Christian Brabandt <cb@256bit.org>
parents:
12564
diff
changeset
|
702 #endif |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
703 // FALLTHROUGH |
7 | 704 case ']': |
705 case Ctrl_RSB: | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
706 // keep Visual mode, can select words to use as a tag |
7 | 707 if (Prenum) |
708 postponed_split = Prenum; | |
709 else | |
710 postponed_split = -1; | |
711 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
712 // Execute the command right here, required when |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
713 // "wincmd g}" was used in a function. |
7 | 714 do_nv_ident('g', xchar); |
31437
ede2bd5f3426
patch 9.0.1051: after a failed CTRL-W ] next command splits window
Bram Moolenaar <Bram@vim.org>
parents:
31384
diff
changeset
|
715 postponed_split = 0; |
7 | 716 break; |
717 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
718 case 'f': // CTRL-W gf: "gf" in a new tab page |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
719 case 'F': // CTRL-W gF: "gF" in a new tab page |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
22470
diff
changeset
|
720 cmdmod.cmod_tab = tabpage_index(curtab) + 1; |
839 | 721 nchar = xchar; |
820 | 722 goto wingotofile; |
29853
31c598083364
patch 9.0.0265: no good reason why the "gf" command isn't in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
29849
diff
changeset
|
723 |
15933
b2423b31266f
patch 8.1.0972: cannot switch from terminal window to next tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
724 case 't': // CTRL-W gt: go to next tab page |
b2423b31266f
patch 8.1.0972: cannot switch from terminal window to next tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
725 goto_tabpage((int)Prenum); |
b2423b31266f
patch 8.1.0972: cannot switch from terminal window to next tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
726 break; |
b2423b31266f
patch 8.1.0972: cannot switch from terminal window to next tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
727 |
15937
c38fb03a6055
patch 8.1.0974: cannot switch from terminal window to previous tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15933
diff
changeset
|
728 case 'T': // CTRL-W gT: go to previous tab page |
c38fb03a6055
patch 8.1.0974: cannot switch from terminal window to previous tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15933
diff
changeset
|
729 goto_tabpage(-(int)Prenum1); |
c38fb03a6055
patch 8.1.0974: cannot switch from terminal window to previous tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15933
diff
changeset
|
730 break; |
c38fb03a6055
patch 8.1.0974: cannot switch from terminal window to previous tabpage
Bram Moolenaar <Bram@vim.org>
parents:
15933
diff
changeset
|
731 |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
732 case TAB: // CTRL-W g<Tab>: go to last used tab page |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
733 if (goto_tabpage_lastused() == FAIL) |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
734 beep_flush(); |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
735 break; |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
736 |
7 | 737 default: |
738 beep_flush(); | |
739 break; | |
740 } | |
741 break; | |
742 | |
743 default: beep_flush(); | |
744 break; | |
745 } | |
746 } | |
747 | |
6489 | 748 /* |
16475
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
749 * Figure out the address type for ":wincmd". |
6489 | 750 */ |
751 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
752 get_wincmd_addr_type(char_u *arg, exarg_T *eap) |
6489 | 753 { |
754 switch (*arg) | |
755 { | |
756 case 'S': | |
757 case Ctrl_S: | |
758 case 's': | |
759 case Ctrl_N: | |
760 case 'n': | |
761 case 'j': | |
762 case Ctrl_J: | |
763 case 'k': | |
764 case Ctrl_K: | |
765 case 'T': | |
766 case Ctrl_R: | |
767 case 'r': | |
768 case 'R': | |
769 case 'K': | |
770 case 'J': | |
771 case '+': | |
772 case '-': | |
773 case Ctrl__: | |
774 case '_': | |
775 case '|': | |
776 case ']': | |
777 case Ctrl_RSB: | |
778 case 'g': | |
779 case Ctrl_G: | |
780 case Ctrl_V: | |
781 case 'v': | |
782 case 'h': | |
783 case Ctrl_H: | |
784 case 'l': | |
785 case Ctrl_L: | |
786 case 'H': | |
787 case 'L': | |
788 case '>': | |
789 case '<': | |
790 #if defined(FEAT_QUICKFIX) | |
791 case '}': | |
792 #endif | |
793 case 'f': | |
794 case 'F': | |
795 case Ctrl_F: | |
796 #ifdef FEAT_FIND_ID | |
797 case 'i': | |
798 case Ctrl_I: | |
799 case 'd': | |
800 case Ctrl_D: | |
801 #endif | |
16475
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
802 // window size or any count |
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
803 eap->addr_type = ADDR_OTHER; |
6489 | 804 break; |
805 | |
806 case Ctrl_HAT: | |
807 case '^': | |
16475
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
808 // buffer number |
6489 | 809 eap->addr_type = ADDR_BUFFERS; |
810 break; | |
811 | |
812 case Ctrl_Q: | |
813 case 'q': | |
814 case Ctrl_C: | |
815 case 'c': | |
816 case Ctrl_O: | |
817 case 'o': | |
818 case Ctrl_W: | |
819 case 'w': | |
820 case 'W': | |
821 case 'x': | |
822 case Ctrl_X: | |
16475
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
823 // window number |
6489 | 824 eap->addr_type = ADDR_WINDOWS; |
825 break; | |
826 | |
827 #if defined(FEAT_QUICKFIX) | |
828 case Ctrl_Z: | |
829 case 'z': | |
830 case 'P': | |
831 #endif | |
832 case 't': | |
833 case Ctrl_T: | |
834 case 'b': | |
835 case Ctrl_B: | |
836 case 'p': | |
837 case Ctrl_P: | |
838 case '=': | |
839 case CAR: | |
16475
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
840 // no count |
854fb0ad4be6
patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
841 eap->addr_type = ADDR_NONE; |
6489 | 842 break; |
843 } | |
844 } | |
845 | |
6432 | 846 static void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
847 cmd_with_count( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
848 char *cmd, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
849 char_u *bufp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
850 size_t bufsize, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
851 long Prenum) |
6432 | 852 { |
853 if (Prenum > 0) | |
24216
77cb22562852
patch 8.2.2649: Vim9: some wincmd arguments cause a white space error
Bram Moolenaar <Bram@vim.org>
parents:
24108
diff
changeset
|
854 vim_snprintf((char *)bufp, bufsize, "%s %ld", cmd, Prenum); |
77cb22562852
patch 8.2.2649: Vim9: some wincmd arguments cause a white space error
Bram Moolenaar <Bram@vim.org>
parents:
24108
diff
changeset
|
855 else |
77cb22562852
patch 8.2.2649: Vim9: some wincmd arguments cause a white space error
Bram Moolenaar <Bram@vim.org>
parents:
24108
diff
changeset
|
856 STRCPY(bufp, cmd); |
6432 | 857 } |
858 | |
7 | 859 /* |
27583
d4921b91542c
patch 8.2.4318: various comment and indent mistakes, returning wrong zero
Bram Moolenaar <Bram@vim.org>
parents:
27440
diff
changeset
|
860 * If "split_disallowed" is set give an error and return FAIL. |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
861 * Otherwise return OK. |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
862 */ |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
863 static int |
32009
4545f58c8490
patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents:
31960
diff
changeset
|
864 check_split_disallowed(void) |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
865 { |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
866 if (split_disallowed > 0) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
867 { |
26893
79c76ca2c53c
patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26883
diff
changeset
|
868 emsg(_(e_cant_split_window_while_closing_another)); |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
869 return FAIL; |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
870 } |
23869
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
871 if (curwin->w_buffer->b_locked_split) |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
872 { |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
873 emsg(_(e_cannot_split_window_when_closing_buffer)); |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
874 return FAIL; |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
875 } |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
876 return OK; |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
877 } |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
878 |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
879 /* |
7 | 880 * split the current window, implements CTRL-W s and :split |
881 * | |
882 * "size" is the height or width for the new window, 0 to use half of current | |
883 * height or width. | |
884 * | |
885 * "flags": | |
886 * WSP_ROOM: require enough room for new window | |
887 * WSP_VERT: vertical split. | |
888 * WSP_TOP: open window at the top-left of the shell (help window). | |
889 * WSP_BOT: open window at the bottom-right of the shell (quickfix window). | |
890 * WSP_HELP: creating the help window, keep layout snapshot | |
891 * | |
892 * return FAIL for failure, OK otherwise | |
893 */ | |
894 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
895 win_split(int size, int flags) |
7 | 896 { |
19271
ebeeb4b4a1fa
patch 8.2.0194: some commands can cause problems in terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
19265
diff
changeset
|
897 if (ERROR_IF_ANY_POPUP_WINDOW) |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
898 return FAIL; |
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
899 |
23869
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
900 if (check_split_disallowed() == FAIL) |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
901 return FAIL; |
5a4f9c5c1b99
patch 8.2.2476: using freed memory when splitting window while closing buffer
Bram Moolenaar <Bram@vim.org>
parents:
23402
diff
changeset
|
902 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
903 // When the ":tab" modifier was used open a new tab page instead. |
682 | 904 if (may_open_tabpage() == OK) |
905 return OK; | |
906 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
907 // Add flags from ":vertical", ":topleft" and ":botright". |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
22470
diff
changeset
|
908 flags |= cmdmod.cmod_split; |
7 | 909 if ((flags & WSP_TOP) && (flags & WSP_BOT)) |
910 { | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
911 emsg(_(e_cant_split_topleft_and_botright_at_the_same_time)); |
7 | 912 return FAIL; |
913 } | |
914 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
915 // When creating the help window make a snapshot of the window layout. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
916 // Otherwise clear the snapshot, it's now invalid. |
7 | 917 if (flags & WSP_HELP) |
1906 | 918 make_snapshot(SNAP_HELP_IDX); |
7 | 919 else |
1906 | 920 clear_snapshot(curtab, SNAP_HELP_IDX); |
7 | 921 |
922 return win_split_ins(size, flags, NULL, 0); | |
923 } | |
924 | |
925 /* | |
3263 | 926 * When "new_wp" is NULL: split the current window in two. |
927 * When "new_wp" is not NULL: insert this window at the far | |
7 | 928 * top/left/right/bottom. |
31227
1a9e44a45614
patch 9.0.0947: invalid memory access in substitute with function
Bram Moolenaar <Bram@vim.org>
parents:
31190
diff
changeset
|
929 * Return FAIL for failure, OK otherwise. |
7 | 930 */ |
1906 | 931 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
932 win_split_ins( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
933 int size, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
934 int flags, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
935 win_T *new_wp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
936 int dir) |
7 | 937 { |
3263 | 938 win_T *wp = new_wp; |
7 | 939 win_T *oldwin; |
940 int new_size = size; | |
941 int i; | |
942 int need_status = 0; | |
943 int do_equal = FALSE; | |
944 int needed; | |
945 int available; | |
946 int oldwin_height = 0; | |
947 int layout; | |
6077 | 948 frame_T *frp, *curfrp, *frp2, *prevfrp; |
7 | 949 int before; |
6052 | 950 int minheight; |
6066 | 951 int wmh1; |
13670
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
952 int did_set_fraction = FALSE; |
7 | 953 |
954 if (flags & WSP_TOP) | |
955 oldwin = firstwin; | |
956 else if (flags & WSP_BOT) | |
957 oldwin = lastwin; | |
958 else | |
959 oldwin = curwin; | |
960 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
961 // add a status line when p_ls == 1 and splitting the first window |
10357
59d01e335858
commit https://github.com/vim/vim/commit/459ca563128f2edb7e3bb190090bbb755a56dd55
Christian Brabandt <cb@256bit.org>
parents:
10349
diff
changeset
|
962 if (ONE_WINDOW && p_ls == 1 && oldwin->w_status_height == 0) |
7 | 963 { |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
964 if (VISIBLE_HEIGHT(oldwin) <= p_wmh && new_wp == NULL) |
7 | 965 { |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
966 emsg(_(e_not_enough_room)); |
7 | 967 return FAIL; |
968 } | |
969 need_status = STATUS_HEIGHT; | |
970 } | |
971 | |
1114 | 972 #ifdef FEAT_GUI |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
973 // May be needed for the scrollbars that are going to change. |
1114 | 974 if (gui.in_use) |
975 out_flush(); | |
976 #endif | |
977 | |
7 | 978 if (flags & WSP_VERT) |
979 { | |
6068 | 980 int wmw1; |
981 int minwidth; | |
982 | |
7 | 983 layout = FR_ROW; |
984 | |
985 /* | |
986 * Check if we are able to split the current window and compute its | |
987 * width. | |
988 */ | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
989 // Current window requires at least 1 space. |
6066 | 990 wmw1 = (p_wmw == 0 ? 1 : p_wmw); |
991 needed = wmw1 + 1; | |
7 | 992 if (flags & WSP_ROOM) |
6066 | 993 needed += p_wiw - wmw1; |
6077 | 994 if (flags & (WSP_BOT | WSP_TOP)) |
7 | 995 { |
6066 | 996 minwidth = frame_minwidth(topframe, NOWIN); |
7 | 997 available = topframe->fr_width; |
6052 | 998 needed += minwidth; |
7 | 999 } |
6077 | 1000 else if (p_ea) |
1001 { | |
1002 minwidth = frame_minwidth(oldwin->w_frame, NOWIN); | |
1003 prevfrp = oldwin->w_frame; | |
1004 for (frp = oldwin->w_frame->fr_parent; frp != NULL; | |
1005 frp = frp->fr_parent) | |
1006 { | |
1007 if (frp->fr_layout == FR_ROW) | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
1008 FOR_ALL_FRAMES(frp2, frp->fr_child) |
6077 | 1009 if (frp2 != prevfrp) |
1010 minwidth += frame_minwidth(frp2, NOWIN); | |
1011 prevfrp = frp; | |
1012 } | |
1013 available = topframe->fr_width; | |
1014 needed += minwidth; | |
1015 } | |
7 | 1016 else |
6052 | 1017 { |
6066 | 1018 minwidth = frame_minwidth(oldwin->w_frame, NOWIN); |
1019 available = oldwin->w_frame->fr_width; | |
1020 needed += minwidth; | |
6052 | 1021 } |
3263 | 1022 if (available < needed && new_wp == NULL) |
7 | 1023 { |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
1024 emsg(_(e_not_enough_room)); |
7 | 1025 return FAIL; |
1026 } | |
1027 if (new_size == 0) | |
1028 new_size = oldwin->w_width / 2; | |
6052 | 1029 if (new_size > available - minwidth - 1) |
1030 new_size = available - minwidth - 1; | |
6066 | 1031 if (new_size < wmw1) |
1032 new_size = wmw1; | |
7 | 1033 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1034 // if it doesn't fit in the current window, need win_equal() |
7 | 1035 if (oldwin->w_width - new_size - 1 < p_wmw) |
1036 do_equal = TRUE; | |
779 | 1037 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1038 // We don't like to take lines for the new window from a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1039 // 'winfixwidth' window. Take them from a window to the left or right |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1040 // instead, if possible. Add one for the separator. |
779 | 1041 if (oldwin->w_p_wfw) |
11207
e6140f3d2be7
patch 8.0.0490: vertical split makes 'winfixwidth' window smaller
Christian Brabandt <cb@256bit.org>
parents:
11199
diff
changeset
|
1042 win_setwidth_win(oldwin->w_width + new_size + 1, oldwin); |
1354 | 1043 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1044 // Only make all windows the same width if one of them (except oldwin) |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1045 // is wider than one of the split windows. |
1354 | 1046 if (!do_equal && p_ea && size == 0 && *p_ead != 'v' |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1047 && oldwin->w_frame->fr_parent != NULL) |
1354 | 1048 { |
1049 frp = oldwin->w_frame->fr_parent->fr_child; | |
1050 while (frp != NULL) | |
1051 { | |
1052 if (frp->fr_win != oldwin && frp->fr_win != NULL | |
1053 && (frp->fr_win->w_width > new_size | |
1054 || frp->fr_win->w_width > oldwin->w_width | |
6373 | 1055 - new_size - 1)) |
1354 | 1056 { |
1057 do_equal = TRUE; | |
1058 break; | |
1059 } | |
1060 frp = frp->fr_next; | |
1061 } | |
1062 } | |
7 | 1063 } |
1064 else | |
1065 { | |
1066 layout = FR_COL; | |
1067 | |
1068 /* | |
1069 * Check if we are able to split the current window and compute its | |
1070 * height. | |
1071 */ | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1072 // Current window requires at least 1 space. |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
1073 wmh1 = (p_wmh == 0 ? 1 : p_wmh) + WINBAR_HEIGHT(curwin); |
6066 | 1074 needed = wmh1 + STATUS_HEIGHT; |
7 | 1075 if (flags & WSP_ROOM) |
6066 | 1076 needed += p_wh - wmh1; |
6077 | 1077 if (flags & (WSP_BOT | WSP_TOP)) |
7 | 1078 { |
6066 | 1079 minheight = frame_minheight(topframe, NOWIN) + need_status; |
7 | 1080 available = topframe->fr_height; |
6052 | 1081 needed += minheight; |
7 | 1082 } |
6077 | 1083 else if (p_ea) |
1084 { | |
1085 minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; | |
1086 prevfrp = oldwin->w_frame; | |
1087 for (frp = oldwin->w_frame->fr_parent; frp != NULL; | |
1088 frp = frp->fr_parent) | |
1089 { | |
1090 if (frp->fr_layout == FR_COL) | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
1091 FOR_ALL_FRAMES(frp2, frp->fr_child) |
6077 | 1092 if (frp2 != prevfrp) |
1093 minheight += frame_minheight(frp2, NOWIN); | |
1094 prevfrp = frp; | |
1095 } | |
1096 available = topframe->fr_height; | |
1097 needed += minheight; | |
1098 } | |
7 | 1099 else |
1100 { | |
6066 | 1101 minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; |
1102 available = oldwin->w_frame->fr_height; | |
1103 needed += minheight; | |
7 | 1104 } |
3263 | 1105 if (available < needed && new_wp == NULL) |
7 | 1106 { |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
1107 emsg(_(e_not_enough_room)); |
7 | 1108 return FAIL; |
1109 } | |
1110 oldwin_height = oldwin->w_height; | |
1111 if (need_status) | |
1112 { | |
1113 oldwin->w_status_height = STATUS_HEIGHT; | |
1114 oldwin_height -= STATUS_HEIGHT; | |
1115 } | |
1116 if (new_size == 0) | |
1117 new_size = oldwin_height / 2; | |
6052 | 1118 if (new_size > available - minheight - STATUS_HEIGHT) |
1119 new_size = available - minheight - STATUS_HEIGHT; | |
6066 | 1120 if (new_size < wmh1) |
1121 new_size = wmh1; | |
7 | 1122 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1123 // if it doesn't fit in the current window, need win_equal() |
7 | 1124 if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) |
1125 do_equal = TRUE; | |
1126 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1127 // We don't like to take lines for the new window from a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1128 // 'winfixheight' window. Take them from a window above or below |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1129 // instead, if possible. |
7 | 1130 if (oldwin->w_p_wfh) |
1131 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1132 // Set w_fraction now so that the cursor keeps the same relative |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1133 // vertical position using the old height. |
13670
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
1134 set_fraction(oldwin); |
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
1135 did_set_fraction = TRUE; |
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
1136 |
7 | 1137 win_setheight_win(oldwin->w_height + new_size + STATUS_HEIGHT, |
1138 oldwin); | |
1139 oldwin_height = oldwin->w_height; | |
1140 if (need_status) | |
1141 oldwin_height -= STATUS_HEIGHT; | |
1142 } | |
1354 | 1143 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1144 // Only make all windows the same height if one of them (except oldwin) |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1145 // is higher than one of the split windows. |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1146 if (!do_equal && p_ea && size == 0 && *p_ead != 'h' |
1354 | 1147 && oldwin->w_frame->fr_parent != NULL) |
1148 { | |
1149 frp = oldwin->w_frame->fr_parent->fr_child; | |
1150 while (frp != NULL) | |
1151 { | |
1152 if (frp->fr_win != oldwin && frp->fr_win != NULL | |
1153 && (frp->fr_win->w_height > new_size | |
1154 || frp->fr_win->w_height > oldwin_height - new_size | |
1155 - STATUS_HEIGHT)) | |
1156 { | |
1157 do_equal = TRUE; | |
1158 break; | |
1159 } | |
1160 frp = frp->fr_next; | |
1161 } | |
1162 } | |
7 | 1163 } |
1164 | |
1165 /* | |
1166 * allocate new window structure and link it in the window list | |
1167 */ | |
1168 if ((flags & WSP_TOP) == 0 | |
1169 && ((flags & WSP_BOT) | |
1170 || (flags & WSP_BELOW) | |
1171 || (!(flags & WSP_ABOVE) | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1172 && ( (flags & WSP_VERT) ? p_spr : p_sb)))) |
7 | 1173 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1174 // new window below/right of current one |
3263 | 1175 if (new_wp == NULL) |
1906 | 1176 wp = win_alloc(oldwin, FALSE); |
7 | 1177 else |
1178 win_append(oldwin, wp); | |
1179 } | |
1180 else | |
1181 { | |
3263 | 1182 if (new_wp == NULL) |
1906 | 1183 wp = win_alloc(oldwin->w_prev, FALSE); |
7 | 1184 else |
1185 win_append(oldwin->w_prev, wp); | |
1186 } | |
1187 | |
3263 | 1188 if (new_wp == NULL) |
7 | 1189 { |
1190 if (wp == NULL) | |
1191 return FAIL; | |
1192 | |
1906 | 1193 new_frame(wp); |
1194 if (wp->w_frame == NULL) | |
1195 { | |
1196 win_free(wp, NULL); | |
1197 return FAIL; | |
1198 } | |
1199 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1200 // make the contents of the new window the same as the current one |
1822 | 1201 win_init(wp, curwin, flags); |
7 | 1202 } |
1203 | |
1204 /* | |
1205 * Reorganise the tree of frames to insert the new window. | |
1206 */ | |
1207 if (flags & (WSP_TOP | WSP_BOT)) | |
1208 { | |
1209 if ((topframe->fr_layout == FR_COL && (flags & WSP_VERT) == 0) | |
1210 || (topframe->fr_layout == FR_ROW && (flags & WSP_VERT) != 0)) | |
1211 { | |
1212 curfrp = topframe->fr_child; | |
1213 if (flags & WSP_BOT) | |
1214 while (curfrp->fr_next != NULL) | |
1215 curfrp = curfrp->fr_next; | |
1216 } | |
1217 else | |
1218 curfrp = topframe; | |
1219 before = (flags & WSP_TOP); | |
1220 } | |
1221 else | |
1222 { | |
1223 curfrp = oldwin->w_frame; | |
1224 if (flags & WSP_BELOW) | |
1225 before = FALSE; | |
1226 else if (flags & WSP_ABOVE) | |
1227 before = TRUE; | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1228 else if (flags & WSP_VERT) |
7 | 1229 before = !p_spr; |
1230 else | |
1231 before = !p_sb; | |
1232 } | |
1233 if (curfrp->fr_parent == NULL || curfrp->fr_parent->fr_layout != layout) | |
1234 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1235 // Need to create a new frame in the tree to make a branch. |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16802
diff
changeset
|
1236 frp = ALLOC_CLEAR_ONE(frame_T); |
7 | 1237 *frp = *curfrp; |
1238 curfrp->fr_layout = layout; | |
1239 frp->fr_parent = curfrp; | |
1240 frp->fr_next = NULL; | |
1241 frp->fr_prev = NULL; | |
1242 curfrp->fr_child = frp; | |
1243 curfrp->fr_win = NULL; | |
1244 curfrp = frp; | |
1245 if (frp->fr_win != NULL) | |
1246 oldwin->w_frame = frp; | |
1247 else | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
1248 FOR_ALL_FRAMES(frp, frp->fr_child) |
7 | 1249 frp->fr_parent = curfrp; |
1250 } | |
1251 | |
3263 | 1252 if (new_wp == NULL) |
1906 | 1253 frp = wp->w_frame; |
7 | 1254 else |
3263 | 1255 frp = new_wp->w_frame; |
7 | 1256 frp->fr_parent = curfrp->fr_parent; |
1257 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1258 // Insert the new frame at the right place in the frame list. |
7 | 1259 if (before) |
1260 frame_insert(curfrp, frp); | |
1261 else | |
1262 frame_append(curfrp, frp); | |
1263 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1264 // Set w_fraction now so that the cursor keeps the same relative |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1265 // vertical position. |
13670
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
1266 if (!did_set_fraction) |
3085d67d24c8
patch 8.0.1707: when 'wfh' is set ":bel 10new" scrolls window
Christian Brabandt <cb@256bit.org>
parents:
13632
diff
changeset
|
1267 set_fraction(oldwin); |
2665 | 1268 wp->w_fraction = oldwin->w_fraction; |
1269 | |
7 | 1270 if (flags & WSP_VERT) |
1271 { | |
1272 wp->w_p_scr = curwin->w_p_scr; | |
2665 | 1273 |
7 | 1274 if (need_status) |
1275 { | |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1276 win_new_height(oldwin, oldwin->w_height - 1); |
7 | 1277 oldwin->w_status_height = need_status; |
1278 } | |
1279 if (flags & (WSP_TOP | WSP_BOT)) | |
1280 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1281 // set height and row of new window to full height |
685 | 1282 wp->w_winrow = tabline_height(); |
12491
7ab796b041bd
patch 8.0.1125: wrong window height when splitting window with window toolbar
Christian Brabandt <cb@256bit.org>
parents:
12487
diff
changeset
|
1283 win_new_height(wp, curfrp->fr_height - (p_ls > 0) |
12916
af2e0401eb8c
patch 8.0.1334: splitting a window with a WinBar damages window layout
Christian Brabandt <cb@256bit.org>
parents:
12910
diff
changeset
|
1284 - WINBAR_HEIGHT(wp)); |
7 | 1285 wp->w_status_height = (p_ls > 0); |
1286 } | |
1287 else | |
1288 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1289 // height and row of new window is same as current window |
7 | 1290 wp->w_winrow = oldwin->w_winrow; |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
1291 win_new_height(wp, VISIBLE_HEIGHT(oldwin)); |
7 | 1292 wp->w_status_height = oldwin->w_status_height; |
1293 } | |
1294 frp->fr_height = curfrp->fr_height; | |
1295 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1296 // "new_size" of the current window goes to the new window, use |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1297 // one column for the vertical separator |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1298 win_new_width(wp, new_size); |
7 | 1299 if (before) |
1300 wp->w_vsep_width = 1; | |
1301 else | |
1302 { | |
1303 wp->w_vsep_width = oldwin->w_vsep_width; | |
1304 oldwin->w_vsep_width = 1; | |
1305 } | |
1306 if (flags & (WSP_TOP | WSP_BOT)) | |
1307 { | |
1308 if (flags & WSP_BOT) | |
1309 frame_add_vsep(curfrp); | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1310 // Set width of neighbor frame |
7 | 1311 frame_new_width(curfrp, curfrp->fr_width |
779 | 1312 - (new_size + ((flags & WSP_TOP) != 0)), flags & WSP_TOP, |
1313 FALSE); | |
7 | 1314 } |
1315 else | |
779 | 1316 win_new_width(oldwin, oldwin->w_width - (new_size + 1)); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1317 if (before) // new window left of current one |
7 | 1318 { |
1319 wp->w_wincol = oldwin->w_wincol; | |
1320 oldwin->w_wincol += new_size + 1; | |
1321 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1322 else // new window right of current one |
7 | 1323 wp->w_wincol = oldwin->w_wincol + oldwin->w_width + 1; |
1324 frame_fix_width(oldwin); | |
1325 frame_fix_width(wp); | |
1326 } | |
1327 else | |
1328 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1329 // width and column of new window is same as current window |
7 | 1330 if (flags & (WSP_TOP | WSP_BOT)) |
1331 { | |
1332 wp->w_wincol = 0; | |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1333 win_new_width(wp, Columns); |
7 | 1334 wp->w_vsep_width = 0; |
1335 } | |
1336 else | |
1337 { | |
1338 wp->w_wincol = oldwin->w_wincol; | |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1339 win_new_width(wp, oldwin->w_width); |
7 | 1340 wp->w_vsep_width = oldwin->w_vsep_width; |
1341 } | |
1342 frp->fr_width = curfrp->fr_width; | |
1343 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1344 // "new_size" of the current window goes to the new window, use |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1345 // one row for the status line |
7 | 1346 win_new_height(wp, new_size); |
32319
23d44be6ec20
patch 9.0.1491: wrong scrolling with ls=0 and :botright split
Bram Moolenaar <Bram@vim.org>
parents:
32295
diff
changeset
|
1347 int old_status_height = oldwin->w_status_height; |
7 | 1348 if (flags & (WSP_TOP | WSP_BOT)) |
9102
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1349 { |
12491
7ab796b041bd
patch 8.0.1125: wrong window height when splitting window with window toolbar
Christian Brabandt <cb@256bit.org>
parents:
12487
diff
changeset
|
1350 int new_fr_height = curfrp->fr_height - new_size |
12916
af2e0401eb8c
patch 8.0.1334: splitting a window with a WinBar damages window layout
Christian Brabandt <cb@256bit.org>
parents:
12910
diff
changeset
|
1351 + WINBAR_HEIGHT(wp) ; |
9102
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1352 |
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1353 if (!((flags & WSP_BOT) && p_ls == 0)) |
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1354 new_fr_height -= STATUS_HEIGHT; |
32319
23d44be6ec20
patch 9.0.1491: wrong scrolling with ls=0 and :botright split
Bram Moolenaar <Bram@vim.org>
parents:
32295
diff
changeset
|
1355 if (flags & WSP_BOT) |
23d44be6ec20
patch 9.0.1491: wrong scrolling with ls=0 and :botright split
Bram Moolenaar <Bram@vim.org>
parents:
32295
diff
changeset
|
1356 frame_add_statusline(curfrp); |
9102
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1357 frame_new_height(curfrp, new_fr_height, flags & WSP_TOP, FALSE); |
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1358 } |
7 | 1359 else |
1360 win_new_height(oldwin, oldwin_height - (new_size + STATUS_HEIGHT)); | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1361 if (before) // new window above current one |
7 | 1362 { |
1363 wp->w_winrow = oldwin->w_winrow; | |
1364 wp->w_status_height = STATUS_HEIGHT; | |
1365 oldwin->w_winrow += wp->w_height + STATUS_HEIGHT; | |
1366 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1367 else // new window below current one |
7 | 1368 { |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
1369 wp->w_winrow = oldwin->w_winrow + VISIBLE_HEIGHT(oldwin) |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
1370 + STATUS_HEIGHT; |
32319
23d44be6ec20
patch 9.0.1491: wrong scrolling with ls=0 and :botright split
Bram Moolenaar <Bram@vim.org>
parents:
32295
diff
changeset
|
1371 wp->w_status_height = old_status_height; |
9102
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1372 if (!(flags & WSP_BOT)) |
0e90f3e13d88
commit https://github.com/vim/vim/commit/991dea3ab185fb35e577ab0bdfd443cd4b43ccc6
Christian Brabandt <cb@256bit.org>
parents:
8833
diff
changeset
|
1373 oldwin->w_status_height = STATUS_HEIGHT; |
7 | 1374 } |
1375 frame_fix_height(wp); | |
1376 frame_fix_height(oldwin); | |
1377 } | |
1378 | |
1379 if (flags & (WSP_TOP | WSP_BOT)) | |
1380 (void)win_comp_pos(); | |
1381 | |
22464
b74bdd85bb26
patch 8.2.1780: statusline not updated when splitting windows
Bram Moolenaar <Bram@vim.org>
parents:
22399
diff
changeset
|
1382 // Both windows need redrawing. Update all status lines, in case they |
b74bdd85bb26
patch 8.2.1780: statusline not updated when splitting windows
Bram Moolenaar <Bram@vim.org>
parents:
22399
diff
changeset
|
1383 // show something related to the window count or position. |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
1384 redraw_win_later(wp, UPD_NOT_VALID); |
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
1385 redraw_win_later(oldwin, UPD_NOT_VALID); |
22464
b74bdd85bb26
patch 8.2.1780: statusline not updated when splitting windows
Bram Moolenaar <Bram@vim.org>
parents:
22399
diff
changeset
|
1386 status_redraw_all(); |
7 | 1387 |
1388 if (need_status) | |
1389 { | |
1390 msg_row = Rows - 1; | |
1391 msg_col = sc_col; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1392 msg_clr_eos_force(); // Old command/ruler may still be there |
7 | 1393 comp_col(); |
1394 msg_row = Rows - 1; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1395 msg_col = 0; // put position back at start of line |
7 | 1396 } |
1397 | |
1398 /* | |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1399 * equalize the window sizes. |
7 | 1400 */ |
1401 if (do_equal || dir != 0) | |
1402 win_equal(wp, TRUE, | |
1403 (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1404 : dir == 'h' ? 'b' : 'v'); |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
1405 else if (*p_spk != 'c' && !is_aucmd_win(wp)) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1406 win_fix_scroll(FALSE); |
7 | 1407 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1408 // Don't change the window height/width to 'winheight' / 'winwidth' if a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1409 // size was given. |
7 | 1410 if (flags & WSP_VERT) |
1411 { | |
1412 i = p_wiw; | |
1413 if (size != 0) | |
1414 p_wiw = size; | |
1415 | |
1416 # ifdef FEAT_GUI | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1417 // When 'guioptions' includes 'L' or 'R' may have to add scrollbars. |
7 | 1418 if (gui.in_use) |
1419 gui_init_which_components(NULL); | |
1420 # endif | |
1421 } | |
1422 else | |
1423 { | |
1424 i = p_wh; | |
1425 if (size != 0) | |
1426 p_wh = size; | |
1427 } | |
2115
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1428 |
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1429 /* |
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1430 * make the new window the current window |
5fd44cf99b6d
updated for version 7.2.398
Bram Moolenaar <bram@zimbu.org>
parents:
2064
diff
changeset
|
1431 */ |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
1432 (void)win_enter_ext(wp, WEE_TRIGGER_NEW_AUTOCMDS |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
1433 | WEE_TRIGGER_ENTER_AUTOCMDS | WEE_TRIGGER_LEAVE_AUTOCMDS); |
7 | 1434 if (flags & WSP_VERT) |
1435 p_wiw = i; | |
1436 else | |
1437 p_wh = i; | |
1438 | |
1439 return OK; | |
1440 } | |
1441 | |
1906 | 1442 |
675 | 1443 /* |
1444 * Initialize window "newp" from window "oldp". | |
1445 * Used when splitting a window and when creating a new tab page. | |
1446 * The windows will both edit the same buffer. | |
1822 | 1447 * WSP_NEWLOC may be specified in flags to prevent the location list from |
1448 * being copied. | |
675 | 1449 */ |
1450 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1451 win_init(win_T *newp, win_T *oldp, int flags UNUSED) |
675 | 1452 { |
1453 int i; | |
1454 | |
1455 newp->w_buffer = oldp->w_buffer; | |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
1456 #ifdef FEAT_SYN_HL |
2253
12ebd6f6dfce
Fixed: after ":ownsyntax perl" and ":e" syntax was cleared in other window.
Bram Moolenaar <bram@vim.org>
parents:
2252
diff
changeset
|
1457 newp->w_s = &(oldp->w_buffer->b_s); |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
1458 #endif |
675 | 1459 oldp->w_buffer->b_nwindows++; |
1460 newp->w_cursor = oldp->w_cursor; | |
1461 newp->w_valid = 0; | |
1462 newp->w_curswant = oldp->w_curswant; | |
1463 newp->w_set_curswant = oldp->w_set_curswant; | |
1464 newp->w_topline = oldp->w_topline; | |
1465 #ifdef FEAT_DIFF | |
1466 newp->w_topfill = oldp->w_topfill; | |
1467 #endif | |
1468 newp->w_leftcol = oldp->w_leftcol; | |
1469 newp->w_pcmark = oldp->w_pcmark; | |
1470 newp->w_prev_pcmark = oldp->w_prev_pcmark; | |
1471 newp->w_alt_fnum = oldp->w_alt_fnum; | |
826 | 1472 newp->w_wrow = oldp->w_wrow; |
675 | 1473 newp->w_fraction = oldp->w_fraction; |
1474 newp->w_prev_fraction_row = oldp->w_prev_fraction_row; | |
1475 copy_jumplist(oldp, newp); | |
1476 #ifdef FEAT_QUICKFIX | |
1822 | 1477 if (flags & WSP_NEWLOC) |
1478 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1479 // Don't copy the location list. |
1822 | 1480 newp->w_llist = NULL; |
1481 newp->w_llist_ref = NULL; | |
1482 } | |
1483 else | |
14844
a74786d0370c
patch 8.1.0434: copy_loclist() is too long
Christian Brabandt <cb@256bit.org>
parents:
14730
diff
changeset
|
1484 copy_loclist_stack(oldp, newp); |
675 | 1485 #endif |
5584 | 1486 newp->w_localdir = (oldp->w_localdir == NULL) |
1487 ? NULL : vim_strsave(oldp->w_localdir); | |
21723
5b0796787cb2
patch 8.2.1411: when splitting a window localdir is copied but prevdir is not
Bram Moolenaar <Bram@vim.org>
parents:
21703
diff
changeset
|
1488 newp->w_prevdir = (oldp->w_prevdir == NULL) |
5b0796787cb2
patch 8.2.1411: when splitting a window localdir is copied but prevdir is not
Bram Moolenaar <Bram@vim.org>
parents:
21703
diff
changeset
|
1489 ? NULL : vim_strsave(oldp->w_prevdir); |
675 | 1490 |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
1491 if (*p_spk != 'c') |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1492 { |
32363
c114eebb5268
patch 9.0.1513: text scrolls unnecessarily when splitting
Bram Moolenaar <Bram@vim.org>
parents:
32319
diff
changeset
|
1493 if (*p_spk == 't') |
c114eebb5268
patch 9.0.1513: text scrolls unnecessarily when splitting
Bram Moolenaar <Bram@vim.org>
parents:
32319
diff
changeset
|
1494 newp->w_skipcol = oldp->w_skipcol; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1495 newp->w_botline = oldp->w_botline; |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1496 newp->w_prev_height = oldp->w_height - WINBAR_HEIGHT(oldp); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1497 newp->w_prev_winrow = oldp->w_winrow + 2 * WINBAR_HEIGHT(oldp); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1498 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
1499 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1500 // copy tagstack and folds |
675 | 1501 for (i = 0; i < oldp->w_tagstacklen; i++) |
1502 { | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1503 taggy_T *tag = &newp->w_tagstack[i]; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1504 *tag = oldp->w_tagstack[i]; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1505 if (tag->tagname != NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1506 tag->tagname = vim_strsave(tag->tagname); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1507 if (tag->user_data != NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16427
diff
changeset
|
1508 tag->user_data = vim_strsave(tag->user_data); |
675 | 1509 } |
1510 newp->w_tagstackidx = oldp->w_tagstackidx; | |
1511 newp->w_tagstacklen = oldp->w_tagstacklen; | |
29026
5baf5e50049b
patch 8.2.5035: when splitting a window the changelist position moves
Bram Moolenaar <Bram@vim.org>
parents:
29014
diff
changeset
|
1512 |
5baf5e50049b
patch 8.2.5035: when splitting a window the changelist position moves
Bram Moolenaar <Bram@vim.org>
parents:
29014
diff
changeset
|
1513 // Keep same changelist position in new window. |
5baf5e50049b
patch 8.2.5035: when splitting a window the changelist position moves
Bram Moolenaar <Bram@vim.org>
parents:
29014
diff
changeset
|
1514 newp->w_changelistidx = oldp->w_changelistidx; |
5baf5e50049b
patch 8.2.5035: when splitting a window the changelist position moves
Bram Moolenaar <Bram@vim.org>
parents:
29014
diff
changeset
|
1515 |
3068 | 1516 #ifdef FEAT_FOLDING |
675 | 1517 copyFoldingState(oldp, newp); |
3068 | 1518 #endif |
1906 | 1519 |
1520 win_init_some(newp, oldp); | |
26193
c83460a14407
patch 8.2.3628: looking terminal colors is a bit slow
Bram Moolenaar <Bram@vim.org>
parents:
26171
diff
changeset
|
1521 #ifdef FEAT_TERMINAL |
c83460a14407
patch 8.2.3628: looking terminal colors is a bit slow
Bram Moolenaar <Bram@vim.org>
parents:
26171
diff
changeset
|
1522 term_update_wincolor(newp); |
c83460a14407
patch 8.2.3628: looking terminal colors is a bit slow
Bram Moolenaar <Bram@vim.org>
parents:
26171
diff
changeset
|
1523 #endif |
1906 | 1524 } |
1525 | |
1526 /* | |
6222 | 1527 * Initialize window "newp" from window "old". |
1906 | 1528 * Only the essential things are copied. |
1529 */ | |
1530 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1531 win_init_some(win_T *newp, win_T *oldp) |
1906 | 1532 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1533 // Use the same argument list. |
1906 | 1534 newp->w_alist = oldp->w_alist; |
1535 ++newp->w_alist->al_refcount; | |
1536 newp->w_arg_idx = oldp->w_arg_idx; | |
1537 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1538 // copy options from existing window |
1906 | 1539 win_copy_options(oldp, newp); |
675 | 1540 } |
1541 | |
16902
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1542 /* |
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1543 * Return TRUE if "win" is a global popup or a popup in the current tab page. |
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1544 */ |
17051
221d4b82bc0b
patch 8.1.1525: cannot move a popup window with the mouse
Bram Moolenaar <Bram@vim.org>
parents:
17043
diff
changeset
|
1545 int |
16780
491c01280a5d
patch 8.1.1392: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents:
16778
diff
changeset
|
1546 win_valid_popup(win_T *win UNUSED) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1547 { |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
1548 #ifdef FEAT_PROP_POPUP |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1549 win_T *wp; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1550 |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
1551 FOR_ALL_POPUPWINS(wp) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1552 if (wp == win) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1553 return TRUE; |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
1554 FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1555 if (wp == win) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1556 return TRUE; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1557 #endif |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1558 return FALSE; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1559 } |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
1560 |
7 | 1561 /* |
9875
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1562 * Check if "win" is a pointer to an existing window in the current tab page. |
7 | 1563 */ |
1564 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1565 win_valid(win_T *win) |
7 | 1566 { |
1567 win_T *wp; | |
1568 | |
1569 if (win == NULL) | |
1570 return FALSE; | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
1571 FOR_ALL_WINDOWS(wp) |
7 | 1572 if (wp == win) |
1573 return TRUE; | |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1574 return win_valid_popup(win); |
7 | 1575 } |
1576 | |
1577 /* | |
22838
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1578 * Find window "id" in the current tab page. |
22900
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1579 * Also find popup windows. |
22838
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1580 * Return NULL if not found. |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1581 */ |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1582 win_T * |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1583 win_find_by_id(int id) |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1584 { |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1585 win_T *wp; |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1586 |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1587 FOR_ALL_WINDOWS(wp) |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1588 if (wp->w_id == id) |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1589 return wp; |
22900
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1590 #ifdef FEAT_PROP_POPUP |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1591 FOR_ALL_POPUPWINS(wp) |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1592 if (wp->w_id == id) |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1593 return wp; |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1594 FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1595 if (wp->w_id == id) |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1596 return wp; |
2c1520981e63
patch 8.2.1997: window changes when using bufload() while in a terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
22838
diff
changeset
|
1597 #endif |
22838
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1598 return NULL; |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1599 } |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1600 |
80bd5de5dcab
patch 8.2.1966: popup becomes current window after closing a terminal window
Bram Moolenaar <Bram@vim.org>
parents:
22800
diff
changeset
|
1601 /* |
9875
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1602 * Check if "win" is a pointer to an existing window in any tab page. |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1603 */ |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1604 int |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1605 win_valid_any_tab(win_T *win) |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1606 { |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1607 win_T *wp; |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1608 tabpage_T *tp; |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1609 |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1610 if (win == NULL) |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1611 return FALSE; |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1612 FOR_ALL_TABPAGES(tp) |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1613 { |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1614 FOR_ALL_WINDOWS_IN_TAB(tp, wp) |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1615 { |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1616 if (wp == win) |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1617 return TRUE; |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1618 } |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
1619 #ifdef FEAT_PROP_POPUP |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
1620 FOR_ALL_POPUPWINS_IN_TAB(tp, wp) |
16902
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1621 if (wp == win) |
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1622 return TRUE; |
23645f9a5ce2
patch 8.1.1452: line and col property of popup windows not properly checked
Bram Moolenaar <Bram@vim.org>
parents:
16890
diff
changeset
|
1623 #endif |
9875
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1624 } |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1625 return win_valid_popup(win); |
9875
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1626 } |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1627 |
42adbf172ecd
commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a
Christian Brabandt <cb@256bit.org>
parents:
9858
diff
changeset
|
1628 /* |
7 | 1629 * Return the number of windows. |
1630 */ | |
1631 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1632 win_count(void) |
7 | 1633 { |
1634 win_T *wp; | |
1635 int count = 0; | |
1636 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
1637 FOR_ALL_WINDOWS(wp) |
7 | 1638 ++count; |
1639 return count; | |
1640 } | |
1641 | |
1642 /* | |
1643 * Make "count" windows on the screen. | |
1644 * Return actual number of windows on the screen. | |
1645 * Must be called when there is just one window, filling the whole screen | |
1646 * (excluding the command line). | |
1647 */ | |
1648 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1649 make_windows( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1650 int count, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1651 int vertical UNUSED) // split windows vertically if TRUE |
7 | 1652 { |
1653 int maxcount; | |
1654 int todo; | |
1655 | |
1656 if (vertical) | |
1657 { | |
26771
fc859aea8cec
patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
1658 // Each window needs at least 'winminwidth' lines and a separator |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1659 // column. |
7 | 1660 maxcount = (curwin->w_width + curwin->w_vsep_width |
1661 - (p_wiw - p_wmw)) / (p_wmw + 1); | |
1662 } | |
1663 else | |
1664 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1665 // Each window needs at least 'winminheight' lines and a status line. |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
1666 maxcount = (VISIBLE_HEIGHT(curwin) + curwin->w_status_height |
7 | 1667 - (p_wh - p_wmh)) / (p_wmh + STATUS_HEIGHT); |
1668 } | |
1669 | |
1670 if (maxcount < 2) | |
1671 maxcount = 2; | |
1672 if (count > maxcount) | |
1673 count = maxcount; | |
1674 | |
1675 /* | |
1676 * add status line now, otherwise first window will be too big | |
1677 */ | |
1678 if (count > 1) | |
1679 last_status(TRUE); | |
1680 | |
1681 /* | |
1682 * Don't execute autocommands while creating the windows. Must do that | |
1683 * when putting the buffers in the windows. | |
1684 */ | |
1410 | 1685 block_autocmds(); |
7 | 1686 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1687 // todo is number of windows left to create |
7 | 1688 for (todo = count - 1; todo > 0; --todo) |
1689 if (vertical) | |
1690 { | |
1691 if (win_split(curwin->w_width - (curwin->w_width - todo) | |
1692 / (todo + 1) - 1, WSP_VERT | WSP_ABOVE) == FAIL) | |
1693 break; | |
1694 } | |
1695 else | |
1696 { | |
1697 if (win_split(curwin->w_height - (curwin->w_height - todo | |
1698 * STATUS_HEIGHT) / (todo + 1) | |
1699 - STATUS_HEIGHT, WSP_ABOVE) == FAIL) | |
1700 break; | |
1701 } | |
1702 | |
1410 | 1703 unblock_autocmds(); |
7 | 1704 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1705 // return actual number of windows |
7 | 1706 return (count - todo); |
1707 } | |
1708 | |
1709 /* | |
1710 * Exchange current and next window | |
1711 */ | |
1712 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1713 win_exchange(long Prenum) |
7 | 1714 { |
1715 frame_T *frp; | |
1716 frame_T *frp2; | |
1717 win_T *wp; | |
1718 win_T *wp2; | |
1719 int temp; | |
1720 | |
19271
ebeeb4b4a1fa
patch 8.2.0194: some commands can cause problems in terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
19265
diff
changeset
|
1721 if (ERROR_IF_ANY_POPUP_WINDOW) |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
1722 return; |
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
1723 if (ONE_WINDOW) // just one window |
7 | 1724 { |
1725 beep_flush(); | |
1726 return; | |
1727 } | |
1728 | |
1729 #ifdef FEAT_GUI | |
1730 need_mouse_correct = TRUE; | |
1731 #endif | |
1732 | |
1733 /* | |
1734 * find window to exchange with | |
1735 */ | |
1736 if (Prenum) | |
1737 { | |
1738 frp = curwin->w_frame->fr_parent->fr_child; | |
1739 while (frp != NULL && --Prenum > 0) | |
1740 frp = frp->fr_next; | |
1741 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1742 else if (curwin->w_frame->fr_next != NULL) // Swap with next |
7 | 1743 frp = curwin->w_frame->fr_next; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1744 else // Swap last window in row/col with previous |
7 | 1745 frp = curwin->w_frame->fr_prev; |
1746 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1747 // We can only exchange a window with another window, not with a frame |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1748 // containing windows. |
7 | 1749 if (frp == NULL || frp->fr_win == NULL || frp->fr_win == curwin) |
1750 return; | |
1751 wp = frp->fr_win; | |
1752 | |
1753 /* | |
1754 * 1. remove curwin from the list. Remember after which window it was in wp2 | |
1755 * 2. insert curwin before wp in the list | |
1756 * if wp != wp2 | |
1757 * 3. remove wp from the list | |
1758 * 4. insert wp after wp2 | |
1759 * 5. exchange the status line height and vsep width. | |
1760 */ | |
1761 wp2 = curwin->w_prev; | |
1762 frp2 = curwin->w_frame->fr_prev; | |
1763 if (wp->w_prev != curwin) | |
1764 { | |
671 | 1765 win_remove(curwin, NULL); |
7 | 1766 frame_remove(curwin->w_frame); |
1767 win_append(wp->w_prev, curwin); | |
1768 frame_insert(frp, curwin->w_frame); | |
1769 } | |
1770 if (wp != wp2) | |
1771 { | |
671 | 1772 win_remove(wp, NULL); |
7 | 1773 frame_remove(wp->w_frame); |
1774 win_append(wp2, wp); | |
1775 if (frp2 == NULL) | |
1776 frame_insert(wp->w_frame->fr_parent->fr_child, wp->w_frame); | |
1777 else | |
1778 frame_append(frp2, wp->w_frame); | |
1779 } | |
1780 temp = curwin->w_status_height; | |
1781 curwin->w_status_height = wp->w_status_height; | |
1782 wp->w_status_height = temp; | |
1783 temp = curwin->w_vsep_width; | |
1784 curwin->w_vsep_width = wp->w_vsep_width; | |
1785 wp->w_vsep_width = temp; | |
1786 | |
25553
8b5dc14345ce
patch 8.2.3313: unused code in win_exchange() and frame_remove()
Bram Moolenaar <Bram@vim.org>
parents:
25505
diff
changeset
|
1787 frame_fix_height(curwin); |
8b5dc14345ce
patch 8.2.3313: unused code in win_exchange() and frame_remove()
Bram Moolenaar <Bram@vim.org>
parents:
25505
diff
changeset
|
1788 frame_fix_height(wp); |
8b5dc14345ce
patch 8.2.3313: unused code in win_exchange() and frame_remove()
Bram Moolenaar <Bram@vim.org>
parents:
25505
diff
changeset
|
1789 frame_fix_width(curwin); |
8b5dc14345ce
patch 8.2.3313: unused code in win_exchange() and frame_remove()
Bram Moolenaar <Bram@vim.org>
parents:
25505
diff
changeset
|
1790 frame_fix_width(wp); |
7 | 1791 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1792 (void)win_comp_pos(); // recompute window positions |
7 | 1793 |
27251
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
1794 if (wp->w_buffer != curbuf) |
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
1795 reset_VIsual_and_resel(); |
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
1796 else if (VIsual_active) |
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
1797 wp->w_cursor = curwin->w_cursor; |
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
1798 |
7 | 1799 win_enter(wp, TRUE); |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
1800 redraw_all_later(UPD_NOT_VALID); |
7 | 1801 } |
1802 | |
1803 /* | |
1804 * rotate windows: if upwards TRUE the second window becomes the first one | |
1805 * if upwards FALSE the first window becomes the second one | |
1806 */ | |
1807 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1808 win_rotate(int upwards, int count) |
7 | 1809 { |
1810 win_T *wp1; | |
1811 win_T *wp2; | |
1812 frame_T *frp; | |
1813 int n; | |
1814 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1815 if (ONE_WINDOW) // nothing to do |
7 | 1816 { |
1817 beep_flush(); | |
1818 return; | |
1819 } | |
1820 | |
1821 #ifdef FEAT_GUI | |
1822 need_mouse_correct = TRUE; | |
1823 #endif | |
1824 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1825 // Check if all frames in this row/col have one window. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
1826 FOR_ALL_FRAMES(frp, curwin->w_frame->fr_parent->fr_child) |
7 | 1827 if (frp->fr_win == NULL) |
1828 { | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
1829 emsg(_(e_cannot_rotate_when_another_window_is_split)); |
7 | 1830 return; |
1831 } | |
1832 | |
1833 while (count--) | |
1834 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1835 if (upwards) // first window becomes last window |
7 | 1836 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1837 // remove first window/frame from the list |
7 | 1838 frp = curwin->w_frame->fr_parent->fr_child; |
1839 wp1 = frp->fr_win; | |
671 | 1840 win_remove(wp1, NULL); |
7 | 1841 frame_remove(frp); |
1842 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1843 // find last frame and append removed window/frame after it |
7 | 1844 for ( ; frp->fr_next != NULL; frp = frp->fr_next) |
1845 ; | |
1846 win_append(frp->fr_win, wp1); | |
1847 frame_append(frp, wp1->w_frame); | |
1848 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1849 wp2 = frp->fr_win; // previously last window |
7 | 1850 } |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1851 else // last window becomes first window |
7 | 1852 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1853 // find last window/frame in the list and remove it |
7 | 1854 for (frp = curwin->w_frame; frp->fr_next != NULL; |
1855 frp = frp->fr_next) | |
1856 ; | |
1857 wp1 = frp->fr_win; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1858 wp2 = wp1->w_prev; // will become last window |
671 | 1859 win_remove(wp1, NULL); |
7 | 1860 frame_remove(frp); |
1861 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1862 // append the removed window/frame before the first in the list |
7 | 1863 win_append(frp->fr_parent->fr_child->fr_win->w_prev, wp1); |
1864 frame_insert(frp->fr_parent->fr_child, frp); | |
1865 } | |
1866 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1867 // exchange status height and vsep width of old and new last window |
7 | 1868 n = wp2->w_status_height; |
1869 wp2->w_status_height = wp1->w_status_height; | |
1870 wp1->w_status_height = n; | |
1871 frame_fix_height(wp1); | |
1872 frame_fix_height(wp2); | |
1873 n = wp2->w_vsep_width; | |
1874 wp2->w_vsep_width = wp1->w_vsep_width; | |
1875 wp1->w_vsep_width = n; | |
1876 frame_fix_width(wp1); | |
1877 frame_fix_width(wp2); | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1878 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1879 // recompute w_winrow and w_wincol for all windows |
7 | 1880 (void)win_comp_pos(); |
1881 } | |
1882 | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
1883 redraw_all_later(UPD_NOT_VALID); |
7 | 1884 } |
1885 | |
1886 /* | |
1887 * Move the current window to the very top/bottom/left/right of the screen. | |
1888 */ | |
1889 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1890 win_totop(int size, int flags) |
7 | 1891 { |
1892 int dir; | |
1893 int height = curwin->w_height; | |
1894 | |
10357
59d01e335858
commit https://github.com/vim/vim/commit/459ca563128f2edb7e3bb190090bbb755a56dd55
Christian Brabandt <cb@256bit.org>
parents:
10349
diff
changeset
|
1895 if (ONE_WINDOW) |
7 | 1896 { |
1897 beep_flush(); | |
1898 return; | |
1899 } | |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1900 if (check_split_disallowed() == FAIL) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1901 return; |
7 | 1902 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1903 // Remove the window and frame from the tree of frames. |
671 | 1904 (void)winframe_remove(curwin, &dir, NULL); |
1905 win_remove(curwin, NULL); | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1906 last_status(FALSE); // may need to remove last status line |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1907 (void)win_comp_pos(); // recompute window positions |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1908 |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1909 // Split a window on the desired side and put the window there. |
7 | 1910 (void)win_split_ins(size, flags, curwin, dir); |
1911 if (!(flags & WSP_VERT)) | |
1912 { | |
1913 win_setheight(height); | |
1914 if (p_ea) | |
1915 win_equal(curwin, TRUE, 'v'); | |
1916 } | |
1917 | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
1918 #if defined(FEAT_GUI) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1919 // When 'guioptions' includes 'L' or 'R' may have to remove or add |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1920 // scrollbars. Have to update them anyway. |
1906 | 1921 gui_may_update_scrollbars(); |
1922 #endif | |
7 | 1923 } |
1924 | |
1925 /* | |
1926 * Move window "win1" to below/right of "win2" and make "win1" the current | |
1927 * window. Only works within the same frame! | |
1928 */ | |
1929 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1930 win_move_after(win_T *win1, win_T *win2) |
7 | 1931 { |
1932 int height; | |
1933 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1934 // check if the arguments are reasonable |
7 | 1935 if (win1 == win2) |
1936 return; | |
1937 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1938 // check if there is something to do |
7 | 1939 if (win2->w_next != win1) |
1940 { | |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1941 if (win1->w_frame->fr_parent != win2->w_frame->fr_parent) |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1942 { |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1943 iemsg("INTERNAL: trying to move a window into another frame"); |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1944 return; |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1945 } |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
1946 |
21020
6c634e63989c
patch 8.2.1061: insufficient testing for src/window.c
Bram Moolenaar <Bram@vim.org>
parents:
21016
diff
changeset
|
1947 // may need to move the status line/vertical separator of the last |
6c634e63989c
patch 8.2.1061: insufficient testing for src/window.c
Bram Moolenaar <Bram@vim.org>
parents:
21016
diff
changeset
|
1948 // window |
7 | 1949 if (win1 == lastwin) |
1950 { | |
1951 height = win1->w_prev->w_status_height; | |
1952 win1->w_prev->w_status_height = win1->w_status_height; | |
1953 win1->w_status_height = height; | |
1070 | 1954 if (win1->w_prev->w_vsep_width == 1) |
1955 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1956 // Remove the vertical separator from the last-but-one window, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1957 // add it to the last window. Adjust the frame widths. |
1070 | 1958 win1->w_prev->w_vsep_width = 0; |
1959 win1->w_prev->w_frame->fr_width -= 1; | |
1960 win1->w_vsep_width = 1; | |
1961 win1->w_frame->fr_width += 1; | |
1962 } | |
7 | 1963 } |
1964 else if (win2 == lastwin) | |
1965 { | |
1966 height = win1->w_status_height; | |
1967 win1->w_status_height = win2->w_status_height; | |
1968 win2->w_status_height = height; | |
1070 | 1969 if (win1->w_vsep_width == 1) |
1970 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1971 // Remove the vertical separator from win1, add it to the last |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1972 // window, win2. Adjust the frame widths. |
1070 | 1973 win2->w_vsep_width = 1; |
1974 win2->w_frame->fr_width += 1; | |
1975 win1->w_vsep_width = 0; | |
1976 win1->w_frame->fr_width -= 1; | |
1977 } | |
7 | 1978 } |
671 | 1979 win_remove(win1, NULL); |
7 | 1980 frame_remove(win1->w_frame); |
1981 win_append(win2, win1); | |
1982 frame_append(win2->w_frame, win1->w_frame); | |
1983 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1984 (void)win_comp_pos(); // recompute w_winrow for all windows |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
1985 redraw_later(UPD_NOT_VALID); |
7 | 1986 } |
1987 win_enter(win1, FALSE); | |
1988 } | |
1989 | |
1990 /* | |
1991 * Make all windows the same height. | |
1992 * 'next_curwin' will soon be the current window, make sure it has enough | |
1993 * rows. | |
1994 */ | |
1995 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1996 win_equal( |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1997 win_T *next_curwin, // pointer to current window to be or NULL |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1998 int current, // do only frame with current window |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1999 int dir) // 'v' for vertically, 'h' for horizontally, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2000 // 'b' for both, 0 for using p_ead |
7 | 2001 { |
2002 if (dir == 0) | |
2003 dir = *p_ead; | |
2004 win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current, | |
685 | 2005 topframe, dir, 0, tabline_height(), |
667 | 2006 (int)Columns, topframe->fr_height); |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
2007 if (*p_spk != 'c' && !is_aucmd_win(next_curwin)) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
2008 win_fix_scroll(TRUE); |
7 | 2009 } |
2010 | |
2011 /* | |
2012 * Set a frame to a new position and height, spreading the available room | |
2013 * equally over contained frames. | |
2014 * The window "next_curwin" (if not NULL) should at least get the size from | |
2015 * 'winheight' and 'winwidth' if possible. | |
2016 */ | |
2017 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2018 win_equal_rec( |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2019 win_T *next_curwin, // pointer to current window to be or NULL |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2020 int current, // do only frame with current window |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2021 frame_T *topfr, // frame to set size off |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2022 int dir, // 'v', 'h' or 'b', see win_equal() |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2023 int col, // horizontal position for frame |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2024 int row, // vertical position for frame |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2025 int width, // new width of frame |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2026 int height) // new height of frame |
7 | 2027 { |
2028 int n, m; | |
2029 int extra_sep = 0; | |
2030 int wincount, totwincount = 0; | |
2031 frame_T *fr; | |
2032 int next_curwin_size = 0; | |
2033 int room = 0; | |
2034 int new_size; | |
2035 int has_next_curwin = 0; | |
2036 int hnc; | |
2037 | |
2038 if (topfr->fr_layout == FR_LEAF) | |
2039 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2040 // Set the width/height of this frame. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2041 // Redraw when size or position changes |
7 | 2042 if (topfr->fr_height != height || topfr->fr_win->w_winrow != row |
2043 || topfr->fr_width != width || topfr->fr_win->w_wincol != col | |
2044 ) | |
2045 { | |
2046 topfr->fr_win->w_winrow = row; | |
2047 frame_new_height(topfr, height, FALSE, FALSE); | |
2048 topfr->fr_win->w_wincol = col; | |
779 | 2049 frame_new_width(topfr, width, FALSE, FALSE); |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
2050 redraw_all_later(UPD_NOT_VALID); |
7 | 2051 } |
2052 } | |
2053 else if (topfr->fr_layout == FR_ROW) | |
2054 { | |
2055 topfr->fr_width = width; | |
2056 topfr->fr_height = height; | |
2057 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2058 if (dir != 'v') // equalize frame widths |
7 | 2059 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2060 // Compute the maximum number of windows horizontally in this |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2061 // frame. |
7 | 2062 n = frame_minwidth(topfr, NOWIN); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2063 // add one for the rightmost window, it doesn't have a separator |
7 | 2064 if (col + width == Columns) |
2065 extra_sep = 1; | |
2066 else | |
2067 extra_sep = 0; | |
2068 totwincount = (n + extra_sep) / (p_wmw + 1); | |
779 | 2069 has_next_curwin = frame_has_win(topfr, next_curwin); |
2070 | |
2071 /* | |
2072 * Compute width for "next_curwin" window and room available for | |
2073 * other windows. | |
2074 * "m" is the minimal width when counting p_wiw for "next_curwin". | |
2075 */ | |
7 | 2076 m = frame_minwidth(topfr, next_curwin); |
2077 room = width - m; | |
2078 if (room < 0) | |
2079 { | |
2080 next_curwin_size = p_wiw + room; | |
2081 room = 0; | |
2082 } | |
2083 else | |
2084 { | |
779 | 2085 next_curwin_size = -1; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
2086 FOR_ALL_FRAMES(fr, topfr->fr_child) |
779 | 2087 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2088 if (!frame_fixed_width(fr)) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2089 continue; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2090 // If 'winfixwidth' set keep the window width if possible. |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2091 // Watch out for this window being the next_curwin. |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2092 n = frame_minwidth(fr, NOWIN); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2093 new_size = fr->fr_width; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2094 if (frame_has_win(fr, next_curwin)) |
779 | 2095 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2096 room += p_wiw - p_wmw; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2097 next_curwin_size = 0; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2098 if (new_size < p_wiw) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2099 new_size = p_wiw; |
779 | 2100 } |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2101 else |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2102 // These windows don't use up room. |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2103 totwincount -= (n + (fr->fr_next == NULL |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2104 ? extra_sep : 0)) / (p_wmw + 1); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2105 room -= new_size - n; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2106 if (room < 0) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2107 { |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2108 new_size += room; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2109 room = 0; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2110 } |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2111 fr->fr_newwidth = new_size; |
779 | 2112 } |
2113 if (next_curwin_size == -1) | |
2114 { | |
2115 if (!has_next_curwin) | |
2116 next_curwin_size = 0; | |
2117 else if (totwincount > 1 | |
2118 && (room + (totwincount - 2)) | |
2119 / (totwincount - 1) > p_wiw) | |
2120 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2121 // Can make all windows wider than 'winwidth', spread |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2122 // the room equally. |
834 | 2123 next_curwin_size = (room + p_wiw |
2124 + (totwincount - 1) * p_wmw | |
2125 + (totwincount - 1)) / totwincount; | |
779 | 2126 room -= next_curwin_size - p_wiw; |
2127 } | |
2128 else | |
2129 next_curwin_size = p_wiw; | |
2130 } | |
7 | 2131 } |
779 | 2132 |
2133 if (has_next_curwin) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2134 --totwincount; // don't count curwin |
7 | 2135 } |
2136 | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
2137 FOR_ALL_FRAMES(fr, topfr->fr_child) |
7 | 2138 { |
2139 wincount = 1; | |
2140 if (fr->fr_next == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2141 // last frame gets all that remains (avoid roundoff error) |
7 | 2142 new_size = width; |
2143 else if (dir == 'v') | |
2144 new_size = fr->fr_width; | |
779 | 2145 else if (frame_fixed_width(fr)) |
2146 { | |
2147 new_size = fr->fr_newwidth; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2148 wincount = 0; // doesn't count as a sizeable window |
779 | 2149 } |
7 | 2150 else |
2151 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2152 // Compute the maximum number of windows horiz. in "fr". |
7 | 2153 n = frame_minwidth(fr, NOWIN); |
2154 wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) | |
2155 / (p_wmw + 1); | |
2156 m = frame_minwidth(fr, next_curwin); | |
779 | 2157 if (has_next_curwin) |
2158 hnc = frame_has_win(fr, next_curwin); | |
2159 else | |
2160 hnc = FALSE; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2161 if (hnc) // don't count next_curwin |
7 | 2162 --wincount; |
779 | 2163 if (totwincount == 0) |
2164 new_size = room; | |
2165 else | |
2166 new_size = (wincount * room + ((unsigned)totwincount >> 1)) | |
7 | 2167 / totwincount; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2168 if (hnc) // add next_curwin size |
7 | 2169 { |
2170 next_curwin_size -= p_wiw - (m - n); | |
30525
6fa498af368d
patch 9.0.0598: using negative array index with negative width window
Bram Moolenaar <Bram@vim.org>
parents:
30439
diff
changeset
|
2171 if (next_curwin_size < 0) |
6fa498af368d
patch 9.0.0598: using negative array index with negative width window
Bram Moolenaar <Bram@vim.org>
parents:
30439
diff
changeset
|
2172 next_curwin_size = 0; |
7 | 2173 new_size += next_curwin_size; |
779 | 2174 room -= new_size - next_curwin_size; |
7 | 2175 } |
779 | 2176 else |
2177 room -= new_size; | |
2178 new_size += n; | |
7 | 2179 } |
2180 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2181 // Skip frame that is full width when splitting or closing a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2182 // window, unless equalizing all frames. |
7 | 2183 if (!current || dir != 'v' || topfr->fr_parent != NULL |
2184 || (new_size != fr->fr_width) | |
2185 || frame_has_win(fr, next_curwin)) | |
2186 win_equal_rec(next_curwin, current, fr, dir, col, row, | |
779 | 2187 new_size, height); |
2188 col += new_size; | |
2189 width -= new_size; | |
7 | 2190 totwincount -= wincount; |
2191 } | |
2192 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2193 else // topfr->fr_layout == FR_COL |
7 | 2194 { |
2195 topfr->fr_width = width; | |
2196 topfr->fr_height = height; | |
2197 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2198 if (dir != 'h') // equalize frame heights |
7 | 2199 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2200 // Compute maximum number of windows vertically in this frame. |
7 | 2201 n = frame_minheight(topfr, NOWIN); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2202 // add one for the bottom window if it doesn't have a statusline |
7 | 2203 if (row + height == cmdline_row && p_ls == 0) |
2204 extra_sep = 1; | |
2205 else | |
2206 extra_sep = 0; | |
2207 totwincount = (n + extra_sep) / (p_wmh + 1); | |
2208 has_next_curwin = frame_has_win(topfr, next_curwin); | |
2209 | |
2210 /* | |
2211 * Compute height for "next_curwin" window and room available for | |
2212 * other windows. | |
2213 * "m" is the minimal height when counting p_wh for "next_curwin". | |
2214 */ | |
2215 m = frame_minheight(topfr, next_curwin); | |
2216 room = height - m; | |
2217 if (room < 0) | |
2218 { | |
26771
fc859aea8cec
patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
2219 // The room is less than 'winheight', use all space for the |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2220 // current window. |
7 | 2221 next_curwin_size = p_wh + room; |
2222 room = 0; | |
2223 } | |
2224 else | |
2225 { | |
2226 next_curwin_size = -1; | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
2227 FOR_ALL_FRAMES(fr, topfr->fr_child) |
7 | 2228 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2229 if (!frame_fixed_height(fr)) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2230 continue; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2231 // If 'winfixheight' set keep the window height if |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2232 // possible. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2233 // Watch out for this window being the next_curwin. |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2234 n = frame_minheight(fr, NOWIN); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2235 new_size = fr->fr_height; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2236 if (frame_has_win(fr, next_curwin)) |
7 | 2237 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2238 room += p_wh - p_wmh; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2239 next_curwin_size = 0; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2240 if (new_size < p_wh) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2241 new_size = p_wh; |
7 | 2242 } |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2243 else |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2244 // These windows don't use up room. |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2245 totwincount -= (n + (fr->fr_next == NULL |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2246 ? extra_sep : 0)) / (p_wmh + 1); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2247 room -= new_size - n; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2248 if (room < 0) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2249 { |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2250 new_size += room; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2251 room = 0; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2252 } |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
2253 fr->fr_newheight = new_size; |
7 | 2254 } |
2255 if (next_curwin_size == -1) | |
2256 { | |
2257 if (!has_next_curwin) | |
2258 next_curwin_size = 0; | |
2259 else if (totwincount > 1 | |
2260 && (room + (totwincount - 2)) | |
2261 / (totwincount - 1) > p_wh) | |
2262 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2263 // can make all windows higher than 'winheight', |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2264 // spread the room equally. |
834 | 2265 next_curwin_size = (room + p_wh |
2266 + (totwincount - 1) * p_wmh | |
7 | 2267 + (totwincount - 1)) / totwincount; |
2268 room -= next_curwin_size - p_wh; | |
2269 } | |
2270 else | |
2271 next_curwin_size = p_wh; | |
2272 } | |
2273 } | |
2274 | |
2275 if (has_next_curwin) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2276 --totwincount; // don't count curwin |
7 | 2277 } |
2278 | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
2279 FOR_ALL_FRAMES(fr, topfr->fr_child) |
7 | 2280 { |
2281 wincount = 1; | |
2282 if (fr->fr_next == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2283 // last frame gets all that remains (avoid roundoff error) |
7 | 2284 new_size = height; |
2285 else if (dir == 'h') | |
2286 new_size = fr->fr_height; | |
2287 else if (frame_fixed_height(fr)) | |
2288 { | |
2289 new_size = fr->fr_newheight; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2290 wincount = 0; // doesn't count as a sizeable window |
7 | 2291 } |
2292 else | |
2293 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2294 // Compute the maximum number of windows vert. in "fr". |
7 | 2295 n = frame_minheight(fr, NOWIN); |
2296 wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) | |
2297 / (p_wmh + 1); | |
2298 m = frame_minheight(fr, next_curwin); | |
2299 if (has_next_curwin) | |
2300 hnc = frame_has_win(fr, next_curwin); | |
2301 else | |
2302 hnc = FALSE; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2303 if (hnc) // don't count next_curwin |
7 | 2304 --wincount; |
2305 if (totwincount == 0) | |
2306 new_size = room; | |
2307 else | |
2308 new_size = (wincount * room + ((unsigned)totwincount >> 1)) | |
2309 / totwincount; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2310 if (hnc) // add next_curwin size |
7 | 2311 { |
2312 next_curwin_size -= p_wh - (m - n); | |
2313 new_size += next_curwin_size; | |
2314 room -= new_size - next_curwin_size; | |
2315 } | |
2316 else | |
2317 room -= new_size; | |
2318 new_size += n; | |
2319 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2320 // Skip frame that is full width when splitting or closing a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2321 // window, unless equalizing all frames. |
7 | 2322 if (!current || dir != 'h' || topfr->fr_parent != NULL |
2323 || (new_size != fr->fr_height) | |
2324 || frame_has_win(fr, next_curwin)) | |
2325 win_equal_rec(next_curwin, current, fr, dir, col, row, | |
2326 width, new_size); | |
2327 row += new_size; | |
2328 height -= new_size; | |
2329 totwincount -= wincount; | |
2330 } | |
2331 } | |
2332 } | |
2333 | |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2334 #ifdef FEAT_JOB_CHANNEL |
32216
6651b86aed3b
patch 9.0.1439: start Insert mode when accessing a hidden prompt buffer
Bram Moolenaar <Bram@vim.org>
parents:
32118
diff
changeset
|
2335 void |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2336 leaving_window(win_T *win) |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2337 { |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2338 // Only matters for a prompt window. |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2339 if (!bt_prompt(win->w_buffer)) |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2340 return; |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2341 |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2342 // When leaving a prompt window stop Insert mode and perhaps restart |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2343 // it when entering that window again. |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2344 win->w_buffer->b_prompt_insert = restart_edit; |
14093
a9d94f10ecef
patch 8.1.0064: typing CTRL-W in a prompt buffer shows mode "-- --"
Christian Brabandt <cb@256bit.org>
parents:
14057
diff
changeset
|
2345 if (restart_edit != 0 && mode_displayed) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2346 clear_cmdline = TRUE; // unshow mode later |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2347 restart_edit = NUL; |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2348 |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2349 // When leaving the window (or closing the window) was done from a |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2350 // callback we need to break out of the Insert mode loop and restart Insert |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2351 // mode when entering the window again. |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28688
diff
changeset
|
2352 if (State & MODE_INSERT) |
14037
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2353 { |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2354 stop_insert_mode = TRUE; |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2355 if (win->w_buffer->b_prompt_insert == NUL) |
14037
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2356 win->w_buffer->b_prompt_insert = 'A'; |
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2357 } |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2358 } |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2359 |
22470
f7471450243c
patch 8.2.1783: try-catch test fails
Bram Moolenaar <Bram@vim.org>
parents:
22464
diff
changeset
|
2360 void |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2361 entering_window(win_T *win) |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2362 { |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2363 // Only matters for a prompt window. |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2364 if (!bt_prompt(win->w_buffer)) |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2365 return; |
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2366 |
14037
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2367 // When switching to a prompt buffer that was in Insert mode, don't stop |
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2368 // Insert mode, it may have been set in leaving_window(). |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2369 if (win->w_buffer->b_prompt_insert != NUL) |
14037
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2370 stop_insert_mode = FALSE; |
afce2005fdc8
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse
Christian Brabandt <cb@256bit.org>
parents:
14035
diff
changeset
|
2371 |
14049
3e6477e767ba
patch 8.1.0042: if omni completion opens a window Insert mode is stopped
Christian Brabandt <cb@256bit.org>
parents:
14037
diff
changeset
|
2372 // When entering the prompt window restart Insert mode if we were in Insert |
26280
b93e176e7998
patch 8.2.3671: restarting Insert mode in prompt buffer too often
Bram Moolenaar <Bram@vim.org>
parents:
26193
diff
changeset
|
2373 // mode when we left it and not already in Insert mode. |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28688
diff
changeset
|
2374 if ((State & MODE_INSERT) == 0) |
26280
b93e176e7998
patch 8.2.3671: restarting Insert mode in prompt buffer too often
Bram Moolenaar <Bram@vim.org>
parents:
26193
diff
changeset
|
2375 restart_edit = win->w_buffer->b_prompt_insert; |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2376 } |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2377 #endif |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2378 |
28211
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2379 static void |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2380 win_init_empty(win_T *wp) |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2381 { |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
2382 redraw_win_later(wp, UPD_NOT_VALID); |
28211
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2383 wp->w_lines_valid = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2384 wp->w_cursor.lnum = 1; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2385 wp->w_curswant = wp->w_cursor.col = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2386 wp->w_cursor.coladd = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2387 wp->w_pcmark.lnum = 1; // pcmark not cleared but set to line 1 |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2388 wp->w_pcmark.col = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2389 wp->w_prev_pcmark.lnum = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2390 wp->w_prev_pcmark.col = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2391 wp->w_topline = 1; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2392 #ifdef FEAT_DIFF |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2393 wp->w_topfill = 0; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2394 #endif |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2395 wp->w_botline = 2; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2396 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2397 wp->w_s = &wp->w_buffer->b_s; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2398 #endif |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2399 #ifdef FEAT_TERMINAL |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2400 term_reset_wincolor(wp); |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2401 #endif |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2402 } |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2403 |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2404 /* |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2405 * Init the current window "curwin". |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2406 * Called when a new file is being edited. |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2407 */ |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2408 void |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2409 curwin_init(void) |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2410 { |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2411 win_init_empty(curwin); |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2412 } |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
2413 |
7 | 2414 /* |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
2415 * Close all windows for buffer "buf". |
7 | 2416 */ |
2417 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2418 close_windows( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2419 buf_T *buf, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2420 int keep_curwin) // don't close "curwin" |
7 | 2421 { |
671 | 2422 win_T *wp; |
2423 tabpage_T *tp, *nexttp; | |
9599
42a8a81decdf
commit https://github.com/vim/vim/commit/12c11d553053f5a9eae9eb3c518279b12fa928c2
Christian Brabandt <cb@256bit.org>
parents:
9595
diff
changeset
|
2424 int count = tabpage_index(NULL); |
7 | 2425 |
2426 ++RedrawingDisabled; | |
671 | 2427 |
10357
59d01e335858
commit https://github.com/vim/vim/commit/459ca563128f2edb7e3bb190090bbb755a56dd55
Christian Brabandt <cb@256bit.org>
parents:
10349
diff
changeset
|
2428 for (wp = firstwin; wp != NULL && !ONE_WINDOW; ) |
7 | 2429 { |
3570 | 2430 if (wp->w_buffer == buf && (!keep_curwin || wp != curwin) |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
2431 && !(wp->w_closing || wp->w_buffer->b_locked > 0)) |
7 | 2432 { |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
2433 if (win_close(wp, FALSE) == FAIL) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2434 // If closing the window fails give up, to avoid looping |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2435 // forever. |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
2436 break; |
671 | 2437 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2438 // Start all over, autocommands may change the window layout. |
671 | 2439 wp = firstwin; |
7 | 2440 } |
2441 else | |
671 | 2442 wp = wp->w_next; |
7 | 2443 } |
671 | 2444 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2445 // Also check windows in other tab pages. |
671 | 2446 for (tp = first_tabpage; tp != NULL; tp = nexttp) |
2447 { | |
2448 nexttp = tp->tp_next; | |
672 | 2449 if (tp != curtab) |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
2450 FOR_ALL_WINDOWS_IN_TAB(tp, wp) |
3570 | 2451 if (wp->w_buffer == buf |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
2452 && !(wp->w_closing || wp->w_buffer->b_locked > 0)) |
671 | 2453 { |
2454 win_close_othertab(wp, FALSE, tp); | |
2455 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2456 // Start all over, the tab page may be closed and |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2457 // autocommands may change the window layout. |
671 | 2458 nexttp = first_tabpage; |
2459 break; | |
2460 } | |
2461 } | |
2462 | |
7 | 2463 --RedrawingDisabled; |
671 | 2464 |
9599
42a8a81decdf
commit https://github.com/vim/vim/commit/12c11d553053f5a9eae9eb3c518279b12fa928c2
Christian Brabandt <cb@256bit.org>
parents:
9595
diff
changeset
|
2465 if (count != tabpage_index(NULL)) |
42a8a81decdf
commit https://github.com/vim/vim/commit/12c11d553053f5a9eae9eb3c518279b12fa928c2
Christian Brabandt <cb@256bit.org>
parents:
9595
diff
changeset
|
2466 apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf); |
7 | 2467 } |
2468 | |
2469 /* | |
1906 | 2470 * Return TRUE if the current window is the only window that exists (ignoring |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
2471 * "aucmd_win[]"). |
672 | 2472 * Returns FALSE if there is a window, possibly in another tab page. |
667 | 2473 */ |
672 | 2474 static int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2475 last_window(void) |
667 | 2476 { |
1906 | 2477 return (one_window() && first_tabpage->tp_next == NULL); |
2478 } | |
2479 | |
2480 /* | |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
2481 * Return TRUE if there is only one window other than "aucmd_win[]" in the |
1906 | 2482 * current tab page. |
2483 */ | |
3365 | 2484 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2485 one_window(void) |
1906 | 2486 { |
2487 win_T *wp; | |
2488 int seen_one = FALSE; | |
2489 | |
2490 FOR_ALL_WINDOWS(wp) | |
2491 { | |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
2492 if (!is_aucmd_win(wp)) |
1906 | 2493 { |
2494 if (seen_one) | |
2495 return FALSE; | |
2496 seen_one = TRUE; | |
2497 } | |
2498 } | |
2499 return TRUE; | |
667 | 2500 } |
2501 | |
2502 /* | |
3535 | 2503 * Close the possibly last window in a tab page. |
2504 * Returns TRUE when the window was closed already. | |
2505 */ | |
2506 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2507 close_last_window_tabpage( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2508 win_T *win, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2509 int free_buf, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2510 tabpage_T *prev_curtab) |
3535 | 2511 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2512 if (!ONE_WINDOW) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2513 return FALSE; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2514 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2515 buf_T *old_curbuf = curbuf; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2516 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2517 /* |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2518 * Closing the last window in a tab page. First go to another tab |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2519 * page and then close the window and the tab page. This avoids that |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2520 * curwin and curtab are invalid while we are freeing memory, they may |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2521 * be used in GUI events. |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2522 * Don't trigger autocommands yet, they may use wrong values, so do |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2523 * that below. |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2524 */ |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2525 goto_tabpage_tp(alt_tabpage(), FALSE, TRUE); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2526 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2527 // Safety check: Autocommands may have closed the window when jumping |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2528 // to the other tab page. |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2529 if (valid_tabpage(prev_curtab) && prev_curtab->tp_firstwin == win) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2530 win_close_othertab(win, free_buf, prev_curtab); |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2531 #ifdef FEAT_JOB_CHANNEL |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2532 entering_window(curwin); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2533 #endif |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2534 // Since goto_tabpage_tp above did not trigger *Enter autocommands, do |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2535 // that now. |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2536 apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2537 apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2538 apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2539 if (old_curbuf != curbuf) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2540 apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
2541 return TRUE; |
3535 | 2542 } |
2543 | |
2544 /* | |
17043
d99805d25b42
patch 8.1.1521: when a popup window is closed the buffer remains
Bram Moolenaar <Bram@vim.org>
parents:
16902
diff
changeset
|
2545 * Close the buffer of "win" and unload it if "action" is DOBUF_UNLOAD. |
d99805d25b42
patch 8.1.1521: when a popup window is closed the buffer remains
Bram Moolenaar <Bram@vim.org>
parents:
16902
diff
changeset
|
2546 * "action" can also be zero (do nothing) or DOBUF_WIPE. |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2547 * "abort_if_last" is passed to close_buffer(): abort closing if all other |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2548 * windows are closed. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2549 */ |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2550 static void |
17043
d99805d25b42
patch 8.1.1521: when a popup window is closed the buffer remains
Bram Moolenaar <Bram@vim.org>
parents:
16902
diff
changeset
|
2551 win_close_buffer(win_T *win, int action, int abort_if_last) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2552 { |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2553 #ifdef FEAT_SYN_HL |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2554 // Free independent synblock before the buffer is freed. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2555 if (win->w_buffer != NULL) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2556 reset_synblock(win); |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2557 #endif |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2558 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2559 #ifdef FEAT_QUICKFIX |
26458
824fe105f5b9
patch 8.2.3759: quickfix buffer becomes hidden while still in a window
Bram Moolenaar <Bram@vim.org>
parents:
26416
diff
changeset
|
2560 // When a quickfix/location list window is closed and the buffer is |
824fe105f5b9
patch 8.2.3759: quickfix buffer becomes hidden while still in a window
Bram Moolenaar <Bram@vim.org>
parents:
26416
diff
changeset
|
2561 // displayed in only one window, then unlist the buffer. |
824fe105f5b9
patch 8.2.3759: quickfix buffer becomes hidden while still in a window
Bram Moolenaar <Bram@vim.org>
parents:
26416
diff
changeset
|
2562 if (win->w_buffer != NULL && bt_quickfix(win->w_buffer) |
824fe105f5b9
patch 8.2.3759: quickfix buffer becomes hidden while still in a window
Bram Moolenaar <Bram@vim.org>
parents:
26416
diff
changeset
|
2563 && win->w_buffer->b_nwindows == 1) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2564 win->w_buffer->b_p_bl = FALSE; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2565 #endif |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2566 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2567 // Close the link to the buffer. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2568 if (win->w_buffer != NULL) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2569 { |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2570 bufref_T bufref; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2571 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2572 set_bufref(&bufref, curbuf); |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2573 win->w_closing = TRUE; |
28349
d3a1fc6b4da6
patch 8.2.4700: buffer remains active if WinClosed event throws an exception
Bram Moolenaar <Bram@vim.org>
parents:
28289
diff
changeset
|
2574 close_buffer(win, win->w_buffer, action, abort_if_last, TRUE); |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2575 if (win_valid_any_tab(win)) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2576 win->w_closing = FALSE; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2577 // Make sure curbuf is valid. It can become invalid if 'bufhidden' is |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2578 // "wipe". |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2579 if (!bufref_valid(&bufref)) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2580 curbuf = firstbuf; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2581 } |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2582 } |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2583 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2584 /* |
819 | 2585 * Close window "win". Only works for the current tab page. |
7 | 2586 * If "free_buf" is TRUE related buffer may be unloaded. |
2587 * | |
3365 | 2588 * Called by :quit, :close, :xit, :wq and findtag(). |
5302 | 2589 * Returns FAIL when the window was not closed. |
7 | 2590 */ |
5302 | 2591 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
2592 win_close(win_T *win, int free_buf) |
7 | 2593 { |
2594 win_T *wp; | |
2595 int other_buffer = FALSE; | |
2596 int close_curwin = FALSE; | |
2597 int dir; | |
2598 int help_window = FALSE; | |
847 | 2599 tabpage_T *prev_curtab = curtab; |
11593
c4e7fe672a72
patch 8.0.0679: using freed memory
Christian Brabandt <cb@256bit.org>
parents:
11591
diff
changeset
|
2600 frame_T *win_frame = win->w_frame->fr_parent; |
18590
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2601 #ifdef FEAT_DIFF |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2602 int had_diffmode = win->w_p_diff; |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2603 #endif |
25505
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2604 #ifdef MESSAGE_QUEUE |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2605 int did_decrement = FALSE; |
25505
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2606 #endif |
7 | 2607 |
19275
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
2608 #if defined(FEAT_TERMINAL) && defined(FEAT_PROP_POPUP) |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
2609 // Can close a popup window with a terminal if the job has finished. |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
2610 if (may_close_term_popup() == OK) |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
2611 return OK; |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
2612 #endif |
19271
ebeeb4b4a1fa
patch 8.2.0194: some commands can cause problems in terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
19265
diff
changeset
|
2613 if (ERROR_IF_ANY_POPUP_WINDOW) |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
2614 return FAIL; |
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
2615 |
667 | 2616 if (last_window()) |
7 | 2617 { |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
2618 emsg(_(e_cannot_close_last_window)); |
5302 | 2619 return FAIL; |
7 | 2620 } |
31150
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
2621 if (window_layout_locked(CMD_close)) |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
2622 return FAIL; |
7 | 2623 |
10106
58e6dd1d8be3
commit https://github.com/vim/vim/commit/e0ab94e7123ca7855f45919114d948ef2bc1e8c3
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
2624 if (win->w_closing || (win->w_buffer != NULL |
58e6dd1d8be3
commit https://github.com/vim/vim/commit/e0ab94e7123ca7855f45919114d948ef2bc1e8c3
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
2625 && win->w_buffer->b_locked > 0)) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2626 return FAIL; // window is already being closed |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2627 if (win_unlisted(win)) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
2628 { |
26883
7f150a4936f2
patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2629 emsg(_(e_cannot_close_autocmd_or_popup_window)); |
5302 | 2630 return FAIL; |
1906 | 2631 } |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
2632 if ((is_aucmd_win(firstwin) || is_aucmd_win(lastwin)) && one_window()) |
1906 | 2633 { |
26962
85866e069c24
patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2634 emsg(_(e_cannot_close_window_only_autocmd_window_would_remain)); |
5302 | 2635 return FAIL; |
1906 | 2636 } |
2637 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2638 // When closing the last window in a tab page first go to another tab page |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2639 // and then close the window and the tab page to avoid that curwin and |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2640 // curtab are invalid while we are freeing memory. |
3535 | 2641 if (close_last_window_tabpage(win, free_buf, prev_curtab)) |
5302 | 2642 return FAIL; |
856 | 2643 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2644 // When closing the help window, try restoring a snapshot after closing |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2645 // the window. Otherwise clear the snapshot, it's now invalid. |
11800
5ceaecedbad2
patch 8.0.0782: using freed memory in quickfix code
Christian Brabandt <cb@256bit.org>
parents:
11593
diff
changeset
|
2646 if (bt_help(win->w_buffer)) |
7 | 2647 help_window = TRUE; |
2648 else | |
1906 | 2649 clear_snapshot(curtab, SNAP_HELP_IDX); |
7 | 2650 |
2651 if (win == curwin) | |
2652 { | |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2653 #ifdef FEAT_JOB_CHANNEL |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2654 leaving_window(curwin); |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
2655 #endif |
7 | 2656 /* |
2657 * Guess which window is going to be the new current window. | |
2658 * This may change because of the autocommands (sigh). | |
2659 */ | |
671 | 2660 wp = frame2win(win_altframe(win, NULL)); |
7 | 2661 |
2662 /* | |
3570 | 2663 * Be careful: If autocommands delete the window or cause this window |
2664 * to be the last one left, return now. | |
7 | 2665 */ |
2666 if (wp->w_buffer != curbuf) | |
2667 { | |
29348
05ac4ab2c282
patch 9.0.0017: accessing memory beyond the end of the line
Bram Moolenaar <Bram@vim.org>
parents:
29090
diff
changeset
|
2668 reset_VIsual_and_resel(); // stop Visual mode |
05ac4ab2c282
patch 9.0.0017: accessing memory beyond the end of the line
Bram Moolenaar <Bram@vim.org>
parents:
29090
diff
changeset
|
2669 |
7 | 2670 other_buffer = TRUE; |
3570 | 2671 win->w_closing = TRUE; |
7 | 2672 apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); |
3570 | 2673 if (!win_valid(win)) |
5302 | 2674 return FAIL; |
3570 | 2675 win->w_closing = FALSE; |
2676 if (last_window()) | |
5302 | 2677 return FAIL; |
7 | 2678 } |
3570 | 2679 win->w_closing = TRUE; |
7 | 2680 apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); |
3570 | 2681 if (!win_valid(win)) |
5302 | 2682 return FAIL; |
3570 | 2683 win->w_closing = FALSE; |
2684 if (last_window()) | |
5302 | 2685 return FAIL; |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
2686 #ifdef FEAT_EVAL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2687 // autocmds may abort script processing |
7 | 2688 if (aborting()) |
5302 | 2689 return FAIL; |
7 | 2690 #endif |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
2691 } |
7 | 2692 |
1101 | 2693 #ifdef FEAT_GUI |
16019
096b8ccd855e
patch 8.1.1015: quickfix buffer shows up in list, can't get buffer number
Bram Moolenaar <Bram@vim.org>
parents:
15977
diff
changeset
|
2694 // Avoid trouble with scrollbars that are going to be deleted in |
096b8ccd855e
patch 8.1.1015: quickfix buffer shows up in list, can't get buffer number
Bram Moolenaar <Bram@vim.org>
parents:
15977
diff
changeset
|
2695 // win_free(). |
1101 | 2696 if (gui.in_use) |
2697 out_flush(); | |
2698 #endif | |
2699 | |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
2700 #ifdef FEAT_PROP_POPUP |
17863
08f1dd29550e
patch 8.1.1928: popup windows don't move with the text when making changes
Bram Moolenaar <Bram@vim.org>
parents:
17823
diff
changeset
|
2701 if (popup_win_closed(win) && !win_valid(win)) |
08f1dd29550e
patch 8.1.1928: popup windows don't move with the text when making changes
Bram Moolenaar <Bram@vim.org>
parents:
17823
diff
changeset
|
2702 return FAIL; |
08f1dd29550e
patch 8.1.1928: popup windows don't move with the text when making changes
Bram Moolenaar <Bram@vim.org>
parents:
17823
diff
changeset
|
2703 #endif |
26117
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2704 |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2705 // Trigger WinClosed just before starting to free window-related resources. |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2706 trigger_winclosed(win); |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2707 // autocmd may have freed the window already. |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2708 if (!win_valid_any_tab(win)) |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2709 return OK; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2710 |
17043
d99805d25b42
patch 8.1.1521: when a popup window is closed the buffer remains
Bram Moolenaar <Bram@vim.org>
parents:
16902
diff
changeset
|
2711 win_close_buffer(win, free_buf ? DOBUF_UNLOAD : 0, TRUE); |
847 | 2712 |
4021 | 2713 if (only_one_window() && win_valid(win) && win->w_buffer == NULL |
2714 && (last_window() || curtab != prev_curtab | |
2715 || close_last_window_tabpage(win, free_buf, prev_curtab))) | |
5233
1899acc5aebd
updated for version 7.4a.042
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
2716 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2717 // Autocommands have closed all windows, quit now. Restore |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2718 // curwin->w_buffer, otherwise writing viminfo may fail. |
5233
1899acc5aebd
updated for version 7.4a.042
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
2719 if (curwin->w_buffer == NULL) |
1899acc5aebd
updated for version 7.4a.042
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
2720 curwin->w_buffer = curbuf; |
4021 | 2721 getout(0); |
5233
1899acc5aebd
updated for version 7.4a.042
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
2722 } |
4021 | 2723 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2724 // Autocommands may have moved to another tab page. |
10076
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2725 if (curtab != prev_curtab && win_valid_any_tab(win) |
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2726 && win->w_buffer == NULL) |
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2727 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2728 // Need to close the window anyway, since the buffer is NULL. |
30429
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
2729 // Don't trigger autocmds with a NULL buffer. |
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
2730 block_autocmds(); |
10076
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2731 win_close_othertab(win, FALSE, prev_curtab); |
30429
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
2732 unblock_autocmds(); |
10076
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2733 return FAIL; |
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2734 } |
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2735 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2736 // Autocommands may have closed the window already or closed the only |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2737 // other window. |
10076
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2738 if (!win_valid(win) || last_window() |
3535 | 2739 || close_last_window_tabpage(win, free_buf, prev_curtab)) |
5302 | 2740 return FAIL; |
7 | 2741 |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2742 // Now we are really going to close the window. Disallow any autocommand |
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2743 // to split a window to avoid trouble. |
22800
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2744 // Also bail out of parse_queued_messages() to avoid it tries to update the |
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2745 // screen. |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2746 ++split_disallowed; |
22800
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2747 #ifdef MESSAGE_QUEUE |
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2748 ++dont_parse_messages; |
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2749 #endif |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2750 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2751 // Free the memory used for the window and get the window that received |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2752 // the screen space. |
847 | 2753 wp = win_free_mem(win, &dir, NULL); |
2754 | |
28688
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2755 if (help_window) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2756 { |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2757 // Closing the help window moves the cursor back to the current window |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2758 // of the snapshot. |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2759 win_T *prev_win = get_snapshot_curwin(SNAP_HELP_IDX); |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2760 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2761 if (win_valid(prev_win)) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2762 wp = prev_win; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2763 } |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
2764 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2765 // Make sure curwin isn't invalid. It can cause severe trouble when |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2766 // printing an error message. For win_equal() curbuf needs to be valid |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2767 // too. |
847 | 2768 if (win == curwin) |
7 | 2769 { |
2770 curwin = wp; | |
2771 #ifdef FEAT_QUICKFIX | |
2772 if (wp->w_p_pvw || bt_quickfix(wp->w_buffer)) | |
2773 { | |
2774 /* | |
1346 | 2775 * If the cursor goes to the preview or the quickfix window, try |
7 | 2776 * finding another window to go to. |
2777 */ | |
2778 for (;;) | |
2779 { | |
2780 if (wp->w_next == NULL) | |
2781 wp = firstwin; | |
2782 else | |
2783 wp = wp->w_next; | |
2784 if (wp == curwin) | |
2785 break; | |
2786 if (!wp->w_p_pvw && !bt_quickfix(wp->w_buffer)) | |
2787 { | |
2788 curwin = wp; | |
2789 break; | |
2790 } | |
2791 } | |
2792 } | |
2793 #endif | |
2794 curbuf = curwin->w_buffer; | |
2795 close_curwin = TRUE; | |
11193
75ccc8a15a51
patch 8.0.0483: illegal memory access when using :all
Christian Brabandt <cb@256bit.org>
parents:
11191
diff
changeset
|
2796 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2797 // The cursor position may be invalid if the buffer changed after last |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2798 // using the window. |
11193
75ccc8a15a51
patch 8.0.0483: illegal memory access when using :all
Christian Brabandt <cb@256bit.org>
parents:
11191
diff
changeset
|
2799 check_cursor(); |
7 | 2800 } |
30134
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2801 |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2802 /* |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2803 * If last window has a status line now and we don't want one, remove the |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2804 * status line. Do this before win_equal(), because it may change the |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2805 * height of a window |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2806 */ |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2807 last_status(FALSE); |
0211a930d873
patch 9.0.0403: 'equalalways' may be off when 'laststatus' is zero
Bram Moolenaar <Bram@vim.org>
parents:
30009
diff
changeset
|
2808 |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
2809 if (p_ea && (*p_ead == 'b' || *p_ead == dir)) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2810 // If the frame of the closed window contains the new current window, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2811 // only resize that frame. Otherwise resize all windows. |
11593
c4e7fe672a72
patch 8.0.0679: using freed memory
Christian Brabandt <cb@256bit.org>
parents:
11591
diff
changeset
|
2812 win_equal(curwin, curwin->w_frame->fr_parent == win_frame, dir); |
7 | 2813 else |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
2814 { |
7 | 2815 win_comp_pos(); |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
2816 if (*p_spk != 'c') |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
2817 win_fix_scroll(FALSE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
2818 } |
7 | 2819 if (close_curwin) |
2820 { | |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2821 // Pass WEE_ALLOW_PARSE_MESSAGES to decrement dont_parse_messages |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2822 // before autocommands. |
25505
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2823 #ifdef MESSAGE_QUEUE |
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2824 did_decrement = |
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2825 #else |
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2826 (void) |
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2827 #endif |
040a45d39570
patch 8.2.3289: compiler warning for unused variable with small features
Bram Moolenaar <Bram@vim.org>
parents:
25501
diff
changeset
|
2828 win_enter_ext(wp, |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2829 WEE_CURWIN_INVALID | WEE_TRIGGER_ENTER_AUTOCMDS |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2830 | WEE_TRIGGER_LEAVE_AUTOCMDS | WEE_ALLOW_PARSE_MESSAGES); |
7 | 2831 if (other_buffer) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2832 // careful: after this wp and win may be invalid! |
7 | 2833 apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); |
2834 } | |
2835 | |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2836 --split_disallowed; |
22800
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2837 #ifdef MESSAGE_QUEUE |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2838 if (!did_decrement) |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
2839 --dont_parse_messages; |
22800
8e7cbf73c3a0
patch 8.2.1948: GUI: crash when handling message while closing a window
Bram Moolenaar <Bram@vim.org>
parents:
22713
diff
changeset
|
2840 #endif |
17516
711db62c8aca
patch 8.1.1756: autocommand that splits window messes up window layout
Bram Moolenaar <Bram@vim.org>
parents:
17514
diff
changeset
|
2841 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2842 // After closing the help window, try restoring the window layout from |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2843 // before it was opened. |
7 | 2844 if (help_window) |
1906 | 2845 restore_snapshot(SNAP_HELP_IDX, close_curwin); |
7 | 2846 |
18590
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2847 #ifdef FEAT_DIFF |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2848 // If the window had 'diff' set and now there is only one window left in |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2849 // the tab page with 'diff' set, and "closeoff" is in 'diffopt', then |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2850 // execute ":diffoff!". |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2851 if (diffopt_closeoff() && had_diffmode && curtab == prev_curtab) |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2852 { |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2853 int diffcount = 0; |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2854 win_T *dwin; |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2855 |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2856 FOR_ALL_WINDOWS(dwin) |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2857 if (dwin->w_p_diff) |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2858 ++diffcount; |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2859 if (diffcount == 1) |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2860 do_cmdline_cmd((char_u *)"diffoff!"); |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2861 } |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2862 #endif |
41484f342f80
patch 8.1.2289: after :diffsplit closing the window does not disable diff
Bram Moolenaar <Bram@vim.org>
parents:
18467
diff
changeset
|
2863 |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
2864 #if defined(FEAT_GUI) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
2865 // When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. |
7 | 2866 if (gui.in_use && !win_hasvertsplit()) |
2867 gui_init_which_components(NULL); | |
2868 #endif | |
2869 | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
2870 redraw_all_later(UPD_NOT_VALID); |
5302 | 2871 return OK; |
7 | 2872 } |
2873 | |
26117
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2874 static void |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2875 trigger_winclosed(win_T *win) |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2876 { |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2877 static int recursive = FALSE; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2878 char_u winid[NUMBUFLEN]; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2879 |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2880 if (recursive) |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2881 return; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2882 recursive = TRUE; |
28375
e466fdbe0699
patch 8.2.4713: plugins cannot track text scrolling
Bram Moolenaar <Bram@vim.org>
parents:
28361
diff
changeset
|
2883 vim_snprintf((char *)winid, sizeof(winid), "%d", win->w_id); |
26117
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2884 apply_autocmds(EVENT_WINCLOSED, winid, winid, FALSE, win->w_buffer); |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2885 recursive = FALSE; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2886 } |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
2887 |
28429
aa9720c76412
patch 8.2.4739: accessing freed memory after WinScrolled autocmd event
Bram Moolenaar <Bram@vim.org>
parents:
28375
diff
changeset
|
2888 /* |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2889 * Make a snapshot of all the window scroll positions and sizes of the current |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2890 * tab page. |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2891 */ |
31162
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
2892 void |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2893 snapshot_windows_scroll_size(void) |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2894 { |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2895 win_T *wp; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2896 FOR_ALL_WINDOWS(wp) |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2897 { |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2898 wp->w_last_topline = wp->w_topline; |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2899 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2900 wp->w_last_topfill = wp->w_topfill; |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2901 #endif |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2902 wp->w_last_leftcol = wp->w_leftcol; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2903 wp->w_last_skipcol = wp->w_skipcol; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2904 wp->w_last_width = wp->w_width; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2905 wp->w_last_height = wp->w_height; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2906 } |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2907 } |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2908 |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2909 static int did_initial_scroll_size_snapshot = FALSE; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2910 |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2911 void |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2912 may_make_initial_scroll_size_snapshot(void) |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2913 { |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2914 if (!did_initial_scroll_size_snapshot) |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2915 { |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2916 did_initial_scroll_size_snapshot = TRUE; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2917 snapshot_windows_scroll_size(); |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2918 } |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2919 } |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2920 |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
2921 #ifdef FEAT_EVAL |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
2922 /* |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2923 * Create a dictionary with information about size and scroll changes in a |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2924 * window. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2925 * Returns the dictionary with refcount set to one. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2926 * Returns NULL when out of memory. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2927 */ |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2928 static dict_T * |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2929 make_win_info_dict( |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2930 int width, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2931 int height, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2932 int topline, |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2933 # ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2934 int topfill, |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2935 # endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2936 int leftcol, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2937 int skipcol) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2938 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2939 dict_T *d = dict_alloc(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2940 if (d == NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2941 return NULL; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2942 d->dv_refcount = 1; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2943 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2944 // not actually looping, for breaking out on error |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2945 while (1) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2946 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2947 typval_T tv; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2948 tv.v_lock = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2949 tv.v_type = VAR_NUMBER; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2950 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2951 tv.vval.v_number = width; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2952 if (dict_add_tv(d, "width", &tv) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2953 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2954 tv.vval.v_number = height; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2955 if (dict_add_tv(d, "height", &tv) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2956 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2957 tv.vval.v_number = topline; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2958 if (dict_add_tv(d, "topline", &tv) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2959 break; |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2960 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2961 tv.vval.v_number = topfill; |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2962 #else |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2963 tv.vval.v_number = 0; |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2964 #endif |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2965 if (dict_add_tv(d, "topfill", &tv) == FAIL) |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
2966 break; |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2967 tv.vval.v_number = leftcol; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2968 if (dict_add_tv(d, "leftcol", &tv) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2969 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2970 tv.vval.v_number = skipcol; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2971 if (dict_add_tv(d, "skipcol", &tv) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2972 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2973 return d; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2974 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2975 dict_unref(d); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2976 return NULL; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2977 } |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
2978 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2979 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2980 // Return values of check_window_scroll_resize(): |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2981 #define CWSR_SCROLLED 1 // at least one window scrolled |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2982 #define CWSR_RESIZED 2 // at least one window size changed |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2983 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2984 /* |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2985 * This function is used for three purposes: |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2986 * 1. Goes over all windows in the current tab page and returns: |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2987 * 0 no scrolling and no size changes found |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2988 * CWSR_SCROLLED at least one window scrolled |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2989 * CWSR_RESIZED at least one window changed size |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2990 * CWSR_SCROLLED + CWSR_RESIZED both |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2991 * "size_count" is set to the nr of windows with size changes. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2992 * "first_scroll_win" is set to the first window with any relevant changes. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2993 * "first_size_win" is set to the first window with size changes. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2994 * |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2995 * 2. When the first three arguments are NULL and "winlist" is not NULL, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2996 * "winlist" is set to the list of window IDs with size changes. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2997 * |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2998 * 3. When the first three arguments are NULL and "v_event" is not NULL, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
2999 * information about changed windows is added to "v_event". |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3000 */ |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3001 static int |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3002 check_window_scroll_resize( |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3003 int *size_count, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3004 win_T **first_scroll_win, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3005 win_T **first_size_win, |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3006 list_T *winlist UNUSED, |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3007 dict_T *v_event UNUSED) |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3008 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3009 int result = 0; |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3010 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3011 int listidx = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3012 int tot_width = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3013 int tot_height = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3014 int tot_topline = 0; |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3015 # ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3016 int tot_topfill = 0; |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3017 # endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3018 int tot_leftcol = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3019 int tot_skipcol = 0; |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3020 #endif |
28375
e466fdbe0699
patch 8.2.4713: plugins cannot track text scrolling
Bram Moolenaar <Bram@vim.org>
parents:
28361
diff
changeset
|
3021 |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
3022 win_T *wp; |
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
3023 FOR_ALL_WINDOWS(wp) |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3024 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3025 int size_changed = wp->w_last_width != wp->w_width |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3026 || wp->w_last_height != wp->w_height; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3027 if (size_changed) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3028 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3029 result |= CWSR_RESIZED; |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3030 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3031 if (winlist != NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3032 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3033 // Add this window to the list of changed windows. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3034 typval_T tv; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3035 tv.v_lock = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3036 tv.v_type = VAR_NUMBER; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3037 tv.vval.v_number = wp->w_id; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3038 list_set_item(winlist, listidx++, &tv); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3039 } |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3040 else |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3041 #endif |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3042 if (size_count != NULL) |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3043 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3044 ++*size_count; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3045 if (*first_size_win == NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3046 *first_size_win = wp; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3047 // For WinScrolled the first window with a size change is used |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3048 // even when it didn't scroll. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3049 if (*first_scroll_win == NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3050 *first_scroll_win = wp; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3051 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3052 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3053 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3054 int scroll_changed = wp->w_last_topline != wp->w_topline |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3055 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3056 || wp->w_last_topfill != wp->w_topfill |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3057 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3058 || wp->w_last_leftcol != wp->w_leftcol |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3059 || wp->w_last_skipcol != wp->w_skipcol; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3060 if (scroll_changed) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3061 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3062 result |= CWSR_SCROLLED; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3063 if (first_scroll_win != NULL && *first_scroll_win == NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3064 *first_scroll_win = wp; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3065 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3066 |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3067 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3068 if ((size_changed || scroll_changed) && v_event != NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3069 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3070 // Add info about this window to the v:event dictionary. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3071 int width = wp->w_width - wp->w_last_width; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3072 int height = wp->w_height - wp->w_last_height; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3073 int topline = wp->w_topline - wp->w_last_topline; |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3074 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3075 int topfill = wp->w_topfill - wp->w_last_topfill; |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3076 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3077 int leftcol = wp->w_leftcol - wp->w_last_leftcol; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3078 int skipcol = wp->w_skipcol - wp->w_last_skipcol; |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3079 dict_T *d = make_win_info_dict(width, height, topline, |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3080 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3081 topfill, |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3082 #endif |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3083 leftcol, skipcol); |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3084 if (d == NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3085 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3086 char winid[NUMBUFLEN]; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3087 vim_snprintf(winid, sizeof(winid), "%d", wp->w_id); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3088 if (dict_add_dict(v_event, winid, d) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3089 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3090 dict_unref(d); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3091 break; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3092 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3093 --d->dv_refcount; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3094 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3095 tot_width += abs(width); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3096 tot_height += abs(height); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3097 tot_topline += abs(topline); |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3098 #ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3099 tot_topfill += abs(topfill); |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3100 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3101 tot_leftcol += abs(leftcol); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3102 tot_skipcol += abs(skipcol); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3103 } |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3104 #endif |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3105 } |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3106 |
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3107 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3108 if (v_event != NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3109 { |
31384
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3110 dict_T *alldict = make_win_info_dict(tot_width, tot_height, tot_topline, |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3111 # ifdef FEAT_DIFF |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3112 tot_topfill, |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3113 # endif |
992bfd3aee3f
patch 9.0.1025: WinScrolled is not triggered when filler lines change
Bram Moolenaar <Bram@vim.org>
parents:
31267
diff
changeset
|
3114 tot_leftcol, tot_skipcol); |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3115 if (alldict != NULL) |
28429
aa9720c76412
patch 8.2.4739: accessing freed memory after WinScrolled autocmd event
Bram Moolenaar <Bram@vim.org>
parents:
28375
diff
changeset
|
3116 { |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3117 if (dict_add_dict(v_event, "all", alldict) == FAIL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3118 dict_unref(alldict); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3119 else |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3120 --alldict->dv_refcount; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3121 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3122 } |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3123 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3124 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3125 return result; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3126 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3127 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3128 /* |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3129 * Trigger WinScrolled and/or WinResized if any window in the current tab page |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3130 * scrolled or changed size. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3131 */ |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3132 void |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3133 may_trigger_win_scrolled_resized(void) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3134 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3135 static int recursive = FALSE; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3136 int do_resize = has_winresized(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3137 int do_scroll = has_winscrolled(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3138 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3139 // Do not trigger WinScrolled or WinResized recursively. Do not trigger |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3140 // before the initial snapshot of the w_last_ values was made. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3141 if (recursive |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3142 || !(do_scroll || do_resize) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3143 || !did_initial_scroll_size_snapshot) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3144 return; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3145 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3146 int size_count = 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3147 win_T *first_scroll_win = NULL, *first_size_win = NULL; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3148 int cwsr = check_window_scroll_resize(&size_count, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3149 &first_scroll_win, &first_size_win, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3150 NULL, NULL); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3151 int trigger_resize = do_resize && size_count > 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3152 int trigger_scroll = do_scroll && cwsr != 0; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3153 if (!trigger_resize && !trigger_scroll) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3154 return; // no relevant changes |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3155 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3156 list_T *windows_list = NULL; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3157 if (trigger_resize) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3158 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3159 // Create the list for v:event.windows before making the snapshot. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3160 windows_list = list_alloc_with_items(size_count); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3161 (void)check_window_scroll_resize(NULL, NULL, NULL, windows_list, NULL); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3162 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3163 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3164 dict_T *scroll_dict = NULL; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3165 if (trigger_scroll) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3166 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3167 // Create the dict with entries for v:event before making the snapshot. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3168 scroll_dict = dict_alloc(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3169 if (scroll_dict != NULL) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3170 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3171 scroll_dict->dv_refcount = 1; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3172 (void)check_window_scroll_resize(NULL, NULL, NULL, NULL, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3173 scroll_dict); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3174 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3175 } |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3176 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3177 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3178 // WinScrolled/WinResized are triggered only once, even when multiple |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3179 // windows scrolled or changed size. Store the current values before |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3180 // triggering the event, if a scroll or resize happens as a side effect |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3181 // then WinScrolled/WinResized is triggered for that later. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3182 snapshot_windows_scroll_size(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3183 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3184 // "curwin" may be different from the actual current window, make |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3185 // sure it can be restored. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3186 window_layout_lock(); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3187 recursive = TRUE; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3188 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3189 // If both are to be triggered do WinResized first. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3190 if (trigger_resize) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3191 { |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3192 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3193 save_v_event_T save_v_event; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3194 dict_T *v_event = get_v_event(&save_v_event); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3195 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3196 if (dict_add_list(v_event, "windows", windows_list) == OK) |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3197 { |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3198 dict_set_items_ro(v_event); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3199 #endif |
31158
514ab6bdf73d
patch 9.0.0913: only change in current window triggers the WinScrolled event
Bram Moolenaar <Bram@vim.org>
parents:
31150
diff
changeset
|
3200 char_u winid[NUMBUFLEN]; |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3201 vim_snprintf((char *)winid, sizeof(winid), "%d", |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3202 first_size_win->w_id); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3203 apply_autocmds(EVENT_WINRESIZED, winid, winid, FALSE, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3204 first_size_win->w_buffer); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3205 #ifdef FEAT_EVAL |
28429
aa9720c76412
patch 8.2.4739: accessing freed memory after WinScrolled autocmd event
Bram Moolenaar <Bram@vim.org>
parents:
28375
diff
changeset
|
3206 } |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3207 restore_v_event(v_event, &save_v_event); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3208 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3209 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3210 |
31190
02b719cd27c6
patch 9.0.0929: build failure with tiny version
Bram Moolenaar <Bram@vim.org>
parents:
31186
diff
changeset
|
3211 if (trigger_scroll |
02b719cd27c6
patch 9.0.0929: build failure with tiny version
Bram Moolenaar <Bram@vim.org>
parents:
31186
diff
changeset
|
3212 #ifdef FEAT_EVAL |
02b719cd27c6
patch 9.0.0929: build failure with tiny version
Bram Moolenaar <Bram@vim.org>
parents:
31186
diff
changeset
|
3213 && scroll_dict != NULL |
02b719cd27c6
patch 9.0.0929: build failure with tiny version
Bram Moolenaar <Bram@vim.org>
parents:
31186
diff
changeset
|
3214 #endif |
02b719cd27c6
patch 9.0.0929: build failure with tiny version
Bram Moolenaar <Bram@vim.org>
parents:
31186
diff
changeset
|
3215 ) |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3216 { |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3217 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3218 save_v_event_T save_v_event; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3219 dict_T *v_event = get_v_event(&save_v_event); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3220 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3221 // Move the entries from scroll_dict to v_event. |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3222 dict_extend(v_event, scroll_dict, (char_u *)"move", NULL); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3223 dict_set_items_ro(v_event); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3224 dict_unref(scroll_dict); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3225 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3226 char_u winid[NUMBUFLEN]; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3227 vim_snprintf((char *)winid, sizeof(winid), "%d", |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3228 first_scroll_win->w_id); |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3229 apply_autocmds(EVENT_WINSCROLLED, winid, winid, FALSE, |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3230 first_scroll_win->w_buffer); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3231 #ifdef FEAT_EVAL |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3232 restore_v_event(v_event, &save_v_event); |
31170
b7e381d7e8b8
patch 9.0.0919: build failure with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
31166
diff
changeset
|
3233 #endif |
31166
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3234 } |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3235 |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3236 recursive = FALSE; |
a86ee6c0309e
patch 9.0.0917: the WinScrolled autocommand event is not enough
Bram Moolenaar <Bram@vim.org>
parents:
31162
diff
changeset
|
3237 window_layout_unlock(); |
28375
e466fdbe0699
patch 8.2.4713: plugins cannot track text scrolling
Bram Moolenaar <Bram@vim.org>
parents:
28361
diff
changeset
|
3238 } |
e466fdbe0699
patch 8.2.4713: plugins cannot track text scrolling
Bram Moolenaar <Bram@vim.org>
parents:
28361
diff
changeset
|
3239 |
7 | 3240 /* |
671 | 3241 * Close window "win" in tab page "tp", which is not the current tab page. |
3535 | 3242 * This may be the last window in that tab page and result in closing the tab, |
671 | 3243 * thus "tp" may become invalid! |
856 | 3244 * Caller must check if buffer is hidden and whether the tabline needs to be |
3245 * updated. | |
671 | 3246 */ |
3247 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3248 win_close_othertab(win_T *win, int free_buf, tabpage_T *tp) |
671 | 3249 { |
3250 win_T *wp; | |
3251 int dir; | |
3252 tabpage_T *ptp = NULL; | |
2191 | 3253 int free_tp = FALSE; |
671 | 3254 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3255 // Get here with win->w_buffer == NULL when win_close() detects the tab |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3256 // page changed. |
10106
58e6dd1d8be3
commit https://github.com/vim/vim/commit/e0ab94e7123ca7855f45919114d948ef2bc1e8c3
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
3257 if (win->w_closing || (win->w_buffer != NULL |
58e6dd1d8be3
commit https://github.com/vim/vim/commit/e0ab94e7123ca7855f45919114d948ef2bc1e8c3
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
3258 && win->w_buffer->b_locked > 0)) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3259 return; // window is already being closed |
3570 | 3260 |
26117
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3261 // Trigger WinClosed just before starting to free window-related resources. |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3262 trigger_winclosed(win); |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3263 // autocmd may have freed the window already. |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3264 if (!win_valid_any_tab(win)) |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3265 return; |
d4d9c7c55a5f
patch 8.2.3591: no event is triggered when closing a window
Bram Moolenaar <Bram@vim.org>
parents:
26077
diff
changeset
|
3266 |
10076
bc30991c3e98
commit https://github.com/vim/vim/commit/11fbc2866ccc11b4dd1726abdaf582a78ef3f743
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
3267 if (win->w_buffer != NULL) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3268 // Close the link to the buffer. |
18886
050f5eaa9e50
patch 8.2.0004: get E685 and E931 if buffer reload is interrupted
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
3269 close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, |
28361
68c36f734b10
patch 8.2.4706: buffer remains active with WinClosed and tabpages
Bram Moolenaar <Bram@vim.org>
parents:
28349
diff
changeset
|
3270 FALSE, TRUE); |
671 | 3271 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3272 // Careful: Autocommands may have closed the tab page or made it the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3273 // current tab page. |
671 | 3274 for (ptp = first_tabpage; ptp != NULL && ptp != tp; ptp = ptp->tp_next) |
3275 ; | |
672 | 3276 if (ptp == NULL || tp == curtab) |
28211
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3277 { |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3278 // If the buffer was removed from the window we have to give it any |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3279 // buffer. |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3280 if (win_valid_any_tab(win) && win->w_buffer == NULL) |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3281 { |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3282 win->w_buffer = firstbuf; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3283 ++firstbuf->b_nwindows; |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3284 win_init_empty(win); |
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3285 } |
671 | 3286 return; |
28211
522864f990ec
patch 8.2.4631: crash when switching window in BufWipeout autocommand
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
3287 } |
671 | 3288 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3289 // Autocommands may have closed the window already. |
671 | 3290 for (wp = tp->tp_firstwin; wp != NULL && wp != win; wp = wp->w_next) |
3291 ; | |
3292 if (wp == NULL) | |
3293 return; | |
3294 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3295 // When closing the last window in a tab page remove the tab page. |
7009 | 3296 if (tp->tp_firstwin == tp->tp_lastwin) |
671 | 3297 { |
30429
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
3298 int h = tabline_height(); |
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
3299 |
671 | 3300 if (tp == first_tabpage) |
3301 first_tabpage = tp->tp_next; | |
3302 else | |
3303 { | |
3304 for (ptp = first_tabpage; ptp != NULL && ptp->tp_next != tp; | |
3305 ptp = ptp->tp_next) | |
3306 ; | |
3307 if (ptp == NULL) | |
3308 { | |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10357
diff
changeset
|
3309 internal_error("win_close_othertab()"); |
671 | 3310 return; |
3311 } | |
3312 ptp->tp_next = tp->tp_next; | |
3313 } | |
2191 | 3314 free_tp = TRUE; |
30429
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
3315 redraw_tabline = TRUE; |
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
3316 if (h != tabline_height()) |
69ff2bd737a9
patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Bram Moolenaar <Bram@vim.org>
parents:
30339
diff
changeset
|
3317 shell_new_rows(); |
2191 | 3318 } |
3319 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3320 // Free the memory used for the window. |
2191 | 3321 win_free_mem(win, &dir, tp); |
3322 | |
3323 if (free_tp) | |
847 | 3324 free_tabpage(tp); |
671 | 3325 } |
3326 | |
3327 /* | |
355 | 3328 * Free the memory used for a window. |
3329 * Returns a pointer to the window that got the freed up space. | |
3330 */ | |
3331 static win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3332 win_free_mem( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3333 win_T *win, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3334 int *dirp, // set to 'v' or 'h' for direction if 'ea' |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3335 tabpage_T *tp) // tab page "win" is in, NULL for current |
355 | 3336 { |
3337 frame_T *frp; | |
3338 win_T *wp; | |
22399
75513701ddd2
patch 8.2.1748: closing split window in other tab may cause a crash
Bram Moolenaar <Bram@vim.org>
parents:
21727
diff
changeset
|
3339 tabpage_T *win_tp = tp == NULL ? curtab : tp; |
355 | 3340 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3341 // Remove the window and its frame from the tree of frames. |
355 | 3342 frp = win->w_frame; |
671 | 3343 wp = winframe_remove(win, dirp, tp); |
355 | 3344 vim_free(frp); |
671 | 3345 win_free(win, tp); |
355 | 3346 |
22399
75513701ddd2
patch 8.2.1748: closing split window in other tab may cause a crash
Bram Moolenaar <Bram@vim.org>
parents:
21727
diff
changeset
|
3347 // When deleting the current window in the tab, select a new current |
75513701ddd2
patch 8.2.1748: closing split window in other tab may cause a crash
Bram Moolenaar <Bram@vim.org>
parents:
21727
diff
changeset
|
3348 // window. |
75513701ddd2
patch 8.2.1748: closing split window in other tab may cause a crash
Bram Moolenaar <Bram@vim.org>
parents:
21727
diff
changeset
|
3349 if (win == win_tp->tp_curwin) |
75513701ddd2
patch 8.2.1748: closing split window in other tab may cause a crash
Bram Moolenaar <Bram@vim.org>
parents:
21727
diff
changeset
|
3350 win_tp->tp_curwin = wp; |
819 | 3351 |
355 | 3352 return wp; |
3353 } | |
3354 | |
3355 #if defined(EXITFREE) || defined(PROTO) | |
3356 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3357 win_free_all(void) |
355 | 3358 { |
3359 int dummy; | |
3360 | |
27857
8c8fabf093bb
patch 8.2.4454: resetting cmdwin_type only for one situation
Bram Moolenaar <Bram@vim.org>
parents:
27817
diff
changeset
|
3361 // avoid an error for switching tabpage with the cmdline window open |
8c8fabf093bb
patch 8.2.4454: resetting cmdwin_type only for one situation
Bram Moolenaar <Bram@vim.org>
parents:
27817
diff
changeset
|
3362 cmdwin_type = 0; |
30645
101f08b49ed3
patch 9.0.0657: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30624
diff
changeset
|
3363 |
671 | 3364 while (first_tabpage->tp_next != NULL) |
3365 tabpage_close(TRUE); | |
3366 | |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
3367 for (int i = 0; i < AUCMD_WIN_COUNT; ++i) |
31267
4bc9cd62d378
patch 9.0.0967: leaking memory from autocmd windows
Bram Moolenaar <Bram@vim.org>
parents:
31263
diff
changeset
|
3368 if (aucmd_win[i].auc_win != NULL) |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
3369 { |
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
3370 (void)win_free_mem(aucmd_win[i].auc_win, &dummy, NULL); |
31267
4bc9cd62d378
patch 9.0.0967: leaking memory from autocmd windows
Bram Moolenaar <Bram@vim.org>
parents:
31263
diff
changeset
|
3371 aucmd_win[i].auc_win = NULL; |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
3372 } |
1918 | 3373 |
3374 while (firstwin != NULL) | |
3375 (void)win_free_mem(firstwin, &dummy, NULL); | |
6060 | 3376 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3377 // No window should be used after this. Set curwin to NULL to crash |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3378 // instead of using freed memory. |
6060 | 3379 curwin = NULL; |
355 | 3380 } |
3381 #endif | |
3382 | |
3383 /* | |
7 | 3384 * Remove a window and its frame from the tree of frames. |
3385 * Returns a pointer to the window that got the freed up space. | |
3386 */ | |
1906 | 3387 win_T * |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3388 winframe_remove( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3389 win_T *win, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3390 int *dirp UNUSED, // set to 'v' or 'h' for direction if 'ea' |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3391 tabpage_T *tp) // tab page "win" is in, NULL for current |
7 | 3392 { |
3393 frame_T *frp, *frp2, *frp3; | |
3394 frame_T *frp_close = win->w_frame; | |
3395 win_T *wp; | |
3396 | |
3397 /* | |
671 | 3398 * If there is only one window there is nothing to remove. |
3399 */ | |
10349
cf988222b150
commit https://github.com/vim/vim/commit/a1f4cb93ba50ea9e40cd4b1f5592b8a6d1398660
Christian Brabandt <cb@256bit.org>
parents:
10106
diff
changeset
|
3400 if (tp == NULL ? ONE_WINDOW : tp->tp_firstwin == tp->tp_lastwin) |
671 | 3401 return NULL; |
3402 | |
3403 /* | |
7 | 3404 * Remove the window from its frame. |
3405 */ | |
671 | 3406 frp2 = win_altframe(win, tp); |
7 | 3407 wp = frame2win(frp2); |
3408 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3409 // Remove this frame from the list of frames. |
7 | 3410 frame_remove(frp_close); |
3411 | |
3412 if (frp_close->fr_parent->fr_layout == FR_COL) | |
3413 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3414 // When 'winfixheight' is set, try to find another frame in the column |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3415 // (as close to the closed frame as possible) to distribute the height |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3416 // to. |
1346 | 3417 if (frp2->fr_win != NULL && frp2->fr_win->w_p_wfh) |
3418 { | |
3419 frp = frp_close->fr_prev; | |
3420 frp3 = frp_close->fr_next; | |
3421 while (frp != NULL || frp3 != NULL) | |
3422 { | |
3423 if (frp != NULL) | |
3424 { | |
16166
a3284dd27de6
patch 8.1.1088: height of quickfix window not retained with vertical split
Bram Moolenaar <Bram@vim.org>
parents:
16019
diff
changeset
|
3425 if (!frame_fixed_height(frp)) |
1346 | 3426 { |
3427 frp2 = frp; | |
16166
a3284dd27de6
patch 8.1.1088: height of quickfix window not retained with vertical split
Bram Moolenaar <Bram@vim.org>
parents:
16019
diff
changeset
|
3428 wp = frame2win(frp2); |
1346 | 3429 break; |
3430 } | |
3431 frp = frp->fr_prev; | |
3432 } | |
3433 if (frp3 != NULL) | |
3434 { | |
3435 if (frp3->fr_win != NULL && !frp3->fr_win->w_p_wfh) | |
3436 { | |
3437 frp2 = frp3; | |
3438 wp = frp3->fr_win; | |
3439 break; | |
3440 } | |
3441 frp3 = frp3->fr_next; | |
3442 } | |
3443 } | |
3444 } | |
7 | 3445 frame_new_height(frp2, frp2->fr_height + frp_close->fr_height, |
3446 frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); | |
3447 *dirp = 'v'; | |
3448 } | |
3449 else | |
3450 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3451 // When 'winfixwidth' is set, try to find another frame in the column |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3452 // (as close to the closed frame as possible) to distribute the width |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3453 // to. |
1346 | 3454 if (frp2->fr_win != NULL && frp2->fr_win->w_p_wfw) |
3455 { | |
3456 frp = frp_close->fr_prev; | |
3457 frp3 = frp_close->fr_next; | |
3458 while (frp != NULL || frp3 != NULL) | |
3459 { | |
3460 if (frp != NULL) | |
3461 { | |
16166
a3284dd27de6
patch 8.1.1088: height of quickfix window not retained with vertical split
Bram Moolenaar <Bram@vim.org>
parents:
16019
diff
changeset
|
3462 if (!frame_fixed_width(frp)) |
1346 | 3463 { |
3464 frp2 = frp; | |
16166
a3284dd27de6
patch 8.1.1088: height of quickfix window not retained with vertical split
Bram Moolenaar <Bram@vim.org>
parents:
16019
diff
changeset
|
3465 wp = frame2win(frp2); |
1346 | 3466 break; |
3467 } | |
3468 frp = frp->fr_prev; | |
3469 } | |
3470 if (frp3 != NULL) | |
3471 { | |
3472 if (frp3->fr_win != NULL && !frp3->fr_win->w_p_wfw) | |
3473 { | |
3474 frp2 = frp3; | |
3475 wp = frp3->fr_win; | |
3476 break; | |
3477 } | |
3478 frp3 = frp3->fr_next; | |
3479 } | |
3480 } | |
3481 } | |
7 | 3482 frame_new_width(frp2, frp2->fr_width + frp_close->fr_width, |
779 | 3483 frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); |
7 | 3484 *dirp = 'h'; |
3485 } | |
3486 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3487 // If rows/columns go to a window below/right its positions need to be |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3488 // updated. Can only be done after the sizes have been updated. |
7 | 3489 if (frp2 == frp_close->fr_next) |
3490 { | |
3491 int row = win->w_winrow; | |
12513
3ca08bf99396
patch 8.0.1135: W_WINCOL() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12491
diff
changeset
|
3492 int col = win->w_wincol; |
7 | 3493 |
3494 frame_comp_pos(frp2, &row, &col); | |
3495 } | |
3496 | |
3497 if (frp2->fr_next == NULL && frp2->fr_prev == NULL) | |
3498 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3499 // There is no other frame in this list, move its info to the parent |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3500 // and remove it. |
7 | 3501 frp2->fr_parent->fr_layout = frp2->fr_layout; |
3502 frp2->fr_parent->fr_child = frp2->fr_child; | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3503 FOR_ALL_FRAMES(frp, frp2->fr_child) |
7 | 3504 frp->fr_parent = frp2->fr_parent; |
3505 frp2->fr_parent->fr_win = frp2->fr_win; | |
3506 if (frp2->fr_win != NULL) | |
3507 frp2->fr_win->w_frame = frp2->fr_parent; | |
3508 frp = frp2->fr_parent; | |
13144
20fb8c711050
patch 8.0.1446: acessing freed memory after window command in auto command
Christian Brabandt <cb@256bit.org>
parents:
13103
diff
changeset
|
3509 if (topframe->fr_child == frp2) |
20fb8c711050
patch 8.0.1446: acessing freed memory after window command in auto command
Christian Brabandt <cb@256bit.org>
parents:
13103
diff
changeset
|
3510 topframe->fr_child = frp; |
7 | 3511 vim_free(frp2); |
3512 | |
3513 frp2 = frp->fr_parent; | |
3514 if (frp2 != NULL && frp2->fr_layout == frp->fr_layout) | |
3515 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3516 // The frame above the parent has the same layout, have to merge |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3517 // the frames into this list. |
7 | 3518 if (frp2->fr_child == frp) |
3519 frp2->fr_child = frp->fr_child; | |
3520 frp->fr_child->fr_prev = frp->fr_prev; | |
3521 if (frp->fr_prev != NULL) | |
3522 frp->fr_prev->fr_next = frp->fr_child; | |
3523 for (frp3 = frp->fr_child; ; frp3 = frp3->fr_next) | |
3524 { | |
3525 frp3->fr_parent = frp2; | |
3526 if (frp3->fr_next == NULL) | |
3527 { | |
3528 frp3->fr_next = frp->fr_next; | |
3529 if (frp->fr_next != NULL) | |
3530 frp->fr_next->fr_prev = frp3; | |
3531 break; | |
3532 } | |
3533 } | |
13144
20fb8c711050
patch 8.0.1446: acessing freed memory after window command in auto command
Christian Brabandt <cb@256bit.org>
parents:
13103
diff
changeset
|
3534 if (topframe->fr_child == frp) |
20fb8c711050
patch 8.0.1446: acessing freed memory after window command in auto command
Christian Brabandt <cb@256bit.org>
parents:
13103
diff
changeset
|
3535 topframe->fr_child = frp2; |
7 | 3536 vim_free(frp); |
3537 } | |
3538 } | |
3539 | |
3540 return wp; | |
3541 } | |
3542 | |
3543 /* | |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3544 * Return a pointer to the frame that will receive the empty screen space that |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3545 * is left over after "win" is closed. |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3546 * |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3547 * If 'splitbelow' or 'splitright' is set, the space goes above or to the left |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3548 * by default. Otherwise, the free space goes below or to the right. The |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3549 * result is that opening a window and then immediately closing it will |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3550 * preserve the initial window layout. The 'wfh' and 'wfw' settings are |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3551 * respected when possible. |
7 | 3552 */ |
3553 static frame_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3554 win_altframe( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3555 win_T *win, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3556 tabpage_T *tp) // tab page "win" is in, NULL for current |
7 | 3557 { |
3558 frame_T *frp; | |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3559 frame_T *other_fr, *target_fr; |
7 | 3560 |
10349
cf988222b150
commit https://github.com/vim/vim/commit/a1f4cb93ba50ea9e40cd4b1f5592b8a6d1398660
Christian Brabandt <cb@256bit.org>
parents:
10106
diff
changeset
|
3561 if (tp == NULL ? ONE_WINDOW : tp->tp_firstwin == tp->tp_lastwin) |
667 | 3562 return alt_tabpage()->tp_curwin->w_frame; |
3563 | |
7 | 3564 frp = win->w_frame; |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3565 |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3566 if (frp->fr_prev == NULL) |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3567 return frp->fr_next; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3568 if (frp->fr_next == NULL) |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3569 return frp->fr_prev; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3570 |
20049
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3571 // By default the next window will get the space that was abandoned by this |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3572 // window |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3573 target_fr = frp->fr_next; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3574 other_fr = frp->fr_prev; |
20049
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3575 |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3576 // If this is part of a column of windows and 'splitbelow' is true then the |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3577 // previous window will get the space. |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3578 if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_COL && p_sb) |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3579 { |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3580 target_fr = frp->fr_prev; |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3581 other_fr = frp->fr_next; |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3582 } |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3583 |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3584 // If this is part of a row of windows, and 'splitright' is true then the |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3585 // previous window will get the space. |
8c401bc7f32b
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3586 if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW && p_spr) |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3587 { |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3588 target_fr = frp->fr_prev; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3589 other_fr = frp->fr_next; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3590 } |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3591 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3592 // If 'wfh' or 'wfw' is set for the target and not for the alternate |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3593 // window, reverse the selection. |
355 | 3594 if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW) |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3595 { |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3596 if (frame_fixed_width(target_fr) && !frame_fixed_width(other_fr)) |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3597 target_fr = other_fr; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3598 } |
7 | 3599 else |
13837
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3600 { |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3601 if (frame_fixed_height(target_fr) && !frame_fixed_height(other_fr)) |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3602 target_fr = other_fr; |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3603 } |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3604 |
79419af4b29c
patch 8.0.1790: 'winfixwidth' is not always respected by :close
Christian Brabandt <cb@256bit.org>
parents:
13670
diff
changeset
|
3605 return target_fr; |
7 | 3606 } |
3607 | |
3608 /* | |
667 | 3609 * Return the tabpage that will be used if the current one is closed. |
3610 */ | |
3611 static tabpage_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3612 alt_tabpage(void) |
667 | 3613 { |
672 | 3614 tabpage_T *tp; |
3615 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3616 // Use the next tab page if possible. |
682 | 3617 if (curtab->tp_next != NULL) |
672 | 3618 return curtab->tp_next; |
3619 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3620 // Find the last but one tab page. |
682 | 3621 for (tp = first_tabpage; tp->tp_next != curtab; tp = tp->tp_next) |
3622 ; | |
674 | 3623 return tp; |
667 | 3624 } |
3625 | |
3626 /* | |
7 | 3627 * Find the left-upper window in frame "frp". |
3628 */ | |
3629 static win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3630 frame2win(frame_T *frp) |
7 | 3631 { |
3632 while (frp->fr_win == NULL) | |
3633 frp = frp->fr_child; | |
3634 return frp->fr_win; | |
3635 } | |
3636 | |
3637 /* | |
3638 * Return TRUE if frame "frp" contains window "wp". | |
3639 */ | |
3640 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3641 frame_has_win(frame_T *frp, win_T *wp) |
7 | 3642 { |
3643 frame_T *p; | |
3644 | |
3645 if (frp->fr_layout == FR_LEAF) | |
3646 return frp->fr_win == wp; | |
3647 | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3648 FOR_ALL_FRAMES(p, frp->fr_child) |
7 | 3649 if (frame_has_win(p, wp)) |
3650 return TRUE; | |
3651 return FALSE; | |
3652 } | |
3653 | |
3654 /* | |
3655 * Set a new height for a frame. Recursively sets the height for contained | |
3656 * frames and windows. Caller must take care of positions. | |
3657 */ | |
3658 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3659 frame_new_height( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3660 frame_T *topfrp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3661 int height, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3662 int topfirst, // resize topmost contained frame first |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3663 int wfh) // obey 'winfixheight' when there is a choice; |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3664 // may cause the height not to be set |
7 | 3665 { |
3666 frame_T *frp; | |
3667 int extra_lines; | |
3668 int h; | |
3669 | |
3670 if (topfrp->fr_win != NULL) | |
3671 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3672 // Simple case: just one window. |
7 | 3673 win_new_height(topfrp->fr_win, |
12491
7ab796b041bd
patch 8.0.1125: wrong window height when splitting window with window toolbar
Christian Brabandt <cb@256bit.org>
parents:
12487
diff
changeset
|
3674 height - topfrp->fr_win->w_status_height |
12916
af2e0401eb8c
patch 8.0.1334: splitting a window with a WinBar damages window layout
Christian Brabandt <cb@256bit.org>
parents:
12910
diff
changeset
|
3675 - WINBAR_HEIGHT(topfrp->fr_win)); |
7 | 3676 } |
3677 else if (topfrp->fr_layout == FR_ROW) | |
3678 { | |
3679 do | |
3680 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3681 // All frames in this row get the same new height. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3682 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 3683 { |
3684 frame_new_height(frp, height, topfirst, wfh); | |
3685 if (frp->fr_height > height) | |
3686 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3687 // Could not fit the windows, make the whole row higher. |
7 | 3688 height = frp->fr_height; |
3689 break; | |
3690 } | |
3691 } | |
3692 } | |
3693 while (frp != NULL); | |
3694 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3695 else // fr_layout == FR_COL |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3696 { |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3697 // Complicated case: Resize a column of frames. Resize the bottom |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3698 // frame first, frames above that when needed. |
7 | 3699 |
3700 frp = topfrp->fr_child; | |
3701 if (wfh) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3702 // Advance past frames with one window with 'wfh' set. |
7 | 3703 while (frame_fixed_height(frp)) |
3704 { | |
3705 frp = frp->fr_next; | |
3706 if (frp == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3707 return; // no frame without 'wfh', give up |
7 | 3708 } |
3709 if (!topfirst) | |
3710 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3711 // Find the bottom frame of this column |
7 | 3712 while (frp->fr_next != NULL) |
3713 frp = frp->fr_next; | |
3714 if (wfh) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3715 // Advance back for frames with one window with 'wfh' set. |
7 | 3716 while (frame_fixed_height(frp)) |
3717 frp = frp->fr_prev; | |
3718 } | |
3719 | |
3720 extra_lines = height - topfrp->fr_height; | |
3721 if (extra_lines < 0) | |
3722 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3723 // reduce height of contained frames, bottom or top frame first |
7 | 3724 while (frp != NULL) |
3725 { | |
3726 h = frame_minheight(frp, NULL); | |
3727 if (frp->fr_height + extra_lines < h) | |
3728 { | |
3729 extra_lines += frp->fr_height - h; | |
3730 frame_new_height(frp, h, topfirst, wfh); | |
3731 } | |
3732 else | |
3733 { | |
3734 frame_new_height(frp, frp->fr_height + extra_lines, | |
3735 topfirst, wfh); | |
3736 break; | |
3737 } | |
3738 if (topfirst) | |
3739 { | |
3740 do | |
3741 frp = frp->fr_next; | |
3742 while (wfh && frp != NULL && frame_fixed_height(frp)); | |
3743 } | |
3744 else | |
3745 { | |
3746 do | |
3747 frp = frp->fr_prev; | |
3748 while (wfh && frp != NULL && frame_fixed_height(frp)); | |
3749 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3750 // Increase "height" if we could not reduce enough frames. |
7 | 3751 if (frp == NULL) |
3752 height -= extra_lines; | |
3753 } | |
3754 } | |
3755 else if (extra_lines > 0) | |
3756 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3757 // increase height of bottom or top frame |
7 | 3758 frame_new_height(frp, frp->fr_height + extra_lines, topfirst, wfh); |
3759 } | |
3760 } | |
3761 topfrp->fr_height = height; | |
3762 } | |
3763 | |
3764 /* | |
3765 * Return TRUE if height of frame "frp" should not be changed because of | |
3766 * the 'winfixheight' option. | |
3767 */ | |
3768 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3769 frame_fixed_height(frame_T *frp) |
7 | 3770 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3771 // frame with one window: fixed height if 'winfixheight' set. |
7 | 3772 if (frp->fr_win != NULL) |
3773 return frp->fr_win->w_p_wfh; | |
3774 | |
3775 if (frp->fr_layout == FR_ROW) | |
3776 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3777 // The frame is fixed height if one of the frames in the row is fixed |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3778 // height. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3779 FOR_ALL_FRAMES(frp, frp->fr_child) |
7 | 3780 if (frame_fixed_height(frp)) |
3781 return TRUE; | |
3782 return FALSE; | |
3783 } | |
3784 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3785 // frp->fr_layout == FR_COL: The frame is fixed height if all of the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3786 // frames in the row are fixed height. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3787 FOR_ALL_FRAMES(frp, frp->fr_child) |
7 | 3788 if (!frame_fixed_height(frp)) |
3789 return FALSE; | |
3790 return TRUE; | |
3791 } | |
3792 | |
3793 /* | |
779 | 3794 * Return TRUE if width of frame "frp" should not be changed because of |
3795 * the 'winfixwidth' option. | |
3796 */ | |
3797 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3798 frame_fixed_width(frame_T *frp) |
779 | 3799 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3800 // frame with one window: fixed width if 'winfixwidth' set. |
779 | 3801 if (frp->fr_win != NULL) |
3802 return frp->fr_win->w_p_wfw; | |
3803 | |
3804 if (frp->fr_layout == FR_COL) | |
3805 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3806 // The frame is fixed width if one of the frames in the row is fixed |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3807 // width. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3808 FOR_ALL_FRAMES(frp, frp->fr_child) |
779 | 3809 if (frame_fixed_width(frp)) |
3810 return TRUE; | |
3811 return FALSE; | |
3812 } | |
3813 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3814 // frp->fr_layout == FR_ROW: The frame is fixed width if all of the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3815 // frames in the row are fixed width. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3816 FOR_ALL_FRAMES(frp, frp->fr_child) |
779 | 3817 if (!frame_fixed_width(frp)) |
3818 return FALSE; | |
3819 return TRUE; | |
3820 } | |
3821 | |
3822 /* | |
7 | 3823 * Add a status line to windows at the bottom of "frp". |
3824 * Note: Does not check if there is room! | |
3825 */ | |
3826 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3827 frame_add_statusline(frame_T *frp) |
7 | 3828 { |
3829 win_T *wp; | |
3830 | |
3831 if (frp->fr_layout == FR_LEAF) | |
3832 { | |
3833 wp = frp->fr_win; | |
32319
23d44be6ec20
patch 9.0.1491: wrong scrolling with ls=0 and :botright split
Bram Moolenaar <Bram@vim.org>
parents:
32295
diff
changeset
|
3834 wp->w_status_height = STATUS_HEIGHT; |
7 | 3835 } |
3836 else if (frp->fr_layout == FR_ROW) | |
3837 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3838 // Handle all the frames in the row. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3839 FOR_ALL_FRAMES(frp, frp->fr_child) |
7 | 3840 frame_add_statusline(frp); |
3841 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3842 else // frp->fr_layout == FR_COL |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3843 { |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3844 // Only need to handle the last frame in the column. |
7 | 3845 for (frp = frp->fr_child; frp->fr_next != NULL; frp = frp->fr_next) |
3846 ; | |
3847 frame_add_statusline(frp); | |
3848 } | |
3849 } | |
3850 | |
3851 /* | |
3852 * Set width of a frame. Handles recursively going through contained frames. | |
3853 * May remove separator line for windows at the right side (for win_close()). | |
3854 */ | |
3855 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3856 frame_new_width( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3857 frame_T *topfrp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3858 int width, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3859 int leftfirst, // resize leftmost contained frame first |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3860 int wfw) // obey 'winfixwidth' when there is a choice; |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3861 // may cause the width not to be set |
7 | 3862 { |
3863 frame_T *frp; | |
3864 int extra_cols; | |
3865 int w; | |
3866 win_T *wp; | |
3867 | |
3868 if (topfrp->fr_layout == FR_LEAF) | |
3869 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3870 // Simple case: just one window. |
7 | 3871 wp = topfrp->fr_win; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3872 // Find out if there are any windows right of this one. |
7 | 3873 for (frp = topfrp; frp->fr_parent != NULL; frp = frp->fr_parent) |
3874 if (frp->fr_parent->fr_layout == FR_ROW && frp->fr_next != NULL) | |
3875 break; | |
3876 if (frp->fr_parent == NULL) | |
3877 wp->w_vsep_width = 0; | |
3878 win_new_width(wp, width - wp->w_vsep_width); | |
3879 } | |
3880 else if (topfrp->fr_layout == FR_COL) | |
3881 { | |
779 | 3882 do |
3883 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3884 // All frames in this column get the same new width. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3885 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
779 | 3886 { |
3887 frame_new_width(frp, width, leftfirst, wfw); | |
3888 if (frp->fr_width > width) | |
3889 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3890 // Could not fit the windows, make whole column wider. |
779 | 3891 width = frp->fr_width; |
3892 break; | |
3893 } | |
3894 } | |
3895 } while (frp != NULL); | |
7 | 3896 } |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3897 else // fr_layout == FR_ROW |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3898 { |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3899 // Complicated case: Resize a row of frames. Resize the rightmost |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3900 // frame first, frames left of it when needed. |
7 | 3901 |
3902 frp = topfrp->fr_child; | |
779 | 3903 if (wfw) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3904 // Advance past frames with one window with 'wfw' set. |
779 | 3905 while (frame_fixed_width(frp)) |
3906 { | |
3907 frp = frp->fr_next; | |
3908 if (frp == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3909 return; // no frame without 'wfw', give up |
779 | 3910 } |
7 | 3911 if (!leftfirst) |
779 | 3912 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3913 // Find the rightmost frame of this row |
7 | 3914 while (frp->fr_next != NULL) |
3915 frp = frp->fr_next; | |
779 | 3916 if (wfw) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3917 // Advance back for frames with one window with 'wfw' set. |
779 | 3918 while (frame_fixed_width(frp)) |
3919 frp = frp->fr_prev; | |
3920 } | |
7 | 3921 |
3922 extra_cols = width - topfrp->fr_width; | |
3923 if (extra_cols < 0) | |
3924 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3925 // reduce frame width, rightmost frame first |
7 | 3926 while (frp != NULL) |
3927 { | |
3928 w = frame_minwidth(frp, NULL); | |
3929 if (frp->fr_width + extra_cols < w) | |
3930 { | |
3931 extra_cols += frp->fr_width - w; | |
779 | 3932 frame_new_width(frp, w, leftfirst, wfw); |
7 | 3933 } |
3934 else | |
3935 { | |
779 | 3936 frame_new_width(frp, frp->fr_width + extra_cols, |
3937 leftfirst, wfw); | |
7 | 3938 break; |
3939 } | |
3940 if (leftfirst) | |
779 | 3941 { |
3942 do | |
3943 frp = frp->fr_next; | |
3944 while (wfw && frp != NULL && frame_fixed_width(frp)); | |
3945 } | |
7 | 3946 else |
779 | 3947 { |
3948 do | |
3949 frp = frp->fr_prev; | |
3950 while (wfw && frp != NULL && frame_fixed_width(frp)); | |
3951 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3952 // Increase "width" if we could not reduce enough frames. |
779 | 3953 if (frp == NULL) |
3954 width -= extra_cols; | |
7 | 3955 } |
3956 } | |
3957 else if (extra_cols > 0) | |
3958 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3959 // increase width of rightmost frame |
779 | 3960 frame_new_width(frp, frp->fr_width + extra_cols, leftfirst, wfw); |
7 | 3961 } |
3962 } | |
3963 topfrp->fr_width = width; | |
3964 } | |
3965 | |
3966 /* | |
3967 * Add the vertical separator to windows at the right side of "frp". | |
3968 * Note: Does not check if there is room! | |
3969 */ | |
3970 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3971 frame_add_vsep(frame_T *frp) |
7 | 3972 { |
3973 win_T *wp; | |
3974 | |
3975 if (frp->fr_layout == FR_LEAF) | |
3976 { | |
3977 wp = frp->fr_win; | |
3978 if (wp->w_vsep_width == 0) | |
3979 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3980 if (wp->w_width > 0) // don't make it negative |
7 | 3981 --wp->w_width; |
3982 wp->w_vsep_width = 1; | |
3983 } | |
3984 } | |
3985 else if (frp->fr_layout == FR_COL) | |
3986 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3987 // Handle all the frames in the column. |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
3988 FOR_ALL_FRAMES(frp, frp->fr_child) |
7 | 3989 frame_add_vsep(frp); |
3990 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3991 else // frp->fr_layout == FR_ROW |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3992 { |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3993 // Only need to handle the last frame in the row. |
7 | 3994 frp = frp->fr_child; |
3995 while (frp->fr_next != NULL) | |
3996 frp = frp->fr_next; | |
3997 frame_add_vsep(frp); | |
3998 } | |
3999 } | |
4000 | |
4001 /* | |
4002 * Set frame width from the window it contains. | |
4003 */ | |
4004 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4005 frame_fix_width(win_T *wp) |
7 | 4006 { |
4007 wp->w_frame->fr_width = wp->w_width + wp->w_vsep_width; | |
4008 } | |
4009 | |
4010 /* | |
4011 * Set frame height from the window it contains. | |
4012 */ | |
4013 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4014 frame_fix_height(win_T *wp) |
7 | 4015 { |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4016 wp->w_frame->fr_height = VISIBLE_HEIGHT(wp) + wp->w_status_height; |
7 | 4017 } |
4018 | |
4019 /* | |
4020 * Compute the minimal height for frame "topfrp". | |
4021 * Uses the 'winminheight' option. | |
4022 * When "next_curwin" isn't NULL, use p_wh for this window. | |
4023 * When "next_curwin" is NOWIN, don't use at least one line for the current | |
4024 * window. | |
4025 */ | |
4026 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4027 frame_minheight(frame_T *topfrp, win_T *next_curwin) |
7 | 4028 { |
4029 frame_T *frp; | |
4030 int m; | |
4031 int n; | |
4032 | |
4033 if (topfrp->fr_win != NULL) | |
4034 { | |
4035 if (topfrp->fr_win == next_curwin) | |
4036 m = p_wh + topfrp->fr_win->w_status_height; | |
4037 else | |
4038 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4039 // window: minimal height of the window plus status line |
7 | 4040 m = p_wmh + topfrp->fr_win->w_status_height; |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4041 if (topfrp->fr_win == curwin && next_curwin == NULL) |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4042 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4043 // Current window is minimal one line high and WinBar is |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4044 // visible. |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4045 if (p_wmh == 0) |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4046 ++m; |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4047 m += WINBAR_HEIGHT(curwin); |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
4048 } |
7 | 4049 } |
4050 } | |
4051 else if (topfrp->fr_layout == FR_ROW) | |
4052 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4053 // get the minimal height from each frame in this row |
7 | 4054 m = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
4055 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 4056 { |
4057 n = frame_minheight(frp, next_curwin); | |
4058 if (n > m) | |
4059 m = n; | |
4060 } | |
4061 } | |
4062 else | |
4063 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4064 // Add up the minimal heights for all frames in this column. |
7 | 4065 m = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
4066 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 4067 m += frame_minheight(frp, next_curwin); |
4068 } | |
4069 | |
4070 return m; | |
4071 } | |
4072 | |
4073 /* | |
4074 * Compute the minimal width for frame "topfrp". | |
4075 * When "next_curwin" isn't NULL, use p_wiw for this window. | |
4076 * When "next_curwin" is NOWIN, don't use at least one column for the current | |
4077 * window. | |
4078 */ | |
4079 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4080 frame_minwidth( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4081 frame_T *topfrp, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4082 win_T *next_curwin) // use p_wh and p_wiw for next_curwin |
7 | 4083 { |
4084 frame_T *frp; | |
4085 int m, n; | |
4086 | |
4087 if (topfrp->fr_win != NULL) | |
4088 { | |
4089 if (topfrp->fr_win == next_curwin) | |
4090 m = p_wiw + topfrp->fr_win->w_vsep_width; | |
4091 else | |
4092 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4093 // window: minimal width of the window plus separator column |
7 | 4094 m = p_wmw + topfrp->fr_win->w_vsep_width; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4095 // Current window is minimal one column wide |
7 | 4096 if (p_wmw == 0 && topfrp->fr_win == curwin && next_curwin == NULL) |
4097 ++m; | |
4098 } | |
4099 } | |
4100 else if (topfrp->fr_layout == FR_COL) | |
4101 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4102 // get the minimal width from each frame in this column |
7 | 4103 m = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
4104 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 4105 { |
4106 n = frame_minwidth(frp, next_curwin); | |
4107 if (n > m) | |
4108 m = n; | |
4109 } | |
4110 } | |
4111 else | |
4112 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4113 // Add up the minimal widths for all frames in this row. |
7 | 4114 m = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
4115 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 4116 m += frame_minwidth(frp, next_curwin); |
4117 } | |
4118 | |
4119 return m; | |
4120 } | |
4121 | |
4122 | |
4123 /* | |
4124 * Try to close all windows except current one. | |
4125 * Buffers in the other windows become hidden if 'hidden' is set, or '!' is | |
4126 * used and the buffer was modified. | |
4127 * | |
4128 * Used by ":bdel" and ":only". | |
4129 */ | |
4130 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4131 close_others( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4132 int message, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4133 int forceit) // always hide all other windows |
7 | 4134 { |
4135 win_T *wp; | |
4136 win_T *nextwp; | |
4137 int r; | |
4138 | |
1906 | 4139 if (one_window()) |
7 | 4140 { |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
4141 if (message && !autocmd_busy) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15490
diff
changeset
|
4142 msg(_(m_onlyone)); |
7 | 4143 return; |
4144 } | |
4145 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4146 // Be very careful here: autocommands may change the window layout. |
7 | 4147 for (wp = firstwin; win_valid(wp); wp = nextwp) |
4148 { | |
4149 nextwp = wp->w_next; | |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4150 if (wp == curwin) // don't close current window |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4151 continue; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4152 |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4153 // Check if it's allowed to abandon this window |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4154 r = can_abandon(wp->w_buffer, forceit); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4155 if (!win_valid(wp)) // autocommands messed wp up |
7 | 4156 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4157 nextwp = firstwin; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4158 continue; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4159 } |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4160 if (!r) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4161 { |
7 | 4162 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4163 if (message && (p_confirm |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4164 || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write) |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4165 { |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4166 dialog_changed(wp->w_buffer, FALSE); |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4167 if (!win_valid(wp)) // autocommands messed wp up |
7 | 4168 { |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4169 nextwp = firstwin; |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4170 continue; |
7 | 4171 } |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4172 } |
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4173 if (bufIsChanged(wp->w_buffer)) |
7 | 4174 #endif |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4175 continue; |
7 | 4176 } |
29566
99e3763cbd34
patch 9.0.0124: code has more indent than needed
Bram Moolenaar <Bram@vim.org>
parents:
29548
diff
changeset
|
4177 win_close(wp, !buf_hide(wp->w_buffer) && !bufIsChanged(wp->w_buffer)); |
7 | 4178 } |
4179 | |
10357
59d01e335858
commit https://github.com/vim/vim/commit/459ca563128f2edb7e3bb190090bbb755a56dd55
Christian Brabandt <cb@256bit.org>
parents:
10349
diff
changeset
|
4180 if (message && !ONE_WINDOW) |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
4181 emsg(_(e_other_window_contains_changes)); |
7 | 4182 } |
4183 | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17670
diff
changeset
|
4184 /* |
31162
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4185 * Store the relevant window pointers for tab page "tp". To be used before |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4186 * use_tabpage(). |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4187 */ |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4188 void |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4189 unuse_tabpage(tabpage_T *tp) |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4190 { |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4191 tp->tp_topframe = topframe; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4192 tp->tp_firstwin = firstwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4193 tp->tp_lastwin = lastwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4194 tp->tp_curwin = curwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4195 } |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4196 |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4197 /* |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4198 * Set the relevant pointers to use tab page "tp". May want to call |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4199 * unuse_tabpage() first. |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4200 */ |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4201 void |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4202 use_tabpage(tabpage_T *tp) |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4203 { |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4204 curtab = tp; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4205 topframe = curtab->tp_topframe; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4206 firstwin = curtab->tp_firstwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4207 lastwin = curtab->tp_lastwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4208 curwin = curtab->tp_curwin; |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4209 } |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4210 |
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4211 /* |
7 | 4212 * Allocate the first window and put an empty buffer in it. |
4213 * Called from main(). | |
667 | 4214 * Return FAIL when something goes wrong (out of memory). |
7 | 4215 */ |
667 | 4216 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4217 win_alloc_first(void) |
7 | 4218 { |
675 | 4219 if (win_alloc_firstwin(NULL) == FAIL) |
667 | 4220 return FAIL; |
4221 | |
672 | 4222 first_tabpage = alloc_tabpage(); |
667 | 4223 if (first_tabpage == NULL) |
4224 return FAIL; | |
672 | 4225 curtab = first_tabpage; |
31162
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4226 unuse_tabpage(first_tabpage); |
1906 | 4227 |
667 | 4228 return OK; |
4229 } | |
4230 | |
1906 | 4231 /* |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4232 * Allocate and init a window that is not a regular window. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4233 * This can only be done after the first window is fully initialized, thus it |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4234 * can't be in win_alloc_first(). |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4235 */ |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4236 win_T * |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4237 win_alloc_popup_win(void) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4238 { |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4239 win_T *wp; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4240 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4241 wp = win_alloc(NULL, TRUE); |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4242 if (wp == NULL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4243 return NULL; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4244 // We need to initialize options with something, using the current |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4245 // window makes most sense. |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4246 win_init_some(wp, curwin); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4247 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4248 RESET_BINDING(wp); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4249 new_frame(wp); |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4250 return wp; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4251 } |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4252 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4253 /* |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4254 * Initialize window "wp" to display buffer "buf". |
1906 | 4255 */ |
4256 void | |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4257 win_init_popup_win(win_T *wp, buf_T *buf) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4258 { |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4259 wp->w_buffer = buf; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4260 ++buf->b_nwindows; |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4261 win_init_empty(wp); // set cursor and topline to safe values |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4262 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4263 // Make sure w_localdir and globaldir are NULL to avoid a chdir() in |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4264 // win_enter_ext(). |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4265 VIM_CLEAR(wp->w_localdir); |
1906 | 4266 } |
4267 | |
667 | 4268 /* |
675 | 4269 * Allocate the first window or the first window in a new tab page. |
4270 * When "oldwin" is NULL create an empty buffer for it. | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
4271 * When "oldwin" is not NULL copy info from it to the new window. |
667 | 4272 * Return FAIL when something goes wrong (out of memory). |
4273 */ | |
4274 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4275 win_alloc_firstwin(win_T *oldwin) |
667 | 4276 { |
1906 | 4277 curwin = win_alloc(NULL, FALSE); |
28289
cdaff4db7760
patch 8.2.4670: memory allocation failures for new tab page not tested
Bram Moolenaar <Bram@vim.org>
parents:
28285
diff
changeset
|
4278 if (curwin == NULL) |
cdaff4db7760
patch 8.2.4670: memory allocation failures for new tab page not tested
Bram Moolenaar <Bram@vim.org>
parents:
28285
diff
changeset
|
4279 return FAIL; |
675 | 4280 if (oldwin == NULL) |
4281 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4282 // Very first window, need to create an empty buffer for it and |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4283 // initialize from scratch. |
675 | 4284 curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED); |
4285 if (curwin == NULL || curbuf == NULL) | |
4286 return FAIL; | |
4287 curwin->w_buffer = curbuf; | |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
4288 #ifdef FEAT_SYN_HL |
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
4289 curwin->w_s = &(curbuf->b_s); |
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
4290 #endif |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4291 curbuf->b_nwindows = 1; // there is one window |
675 | 4292 curwin->w_alist = &global_alist; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4293 curwin_init(); // init current window |
675 | 4294 } |
4295 else | |
4296 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4297 // First window in new tab page, initialize it from "oldwin". |
1822 | 4298 win_init(curwin, oldwin, 0); |
675 | 4299 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4300 // We don't want cursor- and scroll-binding in the first window. |
2583 | 4301 RESET_BINDING(curwin); |
675 | 4302 } |
7 | 4303 |
1906 | 4304 new_frame(curwin); |
4305 if (curwin->w_frame == NULL) | |
667 | 4306 return FAIL; |
1906 | 4307 topframe = curwin->w_frame; |
7 | 4308 topframe->fr_width = Columns; |
4309 topframe->fr_height = Rows - p_ch; | |
667 | 4310 |
4311 return OK; | |
4312 } | |
4313 | |
4314 /* | |
1906 | 4315 * Create a frame for window "wp". |
4316 */ | |
4317 static void | |
4318 new_frame(win_T *wp) | |
4319 { | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16802
diff
changeset
|
4320 frame_T *frp = ALLOC_CLEAR_ONE(frame_T); |
1906 | 4321 |
4322 wp->w_frame = frp; | |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4323 if (frp == NULL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4324 return; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4325 frp->fr_layout = FR_LEAF; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4326 frp->fr_win = wp; |
1906 | 4327 } |
4328 | |
4329 /* | |
667 | 4330 * Initialize the window and frame size to the maximum. |
4331 */ | |
4332 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4333 win_init_size(void) |
667 | 4334 { |
4335 firstwin->w_height = ROWS_AVAIL; | |
30239
91ecee475811
patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30219
diff
changeset
|
4336 firstwin->w_prev_height = ROWS_AVAIL; |
667 | 4337 topframe->fr_height = ROWS_AVAIL; |
4338 firstwin->w_width = Columns; | |
4339 topframe->fr_width = Columns; | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
4340 } |
672 | 4341 |
4342 /* | |
4343 * Allocate a new tabpage_T and init the values. | |
4344 * Returns NULL when out of memory. | |
4345 */ | |
4346 static tabpage_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4347 alloc_tabpage(void) |
672 | 4348 { |
4349 tabpage_T *tp; | |
4287 | 4350 # ifdef FEAT_GUI |
4351 int i; | |
4352 # endif | |
4353 | |
672 | 4354 |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16802
diff
changeset
|
4355 tp = ALLOC_CLEAR_ONE(tabpage_T); |
4287 | 4356 if (tp == NULL) |
4357 return NULL; | |
4358 | |
4359 # ifdef FEAT_EVAL | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4360 // init t: variables |
28289
cdaff4db7760
patch 8.2.4670: memory allocation failures for new tab page not tested
Bram Moolenaar <Bram@vim.org>
parents:
28285
diff
changeset
|
4361 tp->tp_vars = dict_alloc_id(aid_newtabpage_tvars); |
4287 | 4362 if (tp->tp_vars == NULL) |
4363 { | |
4364 vim_free(tp); | |
4365 return NULL; | |
4366 } | |
4367 init_var_dict(tp->tp_vars, &tp->tp_winvar, VAR_SCOPE); | |
4368 # endif | |
4369 | |
788 | 4370 # ifdef FEAT_GUI |
4287 | 4371 for (i = 0; i < 3; i++) |
4372 tp->tp_prev_which_scrollbars[i] = -1; | |
788 | 4373 # endif |
672 | 4374 # ifdef FEAT_DIFF |
4287 | 4375 tp->tp_diff_invalid = TRUE; |
672 | 4376 # endif |
4287 | 4377 tp->tp_ch_used = p_ch; |
4378 | |
672 | 4379 return tp; |
4380 } | |
4381 | |
852 | 4382 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4383 free_tabpage(tabpage_T *tp) |
672 | 4384 { |
1906 | 4385 int idx; |
4386 | |
672 | 4387 # ifdef FEAT_DIFF |
4388 diff_clear(tp); | |
4389 # endif | |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
4390 # ifdef FEAT_PROP_POPUP |
16800
12e3a3afdb6a
patch 8.1.1402: "timer" option of popup windows not supported
Bram Moolenaar <Bram@vim.org>
parents:
16796
diff
changeset
|
4391 while (tp->tp_first_popupwin != NULL) |
20384
42ab4d40e78f
patch 8.2.0747: cannot forcefully close all popups
Bram Moolenaar <Bram@vim.org>
parents:
20229
diff
changeset
|
4392 popup_close_tabpage(tp, tp->tp_first_popupwin->w_id, TRUE); |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
4393 #endif |
1906 | 4394 for (idx = 0; idx < SNAP_COUNT; ++idx) |
4395 clear_snapshot(tp, idx); | |
819 | 4396 #ifdef FEAT_EVAL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4397 vars_clear(&tp->tp_vars->dv_hashtab); // free all t: variables |
4287 | 4398 hash_init(&tp->tp_vars->dv_hashtab); |
4399 unref_var_dict(tp->tp_vars); | |
819 | 4400 #endif |
4401 | 4401 |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4402 if (tp == lastused_tabpage) |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4403 lastused_tabpage = NULL; |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4404 |
16427
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4405 vim_free(tp->tp_localdir); |
20711
d91b8d1e5198
patch 8.2.0909: cannot go back to the previous local directory
Bram Moolenaar <Bram@vim.org>
parents:
20384
diff
changeset
|
4406 vim_free(tp->tp_prevdir); |
16427
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4407 |
4401 | 4408 #ifdef FEAT_PYTHON |
4409 python_tabpage_free(tp); | |
4410 #endif | |
4411 | |
4412 #ifdef FEAT_PYTHON3 | |
4413 python3_tabpage_free(tp); | |
4414 #endif | |
4415 | |
672 | 4416 vim_free(tp); |
4417 } | |
4418 | |
667 | 4419 /* |
675 | 4420 * Create a new Tab page with one window. |
4421 * It will edit the current buffer, like after ":split". | |
682 | 4422 * When "after" is 0 put it just after the current Tab page. |
4423 * Otherwise put it just before tab page "after". | |
667 | 4424 * Return FAIL or OK. |
4425 */ | |
4426 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4427 win_new_tabpage(int after) |
667 | 4428 { |
672 | 4429 tabpage_T *tp = curtab; |
21727
860cad58f557
patch 8.2.1413: previous tab page not usable from an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
21723
diff
changeset
|
4430 tabpage_T *prev_tp = curtab; |
667 | 4431 tabpage_T *newtp; |
682 | 4432 int n; |
667 | 4433 |
27805
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4434 if (cmdwin_type != 0) |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4435 { |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4436 emsg(_(e_invalid_in_cmdline_window)); |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4437 return FAIL; |
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4438 } |
31150
bcda71c89776
patch 9.0.0909: error message for layout change does not match action
Bram Moolenaar <Bram@vim.org>
parents:
31146
diff
changeset
|
4439 if (window_layout_locked(CMD_tabnew)) |
31146
f6d4c6a3b41c
patch 9.0.0907: restoring window after WinScrolled may fail
Bram Moolenaar <Bram@vim.org>
parents:
30980
diff
changeset
|
4440 return FAIL; |
27805
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4441 |
672 | 4442 newtp = alloc_tabpage(); |
667 | 4443 if (newtp == NULL) |
4444 return FAIL; | |
4445 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4446 // Remember the current windows in this Tab page. |
4354 | 4447 if (leave_tabpage(curbuf, TRUE) == FAIL) |
674 | 4448 { |
4449 vim_free(newtp); | |
4450 return FAIL; | |
4451 } | |
672 | 4452 curtab = newtp; |
667 | 4453 |
16427
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4454 newtp->tp_localdir = (tp->tp_localdir == NULL) |
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4455 ? NULL : vim_strsave(tp->tp_localdir); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4456 // Create a new empty window. |
675 | 4457 if (win_alloc_firstwin(tp->tp_curwin) == OK) |
667 | 4458 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4459 // Make the new Tab page the new topframe. |
682 | 4460 if (after == 1) |
4461 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4462 // New tab page becomes the first one. |
682 | 4463 newtp->tp_next = first_tabpage; |
4464 first_tabpage = newtp; | |
4465 } | |
4466 else | |
4467 { | |
4468 if (after > 0) | |
4469 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4470 // Put new tab page before tab page "after". |
682 | 4471 n = 2; |
4472 for (tp = first_tabpage; tp->tp_next != NULL | |
4473 && n < after; tp = tp->tp_next) | |
4474 ++n; | |
4475 } | |
4476 newtp->tp_next = tp->tp_next; | |
4477 tp->tp_next = newtp; | |
4478 } | |
19155
013f20a3bc6b
patch 8.2.0137: crash when using win_execute() from a new tab
Bram Moolenaar <Bram@vim.org>
parents:
19143
diff
changeset
|
4479 newtp->tp_firstwin = newtp->tp_lastwin = newtp->tp_curwin = curwin; |
013f20a3bc6b
patch 8.2.0137: crash when using win_execute() from a new tab
Bram Moolenaar <Bram@vim.org>
parents:
19143
diff
changeset
|
4480 |
667 | 4481 win_init_size(); |
685 | 4482 firstwin->w_winrow = tabline_height(); |
30239
91ecee475811
patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30219
diff
changeset
|
4483 firstwin->w_prev_winrow = firstwin->w_winrow; |
819 | 4484 win_comp_scroll(curwin); |
667 | 4485 |
4486 newtp->tp_topframe = topframe; | |
671 | 4487 last_status(FALSE); |
815 | 4488 |
21727
860cad58f557
patch 8.2.1413: previous tab page not usable from an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
21723
diff
changeset
|
4489 lastused_tabpage = prev_tp; |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4490 |
815 | 4491 #if defined(FEAT_GUI) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4492 // When 'guioptions' includes 'L' or 'R' may have to remove or add |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4493 // scrollbars. Have to update them anyway. |
1906 | 4494 gui_may_update_scrollbars(); |
815 | 4495 #endif |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4496 #ifdef FEAT_JOB_CHANNEL |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4497 entering_window(curwin); |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4498 #endif |
815 | 4499 |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
4500 redraw_all_later(UPD_NOT_VALID); |
9595
0190d5de215f
commit https://github.com/vim/vim/commit/c917da4b3e8801a255dbefea8e4ed19c1c716dd8
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
4501 apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf); |
4354 | 4502 apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
9595
0190d5de215f
commit https://github.com/vim/vim/commit/c917da4b3e8801a255dbefea8e4ed19c1c716dd8
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
4503 apply_autocmds(EVENT_TABNEW, NULL, NULL, FALSE, curbuf); |
675 | 4504 apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
667 | 4505 return OK; |
4506 } | |
4507 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4508 // Failed, get back the previous Tab page |
4354 | 4509 enter_tabpage(curtab, curbuf, TRUE, TRUE); |
667 | 4510 return FAIL; |
4511 } | |
4512 | |
4513 /* | |
682 | 4514 * Open a new tab page if ":tab cmd" was used. It will edit the same buffer, |
4515 * like with ":split". | |
4516 * Returns OK if a new tab page was created, FAIL otherwise. | |
4517 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17670
diff
changeset
|
4518 static int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4519 may_open_tabpage(void) |
682 | 4520 { |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
22470
diff
changeset
|
4521 int n = (cmdmod.cmod_tab == 0) |
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
22470
diff
changeset
|
4522 ? postponed_split_tab : cmdmod.cmod_tab; |
1090 | 4523 |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4524 if (n == 0) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4525 return FAIL; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4526 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4527 cmdmod.cmod_tab = 0; // reset it to avoid doing it twice |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4528 postponed_split_tab = 0; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4529 return win_new_tabpage(n); |
682 | 4530 } |
4531 | |
4532 /* | |
672 | 4533 * Create up to "maxcount" tabpages with empty windows. |
4534 * Returns the number of resulting tab pages. | |
667 | 4535 */ |
672 | 4536 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4537 make_tabpages(int maxcount) |
667 | 4538 { |
672 | 4539 int count = maxcount; |
4540 int todo; | |
4541 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4542 // Limit to 'tabpagemax' tabs. |
698 | 4543 if (count > p_tpm) |
4544 count = p_tpm; | |
672 | 4545 |
4546 /* | |
4547 * Don't execute autocommands while creating the tab pages. Must do that | |
4548 * when putting the buffers in the windows. | |
4549 */ | |
1410 | 4550 block_autocmds(); |
672 | 4551 |
4552 for (todo = count - 1; todo > 0; --todo) | |
682 | 4553 if (win_new_tabpage(0) == FAIL) |
667 | 4554 break; |
672 | 4555 |
1410 | 4556 unblock_autocmds(); |
672 | 4557 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4558 // return actual number of tab pages |
672 | 4559 return (count - todo); |
667 | 4560 } |
4561 | |
4562 /* | |
671 | 4563 * Return TRUE when "tpc" points to a valid tab page. |
4564 */ | |
4565 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4566 valid_tabpage(tabpage_T *tpc) |
671 | 4567 { |
4568 tabpage_T *tp; | |
4569 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
4570 FOR_ALL_TABPAGES(tp) |
671 | 4571 if (tp == tpc) |
4572 return TRUE; | |
4573 return FALSE; | |
4574 } | |
4575 | |
4576 /* | |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4577 * Return TRUE when "tpc" points to a valid tab page and at least one window is |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4578 * valid. |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4579 */ |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4580 int |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4581 valid_tabpage_win(tabpage_T *tpc) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4582 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4583 tabpage_T *tp; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4584 win_T *wp; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4585 |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4586 FOR_ALL_TABPAGES(tp) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4587 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4588 if (tp == tpc) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4589 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4590 FOR_ALL_WINDOWS_IN_TAB(tp, wp) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4591 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4592 if (win_valid_any_tab(wp)) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4593 return TRUE; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4594 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4595 return FALSE; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4596 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4597 } |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4598 // shouldn't happen |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4599 return FALSE; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4600 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4601 |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4602 /* |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4603 * Close tabpage "tab", assuming it has no windows in it. |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4604 * There must be another tabpage or this will crash. |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4605 */ |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4606 void |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4607 close_tabpage(tabpage_T *tab) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4608 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4609 tabpage_T *ptp; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4610 |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4611 if (tab == first_tabpage) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4612 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4613 first_tabpage = tab->tp_next; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4614 ptp = first_tabpage; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4615 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4616 else |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4617 { |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4618 for (ptp = first_tabpage; ptp != NULL && ptp->tp_next != tab; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4619 ptp = ptp->tp_next) |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4620 ; |
11232
a14090a30a3f
patch 8.0.0502: Coverity complains about possible NULL pointer
Christian Brabandt <cb@256bit.org>
parents:
11207
diff
changeset
|
4621 assert(ptp != NULL); |
11199
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4622 ptp->tp_next = tab->tp_next; |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4623 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4624 |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4625 goto_tabpage_tp(ptp, FALSE, FALSE); |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4626 free_tabpage(tab); |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4627 } |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4628 |
e08ead1d269f
patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents:
11193
diff
changeset
|
4629 /* |
671 | 4630 * Find tab page "n" (first one is 1). Returns NULL when not found. |
4631 */ | |
4632 tabpage_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4633 find_tabpage(int n) |
671 | 4634 { |
4635 tabpage_T *tp; | |
4636 int i = 1; | |
4637 | |
16427
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4638 if (n == 0) |
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4639 return curtab; |
8c3a1bd270bb
patch 8.1.1218: cannot set a directory for a tab page
Bram Moolenaar <Bram@vim.org>
parents:
16405
diff
changeset
|
4640 |
671 | 4641 for (tp = first_tabpage; tp != NULL && i != n; tp = tp->tp_next) |
4642 ++i; | |
4643 return tp; | |
4644 } | |
4645 | |
4646 /* | |
685 | 4647 * Get index of tab page "tp". First one has index 1. |
686 | 4648 * When not found returns number of tab pages plus one. |
685 | 4649 */ |
4650 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4651 tabpage_index(tabpage_T *ftp) |
685 | 4652 { |
4653 int i = 1; | |
4654 tabpage_T *tp; | |
4655 | |
4656 for (tp = first_tabpage; tp != NULL && tp != ftp; tp = tp->tp_next) | |
4657 ++i; | |
4658 return i; | |
4659 } | |
4660 | |
4661 /* | |
674 | 4662 * Prepare for leaving the current tab page. |
4352 | 4663 * When autocommands change "curtab" we don't leave the tab page and return |
674 | 4664 * FAIL. |
4665 * Careful: When OK is returned need to get a new tab page very very soon! | |
667 | 4666 */ |
674 | 4667 static int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4668 leave_tabpage( |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4669 buf_T *new_curbuf UNUSED, // what is going to be the new curbuf, |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4670 // NULL if unknown |
32295
bea4ebf594c6
patch 9.0.1479: small source file problems; outdated list of distrib. files
Bram Moolenaar <Bram@vim.org>
parents:
32216
diff
changeset
|
4671 int trigger_leave_autocmds) |
667 | 4672 { |
674 | 4673 tabpage_T *tp = curtab; |
4674 | |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4675 #ifdef FEAT_JOB_CHANNEL |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4676 leaving_window(curwin); |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
4677 #endif |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4678 reset_VIsual_and_resel(); // stop Visual mode |
4354 | 4679 if (trigger_leave_autocmds) |
4680 { | |
4681 if (new_curbuf != curbuf) | |
4682 { | |
4683 apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); | |
4684 if (curtab != tp) | |
4685 return FAIL; | |
4686 } | |
4687 apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); | |
674 | 4688 if (curtab != tp) |
4689 return FAIL; | |
4354 | 4690 apply_autocmds(EVENT_TABLEAVE, NULL, NULL, FALSE, curbuf); |
4691 if (curtab != tp) | |
4692 return FAIL; | |
4693 } | |
30976
bcda60183c77
patch 9.0.0823: mouse drag test fails
Bram Moolenaar <Bram@vim.org>
parents:
30974
diff
changeset
|
4694 |
30980
eb51299c4bfc
patch 9.0.0825: cannot drag an entry in the tabpage line
Bram Moolenaar <Bram@vim.org>
parents:
30976
diff
changeset
|
4695 reset_dragwin(); |
668 | 4696 #if defined(FEAT_GUI) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4697 // Remove the scrollbars. They may be added back later. |
668 | 4698 if (gui.in_use) |
4699 gui_remove_scrollbars(); | |
4700 #endif | |
667 | 4701 tp->tp_curwin = curwin; |
671 | 4702 tp->tp_prevwin = prevwin; |
667 | 4703 tp->tp_firstwin = firstwin; |
4704 tp->tp_lastwin = lastwin; | |
668 | 4705 tp->tp_old_Rows = Rows; |
26488
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4706 if (tp->tp_old_Columns != -1) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4707 tp->tp_old_Columns = Columns; |
667 | 4708 firstwin = NULL; |
4709 lastwin = NULL; | |
674 | 4710 return OK; |
667 | 4711 } |
4712 | |
4713 /* | |
4714 * Start using tab page "tp". | |
675 | 4715 * Only to be used after leave_tabpage() or freeing the current tab page. |
4354 | 4716 * Only trigger *Enter autocommands when trigger_enter_autocmds is TRUE. |
4717 * Only trigger *Leave autocommands when trigger_leave_autocmds is TRUE. | |
667 | 4718 */ |
4719 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4720 enter_tabpage( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4721 tabpage_T *tp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4722 buf_T *old_curbuf UNUSED, |
8368
db2a07b710ed
commit https://github.com/vim/vim/commit/f1d2501ebe33e148886c2914acd33140e20ee222
Christian Brabandt <cb@256bit.org>
parents:
8212
diff
changeset
|
4723 int trigger_enter_autocmds, |
db2a07b710ed
commit https://github.com/vim/vim/commit/f1d2501ebe33e148886c2914acd33140e20ee222
Christian Brabandt <cb@256bit.org>
parents:
8212
diff
changeset
|
4724 int trigger_leave_autocmds) |
667 | 4725 { |
19143
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4726 int row; |
668 | 4727 int old_off = tp->tp_firstwin->w_winrow; |
870 | 4728 win_T *next_prevwin = tp->tp_prevwin; |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4729 tabpage_T *last_tab = curtab; |
668 | 4730 |
31162
981f7bc781bb
patch 9.0.0915: WinScrolled may trigger immediately when defined
Bram Moolenaar <Bram@vim.org>
parents:
31158
diff
changeset
|
4731 use_tabpage(tp); |
870 | 4732 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4733 // We would like doing the TabEnter event first, but we don't have a |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4734 // valid current window yet, which may break some commands. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4735 // This triggers autocommands, thus may make "tp" invalid. |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
4736 (void)win_enter_ext(tp->tp_curwin, WEE_CURWIN_INVALID |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
4737 | (trigger_enter_autocmds ? WEE_TRIGGER_ENTER_AUTOCMDS : 0) |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
4738 | (trigger_leave_autocmds ? WEE_TRIGGER_LEAVE_AUTOCMDS : 0)); |
870 | 4739 prevwin = next_prevwin; |
4740 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4741 last_status(FALSE); // status line may appear or disappear |
19143
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4742 row = win_comp_pos(); // recompute w_winrow for all windows |
672 | 4743 #ifdef FEAT_DIFF |
4744 diff_need_scrollbind = TRUE; | |
4745 #endif | |
668 | 4746 |
29589
150a39f639d9
patch 9.0.0135: comment about tabpage line above the wrong code
Bram Moolenaar <Bram@vim.org>
parents:
29566
diff
changeset
|
4747 // Use the stored value of p_ch, so that it can be different for each tab |
150a39f639d9
patch 9.0.0135: comment about tabpage line above the wrong code
Bram Moolenaar <Bram@vim.org>
parents:
29566
diff
changeset
|
4748 // page. |
16477
8cc31b1b1d23
patch 8.1.1242: no cmdline redraw when tabpages have different 'cmdheight'
Bram Moolenaar <Bram@vim.org>
parents:
16475
diff
changeset
|
4749 if (p_ch != curtab->tp_ch_used) |
8cc31b1b1d23
patch 8.1.1242: no cmdline redraw when tabpages have different 'cmdheight'
Bram Moolenaar <Bram@vim.org>
parents:
16475
diff
changeset
|
4750 clear_cmdline = TRUE; |
824 | 4751 p_ch = curtab->tp_ch_used; |
19143
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4752 |
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4753 // When cmdheight is changed in a tab page with '<C-w>-', cmdline_row is |
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4754 // changed but p_ch and tp_ch_used are not changed. Thus we also need to |
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4755 // check cmdline_row. |
30671
15ac28c12c8f
patch 9.0.0670: no space for command line when there is a tabline
Bram Moolenaar <Bram@vim.org>
parents:
30665
diff
changeset
|
4756 if (row < cmdline_row && cmdline_row <= Rows - p_ch) |
19143
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4757 clear_cmdline = TRUE; |
bfcafd1a3e37
patch 8.2.0131: command line is not cleared when switching tabs
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
4758 |
30976
bcda60183c77
patch 9.0.0823: mouse drag test fails
Bram Moolenaar <Bram@vim.org>
parents:
30974
diff
changeset
|
4759 // If there was a click in a window, it won't be usable for a following |
bcda60183c77
patch 9.0.0823: mouse drag test fails
Bram Moolenaar <Bram@vim.org>
parents:
30974
diff
changeset
|
4760 // drag. |
30980
eb51299c4bfc
patch 9.0.0825: cannot drag an entry in the tabpage line
Bram Moolenaar <Bram@vim.org>
parents:
30976
diff
changeset
|
4761 reset_dragwin(); |
30976
bcda60183c77
patch 9.0.0823: mouse drag test fails
Bram Moolenaar <Bram@vim.org>
parents:
30974
diff
changeset
|
4762 |
29589
150a39f639d9
patch 9.0.0135: comment about tabpage line above the wrong code
Bram Moolenaar <Bram@vim.org>
parents:
29566
diff
changeset
|
4763 // The tabpage line may have appeared or disappeared, may need to resize |
150a39f639d9
patch 9.0.0135: comment about tabpage line above the wrong code
Bram Moolenaar <Bram@vim.org>
parents:
29566
diff
changeset
|
4764 // the frames for that. When the Vim window was resized need to update |
150a39f639d9
patch 9.0.0135: comment about tabpage line above the wrong code
Bram Moolenaar <Bram@vim.org>
parents:
29566
diff
changeset
|
4765 // frame sizes too. |
685 | 4766 if (curtab->tp_old_Rows != Rows || (old_off != firstwin->w_winrow |
4767 #ifdef FEAT_GUI_TABLINE | |
4768 && !gui_use_tabline() | |
4769 #endif | |
4770 )) | |
668 | 4771 shell_new_rows(); |
26488
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4772 if (curtab->tp_old_Columns != Columns) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4773 { |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4774 if (starting == 0) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4775 { |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4776 shell_new_columns(); // update window widths |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4777 curtab->tp_old_Columns = Columns; |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4778 } |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4779 else |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4780 curtab->tp_old_Columns = -1; // update window widths later |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
4781 } |
668 | 4782 |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4783 lastused_tabpage = last_tab; |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4784 |
668 | 4785 #if defined(FEAT_GUI) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4786 // When 'guioptions' includes 'L' or 'R' may have to remove or add |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4787 // scrollbars. Have to update them anyway. |
1906 | 4788 gui_may_update_scrollbars(); |
667 | 4789 #endif |
4790 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4791 // Apply autocommands after updating the display, when 'rows' and |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4792 // 'columns' have been set correctly. |
4354 | 4793 if (trigger_enter_autocmds) |
3582 | 4794 { |
4795 apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); | |
4796 if (old_curbuf != curbuf) | |
4797 apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); | |
4798 } | |
3413 | 4799 |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
4800 redraw_all_later(UPD_NOT_VALID); |
667 | 4801 } |
4802 | |
4803 /* | |
4804 * Go to tab page "n". For ":tab N" and "Ngt". | |
685 | 4805 * When "n" is 9999 go to the last tab page. |
667 | 4806 */ |
4807 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4808 goto_tabpage(int n) |
667 | 4809 { |
16405
840fa633ad64
patch 8.1.1207: some compilers give warning messages
Bram Moolenaar <Bram@vim.org>
parents:
16401
diff
changeset
|
4810 tabpage_T *tp = NULL; // shut up compiler |
682 | 4811 tabpage_T *ttp; |
667 | 4812 int i; |
4813 | |
857 | 4814 if (text_locked()) |
4815 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4816 // Not allowed when editing the command line. |
10082
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10076
diff
changeset
|
4817 text_locked_msg(); |
857 | 4818 return; |
4819 } | |
4820 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4821 // If there is only one it can't work. |
675 | 4822 if (first_tabpage->tp_next == NULL) |
4823 { | |
4824 if (n > 1) | |
4825 beep_flush(); | |
4826 return; | |
4827 } | |
4828 | |
667 | 4829 if (n == 0) |
4830 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4831 // No count, go to next tab page, wrap around end. |
674 | 4832 if (curtab->tp_next == NULL) |
667 | 4833 tp = first_tabpage; |
4834 else | |
674 | 4835 tp = curtab->tp_next; |
667 | 4836 } |
682 | 4837 else if (n < 0) |
4838 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4839 // "gT": go to previous tab page, wrap around end. "N gT" repeats |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4840 // this N times. |
682 | 4841 ttp = curtab; |
4842 for (i = n; i < 0; ++i) | |
4843 { | |
4844 for (tp = first_tabpage; tp->tp_next != ttp && tp->tp_next != NULL; | |
4845 tp = tp->tp_next) | |
4846 ; | |
4847 ttp = tp; | |
4848 } | |
4849 } | |
685 | 4850 else if (n == 9999) |
4851 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4852 // Go to last tab page. |
685 | 4853 for (tp = first_tabpage; tp->tp_next != NULL; tp = tp->tp_next) |
4854 ; | |
4855 } | |
667 | 4856 else |
4857 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4858 // Go to tab page "n". |
685 | 4859 tp = find_tabpage(n); |
671 | 4860 if (tp == NULL) |
4861 { | |
4862 beep_flush(); | |
4863 return; | |
4864 } | |
667 | 4865 } |
4866 | |
4354 | 4867 goto_tabpage_tp(tp, TRUE, TRUE); |
685 | 4868 |
4869 #ifdef FEAT_GUI_TABLINE | |
4870 if (gui_use_tabline()) | |
690 | 4871 gui_mch_set_curtab(tabpage_index(curtab)); |
685 | 4872 #endif |
4873 } | |
4874 | |
4875 /* | |
4876 * Go to tabpage "tp". | |
4354 | 4877 * Only trigger *Enter autocommands when trigger_enter_autocmds is TRUE. |
4878 * Only trigger *Leave autocommands when trigger_leave_autocmds is TRUE. | |
685 | 4879 * Note: doesn't update the GUI tab. |
4880 */ | |
4881 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4882 goto_tabpage_tp( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4883 tabpage_T *tp, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4884 int trigger_enter_autocmds, |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4885 int trigger_leave_autocmds) |
685 | 4886 { |
27813
126826449b54
patch 8.2.4432: cannot use settabvar() while the cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
27805
diff
changeset
|
4887 if (trigger_enter_autocmds || trigger_leave_autocmds) |
126826449b54
patch 8.2.4432: cannot use settabvar() while the cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
27805
diff
changeset
|
4888 CHECK_CMDWIN; |
27805
afbe86e8b24a
patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
4889 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4890 // Don't repeat a message in another tab page. |
2201
4c6b4298852f
Other solution for GTK not changing the locale.
Bram Moolenaar <bram@vim.org>
parents:
2115
diff
changeset
|
4891 set_keep_msg(NULL, 0); |
4c6b4298852f
Other solution for GTK not changing the locale.
Bram Moolenaar <bram@vim.org>
parents:
2115
diff
changeset
|
4892 |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
4893 skip_win_fix_scroll = TRUE; |
4354 | 4894 if (tp != curtab && leave_tabpage(tp->tp_curwin->w_buffer, |
4895 trigger_leave_autocmds) == OK) | |
674 | 4896 { |
4897 if (valid_tabpage(tp)) | |
4354 | 4898 enter_tabpage(tp, curbuf, trigger_enter_autocmds, |
4899 trigger_leave_autocmds); | |
674 | 4900 else |
4354 | 4901 enter_tabpage(curtab, curbuf, trigger_enter_autocmds, |
4902 trigger_leave_autocmds); | |
674 | 4903 } |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
4904 skip_win_fix_scroll = FALSE; |
667 | 4905 } |
7 | 4906 |
4907 /* | |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4908 * Go to the last accessed tab page, if there is one. |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4909 * Return OK or FAIL |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4910 */ |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4911 int |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4912 goto_tabpage_lastused(void) |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4913 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4914 if (!valid_tabpage(lastused_tabpage)) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4915 return FAIL; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4916 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4917 goto_tabpage_tp(lastused_tabpage, TRUE, TRUE); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
4918 return OK; |
21703
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4919 } |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4920 |
22583b9d4efd
patch 8.2.1401: cannot jump to the last used tabpage
Bram Moolenaar <Bram@vim.org>
parents:
21020
diff
changeset
|
4921 /* |
825 | 4922 * Enter window "wp" in tab page "tp". |
4923 * Also updates the GUI tab. | |
4924 */ | |
4925 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4926 goto_tabpage_win(tabpage_T *tp, win_T *wp) |
825 | 4927 { |
4354 | 4928 goto_tabpage_tp(tp, TRUE, TRUE); |
825 | 4929 if (curtab == tp && win_valid(wp)) |
4930 { | |
4931 win_enter(wp, TRUE); | |
4932 # ifdef FEAT_GUI_TABLINE | |
4933 if (gui_use_tabline()) | |
4934 gui_mch_set_curtab(tabpage_index(curtab)); | |
4935 # endif | |
4936 } | |
4937 } | |
4938 | |
4939 /* | |
6775 | 4940 * Move the current tab page to after tab page "nr". |
682 | 4941 */ |
4942 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4943 tabpage_move(int nr) |
682 | 4944 { |
6775 | 4945 int n = 1; |
4946 tabpage_T *tp, *tp_dst; | |
682 | 4947 |
4948 if (first_tabpage->tp_next == NULL) | |
4949 return; | |
4950 | |
6775 | 4951 for (tp = first_tabpage; tp->tp_next != NULL && n < nr; tp = tp->tp_next) |
4952 ++n; | |
4953 | |
4954 if (tp == curtab || (nr > 0 && tp->tp_next != NULL | |
4955 && tp->tp_next == curtab)) | |
4956 return; | |
4957 | |
4958 tp_dst = tp; | |
4959 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4960 // Remove the current tab page from the list of tab pages. |
682 | 4961 if (curtab == first_tabpage) |
4962 first_tabpage = curtab->tp_next; | |
4963 else | |
4964 { | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
4965 FOR_ALL_TABPAGES(tp) |
682 | 4966 if (tp->tp_next == curtab) |
4967 break; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4968 if (tp == NULL) // "cannot happen" |
682 | 4969 return; |
4970 tp->tp_next = curtab->tp_next; | |
4971 } | |
4972 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4973 // Re-insert it at the specified position. |
6775 | 4974 if (nr <= 0) |
682 | 4975 { |
4976 curtab->tp_next = first_tabpage; | |
4977 first_tabpage = curtab; | |
4978 } | |
4979 else | |
4980 { | |
6775 | 4981 curtab->tp_next = tp_dst->tp_next; |
4982 tp_dst->tp_next = curtab; | |
682 | 4983 } |
4984 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4985 // Need to redraw the tabline. Tab page contents doesn't change. |
682 | 4986 redraw_tabline = TRUE; |
4987 } | |
4988 | |
4989 | |
4990 /* | |
7 | 4991 * Go to another window. |
4992 * When jumping to another buffer, stop Visual mode. Do this before | |
4993 * changing windows so we can yank the selection into the '*' register. | |
4994 * When jumping to another window on the same buffer, adjust its cursor | |
4995 * position to keep the same Visual area. | |
4996 */ | |
4997 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4998 win_goto(win_T *wp) |
7 | 4999 { |
2316
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5000 #ifdef FEAT_CONCEAL |
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5001 win_T *owp = curwin; |
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5002 #endif |
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5003 |
19166
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5004 #ifdef FEAT_PROP_POPUP |
19271
ebeeb4b4a1fa
patch 8.2.0194: some commands can cause problems in terminal popup
Bram Moolenaar <Bram@vim.org>
parents:
19265
diff
changeset
|
5005 if (ERROR_IF_ANY_POPUP_WINDOW) |
16874
da5f5836e90c
patch 8.1.1438: some commands cause trouble in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
16863
diff
changeset
|
5006 return; |
19166
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5007 if (popup_is_popup(wp)) |
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5008 { |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
5009 emsg(_(e_not_allowed_to_enter_popup_window)); |
19166
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5010 return; |
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5011 } |
215793f6b59d
patch 8.2.0142: possible to enter popup window with CTRL-W p
Bram Moolenaar <Bram@vim.org>
parents:
19155
diff
changeset
|
5012 #endif |
29042
e150d0e4701f
patch 8.2.5043: can open a cmdline window from a substitute expression
Bram Moolenaar <Bram@vim.org>
parents:
29026
diff
changeset
|
5013 if (text_or_buf_locked()) |
7 | 5014 { |
5015 beep_flush(); | |
5016 return; | |
5017 } | |
631 | 5018 |
7 | 5019 if (wp->w_buffer != curbuf) |
5020 reset_VIsual_and_resel(); | |
5021 else if (VIsual_active) | |
5022 wp->w_cursor = curwin->w_cursor; | |
5023 | |
5024 #ifdef FEAT_GUI | |
5025 need_mouse_correct = TRUE; | |
5026 #endif | |
5027 win_enter(wp, TRUE); | |
2316
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5028 |
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5029 #ifdef FEAT_CONCEAL |
15436
29f3d59bb6f0
patch 8.1.0726: redrawing specifically for conceal feature
Bram Moolenaar <Bram@vim.org>
parents:
15380
diff
changeset
|
5030 // Conceal cursor line in previous window, unconceal in current window. |
4094 | 5031 if (win_valid(owp) && owp->w_p_cole > 0 && !msg_scrolled) |
15436
29f3d59bb6f0
patch 8.1.0726: redrawing specifically for conceal feature
Bram Moolenaar <Bram@vim.org>
parents:
15380
diff
changeset
|
5032 redrawWinline(owp, owp->w_cursor.lnum); |
4094 | 5033 if (curwin->w_p_cole > 0 && !msg_scrolled) |
5034 need_cursor_line_redraw = TRUE; | |
2316
db0ea641e382
Fix: cursor line not properly concealed when moving between windows.
Bram Moolenaar <bram@vim.org>
parents:
2314
diff
changeset
|
5035 #endif |
7 | 5036 } |
5037 | |
25567
0082503ff2ff
patch 8.2.3320: some local functions are not static
Bram Moolenaar <Bram@vim.org>
parents:
25553
diff
changeset
|
5038 #if defined(FEAT_PERL) || defined(PROTO) |
7 | 5039 /* |
5040 * Find window number "winnr" (counting top to bottom). | |
5041 */ | |
5042 win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5043 win_find_nr(int winnr) |
7 | 5044 { |
5045 win_T *wp; | |
5046 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5047 FOR_ALL_WINDOWS(wp) |
7 | 5048 if (--winnr == 0) |
5049 break; | |
5050 return wp; | |
5051 } | |
5052 #endif | |
5053 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
5054 #if ((defined(FEAT_PYTHON) || defined(FEAT_PYTHON3))) || defined(PROTO) |
4429 | 5055 /* |
5056 * Find the tabpage for window "win". | |
5057 */ | |
5058 tabpage_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5059 win_find_tabpage(win_T *win) |
4429 | 5060 { |
5061 win_T *wp; | |
5062 tabpage_T *tp; | |
5063 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5064 FOR_ALL_TAB_WINDOWS(tp, wp) |
4429 | 5065 if (wp == win) |
5066 return tp; | |
5067 return NULL; | |
5068 } | |
5069 #endif | |
5070 | |
7 | 5071 /* |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5072 * Get the above or below neighbor window of the specified window. |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5073 * up - TRUE for the above neighbor |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5074 * count - nth neighbor window |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5075 * Returns the specified window if the neighbor is not found. |
7 | 5076 */ |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5077 win_T * |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5078 win_vert_neighbor(tabpage_T *tp, win_T *wp, int up, long count) |
7 | 5079 { |
5080 frame_T *fr; | |
5081 frame_T *nfr; | |
5082 frame_T *foundfr; | |
5083 | |
19291
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5084 #ifdef FEAT_PROP_POPUP |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5085 if (popup_is_popup(wp)) |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5086 // popups don't have neighbors. |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5087 return NULL; |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5088 #endif |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5089 foundfr = wp->w_frame; |
7 | 5090 while (count--) |
5091 { | |
5092 /* | |
5093 * First go upwards in the tree of frames until we find a upwards or | |
5094 * downwards neighbor. | |
5095 */ | |
5096 fr = foundfr; | |
5097 for (;;) | |
5098 { | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5099 if (fr == tp->tp_topframe) |
7 | 5100 goto end; |
5101 if (up) | |
5102 nfr = fr->fr_prev; | |
5103 else | |
5104 nfr = fr->fr_next; | |
5105 if (fr->fr_parent->fr_layout == FR_COL && nfr != NULL) | |
5106 break; | |
5107 fr = fr->fr_parent; | |
5108 } | |
5109 | |
5110 /* | |
5111 * Now go downwards to find the bottom or top frame in it. | |
5112 */ | |
5113 for (;;) | |
5114 { | |
5115 if (nfr->fr_layout == FR_LEAF) | |
5116 { | |
5117 foundfr = nfr; | |
5118 break; | |
5119 } | |
5120 fr = nfr->fr_child; | |
5121 if (nfr->fr_layout == FR_ROW) | |
5122 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5123 // Find the frame at the cursor row. |
7 | 5124 while (fr->fr_next != NULL |
5125 && frame2win(fr)->w_wincol + fr->fr_width | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5126 <= wp->w_wincol + wp->w_wcol) |
7 | 5127 fr = fr->fr_next; |
5128 } | |
5129 if (nfr->fr_layout == FR_COL && up) | |
5130 while (fr->fr_next != NULL) | |
5131 fr = fr->fr_next; | |
5132 nfr = fr; | |
5133 } | |
5134 } | |
5135 end: | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5136 return foundfr != NULL ? foundfr->fr_win : NULL; |
7 | 5137 } |
5138 | |
5139 /* | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5140 * Move to window above or below "count" times. |
7 | 5141 */ |
5142 static void | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5143 win_goto_ver( |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5144 int up, // TRUE to go to win above |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5145 long count) |
7 | 5146 { |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5147 win_T *win; |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5148 |
19265
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5149 #ifdef FEAT_PROP_POPUP |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5150 if (ERROR_IF_TERM_POPUP_WINDOW) |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5151 return; |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5152 #endif |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5153 win = win_vert_neighbor(curtab, curwin, up, count); |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5154 if (win != NULL) |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5155 win_goto(win); |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5156 } |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5157 |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5158 /* |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5159 * Get the left or right neighbor window of the specified window. |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5160 * left - TRUE for the left neighbor |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5161 * count - nth neighbor window |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5162 * Returns the specified window if the neighbor is not found. |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5163 */ |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5164 win_T * |
16354
b3bc3ba07bef
patch 8.1.1182: some function prototypes are outdated
Bram Moolenaar <Bram@vim.org>
parents:
16271
diff
changeset
|
5165 win_horz_neighbor(tabpage_T *tp, win_T *wp, int left, long count) |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5166 { |
7 | 5167 frame_T *fr; |
5168 frame_T *nfr; | |
5169 frame_T *foundfr; | |
5170 | |
19291
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5171 #ifdef FEAT_PROP_POPUP |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5172 if (popup_is_popup(wp)) |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5173 // popups don't have neighbors. |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5174 return NULL; |
1d6bc6b31c2e
patch 8.2.0204: crash when using winnr('j') in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19275
diff
changeset
|
5175 #endif |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5176 foundfr = wp->w_frame; |
7 | 5177 while (count--) |
5178 { | |
5179 /* | |
5180 * First go upwards in the tree of frames until we find a left or | |
5181 * right neighbor. | |
5182 */ | |
5183 fr = foundfr; | |
5184 for (;;) | |
5185 { | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5186 if (fr == tp->tp_topframe) |
7 | 5187 goto end; |
5188 if (left) | |
5189 nfr = fr->fr_prev; | |
5190 else | |
5191 nfr = fr->fr_next; | |
5192 if (fr->fr_parent->fr_layout == FR_ROW && nfr != NULL) | |
5193 break; | |
5194 fr = fr->fr_parent; | |
5195 } | |
5196 | |
5197 /* | |
5198 * Now go downwards to find the leftmost or rightmost frame in it. | |
5199 */ | |
5200 for (;;) | |
5201 { | |
5202 if (nfr->fr_layout == FR_LEAF) | |
5203 { | |
5204 foundfr = nfr; | |
5205 break; | |
5206 } | |
5207 fr = nfr->fr_child; | |
5208 if (nfr->fr_layout == FR_COL) | |
5209 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5210 // Find the frame at the cursor row. |
7 | 5211 while (fr->fr_next != NULL |
5212 && frame2win(fr)->w_winrow + fr->fr_height | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5213 <= wp->w_winrow + wp->w_wrow) |
7 | 5214 fr = fr->fr_next; |
5215 } | |
5216 if (nfr->fr_layout == FR_ROW && left) | |
5217 while (fr->fr_next != NULL) | |
5218 fr = fr->fr_next; | |
5219 nfr = fr; | |
5220 } | |
5221 } | |
5222 end: | |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5223 return foundfr != NULL ? foundfr->fr_win : NULL; |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5224 } |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5225 |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5226 /* |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5227 * Move to left or right window. |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5228 */ |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5229 static void |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5230 win_goto_hor( |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5231 int left, // TRUE to go to left win |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5232 long count) |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5233 { |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5234 win_T *win; |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5235 |
19265
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5236 #ifdef FEAT_PROP_POPUP |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5237 if (ERROR_IF_TERM_POPUP_WINDOW) |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5238 return; |
ce8c47ed54e5
patch 8.2.0191: cannot put a terminal in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19166
diff
changeset
|
5239 #endif |
16271
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5240 win = win_horz_neighbor(curtab, curwin, left, count); |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5241 if (win != NULL) |
243cdc183ec9
patch 8.1.1140: not easy to find out what neighbors a window has
Bram Moolenaar <Bram@vim.org>
parents:
16166
diff
changeset
|
5242 win_goto(win); |
7 | 5243 } |
5244 | |
5245 /* | |
5246 * Make window "wp" the current window. | |
5247 */ | |
5248 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5249 win_enter(win_T *wp, int undo_sync) |
7 | 5250 { |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5251 (void)win_enter_ext(wp, (undo_sync ? WEE_UNDO_SYNC : 0) |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5252 | WEE_TRIGGER_ENTER_AUTOCMDS | WEE_TRIGGER_LEAVE_AUTOCMDS); |
7 | 5253 } |
5254 | |
5255 /* | |
27032
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5256 * Used after making another window the current one: change directory if |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5257 * needed. |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5258 */ |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5259 static void |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5260 fix_current_dir(void) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5261 { |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5262 if (curwin->w_localdir != NULL || curtab->tp_localdir != NULL) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5263 { |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5264 char_u *dirname; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5265 |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5266 // Window or tab has a local directory: Save current directory as |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5267 // global directory (unless that was done already) and change to the |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5268 // local directory. |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5269 if (globaldir == NULL) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5270 { |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5271 char_u cwd[MAXPATHL]; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5272 |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5273 if (mch_dirname(cwd, MAXPATHL) == OK) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5274 globaldir = vim_strsave(cwd); |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5275 } |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5276 if (curwin->w_localdir != NULL) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5277 dirname = curwin->w_localdir; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5278 else |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5279 dirname = curtab->tp_localdir; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5280 |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5281 if (mch_chdir((char *)dirname) == 0) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5282 { |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5283 last_chdir_reason = NULL; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5284 shorten_fnames(TRUE); |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5285 } |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5286 } |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5287 else if (globaldir != NULL) |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5288 { |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5289 // Window doesn't have a local directory and we are not in the global |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5290 // directory: Change to the global directory. |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5291 vim_ignored = mch_chdir((char *)globaldir); |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5292 VIM_CLEAR(globaldir); |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5293 last_chdir_reason = NULL; |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5294 shorten_fnames(TRUE); |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5295 } |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5296 } |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5297 |
18cafa092e8d
patch 8.2.4045: some global functions are only used in one file
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
5298 /* |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5299 * Make window "wp" the current window. |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5300 * Can be called with "flags" containing WEE_CURWIN_INVALID, which means that |
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5301 * curwin has just been closed and isn't valid. |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5302 * Returns TRUE when dont_parse_messages was decremented. |
7 | 5303 */ |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5304 static int |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5305 win_enter_ext(win_T *wp, int flags) |
7 | 5306 { |
5307 int other_buffer = FALSE; | |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5308 int curwin_invalid = (flags & WEE_CURWIN_INVALID); |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5309 int did_decrement = FALSE; |
7 | 5310 |
32062
8c9f63a518f5
patch 9.0.1362: ml_get error when going to another tab
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
5311 if (wp == curwin && curwin_invalid == 0) // nothing to do |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5312 return FALSE; |
7 | 5313 |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5314 #ifdef FEAT_JOB_CHANNEL |
32062
8c9f63a518f5
patch 9.0.1362: ml_get error when going to another tab
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
5315 if (curwin_invalid == 0) |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5316 leaving_window(curwin); |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5317 #endif |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5318 |
32062
8c9f63a518f5
patch 9.0.1362: ml_get error when going to another tab
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
5319 if (curwin_invalid == 0 && (flags & WEE_TRIGGER_LEAVE_AUTOCMDS)) |
7 | 5320 { |
5321 /* | |
5322 * Be careful: If autocommands delete the window, return now. | |
5323 */ | |
5324 if (wp->w_buffer != curbuf) | |
5325 { | |
5326 apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); | |
5327 other_buffer = TRUE; | |
5328 if (!win_valid(wp)) | |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5329 return FALSE; |
7 | 5330 } |
5331 apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); | |
5332 if (!win_valid(wp)) | |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5333 return FALSE; |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
5334 #ifdef FEAT_EVAL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5335 // autocmds may abort script processing |
7 | 5336 if (aborting()) |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5337 return FALSE; |
7 | 5338 #endif |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
5339 } |
7 | 5340 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5341 // sync undo before leaving the current buffer |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5342 if ((flags & WEE_UNDO_SYNC) && curbuf != wp->w_buffer) |
825 | 5343 u_sync(FALSE); |
5977 | 5344 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5345 // Might need to scroll the old window before switching, e.g., when the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5346 // cursor was moved. |
32062
8c9f63a518f5
patch 9.0.1362: ml_get error when going to another tab
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
5347 if (*p_spk == 'c' && curwin_invalid == 0) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
5348 update_topline(); |
5977 | 5349 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5350 // may have to copy the buffer options when 'cpo' contains 'S' |
7 | 5351 if (wp->w_buffer != curbuf) |
5352 buf_copy_options(wp->w_buffer, BCO_ENTER | BCO_NOHELP); | |
32062
8c9f63a518f5
patch 9.0.1362: ml_get error when going to another tab
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
5353 if (curwin_invalid == 0) |
7 | 5354 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5355 prevwin = curwin; // remember for CTRL-W p |
7 | 5356 curwin->w_redr_status = TRUE; |
5357 } | |
5358 curwin = wp; | |
5359 curbuf = wp->w_buffer; | |
5360 check_cursor(); | |
5361 if (!virtual_active()) | |
5362 curwin->w_cursor.coladd = 0; | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
5363 if (*p_spk == 'c') // assume cursor position needs updating |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
5364 changed_line_abv_curs(); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
5365 else |
31960
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
5366 // Make sure the cursor position is valid, either by moving the cursor |
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
5367 // or by scrolling the text. |
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
5368 win_fix_cursor( |
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
5369 get_real_state() & (MODE_NORMAL|MODE_CMDLINE|MODE_TERMINAL)); |
7 | 5370 |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5371 // Now it is OK to parse messages again, which may be needed in |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5372 // autocommands. |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5373 #ifdef MESSAGE_QUEUE |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5374 if (flags & WEE_ALLOW_PARSE_MESSAGES) |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5375 { |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5376 --dont_parse_messages; |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5377 did_decrement = TRUE; |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5378 } |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5379 #endif |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5380 |
26121
2c64a420ce7e
patch 8.2.3593: directory is wrong after executing "lcd" with win_execute()
Bram Moolenaar <Bram@vim.org>
parents:
26117
diff
changeset
|
5381 fix_current_dir(); |
7 | 5382 |
14035
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5383 #ifdef FEAT_JOB_CHANNEL |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5384 entering_window(curwin); |
bccd66fa00c1
patch 8.1.0035: not easy to switch between prompt buffer and other windows
Christian Brabandt <cb@256bit.org>
parents:
13837
diff
changeset
|
5385 #endif |
18283
0cb608fc9c60
patch 8.1.2136: using freed memory with autocmd from fuzzer
Bram Moolenaar <Bram@vim.org>
parents:
18255
diff
changeset
|
5386 // Careful: autocommands may close the window and make "wp" invalid |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5387 if (flags & WEE_TRIGGER_NEW_AUTOCMDS) |
9595
0190d5de215f
commit https://github.com/vim/vim/commit/c917da4b3e8801a255dbefea8e4ed19c1c716dd8
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
5388 apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf); |
25499
5ebf9bb1cbcd
patch 8.2.3286: win_enter_ext() has too many boolean arguments
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
5389 if (flags & WEE_TRIGGER_ENTER_AUTOCMDS) |
4354 | 5390 { |
5391 apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); | |
5392 if (other_buffer) | |
5393 apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); | |
5394 } | |
7 | 5395 |
5396 maketitle(); | |
5397 curwin->w_redr_status = TRUE; | |
18255
3f51e026de28
patch 8.1.2122: cannot build without terminal feature
Bram Moolenaar <Bram@vim.org>
parents:
18253
diff
changeset
|
5398 #ifdef FEAT_TERMINAL |
18283
0cb608fc9c60
patch 8.1.2136: using freed memory with autocmd from fuzzer
Bram Moolenaar <Bram@vim.org>
parents:
18255
diff
changeset
|
5399 if (bt_terminal(curwin->w_buffer)) |
18253
783f796a1426
patch 8.1.2121: mode is not updated when switching to terminal
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
5400 // terminal is likely in another mode |
783f796a1426
patch 8.1.2121: mode is not updated when switching to terminal
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
5401 redraw_mode = TRUE; |
18255
3f51e026de28
patch 8.1.2122: cannot build without terminal feature
Bram Moolenaar <Bram@vim.org>
parents:
18253
diff
changeset
|
5402 #endif |
672 | 5403 redraw_tabline = TRUE; |
7 | 5404 if (restart_edit) |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
5405 redraw_later(UPD_VALID); // causes status line redraw |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5406 |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5407 // set window height to desired minimal value |
17472
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
17225
diff
changeset
|
5408 if (curwin->w_height < p_wh && !curwin->w_p_wfh |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
5409 #ifdef FEAT_PROP_POPUP |
17472
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
17225
diff
changeset
|
5410 && !popup_is_popup(curwin) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
17225
diff
changeset
|
5411 #endif |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
17225
diff
changeset
|
5412 ) |
7 | 5413 win_setheight((int)p_wh); |
5414 else if (curwin->w_height == 0) | |
5415 win_setheight(1); | |
5416 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5417 // set window width to desired minimal value |
779 | 5418 if (curwin->w_width < p_wiw && !curwin->w_p_wfw) |
7 | 5419 win_setwidth((int)p_wiw); |
5420 | |
18135
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18010
diff
changeset
|
5421 setmouse(); // in case jumped to/from help buffer |
7 | 5422 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5423 // Change directories when the 'acd' option is set. |
13632
cec5137d5332
patch 8.0.1688: some macros are used without a semicolon
Christian Brabandt <cb@256bit.org>
parents:
13384
diff
changeset
|
5424 DO_AUTOCHDIR; |
25501
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5425 |
a1ed55c02e80
patch 8.2.3287: channel events not handled in BufEnter autocommand
Bram Moolenaar <Bram@vim.org>
parents:
25499
diff
changeset
|
5426 return did_decrement; |
7 | 5427 } |
5428 | |
26121
2c64a420ce7e
patch 8.2.3593: directory is wrong after executing "lcd" with win_execute()
Bram Moolenaar <Bram@vim.org>
parents:
26117
diff
changeset
|
5429 /* |
825 | 5430 * Jump to the first open window that contains buffer "buf", if one exists. |
5431 * Returns a pointer to the window found, otherwise NULL. | |
7 | 5432 */ |
5433 win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5434 buf_jump_open_win(buf_T *buf) |
7 | 5435 { |
6307 | 5436 win_T *wp = NULL; |
5437 | |
5438 if (curwin->w_buffer == buf) | |
5439 wp = curwin; | |
5440 else | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5441 FOR_ALL_WINDOWS(wp) |
6307 | 5442 if (wp->w_buffer == buf) |
5443 break; | |
7 | 5444 if (wp != NULL) |
5445 win_enter(wp, FALSE); | |
5446 return wp; | |
5447 } | |
825 | 5448 |
5449 /* | |
5450 * Jump to the first open window in any tab page that contains buffer "buf", | |
27873
d1af65b322d0
patch 8.2.4462: not enough testing for quickfix code
Bram Moolenaar <Bram@vim.org>
parents:
27857
diff
changeset
|
5451 * if one exists. First search in the windows present in the current tab page. |
825 | 5452 * Returns a pointer to the window found, otherwise NULL. |
5453 */ | |
5454 win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5455 buf_jump_open_tab(buf_T *buf) |
825 | 5456 { |
6307 | 5457 win_T *wp = buf_jump_open_win(buf); |
825 | 5458 tabpage_T *tp; |
5459 | |
5460 if (wp != NULL) | |
5461 return wp; | |
5462 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5463 FOR_ALL_TABPAGES(tp) |
825 | 5464 if (tp != curtab) |
5465 { | |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
5466 FOR_ALL_WINDOWS_IN_TAB(tp, wp) |
825 | 5467 if (wp->w_buffer == buf) |
5468 break; | |
5469 if (wp != NULL) | |
5470 { | |
5471 goto_tabpage_win(tp, wp); | |
5472 if (curwin != wp) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5473 wp = NULL; // something went wrong |
825 | 5474 break; |
5475 } | |
5476 } | |
5477 return wp; | |
5478 } | |
7 | 5479 |
9223
6c4d610fce0a
commit https://github.com/vim/vim/commit/888ccac8902cee186fbd47e971881f6d9b19c068
Christian Brabandt <cb@256bit.org>
parents:
9102
diff
changeset
|
5480 static int last_win_id = LOWEST_WIN_ID - 1; |
8534
485d4d8a97f6
commit https://github.com/vim/vim/commit/86edef664efccbfe685906c854b9cdd04e56f2d5
Christian Brabandt <cb@256bit.org>
parents:
8368
diff
changeset
|
5481 |
7 | 5482 /* |
1906 | 5483 * Allocate a window structure and link it in the window list when "hidden" is |
5484 * FALSE. | |
7 | 5485 */ |
5486 static win_T * | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
5487 win_alloc(win_T *after, int hidden) |
7 | 5488 { |
3263 | 5489 win_T *new_wp; |
7 | 5490 |
5491 /* | |
5492 * allocate window structure and linesizes arrays | |
5493 */ | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16802
diff
changeset
|
5494 new_wp = ALLOC_CLEAR_ONE(win_T); |
4287 | 5495 if (new_wp == NULL) |
5496 return NULL; | |
5497 | |
5498 if (win_alloc_lines(new_wp) == FAIL) | |
3263 | 5499 { |
5500 vim_free(new_wp); | |
4287 | 5501 return NULL; |
5502 } | |
5503 | |
8534
485d4d8a97f6
commit https://github.com/vim/vim/commit/86edef664efccbfe685906c854b9cdd04e56f2d5
Christian Brabandt <cb@256bit.org>
parents:
8368
diff
changeset
|
5504 new_wp->w_id = ++last_win_id; |
485d4d8a97f6
commit https://github.com/vim/vim/commit/86edef664efccbfe685906c854b9cdd04e56f2d5
Christian Brabandt <cb@256bit.org>
parents:
8368
diff
changeset
|
5505 |
4287 | 5506 #ifdef FEAT_EVAL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5507 // init w: variables |
28289
cdaff4db7760
patch 8.2.4670: memory allocation failures for new tab page not tested
Bram Moolenaar <Bram@vim.org>
parents:
28285
diff
changeset
|
5508 new_wp->w_vars = dict_alloc_id(aid_newwin_wvars); |
4287 | 5509 if (new_wp->w_vars == NULL) |
5510 { | |
5511 win_free_lsize(new_wp); | |
5512 vim_free(new_wp); | |
5513 return NULL; | |
5514 } | |
5515 init_var_dict(new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE); | |
5516 #endif | |
5517 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5518 // Don't execute autocommands while the window is not properly |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5519 // initialized yet. gui_create_scrollbar() may trigger a FocusGained |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5520 // event. |
4287 | 5521 block_autocmds(); |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13308
diff
changeset
|
5522 |
4287 | 5523 /* |
5524 * link the window in the window list | |
5525 */ | |
5526 if (!hidden) | |
5527 win_append(after, new_wp); | |
5528 new_wp->w_wincol = 0; | |
5529 new_wp->w_width = Columns; | |
5530 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5531 // position the display and the cursor at the top of the file. |
4287 | 5532 new_wp->w_topline = 1; |
7 | 5533 #ifdef FEAT_DIFF |
4287 | 5534 new_wp->w_topfill = 0; |
5535 #endif | |
5536 new_wp->w_botline = 2; | |
5537 new_wp->w_cursor.lnum = 1; | |
5538 new_wp->w_scbind_pos = 1; | |
5539 | |
15713
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
5540 // use global option value for global-local options |
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
5541 new_wp->w_p_so = -1; |
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
5542 new_wp->w_p_siso = -1; |
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
5543 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5544 // We won't calculate w_fraction until resizing the window |
4287 | 5545 new_wp->w_fraction = 0; |
5546 new_wp->w_prev_fraction_row = -1; | |
7 | 5547 |
5548 #ifdef FEAT_GUI | |
4287 | 5549 if (gui.in_use) |
5550 { | |
5551 gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_LEFT], | |
5552 SBAR_LEFT, new_wp); | |
5553 gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_RIGHT], | |
5554 SBAR_RIGHT, new_wp); | |
5555 } | |
7 | 5556 #endif |
5557 #ifdef FEAT_FOLDING | |
4287 | 5558 foldInitWin(new_wp); |
7 | 5559 #endif |
4287 | 5560 unblock_autocmds(); |
1326 | 5561 #ifdef FEAT_SEARCH_EXTRA |
30574
66de6909e102
patch 9.0.0622: matchaddpos() can get slow when adding many matches
Bram Moolenaar <Bram@vim.org>
parents:
30535
diff
changeset
|
5562 new_wp->w_next_match_id = 1000; // up to 1000 can be picked by the user |
4287 | 5563 #endif |
3263 | 5564 return new_wp; |
7 | 5565 } |
5566 | |
5567 /* | |
5237
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5568 * Remove window 'wp' from the window list and free the structure. |
7 | 5569 */ |
5570 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5571 win_free( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5572 win_T *wp, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5573 tabpage_T *tp) // tab page "win" is in, NULL for current |
7 | 5574 { |
5575 int i; | |
5237
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5576 buf_T *buf; |
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5577 wininfo_T *wip; |
7 | 5578 |
1918 | 5579 #ifdef FEAT_FOLDING |
5580 clearFolding(wp); | |
5581 #endif | |
5582 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5583 // reduce the reference count to the argument list. |
1918 | 5584 alist_unlink(wp->w_alist); |
5585 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5586 // Don't execute autocommands while the window is halfway being deleted. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5587 // gui_mch_destroy_scrollbar() may trigger a FocusGained event. |
1410 | 5588 block_autocmds(); |
1114 | 5589 |
2320
966a5609669e
Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
2316
diff
changeset
|
5590 #ifdef FEAT_LUA |
966a5609669e
Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
2316
diff
changeset
|
5591 lua_window_free(wp); |
966a5609669e
Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
2316
diff
changeset
|
5592 #endif |
966a5609669e
Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
2316
diff
changeset
|
5593 |
14 | 5594 #ifdef FEAT_MZSCHEME |
5595 mzscheme_window_free(wp); | |
5596 #endif | |
5597 | |
7 | 5598 #ifdef FEAT_PERL |
5599 perl_win_free(wp); | |
5600 #endif | |
5601 | |
5602 #ifdef FEAT_PYTHON | |
5603 python_window_free(wp); | |
5604 #endif | |
5605 | |
2329
ad2889f48843
Added support for Python 3. (Roland Puntaier)
Bram Moolenaar <bram@vim.org>
parents:
2320
diff
changeset
|
5606 #ifdef FEAT_PYTHON3 |
ad2889f48843
Added support for Python 3. (Roland Puntaier)
Bram Moolenaar <bram@vim.org>
parents:
2320
diff
changeset
|
5607 python3_window_free(wp); |
ad2889f48843
Added support for Python 3. (Roland Puntaier)
Bram Moolenaar <bram@vim.org>
parents:
2320
diff
changeset
|
5608 #endif |
ad2889f48843
Added support for Python 3. (Roland Puntaier)
Bram Moolenaar <bram@vim.org>
parents:
2320
diff
changeset
|
5609 |
7 | 5610 #ifdef FEAT_TCL |
5611 tcl_window_free(wp); | |
5612 #endif | |
5613 | |
5614 #ifdef FEAT_RUBY | |
5615 ruby_window_free(wp); | |
5616 #endif | |
5617 | |
5618 clear_winopt(&wp->w_onebuf_opt); | |
5619 clear_winopt(&wp->w_allbuf_opt); | |
5620 | |
26077
ad90d7eee236
patch 8.2.3572: memory leak when closing window and using "multispace"
Bram Moolenaar <Bram@vim.org>
parents:
25567
diff
changeset
|
5621 vim_free(wp->w_lcs_chars.multispace); |
29090
9b292596a332
patch 8.2.5066: timer_create is not available on every Mac system
Bram Moolenaar <Bram@vim.org>
parents:
29042
diff
changeset
|
5622 vim_free(wp->w_lcs_chars.leadmultispace); |
26077
ad90d7eee236
patch 8.2.3572: memory leak when closing window and using "multispace"
Bram Moolenaar <Bram@vim.org>
parents:
25567
diff
changeset
|
5623 |
7 | 5624 #ifdef FEAT_EVAL |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5625 vars_clear(&wp->w_vars->dv_hashtab); // free all w: variables |
4287 | 5626 hash_init(&wp->w_vars->dv_hashtab); |
5627 unref_var_dict(wp->w_vars); | |
7 | 5628 #endif |
5629 | |
8833
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5630 { |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5631 tabpage_T *ttp; |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5632 |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5633 if (prevwin == wp) |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5634 prevwin = NULL; |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5635 FOR_ALL_TABPAGES(ttp) |
8833
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5636 if (ttp->tp_prevwin == wp) |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5637 ttp->tp_prevwin = NULL; |
dc10bd23f918
commit https://github.com/vim/vim/commit/3dda7db4e1f7c4a8110a1f83001ec36b46693d27
Christian Brabandt <cb@256bit.org>
parents:
8804
diff
changeset
|
5638 } |
7 | 5639 win_free_lsize(wp); |
5640 | |
5641 for (i = 0; i < wp->w_tagstacklen; ++i) | |
17932
70ed823bdbb6
patch 8.1.1962: leaking memory when using tagfunc()
Bram Moolenaar <Bram@vim.org>
parents:
17893
diff
changeset
|
5642 { |
7 | 5643 vim_free(wp->w_tagstack[i].tagname); |
17932
70ed823bdbb6
patch 8.1.1962: leaking memory when using tagfunc()
Bram Moolenaar <Bram@vim.org>
parents:
17893
diff
changeset
|
5644 vim_free(wp->w_tagstack[i].user_data); |
70ed823bdbb6
patch 8.1.1962: leaking memory when using tagfunc()
Bram Moolenaar <Bram@vim.org>
parents:
17893
diff
changeset
|
5645 } |
7 | 5646 vim_free(wp->w_localdir); |
20711
d91b8d1e5198
patch 8.2.0909: cannot go back to the previous local directory
Bram Moolenaar <Bram@vim.org>
parents:
20384
diff
changeset
|
5647 vim_free(wp->w_prevdir); |
1326 | 5648 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5649 // Remove the window from the b_wininfo lists, it may happen that the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5650 // freed memory is re-used for another window. |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5651 FOR_ALL_BUFFERS(buf) |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19291
diff
changeset
|
5652 FOR_ALL_BUF_WININFO(buf, wip) |
5237
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5653 if (wip->wi_win == wp) |
22713
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5654 { |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5655 wininfo_T *wip2; |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5656 |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5657 // If there already is an entry with "wi_win" set to NULL it |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5658 // must be removed, it would never be used. |
25157
9a2e7184b604
patch 8.2.3115: Coverity complains about free_wininfo() use
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
5659 // Skip "wip" itself, otherwise Coverity complains. |
32118
04d9dff67d99
patch 9.0.1390: FOR_ALL_ macros are defined in an unexpected file
Bram Moolenaar <Bram@vim.org>
parents:
32062
diff
changeset
|
5660 FOR_ALL_BUF_WININFO(buf, wip2) |
25157
9a2e7184b604
patch 8.2.3115: Coverity complains about free_wininfo() use
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
5661 if (wip2 != wip && wip2->wi_win == NULL) |
22713
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5662 { |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5663 if (wip2->wi_next != NULL) |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5664 wip2->wi_next->wi_prev = wip2->wi_prev; |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5665 if (wip2->wi_prev == NULL) |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5666 buf->b_wininfo = wip2->wi_next; |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5667 else |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5668 wip2->wi_prev->wi_next = wip2->wi_next; |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5669 free_wininfo(wip2); |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5670 break; |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5671 } |
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5672 |
5237
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5673 wip->wi_win = NULL; |
22713
e871a824efc9
patch 8.2.1905: the wininfo list may contain stale entries
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
5674 } |
5237
647596ab1ae2
updated for version 7.4a.044
Bram Moolenaar <bram@vim.org>
parents:
5233
diff
changeset
|
5675 |
7 | 5676 #ifdef FEAT_SEARCH_EXTRA |
1326 | 5677 clear_matches(wp); |
5678 #endif | |
5679 | |
7 | 5680 free_jumplist(wp); |
5681 | |
643 | 5682 #ifdef FEAT_QUICKFIX |
5683 qf_free_all(wp); | |
5684 #endif | |
5685 | |
7 | 5686 #ifdef FEAT_GUI |
5687 if (gui.in_use) | |
5688 { | |
5689 gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_LEFT]); | |
5690 gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_RIGHT]); | |
5691 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5692 #endif // FEAT_GUI |
7 | 5693 |
12487
3f16cf18386c
patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
5694 #ifdef FEAT_MENU |
3f16cf18386c
patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
5695 remove_winbar(wp); |
3f16cf18386c
patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
5696 #endif |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
5697 #ifdef FEAT_PROP_POPUP |
16890
5131023c5728
patch 8.1.1446: popup window callback not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
16888
diff
changeset
|
5698 free_callback(&wp->w_close_cb); |
16880
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16874
diff
changeset
|
5699 free_callback(&wp->w_filter_cb); |
16888
ec61b6b79865
patch 8.1.1445: popup window border highlight not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
16880
diff
changeset
|
5700 for (i = 0; i < 4; ++i) |
ec61b6b79865
patch 8.1.1445: popup window border highlight not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
16880
diff
changeset
|
5701 VIM_CLEAR(wp->w_border_highlight[i]); |
17202
4b40e8821f56
patch 8.1.1600: cannot specify highlighting for popup window scrollbar
Bram Moolenaar <Bram@vim.org>
parents:
17162
diff
changeset
|
5702 vim_free(wp->w_scrollbar_highlight); |
4b40e8821f56
patch 8.1.1600: cannot specify highlighting for popup window scrollbar
Bram Moolenaar <Bram@vim.org>
parents:
17162
diff
changeset
|
5703 vim_free(wp->w_thumb_highlight); |
17119
b439e096a011
patch 8.1.1559: popup window title property not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
17111
diff
changeset
|
5704 vim_free(wp->w_popup_title); |
17162
f16cee6adf29
patch 8.1.1580: cannot make part of a popup transparent
Bram Moolenaar <Bram@vim.org>
parents:
17119
diff
changeset
|
5705 list_unref(wp->w_popup_mask); |
17514
984cc7258468
patch 8.1.1755: leaking memory when using a popup window mask
Bram Moolenaar <Bram@vim.org>
parents:
17472
diff
changeset
|
5706 vim_free(wp->w_popup_mask_cells); |
16880
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16874
diff
changeset
|
5707 #endif |
12487
3f16cf18386c
patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
5708 |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
5709 #ifdef FEAT_SYN_HL |
2314
233eb4412f5d
Added 'colorcolumn' option. Partly by Gregor Uhlenheuer.
Bram Moolenaar <bram@vim.org>
parents:
2306
diff
changeset
|
5710 vim_free(wp->w_p_cc_cols); |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
5711 #endif |
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2201
diff
changeset
|
5712 |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5713 if (win_valid_any_tab(wp)) |
1918 | 5714 win_remove(wp, tp); |
5958 | 5715 if (autocmd_busy) |
5716 { | |
5717 wp->w_next = au_pending_free_win; | |
5718 au_pending_free_win = wp; | |
5719 } | |
5720 else | |
5721 vim_free(wp); | |
1114 | 5722 |
1410 | 5723 unblock_autocmds(); |
7 | 5724 } |
5725 | |
5726 /* | |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5727 * Return TRUE if "wp" is not in the list of windows: the autocmd window or a |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5728 * popup window. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5729 */ |
28167
a52a5e3363c4
patch 8.2.4609: :unhide does not check for failing to close a window
Bram Moolenaar <Bram@vim.org>
parents:
27976
diff
changeset
|
5730 int |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5731 win_unlisted(win_T *wp) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5732 { |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
5733 return is_aucmd_win(wp) || WIN_IS_POPUP(wp); |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5734 } |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5735 |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18590
diff
changeset
|
5736 #if defined(FEAT_PROP_POPUP) || defined(PROTO) |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5737 /* |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5738 * Free a popup window. This does not take the window out of the window list |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5739 * and assumes there is only one toplevel frame, no split. |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5740 */ |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5741 void |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5742 win_free_popup(win_T *win) |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5743 { |
28285
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5744 if (win->w_buffer != NULL) |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5745 { |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5746 if (bt_popup(win->w_buffer)) |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5747 win_close_buffer(win, DOBUF_WIPE_REUSE, FALSE); |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5748 else |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5749 close_buffer(win, win->w_buffer, 0, FALSE, FALSE); |
a4aad5142959
patch 8.2.4668: buffer allocation failures insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents:
28211
diff
changeset
|
5750 } |
16802
f5487021fdad
patch 8.1.1403: cannot build without the timer feature
Bram Moolenaar <Bram@vim.org>
parents:
16800
diff
changeset
|
5751 # if defined(FEAT_TIMERS) |
30695
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30671
diff
changeset
|
5752 // the timer may have been cleared, making the pointer invalid |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30671
diff
changeset
|
5753 if (timer_valid(win->w_popup_timer)) |
16800
12e3a3afdb6a
patch 8.1.1402: "timer" option of popup windows not supported
Bram Moolenaar <Bram@vim.org>
parents:
16796
diff
changeset
|
5754 stop_timer(win->w_popup_timer); |
16802
f5487021fdad
patch 8.1.1403: cannot build without the timer feature
Bram Moolenaar <Bram@vim.org>
parents:
16800
diff
changeset
|
5755 # endif |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5756 vim_free(win->w_frame); |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5757 win_free(win, NULL); |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5758 } |
16802
f5487021fdad
patch 8.1.1403: cannot build without the timer feature
Bram Moolenaar <Bram@vim.org>
parents:
16800
diff
changeset
|
5759 #endif |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5760 |
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
5761 /* |
7 | 5762 * Append window "wp" in the window list after window "after". |
5763 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17670
diff
changeset
|
5764 static void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5765 win_append(win_T *after, win_T *wp) |
7 | 5766 { |
5767 win_T *before; | |
5768 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5769 if (after == NULL) // after NULL is in front of the first |
7 | 5770 before = firstwin; |
5771 else | |
5772 before = after->w_next; | |
5773 | |
5774 wp->w_next = before; | |
5775 wp->w_prev = after; | |
5776 if (after == NULL) | |
5777 firstwin = wp; | |
5778 else | |
5779 after->w_next = wp; | |
5780 if (before == NULL) | |
5781 lastwin = wp; | |
5782 else | |
5783 before->w_prev = wp; | |
5784 } | |
5785 | |
5786 /* | |
5787 * Remove a window from the window list. | |
5788 */ | |
1906 | 5789 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5790 win_remove( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5791 win_T *wp, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5792 tabpage_T *tp) // tab page "win" is in, NULL for current |
7 | 5793 { |
5794 if (wp->w_prev != NULL) | |
5795 wp->w_prev->w_next = wp->w_next; | |
671 | 5796 else if (tp == NULL) |
12564
183dc24cf861
patch 8.0.1160: getting tab-local variable fails after closing window
Christian Brabandt <cb@256bit.org>
parents:
12515
diff
changeset
|
5797 firstwin = curtab->tp_firstwin = wp->w_next; |
7 | 5798 else |
671 | 5799 tp->tp_firstwin = wp->w_next; |
12564
183dc24cf861
patch 8.0.1160: getting tab-local variable fails after closing window
Christian Brabandt <cb@256bit.org>
parents:
12515
diff
changeset
|
5800 |
7 | 5801 if (wp->w_next != NULL) |
5802 wp->w_next->w_prev = wp->w_prev; | |
671 | 5803 else if (tp == NULL) |
12564
183dc24cf861
patch 8.0.1160: getting tab-local variable fails after closing window
Christian Brabandt <cb@256bit.org>
parents:
12515
diff
changeset
|
5804 lastwin = curtab->tp_lastwin = wp->w_prev; |
7 | 5805 else |
671 | 5806 tp->tp_lastwin = wp->w_prev; |
7 | 5807 } |
5808 | |
5809 /* | |
5810 * Append frame "frp" in a frame list after frame "after". | |
5811 */ | |
5812 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5813 frame_append(frame_T *after, frame_T *frp) |
7 | 5814 { |
5815 frp->fr_next = after->fr_next; | |
5816 after->fr_next = frp; | |
5817 if (frp->fr_next != NULL) | |
5818 frp->fr_next->fr_prev = frp; | |
5819 frp->fr_prev = after; | |
5820 } | |
5821 | |
5822 /* | |
5823 * Insert frame "frp" in a frame list before frame "before". | |
5824 */ | |
5825 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5826 frame_insert(frame_T *before, frame_T *frp) |
7 | 5827 { |
5828 frp->fr_next = before; | |
5829 frp->fr_prev = before->fr_prev; | |
5830 before->fr_prev = frp; | |
5831 if (frp->fr_prev != NULL) | |
5832 frp->fr_prev->fr_next = frp; | |
5833 else | |
5834 frp->fr_parent->fr_child = frp; | |
5835 } | |
5836 | |
5837 /* | |
5838 * Remove a frame from a frame list. | |
5839 */ | |
5840 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5841 frame_remove(frame_T *frp) |
7 | 5842 { |
5843 if (frp->fr_prev != NULL) | |
5844 frp->fr_prev->fr_next = frp->fr_next; | |
5845 else | |
5846 frp->fr_parent->fr_child = frp->fr_next; | |
5847 if (frp->fr_next != NULL) | |
5848 frp->fr_next->fr_prev = frp->fr_prev; | |
5849 } | |
5850 | |
5851 /* | |
5852 * Allocate w_lines[] for window "wp". | |
5853 * Return FAIL for failure, OK for success. | |
5854 */ | |
5855 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5856 win_alloc_lines(win_T *wp) |
7 | 5857 { |
5858 wp->w_lines_valid = 0; | |
27251
85f56e16da9b
patch 8.2.4154: ml_get error when exchanging windows in Visual mode
Bram Moolenaar <Bram@vim.org>
parents:
27032
diff
changeset
|
5859 wp->w_lines = ALLOC_CLEAR_MULT(wline_T, Rows); |
7 | 5860 if (wp->w_lines == NULL) |
5861 return FAIL; | |
5862 return OK; | |
5863 } | |
5864 | |
5865 /* | |
5866 * free lsize arrays for a window | |
5867 */ | |
5868 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5869 win_free_lsize(win_T *wp) |
7 | 5870 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5871 // TODO: why would wp be NULL here? |
5952 | 5872 if (wp != NULL) |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13144
diff
changeset
|
5873 VIM_CLEAR(wp->w_lines); |
7 | 5874 } |
5875 | |
5876 /* | |
5877 * Called from win_new_shellsize() after Rows changed. | |
671 | 5878 * This only does the current tab page, others must be done when made active. |
7 | 5879 */ |
5880 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5881 shell_new_rows(void) |
7 | 5882 { |
26488
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5883 int h = (int)ROWS_AVAIL; |
7 | 5884 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5885 if (firstwin == NULL) // not initialized yet |
7 | 5886 return; |
26488
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5887 if (h < frame_minheight(topframe, NULL)) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5888 h = frame_minheight(topframe, NULL); |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5889 |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5890 // First try setting the heights of windows with 'winfixheight'. If |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5891 // that doesn't result in the right height, forget about that option. |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5892 frame_new_height(topframe, h, FALSE, TRUE); |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5893 if (!frame_check_height(topframe, h)) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5894 frame_new_height(topframe, h, FALSE, FALSE); |
7 | 5895 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5896 (void)win_comp_pos(); // recompute w_winrow and w_wincol |
7 | 5897 compute_cmdrow(); |
824 | 5898 curtab->tp_ch_used = p_ch; |
170 | 5899 |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
5900 if (*p_spk != 'c' && !skip_win_fix_scroll) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
5901 win_fix_scroll(TRUE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
5902 |
7 | 5903 #if 0 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5904 // Disabled: don't want making the screen smaller make a window larger. |
7 | 5905 if (p_ea) |
5906 win_equal(curwin, FALSE, 'v'); | |
5907 #endif | |
5908 } | |
5909 | |
5910 /* | |
5911 * Called from win_new_shellsize() after Columns changed. | |
5912 */ | |
5913 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5914 shell_new_columns(void) |
7 | 5915 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5916 if (firstwin == NULL) // not initialized yet |
7 | 5917 return; |
779 | 5918 |
26488
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5919 // First try setting the widths of windows with 'winfixwidth'. If that |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5920 // doesn't result in the right width, forget about that option. |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5921 frame_new_width(topframe, (int)Columns, FALSE, TRUE); |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5922 if (!frame_check_width(topframe, Columns)) |
06aa56b32df4
patch 8.2.3774: test for command line height fails
Bram Moolenaar <Bram@vim.org>
parents:
26486
diff
changeset
|
5923 frame_new_width(topframe, (int)Columns, FALSE, FALSE); |
779 | 5924 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5925 (void)win_comp_pos(); // recompute w_winrow and w_wincol |
7 | 5926 #if 0 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5927 // Disabled: don't want making the screen smaller make a window larger. |
7 | 5928 if (p_ea) |
5929 win_equal(curwin, FALSE, 'h'); | |
5930 #endif | |
5931 } | |
5932 | |
5933 /* | |
5934 * Save the size of all windows in "gap". | |
5935 */ | |
5936 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5937 win_size_save(garray_T *gap) |
7 | 5938 |
5939 { | |
5940 win_T *wp; | |
5941 | |
27028
c9474ae175f4
patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
5942 ga_init2(gap, sizeof(int), 1); |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5943 if (ga_grow(gap, win_count() * 2 + 1) == FAIL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5944 return; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5945 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5946 // first entry is value of 'lines' |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5947 ((int *)gap->ga_data)[gap->ga_len++] = Rows; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5948 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5949 FOR_ALL_WINDOWS(wp) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5950 { |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5951 ((int *)gap->ga_data)[gap->ga_len++] = |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5952 wp->w_width + wp->w_vsep_width; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
5953 ((int *)gap->ga_data)[gap->ga_len++] = wp->w_height; |
18467
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5954 } |
7 | 5955 } |
5956 | |
5957 /* | |
18467
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5958 * Restore window sizes, but only if the number of windows is still the same |
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5959 * and 'lines' didn't change. |
7 | 5960 * Does not free the growarray. |
5961 */ | |
5962 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5963 win_size_restore(garray_T *gap) |
7 | 5964 { |
5965 win_T *wp; | |
6058 | 5966 int i, j; |
7 | 5967 |
18467
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5968 if (win_count() * 2 + 1 == gap->ga_len |
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5969 && ((int *)gap->ga_data)[0] == Rows) |
7 | 5970 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5971 // The order matters, because frames contain other frames, but it's |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5972 // difficult to get right. The easy way out is to do it twice. |
6058 | 5973 for (j = 0; j < 2; ++j) |
7 | 5974 { |
18467
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
5975 i = 1; |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
5976 FOR_ALL_WINDOWS(wp) |
6058 | 5977 { |
5978 frame_setwidth(wp->w_frame, ((int *)gap->ga_data)[i++]); | |
5979 win_setheight_win(((int *)gap->ga_data)[i++], wp); | |
5980 } | |
7 | 5981 } |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
5982 // recompute the window positions |
7 | 5983 (void)win_comp_pos(); |
5984 } | |
5985 } | |
5986 | |
5987 /* | |
5988 * Update the position for all windows, using the width and height of the | |
5989 * frames. | |
5990 * Returns the row just after the last window. | |
5991 */ | |
668 | 5992 int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
5993 win_comp_pos(void) |
7 | 5994 { |
685 | 5995 int row = tabline_height(); |
7 | 5996 int col = 0; |
5997 | |
5998 frame_comp_pos(topframe, &row, &col); | |
5999 return row; | |
6000 } | |
6001 | |
6002 /* | |
6003 * Update the position of the windows in frame "topfrp", using the width and | |
6004 * height of the frames. | |
6005 * "*row" and "*col" are the top-left position of the frame. They are updated | |
6006 * to the bottom-right position plus one. | |
6007 */ | |
6008 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6009 frame_comp_pos(frame_T *topfrp, int *row, int *col) |
7 | 6010 { |
6011 win_T *wp; | |
6012 frame_T *frp; | |
6013 int startcol; | |
6014 int startrow; | |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6015 int h; |
7 | 6016 |
6017 wp = topfrp->fr_win; | |
6018 if (wp != NULL) | |
6019 { | |
8643
24b43dd167eb
commit https://github.com/vim/vim/commit/44a2f923c00f1384c9ecde12fb5b4711bc20702e
Christian Brabandt <cb@256bit.org>
parents:
8536
diff
changeset
|
6020 if (wp->w_winrow != *row || wp->w_wincol != *col) |
7 | 6021 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6022 // position changed, redraw |
7 | 6023 wp->w_winrow = *row; |
6024 wp->w_wincol = *col; | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
6025 redraw_win_later(wp, UPD_NOT_VALID); |
7 | 6026 wp->w_redr_status = TRUE; |
6027 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6028 // WinBar will not show if the window height is zero |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6029 h = VISIBLE_HEIGHT(wp) + wp->w_status_height; |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6030 *row += h > topfrp->fr_height ? topfrp->fr_height : h; |
7 | 6031 *col += wp->w_width + wp->w_vsep_width; |
6032 } | |
6033 else | |
6034 { | |
6035 startrow = *row; | |
6036 startcol = *col; | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
6037 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
7 | 6038 { |
6039 if (topfrp->fr_layout == FR_ROW) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6040 *row = startrow; // all frames are at the same row |
7 | 6041 else |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6042 *col = startcol; // all frames are at the same col |
7 | 6043 frame_comp_pos(frp, row, col); |
6044 } | |
6045 } | |
6046 } | |
6047 | |
6048 /* | |
26468
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6049 * Make the current window show at least one line and one column. |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6050 */ |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6051 void |
32009
4545f58c8490
patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents:
31960
diff
changeset
|
6052 win_ensure_size(void) |
26468
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6053 { |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6054 if (curwin->w_height == 0) |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6055 win_setheight(1); |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6056 if (curwin->w_width == 0) |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6057 win_setwidth(1); |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6058 } |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6059 |
2fc13817b100
patch 8.2.3764: cannot see any text when window was made zero lines
Bram Moolenaar <Bram@vim.org>
parents:
26458
diff
changeset
|
6060 /* |
7 | 6061 * Set current window height and take care of repositioning other windows to |
6062 * fit around it. | |
6063 */ | |
6064 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6065 win_setheight(int height) |
7 | 6066 { |
6067 win_setheight_win(height, curwin); | |
6068 } | |
6069 | |
6070 /* | |
6071 * Set the window height of window "win" and take care of repositioning other | |
6072 * windows to fit around it. | |
6073 */ | |
6074 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6075 win_setheight_win(int height, win_T *win) |
7 | 6076 { |
6077 int row; | |
6078 | |
6079 if (win == curwin) | |
6080 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6081 // Always keep current window at least one line high, even when |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6082 // 'winminheight' is zero. |
7 | 6083 if (height < p_wmh) |
6084 height = p_wmh; | |
6085 if (height == 0) | |
6086 height = 1; | |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6087 height += WINBAR_HEIGHT(curwin); |
7 | 6088 } |
6089 | |
6090 frame_setheight(win->w_frame, height + win->w_status_height); | |
6091 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6092 // recompute the window positions |
7 | 6093 row = win_comp_pos(); |
6094 | |
6095 /* | |
6096 * If there is extra space created between the last window and the command | |
6097 * line, clear it. | |
6098 */ | |
6099 if (full_screen && msg_scrolled == 0 && row < cmdline_row) | |
6100 screen_fill(row, cmdline_row, 0, (int)Columns, ' ', ' ', 0); | |
6101 cmdline_row = row; | |
6102 msg_row = row; | |
6103 msg_col = 0; | |
6104 | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6105 if (*p_spk != 'c') |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6106 win_fix_scroll(TRUE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6107 |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
6108 redraw_all_later(UPD_NOT_VALID); |
7 | 6109 } |
6110 | |
6111 /* | |
6112 * Set the height of a frame to "height" and take care that all frames and | |
6113 * windows inside it are resized. Also resize frames on the left and right if | |
6114 * the are in the same FR_ROW frame. | |
6115 * | |
6116 * Strategy: | |
6117 * If the frame is part of a FR_COL frame, try fitting the frame in that | |
6118 * frame. If that doesn't work (the FR_COL frame is too small), recursively | |
6119 * go to containing frames to resize them and make room. | |
6120 * If the frame is part of a FR_ROW frame, all frames must be resized as well. | |
6121 * Check for the minimal height of the FR_ROW frame. | |
6122 * At the top level we can also use change the command line height. | |
6123 */ | |
6124 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6125 frame_setheight(frame_T *curfrp, int height) |
7 | 6126 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6127 int room; // total number of lines available |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6128 int take; // number of lines taken from other windows |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6129 int room_cmdline; // lines available from cmdline |
7 | 6130 int run; |
6131 frame_T *frp; | |
6132 int h; | |
6133 int room_reserved; | |
6134 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6135 // If the height already is the desired value, nothing to do. |
7 | 6136 if (curfrp->fr_height == height) |
6137 return; | |
6138 | |
6139 if (curfrp->fr_parent == NULL) | |
6140 { | |
29700
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
6141 // topframe: can only change the command line height |
667 | 6142 if (height > ROWS_AVAIL) |
29976
b6b71499d9af
patch 9.0.0326: some changes for cmdheight=0 are not needed
Bram Moolenaar <Bram@vim.org>
parents:
29932
diff
changeset
|
6143 height = ROWS_AVAIL; |
7 | 6144 if (height > 0) |
6145 frame_new_height(curfrp, height, FALSE, FALSE); | |
6146 } | |
6147 else if (curfrp->fr_parent->fr_layout == FR_ROW) | |
6148 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6149 // Row of frames: Also need to resize frames left and right of this |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6150 // one. First check for the minimal height of these. |
7 | 6151 h = frame_minheight(curfrp->fr_parent, NULL); |
6152 if (height < h) | |
6153 height = h; | |
6154 frame_setheight(curfrp->fr_parent, height); | |
6155 } | |
6156 else | |
6157 { | |
6158 /* | |
6159 * Column of frames: try to change only frames in this column. | |
6160 */ | |
6161 /* | |
6162 * Do this twice: | |
6163 * 1: compute room available, if it's not enough try resizing the | |
6164 * containing frame. | |
6165 * 2: compute the room available and adjust the height to it. | |
6166 * Try not to reduce the height of a window with 'winfixheight' set. | |
6167 */ | |
6168 for (run = 1; run <= 2; ++run) | |
6169 { | |
6170 room = 0; | |
6171 room_reserved = 0; | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
6172 FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) |
7 | 6173 { |
6174 if (frp != curfrp | |
6175 && frp->fr_win != NULL | |
6176 && frp->fr_win->w_p_wfh) | |
6177 room_reserved += frp->fr_height; | |
6178 room += frp->fr_height; | |
6179 if (frp != curfrp) | |
6180 room -= frame_minheight(frp, NULL); | |
6181 } | |
6182 if (curfrp->fr_width != Columns) | |
6183 room_cmdline = 0; | |
6184 else | |
6185 { | |
6186 room_cmdline = Rows - p_ch - (lastwin->w_winrow | |
12998
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6187 + VISIBLE_HEIGHT(lastwin) |
dd734ee3e2fe
patch 8.0.1375: window size wrong after maximizing with WinBar
Christian Brabandt <cb@256bit.org>
parents:
12916
diff
changeset
|
6188 + lastwin->w_status_height); |
7 | 6189 if (room_cmdline < 0) |
6190 room_cmdline = 0; | |
6191 } | |
6192 | |
6193 if (height <= room + room_cmdline) | |
6194 break; | |
6195 if (run == 2 || curfrp->fr_width == Columns) | |
6196 { | |
28169
bef82285dda0
patch 8.2.4610: some conditions are always true
Bram Moolenaar <Bram@vim.org>
parents:
28167
diff
changeset
|
6197 height = room + room_cmdline; |
7 | 6198 break; |
6199 } | |
6200 frame_setheight(curfrp->fr_parent, height | |
6201 + frame_minheight(curfrp->fr_parent, NOWIN) - (int)p_wmh - 1); | |
6202 } | |
6203 | |
6204 /* | |
6205 * Compute the number of lines we will take from others frames (can be | |
6206 * negative!). | |
6207 */ | |
6208 take = height - curfrp->fr_height; | |
6209 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6210 // If there is not enough room, also reduce the height of a window |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6211 // with 'winfixheight' set. |
7 | 6212 if (height > room + room_cmdline - room_reserved) |
6213 room_reserved = room + room_cmdline - height; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6214 // If there is only a 'winfixheight' window and making the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6215 // window smaller, need to make the other window taller. |
7 | 6216 if (take < 0 && room - curfrp->fr_height < room_reserved) |
6217 room_reserved = 0; | |
6218 | |
6219 if (take > 0 && room_cmdline > 0) | |
6220 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6221 // use lines from cmdline first |
7 | 6222 if (take < room_cmdline) |
6223 room_cmdline = take; | |
6224 take -= room_cmdline; | |
6225 topframe->fr_height += room_cmdline; | |
6226 } | |
6227 | |
6228 /* | |
6229 * set the current frame to the new height | |
6230 */ | |
6231 frame_new_height(curfrp, height, FALSE, FALSE); | |
6232 | |
6233 /* | |
6234 * First take lines from the frames after the current frame. If | |
6235 * that is not enough, takes lines from frames above the current | |
6236 * frame. | |
6237 */ | |
6238 for (run = 0; run < 2; ++run) | |
6239 { | |
6240 if (run == 0) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6241 frp = curfrp->fr_next; // 1st run: start with next window |
7 | 6242 else |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6243 frp = curfrp->fr_prev; // 2nd run: start with prev window |
7 | 6244 while (frp != NULL && take != 0) |
6245 { | |
6246 h = frame_minheight(frp, NULL); | |
6247 if (room_reserved > 0 | |
6248 && frp->fr_win != NULL | |
6249 && frp->fr_win->w_p_wfh) | |
6250 { | |
6251 if (room_reserved >= frp->fr_height) | |
6252 room_reserved -= frp->fr_height; | |
6253 else | |
6254 { | |
6255 if (frp->fr_height - room_reserved > take) | |
6256 room_reserved = frp->fr_height - take; | |
6257 take -= frp->fr_height - room_reserved; | |
6258 frame_new_height(frp, room_reserved, FALSE, FALSE); | |
6259 room_reserved = 0; | |
6260 } | |
6261 } | |
6262 else | |
6263 { | |
6264 if (frp->fr_height - take < h) | |
6265 { | |
6266 take -= frp->fr_height - h; | |
6267 frame_new_height(frp, h, FALSE, FALSE); | |
6268 } | |
6269 else | |
6270 { | |
6271 frame_new_height(frp, frp->fr_height - take, | |
6272 FALSE, FALSE); | |
6273 take = 0; | |
6274 } | |
6275 } | |
6276 if (run == 0) | |
6277 frp = frp->fr_next; | |
6278 else | |
6279 frp = frp->fr_prev; | |
6280 } | |
6281 } | |
6282 } | |
6283 } | |
6284 | |
6285 /* | |
6286 * Set current window width and take care of repositioning other windows to | |
6287 * fit around it. | |
6288 */ | |
6289 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6290 win_setwidth(int width) |
7 | 6291 { |
6292 win_setwidth_win(width, curwin); | |
6293 } | |
6294 | |
6295 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6296 win_setwidth_win(int width, win_T *wp) |
7 | 6297 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6298 // Always keep current window at least one column wide, even when |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6299 // 'winminwidth' is zero. |
7 | 6300 if (wp == curwin) |
6301 { | |
6302 if (width < p_wmw) | |
6303 width = p_wmw; | |
6304 if (width == 0) | |
6305 width = 1; | |
6306 } | |
23402
65718283239b
patch 8.2.2244: crash when making the window width negative
Bram Moolenaar <Bram@vim.org>
parents:
23386
diff
changeset
|
6307 else if (width < 0) |
65718283239b
patch 8.2.2244: crash when making the window width negative
Bram Moolenaar <Bram@vim.org>
parents:
23386
diff
changeset
|
6308 width = 0; |
7 | 6309 |
6310 frame_setwidth(wp->w_frame, width + wp->w_vsep_width); | |
6311 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6312 // recompute the window positions |
7 | 6313 (void)win_comp_pos(); |
6314 | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
6315 redraw_all_later(UPD_NOT_VALID); |
7 | 6316 } |
6317 | |
6318 /* | |
6319 * Set the width of a frame to "width" and take care that all frames and | |
6320 * windows inside it are resized. Also resize frames above and below if the | |
6321 * are in the same FR_ROW frame. | |
6322 * | |
6323 * Strategy is similar to frame_setheight(). | |
6324 */ | |
6325 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6326 frame_setwidth(frame_T *curfrp, int width) |
7 | 6327 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6328 int room; // total number of lines available |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6329 int take; // number of lines taken from other windows |
7 | 6330 int run; |
6331 frame_T *frp; | |
6332 int w; | |
779 | 6333 int room_reserved; |
7 | 6334 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6335 // If the width already is the desired value, nothing to do. |
7 | 6336 if (curfrp->fr_width == width) |
6337 return; | |
6338 | |
6339 if (curfrp->fr_parent == NULL) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6340 // topframe: can't change width |
7 | 6341 return; |
6342 | |
6343 if (curfrp->fr_parent->fr_layout == FR_COL) | |
6344 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6345 // Column of frames: Also need to resize frames above and below of |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6346 // this one. First check for the minimal width of these. |
7 | 6347 w = frame_minwidth(curfrp->fr_parent, NULL); |
6348 if (width < w) | |
6349 width = w; | |
6350 frame_setwidth(curfrp->fr_parent, width); | |
6351 } | |
6352 else | |
6353 { | |
6354 /* | |
6355 * Row of frames: try to change only frames in this row. | |
6356 * | |
6357 * Do this twice: | |
6358 * 1: compute room available, if it's not enough try resizing the | |
6359 * containing frame. | |
6360 * 2: compute the room available and adjust the width to it. | |
6361 */ | |
6362 for (run = 1; run <= 2; ++run) | |
6363 { | |
6364 room = 0; | |
779 | 6365 room_reserved = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
6366 FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) |
7 | 6367 { |
779 | 6368 if (frp != curfrp |
6369 && frp->fr_win != NULL | |
6370 && frp->fr_win->w_p_wfw) | |
6371 room_reserved += frp->fr_width; | |
7 | 6372 room += frp->fr_width; |
6373 if (frp != curfrp) | |
6374 room -= frame_minwidth(frp, NULL); | |
6375 } | |
6376 | |
6377 if (width <= room) | |
6378 break; | |
667 | 6379 if (run == 2 || curfrp->fr_height >= ROWS_AVAIL) |
7 | 6380 { |
28169
bef82285dda0
patch 8.2.4610: some conditions are always true
Bram Moolenaar <Bram@vim.org>
parents:
28167
diff
changeset
|
6381 width = room; |
7 | 6382 break; |
6383 } | |
6384 frame_setwidth(curfrp->fr_parent, width | |
6385 + frame_minwidth(curfrp->fr_parent, NOWIN) - (int)p_wmw - 1); | |
6386 } | |
6387 | |
6388 /* | |
6389 * Compute the number of lines we will take from others frames (can be | |
6390 * negative!). | |
6391 */ | |
6392 take = width - curfrp->fr_width; | |
6393 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6394 // If there is not enough room, also reduce the width of a window |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6395 // with 'winfixwidth' set. |
779 | 6396 if (width > room - room_reserved) |
6397 room_reserved = room - width; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6398 // If there is only a 'winfixwidth' window and making the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6399 // window smaller, need to make the other window narrower. |
779 | 6400 if (take < 0 && room - curfrp->fr_width < room_reserved) |
6401 room_reserved = 0; | |
6402 | |
7 | 6403 /* |
6404 * set the current frame to the new width | |
6405 */ | |
779 | 6406 frame_new_width(curfrp, width, FALSE, FALSE); |
7 | 6407 |
6408 /* | |
6409 * First take lines from the frames right of the current frame. If | |
6410 * that is not enough, takes lines from frames left of the current | |
6411 * frame. | |
6412 */ | |
6413 for (run = 0; run < 2; ++run) | |
6414 { | |
6415 if (run == 0) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6416 frp = curfrp->fr_next; // 1st run: start with next window |
7 | 6417 else |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6418 frp = curfrp->fr_prev; // 2nd run: start with prev window |
7 | 6419 while (frp != NULL && take != 0) |
6420 { | |
6421 w = frame_minwidth(frp, NULL); | |
779 | 6422 if (room_reserved > 0 |
6423 && frp->fr_win != NULL | |
6424 && frp->fr_win->w_p_wfw) | |
7 | 6425 { |
779 | 6426 if (room_reserved >= frp->fr_width) |
6427 room_reserved -= frp->fr_width; | |
6428 else | |
6429 { | |
6430 if (frp->fr_width - room_reserved > take) | |
6431 room_reserved = frp->fr_width - take; | |
6432 take -= frp->fr_width - room_reserved; | |
6433 frame_new_width(frp, room_reserved, FALSE, FALSE); | |
6434 room_reserved = 0; | |
6435 } | |
7 | 6436 } |
6437 else | |
6438 { | |
779 | 6439 if (frp->fr_width - take < w) |
6440 { | |
6441 take -= frp->fr_width - w; | |
6442 frame_new_width(frp, w, FALSE, FALSE); | |
6443 } | |
6444 else | |
6445 { | |
6446 frame_new_width(frp, frp->fr_width - take, | |
6447 FALSE, FALSE); | |
6448 take = 0; | |
6449 } | |
7 | 6450 } |
6451 if (run == 0) | |
6452 frp = frp->fr_next; | |
6453 else | |
6454 frp = frp->fr_prev; | |
6455 } | |
6456 } | |
6457 } | |
6458 } | |
6459 | |
6460 /* | |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6461 * Check 'winminheight' for a valid value and reduce it if needed. |
7 | 6462 */ |
6463 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6464 win_setminheight(void) |
7 | 6465 { |
6466 int room; | |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6467 int needed; |
7 | 6468 int first = TRUE; |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6469 |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6470 // loop until there is a 'winminheight' that is possible |
7 | 6471 while (p_wmh > 0) |
6472 { | |
24108
0a5eba7e6660
patch 8.2.2595: setting 'winminheight' may cause 'lines' to change
Bram Moolenaar <Bram@vim.org>
parents:
24037
diff
changeset
|
6473 room = Rows - p_ch; |
30005
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6474 needed = min_rows() - 1; // 1 was added for the cmdline |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6475 if (room >= needed) |
7 | 6476 break; |
6477 --p_wmh; | |
6478 if (first) | |
6479 { | |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
6480 emsg(_(e_not_enough_room)); |
7 | 6481 first = FALSE; |
6482 } | |
6483 } | |
6484 } | |
6485 | |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6486 /* |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6487 * Check 'winminwidth' for a valid value and reduce it if needed. |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6488 */ |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6489 void |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6490 win_setminwidth(void) |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6491 { |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6492 int room; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6493 int needed; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6494 int first = TRUE; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6495 |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6496 // loop until there is a 'winminheight' that is possible |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6497 while (p_wmw > 0) |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6498 { |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6499 room = Columns; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6500 needed = frame_minwidth(topframe, NULL); |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6501 if (room >= needed) |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6502 break; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6503 --p_wmw; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6504 if (first) |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6505 { |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
6506 emsg(_(e_not_enough_room)); |
14057
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6507 first = FALSE; |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6508 } |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6509 } |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6510 } |
be8fb2fd51fc
patch 8.1.0046: loading a session file fails if 'winheight' is big
Christian Brabandt <cb@256bit.org>
parents:
14049
diff
changeset
|
6511 |
7 | 6512 /* |
6513 * Status line of dragwin is dragged "offset" lines down (negative is up). | |
6514 */ | |
6515 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6516 win_drag_status_line(win_T *dragwin, int offset) |
7 | 6517 { |
6518 frame_T *curfr; | |
6519 frame_T *fr; | |
6520 int room; | |
6521 int row; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6522 int up; // if TRUE, drag status line up, otherwise down |
7 | 6523 int n; |
6524 | |
6525 fr = dragwin->w_frame; | |
6526 curfr = fr; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6527 if (fr != topframe) // more than one window |
7 | 6528 { |
6529 fr = fr->fr_parent; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6530 // When the parent frame is not a column of frames, its parent should |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6531 // be. |
7 | 6532 if (fr->fr_layout != FR_COL) |
6533 { | |
6534 curfr = fr; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6535 if (fr != topframe) // only a row of windows, may drag statusline |
7 | 6536 fr = fr->fr_parent; |
6537 } | |
6538 } | |
6539 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6540 // If this is the last frame in a column, may want to resize the parent |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6541 // frame instead (go two up to skip a row of frames). |
7 | 6542 while (curfr != topframe && curfr->fr_next == NULL) |
6543 { | |
6544 if (fr != topframe) | |
6545 fr = fr->fr_parent; | |
6546 curfr = fr; | |
6547 if (fr != topframe) | |
6548 fr = fr->fr_parent; | |
6549 } | |
6550 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6551 if (offset < 0) // drag up |
7 | 6552 { |
6553 up = TRUE; | |
6554 offset = -offset; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6555 // sum up the room of the current frame and above it |
7 | 6556 if (fr == curfr) |
6557 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6558 // only one window |
7 | 6559 room = fr->fr_height - frame_minheight(fr, NULL); |
6560 } | |
6561 else | |
6562 { | |
6563 room = 0; | |
6564 for (fr = fr->fr_child; ; fr = fr->fr_next) | |
6565 { | |
6566 room += fr->fr_height - frame_minheight(fr, NULL); | |
6567 if (fr == curfr) | |
6568 break; | |
6569 } | |
6570 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6571 fr = curfr->fr_next; // put fr at frame that grows |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6572 } |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6573 else // drag down |
7 | 6574 { |
6575 up = FALSE; | |
6576 /* | |
6577 * Only dragging the last status line can reduce p_ch. | |
6578 */ | |
6579 room = Rows - cmdline_row; | |
30005
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6580 if (curfr->fr_next == NULL) |
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6581 --room; |
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6582 else |
7 | 6583 room -= p_ch; |
6584 if (room < 0) | |
6585 room = 0; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6586 // sum up the room of frames below of the current one |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
6587 FOR_ALL_FRAMES(fr, curfr->fr_next) |
7 | 6588 room += fr->fr_height - frame_minheight(fr, NULL); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6589 fr = curfr; // put fr at window that grows |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6590 } |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6591 |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6592 if (room < offset) // Not enough room |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6593 offset = room; // Move as far as we can |
7 | 6594 if (offset <= 0) |
6595 return; | |
6596 | |
6597 /* | |
6598 * Grow frame fr by "offset" lines. | |
6599 * Doesn't happen when dragging the last status line up. | |
6600 */ | |
6601 if (fr != NULL) | |
6602 frame_new_height(fr, fr->fr_height + offset, up, FALSE); | |
6603 | |
6604 if (up) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6605 fr = curfr; // current frame gets smaller |
7 | 6606 else |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6607 fr = curfr->fr_next; // next frame gets smaller |
7 | 6608 |
6609 /* | |
6610 * Now make the other frames smaller. | |
6611 */ | |
6612 while (fr != NULL && offset > 0) | |
6613 { | |
6614 n = frame_minheight(fr, NULL); | |
6615 if (fr->fr_height - offset <= n) | |
6616 { | |
6617 offset -= fr->fr_height - n; | |
6618 frame_new_height(fr, n, !up, FALSE); | |
6619 } | |
6620 else | |
6621 { | |
6622 frame_new_height(fr, fr->fr_height - offset, !up, FALSE); | |
6623 break; | |
6624 } | |
6625 if (up) | |
6626 fr = fr->fr_prev; | |
6627 else | |
6628 fr = fr->fr_next; | |
6629 } | |
6630 row = win_comp_pos(); | |
6631 screen_fill(row, cmdline_row, 0, (int)Columns, ' ', ' ', 0); | |
6632 cmdline_row = row; | |
30005
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6633 p_ch = MAX(Rows - cmdline_row, 1); |
824 | 6634 curtab->tp_ch_used = p_ch; |
30005
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
6635 |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6636 if (*p_spk != 'c') |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6637 win_fix_scroll(TRUE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6638 |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
6639 redraw_all_later(UPD_SOME_VALID); |
7 | 6640 showmode(); |
6641 } | |
6642 | |
6643 /* | |
6644 * Separator line of dragwin is dragged "offset" lines right (negative is left). | |
6645 */ | |
6646 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6647 win_drag_vsep_line(win_T *dragwin, int offset) |
7 | 6648 { |
6649 frame_T *curfr; | |
6650 frame_T *fr; | |
6651 int room; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6652 int left; // if TRUE, drag separator line left, otherwise right |
7 | 6653 int n; |
6654 | |
6655 fr = dragwin->w_frame; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6656 if (fr == topframe) // only one window (cannot happen?) |
7 | 6657 return; |
6658 curfr = fr; | |
6659 fr = fr->fr_parent; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6660 // When the parent frame is not a row of frames, its parent should be. |
7 | 6661 if (fr->fr_layout != FR_ROW) |
6662 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6663 if (fr == topframe) // only a column of windows (cannot happen?) |
7 | 6664 return; |
6665 curfr = fr; | |
6666 fr = fr->fr_parent; | |
6667 } | |
6668 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6669 // If this is the last frame in a row, may want to resize a parent |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6670 // frame instead. |
7 | 6671 while (curfr->fr_next == NULL) |
6672 { | |
6673 if (fr == topframe) | |
6674 break; | |
6675 curfr = fr; | |
6676 fr = fr->fr_parent; | |
6677 if (fr != topframe) | |
6678 { | |
6679 curfr = fr; | |
6680 fr = fr->fr_parent; | |
6681 } | |
6682 } | |
6683 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6684 if (offset < 0) // drag left |
7 | 6685 { |
6686 left = TRUE; | |
6687 offset = -offset; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6688 // sum up the room of the current frame and left of it |
7 | 6689 room = 0; |
6690 for (fr = fr->fr_child; ; fr = fr->fr_next) | |
6691 { | |
6692 room += fr->fr_width - frame_minwidth(fr, NULL); | |
6693 if (fr == curfr) | |
6694 break; | |
6695 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6696 fr = curfr->fr_next; // put fr at frame that grows |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6697 } |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6698 else // drag right |
7 | 6699 { |
6700 left = FALSE; | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6701 // sum up the room of frames right of the current one |
7 | 6702 room = 0; |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
6703 FOR_ALL_FRAMES(fr, curfr->fr_next) |
7 | 6704 room += fr->fr_width - frame_minwidth(fr, NULL); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6705 fr = curfr; // put fr at window that grows |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6706 } |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6707 |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6708 if (room < offset) // Not enough room |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6709 offset = room; // Move as far as we can |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6710 if (offset <= 0) // No room at all, quit. |
7 | 6711 return; |
7256
79270eaac6de
commit https://github.com/vim/vim/commit/294a7e55b01149154807a23323038784549b8946
Christian Brabandt <cb@256bit.org>
parents:
7229
diff
changeset
|
6712 if (fr == NULL) |
27440
1118a65c9bc7
patch 8.2.4248: no proper test for moving the window separator
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
6713 // This can happen when calling win_move_separator() on the rightmost |
1118a65c9bc7
patch 8.2.4248: no proper test for moving the window separator
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
6714 // window. Just don't do anything. |
30825
c7983f593fa7
patch 9.0.0747: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
6715 return; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6716 |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6717 // grow frame fr by offset lines |
779 | 6718 frame_new_width(fr, fr->fr_width + offset, left, FALSE); |
7 | 6719 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6720 // shrink other frames: current and at the left or at the right |
7 | 6721 if (left) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6722 fr = curfr; // current frame gets smaller |
7 | 6723 else |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6724 fr = curfr->fr_next; // next frame gets smaller |
7 | 6725 |
6726 while (fr != NULL && offset > 0) | |
6727 { | |
6728 n = frame_minwidth(fr, NULL); | |
6729 if (fr->fr_width - offset <= n) | |
6730 { | |
6731 offset -= fr->fr_width - n; | |
779 | 6732 frame_new_width(fr, n, !left, FALSE); |
7 | 6733 } |
6734 else | |
6735 { | |
779 | 6736 frame_new_width(fr, fr->fr_width - offset, !left, FALSE); |
7 | 6737 break; |
6738 } | |
6739 if (left) | |
6740 fr = fr->fr_prev; | |
6741 else | |
6742 fr = fr->fr_next; | |
6743 } | |
6744 (void)win_comp_pos(); | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
6745 redraw_all_later(UPD_NOT_VALID); |
7 | 6746 } |
6747 | |
2665 | 6748 #define FRACTION_MULT 16384L |
6749 | |
6750 /* | |
6751 * Set wp->w_fraction for the current w_wrow and w_height. | |
12910
d21adefd4a50
patch 8.0.1331: possible crash when window can be zero lines high
Christian Brabandt <cb@256bit.org>
parents:
12716
diff
changeset
|
6752 * Has no effect when the window is less than two lines. |
2665 | 6753 */ |
7311
743c258ca3ab
commit https://github.com/vim/vim/commit/9dc2ce398bb3456cc8f590ef0260459798b34d2a
Christian Brabandt <cb@256bit.org>
parents:
7256
diff
changeset
|
6754 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6755 set_fraction(win_T *wp) |
2665 | 6756 { |
12910
d21adefd4a50
patch 8.0.1331: possible crash when window can be zero lines high
Christian Brabandt <cb@256bit.org>
parents:
12716
diff
changeset
|
6757 if (wp->w_height > 1) |
15977
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6758 // When cursor is in the first line the percentage is computed as if |
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6759 // it's halfway that line. Thus with two lines it is 25%, with three |
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6760 // lines 17%, etc. Similarly for the last line: 75%, 83%, etc. |
12910
d21adefd4a50
patch 8.0.1331: possible crash when window can be zero lines high
Christian Brabandt <cb@256bit.org>
parents:
12716
diff
changeset
|
6761 wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT |
15977
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6762 + FRACTION_MULT / 2) / (long)wp->w_height; |
2665 | 6763 } |
6764 | |
7 | 6765 /* |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6766 * Handle scroll position for 'splitkeep'. Replaces scroll_to_fraction() |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6767 * call from win_new_height(). Instead we iterate over all windows in a |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6768 * tabpage and calculate the new scroll position. |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6769 * TODO: Ensure this also works with wrapped lines. |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6770 * Requires topline to be able to be set to a bufferline with some |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6771 * offset(row-wise scrolling/smoothscroll). |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6772 */ |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6773 static void |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6774 win_fix_scroll(int resize) |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6775 { |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6776 int diff; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6777 win_T *wp; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6778 linenr_T lnum; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6779 |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6780 skip_update_topline = TRUE; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6781 FOR_ALL_WINDOWS(wp) |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6782 { |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
6783 // Skip when window height has not changed. |
30300
b9d07900b0b8
patch 9.0.0486: text scrolled with 'nosplitscroll', autocmd win and help
Bram Moolenaar <Bram@vim.org>
parents:
30285
diff
changeset
|
6784 if (wp->w_height != wp->w_prev_height) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6785 { |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6786 // If window has moved update botline to keep the same screenlines. |
30665
fe0a18141c3c
patch 9.0.0667: ml_get error when 'splitkeep' is "screen"
Bram Moolenaar <Bram@vim.org>
parents:
30661
diff
changeset
|
6787 if (*p_spk == 's' && wp->w_winrow != wp->w_prev_winrow |
fe0a18141c3c
patch 9.0.0667: ml_get error when 'splitkeep' is "screen"
Bram Moolenaar <Bram@vim.org>
parents:
30661
diff
changeset
|
6788 && wp->w_botline - 1 <= wp->w_buffer->b_ml.ml_line_count) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6789 { |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6790 lnum = wp->w_cursor.lnum; |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6791 diff = (wp->w_winrow - wp->w_prev_winrow) |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6792 + (wp->w_height - wp->w_prev_height); |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6793 wp->w_cursor.lnum = wp->w_botline - 1; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6794 // Add difference in height and row to botline. |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6795 if (diff > 0) |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6796 cursor_down_inner(wp, diff); |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6797 else |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6798 cursor_up_inner(wp, -diff); |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6799 // Bring the new cursor position to the bottom of the screen. |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6800 wp->w_fraction = FRACTION_MULT; |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6801 scroll_to_fraction(wp, wp->w_prev_height); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6802 wp->w_cursor.lnum = lnum; |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6803 } |
30439
e3091fc473a1
patch 9.0.0555: scrolling with 'nosplitscroll' in callback changing curwin
Bram Moolenaar <Bram@vim.org>
parents:
30429
diff
changeset
|
6804 else if (wp == curwin) |
e3091fc473a1
patch 9.0.0555: scrolling with 'nosplitscroll' in callback changing curwin
Bram Moolenaar <Bram@vim.org>
parents:
30429
diff
changeset
|
6805 wp->w_valid &= ~VALID_CROW; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6806 invalidate_botline_win(wp); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6807 validate_botline_win(wp); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6808 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6809 wp->w_prev_height = wp->w_height; |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6810 wp->w_prev_winrow = wp->w_winrow; |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6811 } |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
6812 skip_update_topline = FALSE; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6813 // Ensure cursor is valid when not in normal mode or when resized. |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
6814 if (!(get_real_state() & (MODE_NORMAL|MODE_CMDLINE|MODE_TERMINAL))) |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6815 win_fix_cursor(FALSE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6816 else if (resize) |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6817 win_fix_cursor(TRUE); |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6818 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6819 |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6820 /* |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6821 * Make sure the cursor position is valid for 'splitkeep'. |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6822 * If it is not, put the cursor position in the jumplist and move it. |
31960
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
6823 * If we are not in normal mode ("normal" is zero), make it valid by scrolling |
9460e6b656ca
patch 9.0.1312: Cursor position wrong when splitting window in insert mode
Bram Moolenaar <Bram@vim.org>
parents:
31827
diff
changeset
|
6824 * instead. |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6825 */ |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6826 static void |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6827 win_fix_cursor(int normal) |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6828 { |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6829 long so = get_scrolloff_value(); |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6830 win_T *wp = curwin; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6831 linenr_T nlnum = 0; |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6832 linenr_T lnum = wp->w_cursor.lnum; |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6833 linenr_T bot; |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6834 linenr_T top; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6835 |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6836 if (wp->w_buffer->b_ml.ml_line_count < wp->w_height) |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6837 return; |
30267
be97adfeac3a
patch 9.0.0469: cursor moves if cmdwin is closed when 'splitscroll' is off
Bram Moolenaar <Bram@vim.org>
parents:
30251
diff
changeset
|
6838 if (skip_win_fix_cursor) |
be97adfeac3a
patch 9.0.0469: cursor moves if cmdwin is closed when 'splitscroll' is off
Bram Moolenaar <Bram@vim.org>
parents:
30251
diff
changeset
|
6839 return; |
30645
101f08b49ed3
patch 9.0.0657: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30624
diff
changeset
|
6840 |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6841 // Determine valid cursor range. |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6842 so = MIN(wp->w_height / 2, so); |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6843 wp->w_cursor.lnum = wp->w_topline; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6844 top = cursor_down_inner(wp, so); |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6845 wp->w_cursor.lnum = wp->w_botline - 1; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6846 bot = cursor_up_inner(wp, so); |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6847 wp->w_cursor.lnum = lnum; |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6848 // Check if cursor position is above or below valid cursor range. |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6849 if (lnum > bot && (wp->w_botline - wp->w_buffer->b_ml.ml_line_count) != 1) |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6850 nlnum = bot; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6851 else if (lnum < top && wp->w_topline != 1) |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6852 nlnum = (so == wp->w_height / 2) ? bot : top; |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6853 |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6854 if (nlnum) // Cursor is invalid for current scroll position. |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6855 { |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6856 if (normal) // Save to jumplist and set cursor to avoid scrolling. |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6857 { |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6858 setmark('\''); |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6859 wp->w_cursor.lnum = nlnum; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6860 } |
30535
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6861 else // Scroll instead when not in normal mode. |
04df44c52d65
patch 9.0.0603: with 'nosplitscroll' folds are not handled correctly
Bram Moolenaar <Bram@vim.org>
parents:
30525
diff
changeset
|
6862 { |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6863 wp->w_fraction = (nlnum == bot) ? FRACTION_MULT : 0; |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6864 scroll_to_fraction(wp, wp->w_prev_height); |
30339
b5f67135fcb6
patch 9.0.0505: various problems with 'nosplitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30300
diff
changeset
|
6865 validate_botline_win(curwin); |
30219
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6866 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6867 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6868 } |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6869 |
bc8ad1c28b51
patch 9.0.0445: when opening/closing window text moves up/down
Bram Moolenaar <Bram@vim.org>
parents:
30134
diff
changeset
|
6870 /* |
7 | 6871 * Set the height of a window. |
12487
3f16cf18386c
patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
6872 * "height" excludes any window toolbar. |
7 | 6873 * This takes care of the things inside the window, not what happens to the |
6874 * window position, the frame or to other windows. | |
6875 */ | |
3697 | 6876 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
6877 win_new_height(win_T *wp, int height) |
7 | 6878 { |
5875 | 6879 int prev_height = wp->w_height; |
7 | 6880 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6881 // Don't want a negative height. Happens when splitting a tiny window. |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6882 // Will equalize heights soon to fix it. |
7 | 6883 if (height < 0) |
6884 height = 0; | |
826 | 6885 if (wp->w_height == height) |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6886 return; // nothing to do |
7 | 6887 |
5875 | 6888 if (wp->w_height > 0) |
6889 { | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6890 if (wp == curwin && *p_spk == 'c') |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6891 // w_wrow needs to be valid. When setting 'laststatus' this may |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6892 // call win_new_height() recursively. |
5969 | 6893 validate_cursor(); |
6894 if (wp->w_height != prev_height) | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6895 return; // Recursive call already changed the size, bail out here |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6896 // to avoid the following to mess things up. |
5875 | 6897 if (wp->w_wrow != wp->w_prev_fraction_row) |
6898 set_fraction(wp); | |
6899 } | |
7 | 6900 |
6901 wp->w_height = height; | |
31261
a9040128bc3b
patch 9.0.0964: status line not redrawn when 'splitkeep' is "screen"
Bram Moolenaar <Bram@vim.org>
parents:
31227
diff
changeset
|
6902 wp->w_redr_status = TRUE; |
30892
d5ad2e07a18f
patch 9.0.0780: 'scroll' value computed in unexpected location
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
6903 win_comp_scroll(wp); |
7 | 6904 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6905 // There is no point in adjusting the scroll position when exiting. Some |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6906 // values might be invalid. |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
6907 if (!exiting && *p_spk == 'c') |
32363
c114eebb5268
patch 9.0.1513: text scrolls unnecessarily when splitting
Bram Moolenaar <Bram@vim.org>
parents:
32319
diff
changeset
|
6908 { |
c114eebb5268
patch 9.0.1513: text scrolls unnecessarily when splitting
Bram Moolenaar <Bram@vim.org>
parents:
32319
diff
changeset
|
6909 wp->w_skipcol = 0; |
10835
c9da7f9137af
patch 8.0.0307: asan detects a memory error when EXITFREE is defined
Christian Brabandt <cb@256bit.org>
parents:
10377
diff
changeset
|
6910 scroll_to_fraction(wp, prev_height); |
32363
c114eebb5268
patch 9.0.1513: text scrolls unnecessarily when splitting
Bram Moolenaar <Bram@vim.org>
parents:
32319
diff
changeset
|
6911 } |
10013
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6912 } |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6913 |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6914 void |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6915 scroll_to_fraction(win_T *wp, int prev_height) |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6916 { |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6917 linenr_T lnum; |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6918 int sline, line_size; |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6919 int height = wp->w_height; |
942d40a92be6
commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028
Christian Brabandt <cb@256bit.org>
parents:
9953
diff
changeset
|
6920 |
16650
06fd0eaada01
patch 8.1.1327: unnecessary scroll after horizontal split
Bram Moolenaar <Bram@vim.org>
parents:
16477
diff
changeset
|
6921 // Don't change w_topline in any of these cases: |
06fd0eaada01
patch 8.1.1327: unnecessary scroll after horizontal split
Bram Moolenaar <Bram@vim.org>
parents:
16477
diff
changeset
|
6922 // - window height is 0 |
06fd0eaada01
patch 8.1.1327: unnecessary scroll after horizontal split
Bram Moolenaar <Bram@vim.org>
parents:
16477
diff
changeset
|
6923 // - 'scrollbind' is set and this isn't the current window |
16690
4e3c4e8e465c
patch 8.1.1347: fractional scroll position not restored after closing window
Bram Moolenaar <Bram@vim.org>
parents:
16650
diff
changeset
|
6924 // - window height is sufficient to display the whole buffer and first line |
4e3c4e8e465c
patch 8.1.1347: fractional scroll position not restored after closing window
Bram Moolenaar <Bram@vim.org>
parents:
16650
diff
changeset
|
6925 // is visible. |
16650
06fd0eaada01
patch 8.1.1327: unnecessary scroll after horizontal split
Bram Moolenaar <Bram@vim.org>
parents:
16477
diff
changeset
|
6926 if (height > 0 |
28809
d0241e74bfdb
patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
6927 && (!wp->w_p_scb || wp == curwin) |
d0241e74bfdb
patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
6928 && (height < wp->w_buffer->b_ml.ml_line_count || wp->w_topline > 1)) |
7 | 6929 { |
47 | 6930 /* |
6931 * Find a value for w_topline that shows the cursor at the same | |
6932 * relative position in the window as before (more or less). | |
6933 */ | |
7 | 6934 lnum = wp->w_cursor.lnum; |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6935 if (lnum < 1) // can happen when starting up |
7 | 6936 lnum = 1; |
15977
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6937 wp->w_wrow = ((long)wp->w_fraction * (long)height - 1L) |
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
6938 / FRACTION_MULT; |
7 | 6939 line_size = plines_win_col(wp, lnum, (long)(wp->w_cursor.col)) - 1; |
6940 sline = wp->w_wrow - line_size; | |
1023 | 6941 |
6942 if (sline >= 0) | |
6943 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6944 // Make sure the whole cursor line is visible, if possible. |
1023 | 6945 int rows = plines_win(wp, lnum, FALSE); |
6946 | |
6947 if (sline > wp->w_height - rows) | |
6948 { | |
6949 sline = wp->w_height - rows; | |
6950 wp->w_wrow -= rows - line_size; | |
6951 } | |
6952 } | |
6953 | |
7 | 6954 if (sline < 0) |
6955 { | |
6956 /* | |
6957 * Cursor line would go off top of screen if w_wrow was this high. | |
1023 | 6958 * Make cursor line the first line in the window. If not enough |
6959 * room use w_skipcol; | |
7 | 6960 */ |
6961 wp->w_wrow = line_size; | |
1023 | 6962 if (wp->w_wrow >= wp->w_height |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12513
diff
changeset
|
6963 && (wp->w_width - win_col_off(wp)) > 0) |
1023 | 6964 { |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12513
diff
changeset
|
6965 wp->w_skipcol += wp->w_width - win_col_off(wp); |
1023 | 6966 --wp->w_wrow; |
6967 while (wp->w_wrow >= wp->w_height) | |
6968 { | |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12513
diff
changeset
|
6969 wp->w_skipcol += wp->w_width - win_col_off(wp) |
1023 | 6970 + win_col_off2(wp); |
6971 --wp->w_wrow; | |
6972 } | |
6973 } | |
7 | 6974 } |
5936 | 6975 else if (sline > 0) |
7 | 6976 { |
1023 | 6977 while (sline > 0 && lnum > 1) |
7 | 6978 { |
6979 #ifdef FEAT_FOLDING | |
6980 hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL); | |
6981 if (lnum == 1) | |
6982 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
6983 // first line in buffer is folded |
7 | 6984 line_size = 1; |
6985 --sline; | |
6986 break; | |
6987 } | |
6988 #endif | |
6989 --lnum; | |
6990 #ifdef FEAT_DIFF | |
6991 if (lnum == wp->w_topline) | |
6992 line_size = plines_win_nofill(wp, lnum, TRUE) | |
6993 + wp->w_topfill; | |
6994 else | |
6995 #endif | |
6996 line_size = plines_win(wp, lnum, TRUE); | |
6997 sline -= line_size; | |
6998 } | |
47 | 6999 |
7 | 7000 if (sline < 0) |
7001 { | |
7002 /* | |
7003 * Line we want at top would go off top of screen. Use next | |
7004 * line instead. | |
7005 */ | |
7006 #ifdef FEAT_FOLDING | |
7007 hasFoldingWin(wp, lnum, NULL, &lnum, TRUE, NULL); | |
7008 #endif | |
7009 lnum++; | |
7010 wp->w_wrow -= line_size + sline; | |
7011 } | |
5936 | 7012 else if (sline > 0) |
7 | 7013 { |
15977
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
7014 // First line of file reached, use that as topline. |
7 | 7015 lnum = 1; |
7016 wp->w_wrow -= sline; | |
7017 } | |
7018 } | |
15977
7fbdceabad64
patch 8.1.0994: relative cursor position is not calculated correctly
Bram Moolenaar <Bram@vim.org>
parents:
15937
diff
changeset
|
7019 set_topline(wp, lnum); |
7 | 7020 } |
7021 | |
7022 if (wp == curwin) | |
7023 { | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7024 if (get_scrolloff_value()) |
7 | 7025 update_topline(); |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7026 curs_columns(FALSE); // validate w_wrow |
7 | 7027 } |
5875 | 7028 if (prev_height > 0) |
7029 wp->w_prev_fraction_row = wp->w_wrow; | |
7 | 7030 |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
7031 redraw_win_later(wp, UPD_SOME_VALID); |
7 | 7032 invalidate_botline_win(wp); |
7033 } | |
7034 | |
7035 /* | |
7036 * Set the width of a window. | |
7037 */ | |
3697 | 7038 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7039 win_new_width(win_T *wp, int width) |
7 | 7040 { |
30525
6fa498af368d
patch 9.0.0598: using negative array index with negative width window
Bram Moolenaar <Bram@vim.org>
parents:
30439
diff
changeset
|
7041 // Should we give an error if width < 0? |
6fa498af368d
patch 9.0.0598: using negative array index with negative width window
Bram Moolenaar <Bram@vim.org>
parents:
30439
diff
changeset
|
7042 wp->w_width = width < 0 ? 0 : width; |
7 | 7043 wp->w_lines_valid = 0; |
7044 changed_line_abv_curs_win(wp); | |
30624
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7045 invalidate_botline_win(wp); |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7046 if (wp == curwin) |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7047 { |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7048 skip_update_topline = (*p_spk != 'c'); |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7049 update_topline(); |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7050 curs_columns(TRUE); // validate w_wrow |
f2f35161d75a
patch 9.0.0647: the 'splitscroll' option is not a good name
Bram Moolenaar <Bram@vim.org>
parents:
30574
diff
changeset
|
7051 skip_update_topline = FALSE; |
7 | 7052 } |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
7053 redraw_win_later(wp, UPD_NOT_VALID); |
7 | 7054 wp->w_redr_status = TRUE; |
7055 } | |
7056 | |
7057 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7058 win_comp_scroll(win_T *wp) |
7 | 7059 { |
23386
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7060 #if defined(FEAT_EVAL) |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7061 int old_w_p_scr = wp->w_p_scr; |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7062 #endif |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7063 |
7 | 7064 wp->w_p_scr = ((unsigned)wp->w_height >> 1); |
7065 if (wp->w_p_scr == 0) | |
7066 wp->w_p_scr = 1; | |
23386
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7067 #if defined(FEAT_EVAL) |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7068 if (wp->w_p_scr != old_w_p_scr) |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7069 { |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7070 // Used by "verbose set scroll". |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7071 wp->w_p_script_ctx[WV_SCROLL].sc_sid = SID_WINLAYOUT; |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7072 wp->w_p_script_ctx[WV_SCROLL].sc_lnum = 0; |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7073 } |
3105546b941f
patch 8.2.2236: 'scroll' option can change when setting the statusline
Bram Moolenaar <Bram@vim.org>
parents:
22900
diff
changeset
|
7074 #endif |
7 | 7075 } |
7076 | |
7077 /* | |
30661
57ebc2a4d2ca
patch 9.0.0665: setting 'cmdheight' has no effect if last window was resized
Bram Moolenaar <Bram@vim.org>
parents:
30645
diff
changeset
|
7078 * Command_height: called whenever p_ch has been changed. |
7 | 7079 */ |
7080 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7081 command_height(void) |
7 | 7082 { |
7083 int h; | |
7084 frame_T *frp; | |
824 | 7085 int old_p_ch = curtab->tp_ch_used; |
7086 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7087 // Use the value of p_ch that we remembered. This is needed for when the |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7088 // GUI starts up, we can't be sure in what order things happen. And when |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7089 // p_ch was changed in another tab page. |
824 | 7090 curtab->tp_ch_used = p_ch; |
170 | 7091 |
29700
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
7092 // If the space for the command line is already more than 'cmdheight' there |
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
7093 // is nothing to do (window size must have decreased). |
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
7094 if (p_ch > old_p_ch && cmdline_row <= Rows - p_ch) |
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
7095 return; |
cc0f638f5f6b
patch 9.0.0190: the way 'cmdheight' can be made zero is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
29694
diff
changeset
|
7096 |
30661
57ebc2a4d2ca
patch 9.0.0665: setting 'cmdheight' has no effect if last window was resized
Bram Moolenaar <Bram@vim.org>
parents:
30645
diff
changeset
|
7097 // Update cmdline_row to what it should be: just below the last window. |
30671
15ac28c12c8f
patch 9.0.0670: no space for command line when there is a tabline
Bram Moolenaar <Bram@vim.org>
parents:
30665
diff
changeset
|
7098 cmdline_row = topframe->fr_height + tabline_height(); |
30661
57ebc2a4d2ca
patch 9.0.0665: setting 'cmdheight' has no effect if last window was resized
Bram Moolenaar <Bram@vim.org>
parents:
30645
diff
changeset
|
7099 |
29702
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7100 // If cmdline_row is smaller than what it is supposed to be for 'cmdheight' |
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7101 // then set old_p_ch to what it would be, so that the windows get resized |
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7102 // properly for the new value. |
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7103 if (cmdline_row < Rows - p_ch) |
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7104 old_p_ch = Rows - cmdline_row; |
c43738957bee
patch 9.0.0191: messages test fails; window size incorrect
Bram Moolenaar <Bram@vim.org>
parents:
29700
diff
changeset
|
7105 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7106 // Find bottom frame with width of screen. |
7 | 7107 frp = lastwin->w_frame; |
7108 while (frp->fr_width != Columns && frp->fr_parent != NULL) | |
7109 frp = frp->fr_parent; | |
7110 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7111 // Avoid changing the height of a window with 'winfixheight' set. |
7 | 7112 while (frp->fr_prev != NULL && frp->fr_layout == FR_LEAF |
7113 && frp->fr_win->w_p_wfh) | |
7114 frp = frp->fr_prev; | |
7115 | |
7116 if (starting != NO_SCREEN) | |
7117 { | |
7118 cmdline_row = Rows - p_ch; | |
7119 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7120 if (p_ch > old_p_ch) // p_ch got bigger |
7 | 7121 { |
7122 while (p_ch > old_p_ch) | |
7123 { | |
7124 if (frp == NULL) | |
7125 { | |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
7126 emsg(_(e_not_enough_room)); |
7 | 7127 p_ch = old_p_ch; |
1404 | 7128 curtab->tp_ch_used = p_ch; |
7 | 7129 cmdline_row = Rows - p_ch; |
7130 break; | |
7131 } | |
7132 h = frp->fr_height - frame_minheight(frp, NULL); | |
7133 if (h > p_ch - old_p_ch) | |
7134 h = p_ch - old_p_ch; | |
7135 old_p_ch += h; | |
7136 frame_add_height(frp, -h); | |
7137 frp = frp->fr_prev; | |
7138 } | |
7139 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7140 // Recompute window positions. |
7 | 7141 (void)win_comp_pos(); |
7142 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7143 // clear the lines added to cmdline |
7 | 7144 if (full_screen) |
27426
41e0dcf38521
patch 8.2.4241: some type casts are redundant
Bram Moolenaar <Bram@vim.org>
parents:
27251
diff
changeset
|
7145 screen_fill(cmdline_row, (int)Rows, 0, |
7 | 7146 (int)Columns, ' ', ' ', 0); |
7147 msg_row = cmdline_row; | |
7148 redraw_cmdline = TRUE; | |
7149 return; | |
7150 } | |
7151 | |
7152 if (msg_row < cmdline_row) | |
7153 msg_row = cmdline_row; | |
7154 redraw_cmdline = TRUE; | |
7155 } | |
7156 frame_add_height(frp, (int)(old_p_ch - p_ch)); | |
7157 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7158 // Recompute window positions. |
7 | 7159 if (frp != lastwin->w_frame) |
7160 (void)win_comp_pos(); | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7161 } |
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7162 |
7 | 7163 /* |
7164 * Resize frame "frp" to be "n" lines higher (negative for less high). | |
7165 * Also resize the frames it is contained in. | |
7166 */ | |
7167 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7168 frame_add_height(frame_T *frp, int n) |
7 | 7169 { |
7170 frame_new_height(frp, frp->fr_height + n, FALSE, FALSE); | |
7171 for (;;) | |
7172 { | |
7173 frp = frp->fr_parent; | |
7174 if (frp == NULL) | |
7175 break; | |
7176 frp->fr_height += n; | |
7177 } | |
7178 } | |
7179 | |
7180 /* | |
7181 * Add or remove a status line for the bottom window(s), according to the | |
7182 * value of 'laststatus'. | |
7183 */ | |
7184 void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7185 last_status( |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7186 int morewin) // pretend there are two or more windows |
7 | 7187 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7188 // Don't make a difference between horizontal or vertical split. |
7 | 7189 last_status_rec(topframe, (p_ls == 2 |
10357
59d01e335858
commit https://github.com/vim/vim/commit/459ca563128f2edb7e3bb190090bbb755a56dd55
Christian Brabandt <cb@256bit.org>
parents:
10349
diff
changeset
|
7190 || (p_ls == 1 && (morewin || !ONE_WINDOW)))); |
7 | 7191 } |
7192 | |
7193 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7194 last_status_rec(frame_T *fr, int statusline) |
7 | 7195 { |
7196 frame_T *fp; | |
7197 win_T *wp; | |
7198 | |
7199 if (fr->fr_layout == FR_LEAF) | |
7200 { | |
7201 wp = fr->fr_win; | |
7202 if (wp->w_status_height != 0 && !statusline) | |
7203 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7204 // remove status line |
7 | 7205 win_new_height(wp, wp->w_height + 1); |
7206 wp->w_status_height = 0; | |
7207 comp_col(); | |
7208 } | |
7209 else if (wp->w_status_height == 0 && statusline) | |
7210 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7211 // Find a frame to take a line from. |
7 | 7212 fp = fr; |
7213 while (fp->fr_height <= frame_minheight(fp, NULL)) | |
7214 { | |
7215 if (fp == topframe) | |
7216 { | |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25157
diff
changeset
|
7217 emsg(_(e_not_enough_room)); |
7 | 7218 return; |
7219 } | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7220 // In a column of frames: go to frame above. If already at |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7221 // the top or in a row of frames: go to parent. |
7 | 7222 if (fp->fr_parent->fr_layout == FR_COL && fp->fr_prev != NULL) |
7223 fp = fp->fr_prev; | |
7224 else | |
7225 fp = fp->fr_parent; | |
7226 } | |
7227 wp->w_status_height = 1; | |
7228 if (fp != fr) | |
7229 { | |
7230 frame_new_height(fp, fp->fr_height - 1, FALSE, FALSE); | |
7231 frame_fix_height(wp); | |
7232 (void)win_comp_pos(); | |
7233 } | |
7234 else | |
7235 win_new_height(wp, wp->w_height - 1); | |
7236 comp_col(); | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
7237 redraw_all_later(UPD_SOME_VALID); |
7 | 7238 } |
30239
91ecee475811
patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30219
diff
changeset
|
7239 // Set prev_height when difference is due to 'laststatus'. |
91ecee475811
patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30219
diff
changeset
|
7240 if (abs(wp->w_height - wp->w_prev_height) == 1) |
91ecee475811
patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30219
diff
changeset
|
7241 wp->w_prev_height = wp->w_height; |
7 | 7242 } |
7243 else if (fr->fr_layout == FR_ROW) | |
7244 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7245 // vertically split windows, set status line for each one |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
7246 FOR_ALL_FRAMES(fp, fr->fr_child) |
7 | 7247 last_status_rec(fp, statusline); |
7248 } | |
7249 else | |
7250 { | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7251 // horizontally split window, set status line for last one |
7 | 7252 for (fp = fr->fr_child; fp->fr_next != NULL; fp = fp->fr_next) |
7253 ; | |
7254 last_status_rec(fp, statusline); | |
7255 } | |
7256 } | |
7257 | |
667 | 7258 /* |
668 | 7259 * Return the number of lines used by the tab page line. |
667 | 7260 */ |
7261 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7262 tabline_height(void) |
667 | 7263 { |
685 | 7264 #ifdef FEAT_GUI_TABLINE |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7265 // When the GUI has the tabline then this always returns zero. |
685 | 7266 if (gui_use_tabline()) |
7267 return 0; | |
7268 #endif | |
675 | 7269 switch (p_stal) |
668 | 7270 { |
7271 case 0: return 0; | |
7272 case 1: return (first_tabpage->tp_next == NULL) ? 0 : 1; | |
7273 } | |
667 | 7274 return 1; |
7275 } | |
7276 | |
7 | 7277 /* |
7278 * Return the minimal number of rows that is needed on the screen to display | |
7279 * the current number of windows. | |
7280 */ | |
7281 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7282 min_rows(void) |
7 | 7283 { |
7284 int total; | |
671 | 7285 tabpage_T *tp; |
7286 int n; | |
7 | 7287 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7288 if (firstwin == NULL) // not initialized yet |
7 | 7289 return MIN_LINES; |
7290 | |
671 | 7291 total = 0; |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
7292 FOR_ALL_TABPAGES(tp) |
671 | 7293 { |
7294 n = frame_minheight(tp->tp_topframe, NULL); | |
7295 if (total < n) | |
7296 total = n; | |
7297 } | |
685 | 7298 total += tabline_height(); |
30005
bb0e525e1393
patch 9.0.0340: the 'cmdheight' zero support causes too much trouble
Bram Moolenaar <Bram@vim.org>
parents:
29976
diff
changeset
|
7299 total += 1; // count the room for the command line |
7 | 7300 return total; |
7301 } | |
7302 | |
7303 /* | |
18467
99fc29219b3e
patch 8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
7304 * Return TRUE if there is only one window and only one tab page, not |
672 | 7305 * counting a help or preview window, unless it is the current window. |
16778
eda4d65f232c
patch 8.1.1391: no popup window support
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
7306 * Does not count unlisted windows. |
7 | 7307 */ |
7308 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7309 only_one_window(void) |
7 | 7310 { |
7311 int count = 0; | |
7312 win_T *wp; | |
7313 | |
19275
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7314 #if defined(FEAT_PROP_POPUP) |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7315 // If the current window is a popup then there always is another window. |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7316 if (popup_is_popup(curwin)) |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7317 return FALSE; |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7318 #endif |
2142fb624658
patch 8.2.0196: blocking commands for a finished job in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
19271
diff
changeset
|
7319 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7320 // If there is another tab page there always is another window. |
667 | 7321 if (first_tabpage->tp_next != NULL) |
7322 return FALSE; | |
7323 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9599
diff
changeset
|
7324 FOR_ALL_WINDOWS(wp) |
4021 | 7325 if (wp->w_buffer != NULL |
11800
5ceaecedbad2
patch 8.0.0782: using freed memory in quickfix code
Christian Brabandt <cb@256bit.org>
parents:
11593
diff
changeset
|
7326 && (!((bt_help(wp->w_buffer) && !bt_help(curbuf)) |
7 | 7327 # ifdef FEAT_QUICKFIX |
7328 || wp->w_p_pvw | |
7329 # endif | |
31263
d8e7d725a666
patch 9.0.0965: using one window for executing autocommands is insufficient
Bram Moolenaar <Bram@vim.org>
parents:
31261
diff
changeset
|
7330 ) || wp == curwin) && !is_aucmd_win(wp)) |
7 | 7331 ++count; |
7332 return (count <= 1); | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7333 } |
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7334 |
7 | 7335 /* |
29438
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7336 * Implementation of check_lnums() and check_lnums_nested(). |
7 | 7337 */ |
29438
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7338 static void |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7339 check_lnums_both(int do_curwin, int nested) |
7 | 7340 { |
7341 win_T *wp; | |
671 | 7342 tabpage_T *tp; |
7343 | |
7344 FOR_ALL_TAB_WINDOWS(tp, wp) | |
7 | 7345 if ((do_curwin || wp != curwin) && wp->w_buffer == curbuf) |
7346 { | |
29505
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7347 int need_adjust; |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7348 |
29438
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7349 if (!nested) |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7350 { |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7351 // save the original cursor position and topline |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7352 wp->w_save_cursor.w_cursor_save = wp->w_cursor; |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7353 wp->w_save_cursor.w_topline_save = wp->w_topline; |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7354 } |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7355 |
29505
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7356 need_adjust = wp->w_cursor.lnum > curbuf->b_ml.ml_line_count; |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7357 if (need_adjust) |
7 | 7358 wp->w_cursor.lnum = curbuf->b_ml.ml_line_count; |
29505
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7359 if (need_adjust || !nested) |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7360 // save the (corrected) cursor position |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7361 wp->w_save_cursor.w_cursor_corr = wp->w_cursor; |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7362 |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7363 need_adjust = wp->w_topline > curbuf->b_ml.ml_line_count; |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7364 if (need_adjust) |
7 | 7365 wp->w_topline = curbuf->b_ml.ml_line_count; |
29505
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7366 if (need_adjust || !nested) |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7367 // save the (corrected) topline |
33983b2f030f
patch 9.0.0094: cursor restored unexpected with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29471
diff
changeset
|
7368 wp->w_save_cursor.w_topline_corr = wp->w_topline; |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7369 } |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7370 } |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7371 |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7372 /* |
29438
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7373 * Correct the cursor line number in other windows. Used after changing the |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7374 * current buffer, and before applying autocommands. |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7375 * When "do_curwin" is TRUE, also check current window. |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7376 */ |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7377 void |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7378 check_lnums(int do_curwin) |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7379 { |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7380 check_lnums_both(do_curwin, FALSE); |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7381 } |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7382 |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7383 /* |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7384 * Like check_lnums() but for when check_lnums() was already called. |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7385 */ |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7386 void |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7387 check_lnums_nested(int do_curwin) |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7388 { |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7389 check_lnums_both(do_curwin, TRUE); |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7390 } |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7391 |
87da4bab5aaa
patch 9.0.0061: ml_get error with nested autocommand
Bram Moolenaar <Bram@vim.org>
parents:
29348
diff
changeset
|
7392 /* |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7393 * Reset cursor and topline to its stored values from check_lnums(). |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7394 * check_lnums() must have been called first! |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7395 */ |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7396 void |
32009
4545f58c8490
patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents:
31960
diff
changeset
|
7397 reset_lnums(void) |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7398 { |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7399 win_T *wp; |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7400 tabpage_T *tp; |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7401 |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7402 FOR_ALL_TAB_WINDOWS(tp, wp) |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7403 if (wp->w_buffer == curbuf) |
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7404 { |
29471
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7405 // Restore the value if the autocommand didn't change it and it was |
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7406 // set. |
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7407 if (EQUAL_POS(wp->w_save_cursor.w_cursor_corr, wp->w_cursor) |
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7408 && wp->w_save_cursor.w_cursor_save.lnum != 0) |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7409 wp->w_cursor = wp->w_save_cursor.w_cursor_save; |
29471
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7410 if (wp->w_save_cursor.w_topline_corr == wp->w_topline |
9ada26920941
patch 9.0.0077: wrong restored cursor position when switching window in autocmd
Bram Moolenaar <Bram@vim.org>
parents:
29438
diff
changeset
|
7411 && wp->w_save_cursor.w_topline_save != 0) |
16401
3b2db762a509
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
Bram Moolenaar <Bram@vim.org>
parents:
16354
diff
changeset
|
7412 wp->w_topline = wp->w_save_cursor.w_topline_save; |
7 | 7413 } |
7414 } | |
7415 | |
7416 /* | |
7417 * A snapshot of the window sizes, to restore them after closing the help | |
32118
04d9dff67d99
patch 9.0.1390: FOR_ALL_ macros are defined in an unexpected file
Bram Moolenaar <Bram@vim.org>
parents:
32062
diff
changeset
|
7418 * or other window. |
7 | 7419 * Only these fields are used: |
7420 * fr_layout | |
7421 * fr_width | |
7422 * fr_height | |
7423 * fr_next | |
7424 * fr_child | |
7425 * fr_win (only valid for the old curwin, NULL otherwise) | |
7426 */ | |
7427 | |
7428 /* | |
7429 * Create a snapshot of the current frame sizes. | |
32118
04d9dff67d99
patch 9.0.1390: FOR_ALL_ macros are defined in an unexpected file
Bram Moolenaar <Bram@vim.org>
parents:
32062
diff
changeset
|
7430 * "idx" is SNAP_HELP_IDX or SNAP_AUCMD_IDX. |
7 | 7431 */ |
1906 | 7432 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7433 make_snapshot(int idx) |
7 | 7434 { |
1906 | 7435 clear_snapshot(curtab, idx); |
7436 make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]); | |
7 | 7437 } |
7438 | |
7439 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7440 make_snapshot_rec(frame_T *fr, frame_T **frp) |
7 | 7441 { |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16802
diff
changeset
|
7442 *frp = ALLOC_CLEAR_ONE(frame_T); |
7 | 7443 if (*frp == NULL) |
7444 return; | |
7445 (*frp)->fr_layout = fr->fr_layout; | |
7446 (*frp)->fr_width = fr->fr_width; | |
7447 (*frp)->fr_height = fr->fr_height; | |
7448 if (fr->fr_next != NULL) | |
7449 make_snapshot_rec(fr->fr_next, &((*frp)->fr_next)); | |
7450 if (fr->fr_child != NULL) | |
7451 make_snapshot_rec(fr->fr_child, &((*frp)->fr_child)); | |
7452 if (fr->fr_layout == FR_LEAF && fr->fr_win == curwin) | |
7453 (*frp)->fr_win = curwin; | |
7454 } | |
7455 | |
7456 /* | |
7457 * Remove any existing snapshot. | |
7458 */ | |
7459 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7460 clear_snapshot(tabpage_T *tp, int idx) |
7 | 7461 { |
1906 | 7462 clear_snapshot_rec(tp->tp_snapshot[idx]); |
7463 tp->tp_snapshot[idx] = NULL; | |
7 | 7464 } |
7465 | |
7466 static void | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7467 clear_snapshot_rec(frame_T *fr) |
7 | 7468 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
7469 if (fr == NULL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
7470 return; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
7471 clear_snapshot_rec(fr->fr_next); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
7472 clear_snapshot_rec(fr->fr_child); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31437
diff
changeset
|
7473 vim_free(fr); |
7 | 7474 } |
7475 | |
7476 /* | |
28688
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7477 * Traverse a snapshot to find the previous curwin. |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7478 */ |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7479 static win_T * |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7480 get_snapshot_curwin_rec(frame_T *ft) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7481 { |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7482 win_T *wp; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7483 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7484 if (ft->fr_next != NULL) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7485 { |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7486 if ((wp = get_snapshot_curwin_rec(ft->fr_next)) != NULL) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7487 return wp; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7488 } |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7489 if (ft->fr_child != NULL) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7490 { |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7491 if ((wp = get_snapshot_curwin_rec(ft->fr_child)) != NULL) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7492 return wp; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7493 } |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7494 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7495 return ft->fr_win; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7496 } |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7497 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7498 /* |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7499 * Return the current window stored in the snapshot or NULL. |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7500 */ |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7501 static win_T * |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7502 get_snapshot_curwin(int idx) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7503 { |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7504 if (curtab->tp_snapshot[idx] == NULL) |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7505 return NULL; |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7506 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7507 return get_snapshot_curwin_rec(curtab->tp_snapshot[idx]); |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7508 } |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7509 |
264fa41e6704
patch 8.2.4868: when closing help window autocmds triggered for wrong window
Bram Moolenaar <Bram@vim.org>
parents:
28429
diff
changeset
|
7510 /* |
7 | 7511 * Restore a previously created snapshot, if there is any. |
7512 * This is only done if the screen size didn't change and the window layout is | |
7513 * still the same. | |
32118
04d9dff67d99
patch 9.0.1390: FOR_ALL_ macros are defined in an unexpected file
Bram Moolenaar <Bram@vim.org>
parents:
32062
diff
changeset
|
7514 * "idx" is SNAP_HELP_IDX or SNAP_AUCMD_IDX. |
7 | 7515 */ |
1906 | 7516 void |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7517 restore_snapshot( |
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7518 int idx, |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
7519 int close_curwin) // closing current window |
7 | 7520 { |
7521 win_T *wp; | |
7522 | |
1906 | 7523 if (curtab->tp_snapshot[idx] != NULL |
7524 && curtab->tp_snapshot[idx]->fr_width == topframe->fr_width | |
7525 && curtab->tp_snapshot[idx]->fr_height == topframe->fr_height | |
7526 && check_snapshot_rec(curtab->tp_snapshot[idx], topframe) == OK) | |
7527 { | |
7528 wp = restore_snapshot_rec(curtab->tp_snapshot[idx], topframe); | |
7 | 7529 win_comp_pos(); |
7530 if (wp != NULL && close_curwin) | |
7531 win_goto(wp); | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29702
diff
changeset
|
7532 redraw_all_later(UPD_NOT_VALID); |
7 | 7533 } |
1906 | 7534 clear_snapshot(curtab, idx); |
7 | 7535 } |
7536 | |
7537 /* | |
7538 * Check if frames "sn" and "fr" have the same layout, same following frames | |
10883
cb71a5468aca
patch 8.0.0331: restoring help snapshot accesses freed memory
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
7539 * and same children. And the window pointer is valid. |
7 | 7540 */ |
7541 static int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7542 check_snapshot_rec(frame_T *sn, frame_T *fr) |
7 | 7543 { |
7544 if (sn->fr_layout != fr->fr_layout | |
7545 || (sn->fr_next == NULL) != (fr->fr_next == NULL) | |
7546 || (sn->fr_child == NULL) != (fr->fr_child == NULL) | |
7547 || (sn->fr_next != NULL | |
7548 && check_snapshot_rec(sn->fr_next, fr->fr_next) == FAIL) | |
7549 || (sn->fr_child != NULL | |
10883
cb71a5468aca
patch 8.0.0331: restoring help snapshot accesses freed memory
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
7550 && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL) |
11191
445fd6be2009
patch 8.0.0482: the setbufvar() function may mess up the window layout
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
7551 || (sn->fr_win != NULL && !win_valid(sn->fr_win))) |
7 | 7552 return FAIL; |
7553 return OK; | |
7554 } | |
7555 | |
7556 /* | |
7557 * Copy the size of snapshot frame "sn" to frame "fr". Do the same for all | |
7558 * following frames and children. | |
7559 * Returns a pointer to the old current window, or NULL. | |
7560 */ | |
7561 static win_T * | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7562 restore_snapshot_rec(frame_T *sn, frame_T *fr) |
7 | 7563 { |
7564 win_T *wp = NULL; | |
7565 win_T *wp2; | |
7566 | |
7567 fr->fr_height = sn->fr_height; | |
7568 fr->fr_width = sn->fr_width; | |
7569 if (fr->fr_layout == FR_LEAF) | |
7570 { | |
7571 frame_new_height(fr, fr->fr_height, FALSE, FALSE); | |
779 | 7572 frame_new_width(fr, fr->fr_width, FALSE, FALSE); |
7 | 7573 wp = sn->fr_win; |
7574 } | |
7575 if (sn->fr_next != NULL) | |
7576 { | |
7577 wp2 = restore_snapshot_rec(sn->fr_next, fr->fr_next); | |
7578 if (wp2 != NULL) | |
7579 wp = wp2; | |
7580 } | |
7581 if (sn->fr_child != NULL) | |
7582 { | |
7583 wp2 = restore_snapshot_rec(sn->fr_child, fr->fr_child); | |
7584 if (wp2 != NULL) | |
7585 wp = wp2; | |
7586 } | |
7587 return wp; | |
7588 } | |
7589 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7590 #if defined(FEAT_GUI) || defined(PROTO) |
7 | 7591 /* |
7592 * Return TRUE if there is any vertically split window. | |
7593 */ | |
7594 int | |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7595 win_hasvertsplit(void) |
7 | 7596 { |
7597 frame_T *fr; | |
7598 | |
7599 if (topframe->fr_layout == FR_ROW) | |
7600 return TRUE; | |
7601 | |
7602 if (topframe->fr_layout == FR_COL) | |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
7603 FOR_ALL_FRAMES(fr, topframe->fr_child) |
7 | 7604 if (fr->fr_layout == FR_ROW) |
7605 return TRUE; | |
7606 | |
7607 return FALSE; | |
7608 } | |
7609 #endif | |
1326 | 7610 |
4379 | 7611 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) || defined(PROTO) |
7612 int | |
4401 | 7613 get_win_number(win_T *wp, win_T *first_win) |
4379 | 7614 { |
7615 int i = 1; | |
7616 win_T *w; | |
7617 | |
4401 | 7618 for (w = first_win; w != NULL && w != wp; w = W_NEXT(w)) |
4379 | 7619 ++i; |
7620 | |
7621 if (w == NULL) | |
7622 return 0; | |
7623 else | |
7624 return i; | |
7625 } | |
4401 | 7626 |
7627 int | |
4936
ae05437a744a
updated for version 7.3.1213
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
7628 get_tab_number(tabpage_T *tp UNUSED) |
4401 | 7629 { |
7630 int i = 1; | |
7631 tabpage_T *t; | |
7632 | |
7633 for (t = first_tabpage; t != NULL && t != tp; t = t->tp_next) | |
7634 ++i; | |
7635 | |
7636 if (t == NULL) | |
7637 return 0; | |
7638 else | |
7639 return i; | |
7640 } | |
7641 #endif | |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7642 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7643 /* |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7644 * Return TRUE if "topfrp" and its children are at the right height. |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7645 */ |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7646 static int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7647 frame_check_height(frame_T *topfrp, int height) |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7648 { |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7649 frame_T *frp; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7650 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7651 if (topfrp->fr_height != height) |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7652 return FALSE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7653 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7654 if (topfrp->fr_layout == FR_ROW) |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
7655 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7656 if (frp->fr_height != height) |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7657 return FALSE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7658 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7659 return TRUE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7660 } |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11957
diff
changeset
|
7661 |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7662 /* |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7663 * Return TRUE if "topfrp" and its children are at the right width. |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7664 */ |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7665 static int |
7837
33ba2adb6065
commit https://github.com/vim/vim/commit/b638a7be952544ceb03052c25b84224577a6494b
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
7666 frame_check_width(frame_T *topfrp, int width) |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7667 { |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7668 frame_T *frp; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7669 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7670 if (topfrp->fr_width != width) |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7671 return FALSE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7672 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7673 if (topfrp->fr_layout == FR_COL) |
15227
95678f27a704
patch 8.1.0623: iterating through window frames is repeated
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
7674 FOR_ALL_FRAMES(frp, topfrp->fr_child) |
5004
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7675 if (frp->fr_width != width) |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7676 return FALSE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7677 |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7678 return TRUE; |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7679 } |
a1b41dabc682
updated for version 7.3.1246
Bram Moolenaar <bram@vim.org>
parents:
4936
diff
changeset
|
7680 |
17940
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7681 #if defined(FEAT_SYN_HL) || defined(PROTO) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7682 /* |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7683 * Simple int comparison function for use with qsort() |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7684 */ |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7685 static int |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7686 int_cmp(const void *a, const void *b) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7687 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7688 return *(const int *)a - *(const int *)b; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7689 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7690 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7691 /* |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7692 * Handle setting 'colorcolumn' or 'textwidth' in window "wp". |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7693 * Returns error message, NULL if it's OK. |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7694 */ |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7695 char * |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7696 check_colorcolumn(win_T *wp) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7697 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7698 char_u *s; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7699 int col; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7700 int count = 0; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7701 int color_cols[256]; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7702 int i; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7703 int j = 0; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7704 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7705 if (wp->w_buffer == NULL) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7706 return NULL; // buffer was closed |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7707 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7708 for (s = wp->w_p_cc; *s != NUL && count < 255;) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7709 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7710 if (*s == '-' || *s == '+') |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7711 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7712 // -N and +N: add to 'textwidth' |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7713 col = (*s == '-') ? -1 : 1; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7714 ++s; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7715 if (!VIM_ISDIGIT(*s)) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26771
diff
changeset
|
7716 return e_invalid_argument; |
17940
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7717 col = col * getdigits(&s); |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7718 if (wp->w_buffer->b_p_tw == 0) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7719 goto skip; // 'textwidth' not set, skip this item |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7720 col += wp->w_buffer->b_p_tw; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7721 if (col < 0) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7722 goto skip; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7723 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7724 else if (VIM_ISDIGIT(*s)) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7725 col = getdigits(&s); |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7726 else |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26771
diff
changeset
|
7727 return e_invalid_argument; |
17940
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7728 color_cols[count++] = col - 1; // 1-based to 0-based |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7729 skip: |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7730 if (*s == NUL) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7731 break; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7732 if (*s != ',') |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26771
diff
changeset
|
7733 return e_invalid_argument; |
17940
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7734 if (*++s == NUL) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26771
diff
changeset
|
7735 return e_invalid_argument; // illegal trailing comma as in "set cc=80," |
17940
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7736 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7737 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7738 vim_free(wp->w_p_cc_cols); |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7739 if (count == 0) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7740 wp->w_p_cc_cols = NULL; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7741 else |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7742 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7743 wp->w_p_cc_cols = ALLOC_MULT(int, count + 1); |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7744 if (wp->w_p_cc_cols != NULL) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7745 { |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7746 // sort the columns for faster usage on screen redraw inside |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7747 // win_line() |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7748 qsort(color_cols, count, sizeof(int), int_cmp); |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7749 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7750 for (i = 0; i < count; ++i) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7751 // skip duplicates |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7752 if (j == 0 || wp->w_p_cc_cols[j - 1] != color_cols[i]) |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7753 wp->w_p_cc_cols[j++] = color_cols[i]; |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7754 wp->w_p_cc_cols[j] = -1; // end marker |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7755 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7756 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7757 |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7758 return NULL; // no error |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7759 } |
079e10a49ea1
patch 8.1.1966: some code in options.c fits better elsewhere
Bram Moolenaar <Bram@vim.org>
parents:
17932
diff
changeset
|
7760 #endif |