4 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
24 * Rotate the panes in a window.
27 static enum cmd_retval
cmd_rotate_window_exec(struct cmd
*,
30 const struct cmd_entry cmd_rotate_window_entry
= {
31 .name
= "rotate-window",
34 .args
= { "Dt:UZ", 0, 0, NULL
},
35 .usage
= "[-DUZ] " CMD_TARGET_WINDOW_USAGE
,
37 .target
= { 't', CMD_FIND_WINDOW
, 0 },
40 .exec
= cmd_rotate_window_exec
43 static enum cmd_retval
44 cmd_rotate_window_exec(struct cmd
*self
, struct cmdq_item
*item
)
46 struct args
*args
= cmd_get_args(self
);
47 struct cmd_find_state
*current
= cmdq_get_current(item
);
48 struct cmd_find_state
*target
= cmdq_get_target(item
);
49 struct winlink
*wl
= target
->wl
;
50 struct window
*w
= wl
->window
;
51 struct window_pane
*wp
, *wp2
;
52 struct layout_cell
*lc
;
53 u_int sx
, sy
, xoff
, yoff
;
55 window_push_zoom(w
, 0, args_has(args
, 'Z'));
57 if (args_has(args
, 'D')) {
58 wp
= TAILQ_LAST(&w
->panes
, window_panes
);
59 TAILQ_REMOVE(&w
->panes
, wp
, entry
);
60 TAILQ_INSERT_HEAD(&w
->panes
, wp
, entry
);
63 xoff
= wp
->xoff
; yoff
= wp
->yoff
;
64 sx
= wp
->sx
; sy
= wp
->sy
;
65 TAILQ_FOREACH(wp
, &w
->panes
, entry
) {
66 if ((wp2
= TAILQ_NEXT(wp
, entry
)) == NULL
)
68 wp
->layout_cell
= wp2
->layout_cell
;
69 if (wp
->layout_cell
!= NULL
)
70 wp
->layout_cell
->wp
= wp
;
71 wp
->xoff
= wp2
->xoff
; wp
->yoff
= wp2
->yoff
;
72 window_pane_resize(wp
, wp2
->sx
, wp2
->sy
);
75 if (wp
->layout_cell
!= NULL
)
76 wp
->layout_cell
->wp
= wp
;
77 wp
->xoff
= xoff
; wp
->yoff
= yoff
;
78 window_pane_resize(wp
, sx
, sy
);
80 if ((wp
= TAILQ_PREV(w
->active
, window_panes
, entry
)) == NULL
)
81 wp
= TAILQ_LAST(&w
->panes
, window_panes
);
83 wp
= TAILQ_FIRST(&w
->panes
);
84 TAILQ_REMOVE(&w
->panes
, wp
, entry
);
85 TAILQ_INSERT_TAIL(&w
->panes
, wp
, entry
);
88 xoff
= wp
->xoff
; yoff
= wp
->yoff
;
89 sx
= wp
->sx
; sy
= wp
->sy
;
90 TAILQ_FOREACH_REVERSE(wp
, &w
->panes
, window_panes
, entry
) {
91 if ((wp2
= TAILQ_PREV(wp
, window_panes
, entry
)) == NULL
)
93 wp
->layout_cell
= wp2
->layout_cell
;
94 if (wp
->layout_cell
!= NULL
)
95 wp
->layout_cell
->wp
= wp
;
96 wp
->xoff
= wp2
->xoff
; wp
->yoff
= wp2
->yoff
;
97 window_pane_resize(wp
, wp2
->sx
, wp2
->sy
);
100 if (wp
->layout_cell
!= NULL
)
101 wp
->layout_cell
->wp
= wp
;
102 wp
->xoff
= xoff
; wp
->yoff
= yoff
;
103 window_pane_resize(wp
, sx
, sy
);
105 if ((wp
= TAILQ_NEXT(w
->active
, entry
)) == NULL
)
106 wp
= TAILQ_FIRST(&w
->panes
);
109 window_set_active_pane(w
, wp
, 1);
110 cmd_find_from_winlink_pane(current
, wl
, wp
, 0);
112 server_redraw_window(w
);
114 return (CMD_RETURN_NORMAL
);