Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 1 | /* $OpenBSD$ */ |
| 2 | |
| 3 | /* |
nicm | 995af0e | 2016-01-19 15:59:12 +0000 | [diff] [blame] | 4 | * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 5 | * |
| 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. |
| 9 | * |
| 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. |
| 17 | */ |
| 18 | |
| 19 | #include <sys/types.h> |
| 20 | |
nicm | 695dc5a | 2017-11-17 09:52:18 +0000 | [diff] [blame] | 21 | #include <stdlib.h> |
nicm | 10f0094 | 2019-03-13 21:39:21 +0000 | [diff] [blame] | 22 | #include <string.h> |
nicm | 695dc5a | 2017-11-17 09:52:18 +0000 | [diff] [blame] | 23 | |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 24 | #include "tmux.h" |
| 25 | |
| 26 | /* |
| 27 | * Select pane. |
| 28 | */ |
| 29 | |
nicm | b342bd0 | 2016-10-16 19:04:05 +0000 | [diff] [blame] | 30 | static enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmdq_item *); |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 31 | |
| 32 | const struct cmd_entry cmd_select_pane_entry = { |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 33 | .name = "select-pane", |
| 34 | .alias = "selectp", |
| 35 | |
nicm | 08e6360 | 2021-08-21 10:22:38 +0000 | [diff] [blame] | 36 | .args = { "DdegLlMmP:RT:t:UZ", 0, 0, NULL }, /* -P and -g deprecated */ |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 37 | .usage = "[-DdeLlMmRUZ] [-T title] " CMD_TARGET_PANE_USAGE, |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 38 | |
nicm | ee45a8a | 2017-04-22 10:22:39 +0000 | [diff] [blame] | 39 | .target = { 't', CMD_FIND_PANE, 0 }, |
nicm | a3129fd | 2015-12-14 00:31:54 +0000 | [diff] [blame] | 40 | |
| 41 | .flags = 0, |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 42 | .exec = cmd_select_pane_exec |
Nicholas Marriott | 96c37fa | 2011-01-04 02:03:41 +0000 | [diff] [blame] | 43 | }; |
| 44 | |
| 45 | const struct cmd_entry cmd_last_pane_entry = { |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 46 | .name = "last-pane", |
| 47 | .alias = "lastp", |
| 48 | |
nicm | 08e6360 | 2021-08-21 10:22:38 +0000 | [diff] [blame] | 49 | .args = { "det:Z", 0, 0, NULL }, |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 50 | .usage = "[-deZ] " CMD_TARGET_WINDOW_USAGE, |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 51 | |
nicm | ee45a8a | 2017-04-22 10:22:39 +0000 | [diff] [blame] | 52 | .target = { 't', CMD_FIND_WINDOW, 0 }, |
nicm | a3129fd | 2015-12-14 00:31:54 +0000 | [diff] [blame] | 53 | |
| 54 | .flags = 0, |
nicm | ecfeee2 | 2015-12-13 21:53:57 +0000 | [diff] [blame] | 55 | .exec = cmd_select_pane_exec |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 56 | }; |
| 57 | |
nicm | 6469953 | 2018-10-18 08:38:01 +0000 | [diff] [blame] | 58 | static void |
| 59 | cmd_select_pane_redraw(struct window *w) |
| 60 | { |
| 61 | struct client *c; |
| 62 | |
| 63 | /* |
| 64 | * Redraw entire window if it is bigger than the client (the |
| 65 | * offset may change), otherwise just draw borders. |
| 66 | */ |
| 67 | |
| 68 | TAILQ_FOREACH(c, &clients, entry) { |
nicm | 5a288b1 | 2019-04-30 06:21:30 +0000 | [diff] [blame] | 69 | if (c->session == NULL || (c->flags & CLIENT_CONTROL)) |
nicm | 6469953 | 2018-10-18 08:38:01 +0000 | [diff] [blame] | 70 | continue; |
| 71 | if (c->session->curw->window == w && tty_window_bigger(&c->tty)) |
| 72 | server_redraw_client(c); |
| 73 | else { |
| 74 | if (c->session->curw->window == w) |
| 75 | c->flags |= CLIENT_REDRAWBORDERS; |
| 76 | if (session_has(c->session, w)) |
| 77 | c->flags |= CLIENT_REDRAWSTATUS; |
| 78 | } |
| 79 | |
| 80 | } |
| 81 | } |
| 82 | |
nicm | a81685b | 2016-10-10 21:51:39 +0000 | [diff] [blame] | 83 | static enum cmd_retval |
nicm | b342bd0 | 2016-10-16 19:04:05 +0000 | [diff] [blame] | 84 | cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 85 | { |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 86 | struct args *args = cmd_get_args(self); |
| 87 | const struct cmd_entry *entry = cmd_get_entry(self); |
nicm | adb76fd | 2020-04-13 14:46:04 +0000 | [diff] [blame] | 88 | struct cmd_find_state *current = cmdq_get_current(item); |
nicm | 04cdd03 | 2020-04-13 10:59:58 +0000 | [diff] [blame] | 89 | struct cmd_find_state *target = cmdq_get_target(item); |
nicm | 303d342 | 2020-05-16 16:20:59 +0000 | [diff] [blame] | 90 | struct client *c = cmdq_get_client(item); |
nicm | 04cdd03 | 2020-04-13 10:59:58 +0000 | [diff] [blame] | 91 | struct winlink *wl = target->wl; |
nicm | 4a4daf1 | 2015-12-13 14:32:38 +0000 | [diff] [blame] | 92 | struct window *w = wl->window; |
nicm | 04cdd03 | 2020-04-13 10:59:58 +0000 | [diff] [blame] | 93 | struct session *s = target->s; |
nicm | 303d342 | 2020-05-16 16:20:59 +0000 | [diff] [blame] | 94 | struct window_pane *wp = target->wp, *activewp, *lastwp, *markedwp; |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 95 | struct options *oo = wp->options; |
nicm | 3f7f9a0 | 2020-04-13 20:51:57 +0000 | [diff] [blame] | 96 | char *title; |
nicm | ee123c2 | 2015-04-19 21:05:27 +0000 | [diff] [blame] | 97 | const char *style; |
nicm | 5f92f92 | 2019-06-20 11:59:59 +0000 | [diff] [blame] | 98 | struct options_entry *o; |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 99 | |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 100 | if (entry == &cmd_last_pane_entry || args_has(args, 'l')) { |
nicm | 8867951 | 2017-04-21 21:02:26 +0000 | [diff] [blame] | 101 | lastwp = w->last; |
nicm | 0c94c3f | 2018-06-25 17:23:16 +0000 | [diff] [blame] | 102 | if (lastwp == NULL && window_count_panes(w) == 2) { |
| 103 | lastwp = TAILQ_PREV(w->active, window_panes, entry); |
| 104 | if (lastwp == NULL) |
| 105 | lastwp = TAILQ_NEXT(w->active, entry); |
| 106 | } |
nicm | 8867951 | 2017-04-21 21:02:26 +0000 | [diff] [blame] | 107 | if (lastwp == NULL) { |
nicm | b342bd0 | 2016-10-16 19:04:05 +0000 | [diff] [blame] | 108 | cmdq_error(item, "no last pane"); |
Nicholas Marriott | ede8312 | 2012-07-11 07:10:15 +0000 | [diff] [blame] | 109 | return (CMD_RETURN_ERROR); |
Nicholas Marriott | 96c37fa | 2011-01-04 02:03:41 +0000 | [diff] [blame] | 110 | } |
nicm | c13f2e1 | 2021-02-04 14:02:24 +0000 | [diff] [blame] | 111 | if (args_has(args, 'e')) { |
nicm | 8867951 | 2017-04-21 21:02:26 +0000 | [diff] [blame] | 112 | lastwp->flags &= ~PANE_INPUTOFF; |
nicm | c13f2e1 | 2021-02-04 14:02:24 +0000 | [diff] [blame] | 113 | server_redraw_window_borders(lastwp->window); |
| 114 | server_status_window(lastwp->window); |
| 115 | } else if (args_has(args, 'd')) { |
nicm | 8867951 | 2017-04-21 21:02:26 +0000 | [diff] [blame] | 116 | lastwp->flags |= PANE_INPUTOFF; |
nicm | c13f2e1 | 2021-02-04 14:02:24 +0000 | [diff] [blame] | 117 | server_redraw_window_borders(lastwp->window); |
| 118 | server_status_window(lastwp->window); |
| 119 | } else { |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 120 | if (window_push_zoom(w, 0, args_has(args, 'Z'))) |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 121 | server_redraw_window(w); |
nicm | 8867951 | 2017-04-21 21:02:26 +0000 | [diff] [blame] | 122 | window_redraw_active_switch(w, lastwp); |
nicm | 78287e2 | 2019-04-17 14:37:48 +0000 | [diff] [blame] | 123 | if (window_set_active_pane(w, lastwp, 1)) { |
nicm | 17cf1b2 | 2017-08-30 10:33:57 +0000 | [diff] [blame] | 124 | cmd_find_from_winlink(current, wl, 0); |
nicm | 6469953 | 2018-10-18 08:38:01 +0000 | [diff] [blame] | 125 | cmd_select_pane_redraw(w); |
nicm | af16ce6 | 2015-09-14 11:34:50 +0000 | [diff] [blame] | 126 | } |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 127 | if (window_pop_zoom(w)) |
| 128 | server_redraw_window(w); |
nicm | f518a07 | 2014-08-11 22:14:30 +0000 | [diff] [blame] | 129 | } |
Nicholas Marriott | ede8312 | 2012-07-11 07:10:15 +0000 | [diff] [blame] | 130 | return (CMD_RETURN_NORMAL); |
Nicholas Marriott | 96c37fa | 2011-01-04 02:03:41 +0000 | [diff] [blame] | 131 | } |
| 132 | |
nicm | a863834 | 2015-06-04 11:43:51 +0000 | [diff] [blame] | 133 | if (args_has(args, 'm') || args_has(args, 'M')) { |
| 134 | if (args_has(args, 'm') && !window_pane_visible(wp)) |
| 135 | return (CMD_RETURN_NORMAL); |
nicm | ca0166f | 2020-05-26 08:47:50 +0000 | [diff] [blame] | 136 | if (server_check_marked()) |
| 137 | lastwp = marked_pane.wp; |
| 138 | else |
| 139 | lastwp = NULL; |
nicm | a863834 | 2015-06-04 11:43:51 +0000 | [diff] [blame] | 140 | |
| 141 | if (args_has(args, 'M') || server_is_marked(s, wl, wp)) |
| 142 | server_clear_marked(); |
| 143 | else |
| 144 | server_set_marked(s, wl, wp); |
nicm | 12da13c | 2015-12-15 00:00:01 +0000 | [diff] [blame] | 145 | markedwp = marked_pane.wp; |
nicm | a863834 | 2015-06-04 11:43:51 +0000 | [diff] [blame] | 146 | |
| 147 | if (lastwp != NULL) { |
nicm | 9b00472 | 2021-08-12 19:47:05 +0000 | [diff] [blame] | 148 | lastwp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); |
nicm | a863834 | 2015-06-04 11:43:51 +0000 | [diff] [blame] | 149 | server_redraw_window_borders(lastwp->window); |
| 150 | server_status_window(lastwp->window); |
| 151 | } |
| 152 | if (markedwp != NULL) { |
nicm | 9b00472 | 2021-08-12 19:47:05 +0000 | [diff] [blame] | 153 | markedwp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); |
nicm | a863834 | 2015-06-04 11:43:51 +0000 | [diff] [blame] | 154 | server_redraw_window_borders(markedwp->window); |
| 155 | server_status_window(markedwp->window); |
| 156 | } |
| 157 | return (CMD_RETURN_NORMAL); |
| 158 | } |
| 159 | |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 160 | style = args_get(args, 'P'); |
| 161 | if (style != NULL) { |
| 162 | o = options_set_string(oo, "window-style", 0, "%s", style); |
| 163 | if (o == NULL) { |
| 164 | cmdq_error(item, "bad style: %s", style); |
| 165 | return (CMD_RETURN_ERROR); |
nicm | ee123c2 | 2015-04-19 21:05:27 +0000 | [diff] [blame] | 166 | } |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 167 | options_set_string(oo, "window-active-style", 0, "%s", style); |
| 168 | wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); |
| 169 | } |
| 170 | if (args_has(args, 'g')) { |
| 171 | cmdq_print(item, "%s", options_get_string(oo, "window-style")); |
nicm | ee123c2 | 2015-04-19 21:05:27 +0000 | [diff] [blame] | 172 | return (CMD_RETURN_NORMAL); |
| 173 | } |
| 174 | |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 175 | if (args_has(args, 'L')) { |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 176 | window_push_zoom(w, 0, 1); |
Nicholas Marriott | 6f04866 | 2010-03-22 19:07:52 +0000 | [diff] [blame] | 177 | wp = window_pane_find_left(wp); |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 178 | window_pop_zoom(w); |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 179 | } else if (args_has(args, 'R')) { |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 180 | window_push_zoom(w, 0, 1); |
Nicholas Marriott | 6f04866 | 2010-03-22 19:07:52 +0000 | [diff] [blame] | 181 | wp = window_pane_find_right(wp); |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 182 | window_pop_zoom(w); |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 183 | } else if (args_has(args, 'U')) { |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 184 | window_push_zoom(w, 0, 1); |
Nicholas Marriott | 6f04866 | 2010-03-22 19:07:52 +0000 | [diff] [blame] | 185 | wp = window_pane_find_up(wp); |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 186 | window_pop_zoom(w); |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 187 | } else if (args_has(args, 'D')) { |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 188 | window_push_zoom(w, 0, 1); |
Nicholas Marriott | 6f04866 | 2010-03-22 19:07:52 +0000 | [diff] [blame] | 189 | wp = window_pane_find_down(wp); |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 190 | window_pop_zoom(w); |
nicm | a05c27a | 2015-10-22 11:19:31 +0000 | [diff] [blame] | 191 | } |
nicm | 69b8f10 | 2015-04-29 16:26:17 +0000 | [diff] [blame] | 192 | if (wp == NULL) |
| 193 | return (CMD_RETURN_NORMAL); |
Nicholas Marriott | 6f04866 | 2010-03-22 19:07:52 +0000 | [diff] [blame] | 194 | |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 195 | if (args_has(args, 'e')) { |
nicm | f518a07 | 2014-08-11 22:14:30 +0000 | [diff] [blame] | 196 | wp->flags &= ~PANE_INPUTOFF; |
nicm | c13f2e1 | 2021-02-04 14:02:24 +0000 | [diff] [blame] | 197 | server_redraw_window_borders(wp->window); |
| 198 | server_status_window(wp->window); |
nicm | a70762c | 2015-04-27 07:49:36 +0000 | [diff] [blame] | 199 | return (CMD_RETURN_NORMAL); |
| 200 | } |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 201 | if (args_has(args, 'd')) { |
nicm | f518a07 | 2014-08-11 22:14:30 +0000 | [diff] [blame] | 202 | wp->flags |= PANE_INPUTOFF; |
nicm | c13f2e1 | 2021-02-04 14:02:24 +0000 | [diff] [blame] | 203 | server_redraw_window_borders(wp->window); |
| 204 | server_status_window(wp->window); |
nicm | a70762c | 2015-04-27 07:49:36 +0000 | [diff] [blame] | 205 | return (CMD_RETURN_NORMAL); |
| 206 | } |
| 207 | |
nicm | c20eb0c | 2020-04-13 08:26:27 +0000 | [diff] [blame] | 208 | if (args_has(args, 'T')) { |
nicm | 3f7f9a0 | 2020-04-13 20:51:57 +0000 | [diff] [blame] | 209 | title = format_single_from_target(item, args_get(args, 'T')); |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 210 | if (screen_set_title(&wp->base, title)) { |
nicm | d329b03 | 2020-07-24 07:05:37 +0000 | [diff] [blame] | 211 | notify_pane("pane-title-changed", wp); |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 212 | server_redraw_window_borders(wp->window); |
nicm | 265164d | 2020-02-03 13:46:27 +0000 | [diff] [blame] | 213 | server_status_window(wp->window); |
nicm | f03b611 | 2020-05-16 15:01:30 +0000 | [diff] [blame] | 214 | } |
nicm | 3f7f9a0 | 2020-04-13 20:51:57 +0000 | [diff] [blame] | 215 | free(title); |
nicm | f2f9605 | 2018-05-20 11:48:34 +0000 | [diff] [blame] | 216 | return (CMD_RETURN_NORMAL); |
nicm | f4848b4 | 2017-09-02 17:51:54 +0000 | [diff] [blame] | 217 | } |
| 218 | |
nicm | 2b1e8d0 | 2020-07-03 07:00:12 +0000 | [diff] [blame] | 219 | if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE)) |
nicm | 303d342 | 2020-05-16 16:20:59 +0000 | [diff] [blame] | 220 | activewp = server_client_get_pane(c); |
| 221 | else |
| 222 | activewp = w->active; |
| 223 | if (wp == activewp) |
nicm | a70762c | 2015-04-27 07:49:36 +0000 | [diff] [blame] | 224 | return (CMD_RETURN_NORMAL); |
nicm | d98f9f7 | 2021-03-11 06:31:05 +0000 | [diff] [blame] | 225 | if (window_push_zoom(w, 0, args_has(args, 'Z'))) |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 226 | server_redraw_window(w); |
nicm | af16ce6 | 2015-09-14 11:34:50 +0000 | [diff] [blame] | 227 | window_redraw_active_switch(w, wp); |
nicm | 2b1e8d0 | 2020-07-03 07:00:12 +0000 | [diff] [blame] | 228 | if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE)) |
nicm | 303d342 | 2020-05-16 16:20:59 +0000 | [diff] [blame] | 229 | server_client_set_pane(c, wp); |
| 230 | else if (window_set_active_pane(w, wp, 1)) |
nicm | 17cf1b2 | 2017-08-30 10:33:57 +0000 | [diff] [blame] | 231 | cmd_find_from_winlink_pane(current, wl, wp, 0); |
nicm | 303d342 | 2020-05-16 16:20:59 +0000 | [diff] [blame] | 232 | cmdq_insert_hook(s, item, current, "after-select-pane"); |
| 233 | cmd_select_pane_redraw(w); |
nicm | 0f243f0 | 2019-08-14 09:58:31 +0000 | [diff] [blame] | 234 | if (window_pop_zoom(w)) |
| 235 | server_redraw_window(w); |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 236 | |
Nicholas Marriott | ede8312 | 2012-07-11 07:10:15 +0000 | [diff] [blame] | 237 | return (CMD_RETURN_NORMAL); |
Nicholas Marriott | 35876ea | 2009-06-01 22:58:49 +0000 | [diff] [blame] | 238 | } |