blob: ae21d4ce6c7bddf0908b97009f44ea2fc460908a [file] [log] [blame] [raw]
Nicholas Marriott35876ea2009-06-01 22:58:49 +00001/* $OpenBSD$ */
2
3/*
nicm995af0e2016-01-19 15:59:12 +00004 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
Nicholas Marriott35876ea2009-06-01 22:58:49 +00005 *
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
nicm695dc5a2017-11-17 09:52:18 +000021#include <stdlib.h>
nicm10f00942019-03-13 21:39:21 +000022#include <string.h>
nicm695dc5a2017-11-17 09:52:18 +000023
Nicholas Marriott35876ea2009-06-01 22:58:49 +000024#include "tmux.h"
25
26/*
27 * Select pane.
28 */
29
nicmb342bd02016-10-16 19:04:05 +000030static enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmdq_item *);
Nicholas Marriott35876ea2009-06-01 22:58:49 +000031
32const struct cmd_entry cmd_select_pane_entry = {
nicmecfeee22015-12-13 21:53:57 +000033 .name = "select-pane",
34 .alias = "selectp",
35
nicm08e63602021-08-21 10:22:38 +000036 .args = { "DdegLlMmP:RT:t:UZ", 0, 0, NULL }, /* -P and -g deprecated */
nicm0f243f02019-08-14 09:58:31 +000037 .usage = "[-DdeLlMmRUZ] [-T title] " CMD_TARGET_PANE_USAGE,
nicmecfeee22015-12-13 21:53:57 +000038
nicmee45a8a2017-04-22 10:22:39 +000039 .target = { 't', CMD_FIND_PANE, 0 },
nicma3129fd2015-12-14 00:31:54 +000040
41 .flags = 0,
nicmecfeee22015-12-13 21:53:57 +000042 .exec = cmd_select_pane_exec
Nicholas Marriott96c37fa2011-01-04 02:03:41 +000043};
44
45const struct cmd_entry cmd_last_pane_entry = {
nicmecfeee22015-12-13 21:53:57 +000046 .name = "last-pane",
47 .alias = "lastp",
48
nicm08e63602021-08-21 10:22:38 +000049 .args = { "det:Z", 0, 0, NULL },
nicm0f243f02019-08-14 09:58:31 +000050 .usage = "[-deZ] " CMD_TARGET_WINDOW_USAGE,
nicmecfeee22015-12-13 21:53:57 +000051
nicmee45a8a2017-04-22 10:22:39 +000052 .target = { 't', CMD_FIND_WINDOW, 0 },
nicma3129fd2015-12-14 00:31:54 +000053
54 .flags = 0,
nicmecfeee22015-12-13 21:53:57 +000055 .exec = cmd_select_pane_exec
Nicholas Marriott35876ea2009-06-01 22:58:49 +000056};
57
nicm64699532018-10-18 08:38:01 +000058static void
59cmd_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) {
nicm5a288b12019-04-30 06:21:30 +000069 if (c->session == NULL || (c->flags & CLIENT_CONTROL))
nicm64699532018-10-18 08:38:01 +000070 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
nicma81685b2016-10-10 21:51:39 +000083static enum cmd_retval
nicmb342bd02016-10-16 19:04:05 +000084cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
Nicholas Marriott35876ea2009-06-01 22:58:49 +000085{
nicmc20eb0c2020-04-13 08:26:27 +000086 struct args *args = cmd_get_args(self);
87 const struct cmd_entry *entry = cmd_get_entry(self);
nicmadb76fd2020-04-13 14:46:04 +000088 struct cmd_find_state *current = cmdq_get_current(item);
nicm04cdd032020-04-13 10:59:58 +000089 struct cmd_find_state *target = cmdq_get_target(item);
nicm303d3422020-05-16 16:20:59 +000090 struct client *c = cmdq_get_client(item);
nicm04cdd032020-04-13 10:59:58 +000091 struct winlink *wl = target->wl;
nicm4a4daf12015-12-13 14:32:38 +000092 struct window *w = wl->window;
nicm04cdd032020-04-13 10:59:58 +000093 struct session *s = target->s;
nicm303d3422020-05-16 16:20:59 +000094 struct window_pane *wp = target->wp, *activewp, *lastwp, *markedwp;
nicmf03b6112020-05-16 15:01:30 +000095 struct options *oo = wp->options;
nicm3f7f9a02020-04-13 20:51:57 +000096 char *title;
nicmee123c22015-04-19 21:05:27 +000097 const char *style;
nicm5f92f922019-06-20 11:59:59 +000098 struct options_entry *o;
Nicholas Marriott35876ea2009-06-01 22:58:49 +000099
nicmc20eb0c2020-04-13 08:26:27 +0000100 if (entry == &cmd_last_pane_entry || args_has(args, 'l')) {
nicm88679512017-04-21 21:02:26 +0000101 lastwp = w->last;
nicm0c94c3f2018-06-25 17:23:16 +0000102 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 }
nicm88679512017-04-21 21:02:26 +0000107 if (lastwp == NULL) {
nicmb342bd02016-10-16 19:04:05 +0000108 cmdq_error(item, "no last pane");
Nicholas Marriottede83122012-07-11 07:10:15 +0000109 return (CMD_RETURN_ERROR);
Nicholas Marriott96c37fa2011-01-04 02:03:41 +0000110 }
nicmc13f2e12021-02-04 14:02:24 +0000111 if (args_has(args, 'e')) {
nicm88679512017-04-21 21:02:26 +0000112 lastwp->flags &= ~PANE_INPUTOFF;
nicmc13f2e12021-02-04 14:02:24 +0000113 server_redraw_window_borders(lastwp->window);
114 server_status_window(lastwp->window);
115 } else if (args_has(args, 'd')) {
nicm88679512017-04-21 21:02:26 +0000116 lastwp->flags |= PANE_INPUTOFF;
nicmc13f2e12021-02-04 14:02:24 +0000117 server_redraw_window_borders(lastwp->window);
118 server_status_window(lastwp->window);
119 } else {
nicmd98f9f72021-03-11 06:31:05 +0000120 if (window_push_zoom(w, 0, args_has(args, 'Z')))
nicm0f243f02019-08-14 09:58:31 +0000121 server_redraw_window(w);
nicm88679512017-04-21 21:02:26 +0000122 window_redraw_active_switch(w, lastwp);
nicm78287e22019-04-17 14:37:48 +0000123 if (window_set_active_pane(w, lastwp, 1)) {
nicm17cf1b22017-08-30 10:33:57 +0000124 cmd_find_from_winlink(current, wl, 0);
nicm64699532018-10-18 08:38:01 +0000125 cmd_select_pane_redraw(w);
nicmaf16ce62015-09-14 11:34:50 +0000126 }
nicm0f243f02019-08-14 09:58:31 +0000127 if (window_pop_zoom(w))
128 server_redraw_window(w);
nicmf518a072014-08-11 22:14:30 +0000129 }
Nicholas Marriottede83122012-07-11 07:10:15 +0000130 return (CMD_RETURN_NORMAL);
Nicholas Marriott96c37fa2011-01-04 02:03:41 +0000131 }
132
nicma8638342015-06-04 11:43:51 +0000133 if (args_has(args, 'm') || args_has(args, 'M')) {
134 if (args_has(args, 'm') && !window_pane_visible(wp))
135 return (CMD_RETURN_NORMAL);
nicmca0166f2020-05-26 08:47:50 +0000136 if (server_check_marked())
137 lastwp = marked_pane.wp;
138 else
139 lastwp = NULL;
nicma8638342015-06-04 11:43:51 +0000140
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);
nicm12da13c2015-12-15 00:00:01 +0000145 markedwp = marked_pane.wp;
nicma8638342015-06-04 11:43:51 +0000146
147 if (lastwp != NULL) {
nicm9b004722021-08-12 19:47:05 +0000148 lastwp->flags |= (PANE_REDRAW|PANE_STYLECHANGED);
nicma8638342015-06-04 11:43:51 +0000149 server_redraw_window_borders(lastwp->window);
150 server_status_window(lastwp->window);
151 }
152 if (markedwp != NULL) {
nicm9b004722021-08-12 19:47:05 +0000153 markedwp->flags |= (PANE_REDRAW|PANE_STYLECHANGED);
nicma8638342015-06-04 11:43:51 +0000154 server_redraw_window_borders(markedwp->window);
155 server_status_window(markedwp->window);
156 }
157 return (CMD_RETURN_NORMAL);
158 }
159
nicmf03b6112020-05-16 15:01:30 +0000160 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);
nicmee123c22015-04-19 21:05:27 +0000166 }
nicmf03b6112020-05-16 15:01:30 +0000167 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"));
nicmee123c22015-04-19 21:05:27 +0000172 return (CMD_RETURN_NORMAL);
173 }
174
nicmc20eb0c2020-04-13 08:26:27 +0000175 if (args_has(args, 'L')) {
nicmd98f9f72021-03-11 06:31:05 +0000176 window_push_zoom(w, 0, 1);
Nicholas Marriott6f048662010-03-22 19:07:52 +0000177 wp = window_pane_find_left(wp);
nicm0f243f02019-08-14 09:58:31 +0000178 window_pop_zoom(w);
nicmc20eb0c2020-04-13 08:26:27 +0000179 } else if (args_has(args, 'R')) {
nicmd98f9f72021-03-11 06:31:05 +0000180 window_push_zoom(w, 0, 1);
Nicholas Marriott6f048662010-03-22 19:07:52 +0000181 wp = window_pane_find_right(wp);
nicm0f243f02019-08-14 09:58:31 +0000182 window_pop_zoom(w);
nicmc20eb0c2020-04-13 08:26:27 +0000183 } else if (args_has(args, 'U')) {
nicmd98f9f72021-03-11 06:31:05 +0000184 window_push_zoom(w, 0, 1);
Nicholas Marriott6f048662010-03-22 19:07:52 +0000185 wp = window_pane_find_up(wp);
nicm0f243f02019-08-14 09:58:31 +0000186 window_pop_zoom(w);
nicmc20eb0c2020-04-13 08:26:27 +0000187 } else if (args_has(args, 'D')) {
nicmd98f9f72021-03-11 06:31:05 +0000188 window_push_zoom(w, 0, 1);
Nicholas Marriott6f048662010-03-22 19:07:52 +0000189 wp = window_pane_find_down(wp);
nicm0f243f02019-08-14 09:58:31 +0000190 window_pop_zoom(w);
nicma05c27a2015-10-22 11:19:31 +0000191 }
nicm69b8f102015-04-29 16:26:17 +0000192 if (wp == NULL)
193 return (CMD_RETURN_NORMAL);
Nicholas Marriott6f048662010-03-22 19:07:52 +0000194
nicmc20eb0c2020-04-13 08:26:27 +0000195 if (args_has(args, 'e')) {
nicmf518a072014-08-11 22:14:30 +0000196 wp->flags &= ~PANE_INPUTOFF;
nicmc13f2e12021-02-04 14:02:24 +0000197 server_redraw_window_borders(wp->window);
198 server_status_window(wp->window);
nicma70762c2015-04-27 07:49:36 +0000199 return (CMD_RETURN_NORMAL);
200 }
nicmc20eb0c2020-04-13 08:26:27 +0000201 if (args_has(args, 'd')) {
nicmf518a072014-08-11 22:14:30 +0000202 wp->flags |= PANE_INPUTOFF;
nicmc13f2e12021-02-04 14:02:24 +0000203 server_redraw_window_borders(wp->window);
204 server_status_window(wp->window);
nicma70762c2015-04-27 07:49:36 +0000205 return (CMD_RETURN_NORMAL);
206 }
207
nicmc20eb0c2020-04-13 08:26:27 +0000208 if (args_has(args, 'T')) {
nicm3f7f9a02020-04-13 20:51:57 +0000209 title = format_single_from_target(item, args_get(args, 'T'));
nicmf03b6112020-05-16 15:01:30 +0000210 if (screen_set_title(&wp->base, title)) {
nicmd329b032020-07-24 07:05:37 +0000211 notify_pane("pane-title-changed", wp);
nicmf03b6112020-05-16 15:01:30 +0000212 server_redraw_window_borders(wp->window);
nicm265164d2020-02-03 13:46:27 +0000213 server_status_window(wp->window);
nicmf03b6112020-05-16 15:01:30 +0000214 }
nicm3f7f9a02020-04-13 20:51:57 +0000215 free(title);
nicmf2f96052018-05-20 11:48:34 +0000216 return (CMD_RETURN_NORMAL);
nicmf4848b42017-09-02 17:51:54 +0000217 }
218
nicm2b1e8d02020-07-03 07:00:12 +0000219 if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE))
nicm303d3422020-05-16 16:20:59 +0000220 activewp = server_client_get_pane(c);
221 else
222 activewp = w->active;
223 if (wp == activewp)
nicma70762c2015-04-27 07:49:36 +0000224 return (CMD_RETURN_NORMAL);
nicmd98f9f72021-03-11 06:31:05 +0000225 if (window_push_zoom(w, 0, args_has(args, 'Z')))
nicm0f243f02019-08-14 09:58:31 +0000226 server_redraw_window(w);
nicmaf16ce62015-09-14 11:34:50 +0000227 window_redraw_active_switch(w, wp);
nicm2b1e8d02020-07-03 07:00:12 +0000228 if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE))
nicm303d3422020-05-16 16:20:59 +0000229 server_client_set_pane(c, wp);
230 else if (window_set_active_pane(w, wp, 1))
nicm17cf1b22017-08-30 10:33:57 +0000231 cmd_find_from_winlink_pane(current, wl, wp, 0);
nicm303d3422020-05-16 16:20:59 +0000232 cmdq_insert_hook(s, item, current, "after-select-pane");
233 cmd_select_pane_redraw(w);
nicm0f243f02019-08-14 09:58:31 +0000234 if (window_pop_zoom(w))
235 server_redraw_window(w);
Nicholas Marriott35876ea2009-06-01 22:58:49 +0000236
Nicholas Marriottede83122012-07-11 07:10:15 +0000237 return (CMD_RETURN_NORMAL);
Nicholas Marriott35876ea2009-06-01 22:58:49 +0000238}