1*afeb706aSnicm /* $OpenBSD: cmd-copy-mode.c,v 1.49 2024/11/12 09:32:56 nicm Exp $ */ 2311827fbSnicm 3311827fbSnicm /* 498ca8272Snicm * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> 5311827fbSnicm * 6311827fbSnicm * Permission to use, copy, modify, and distribute this software for any 7311827fbSnicm * purpose with or without fee is hereby granted, provided that the above 8311827fbSnicm * copyright notice and this permission notice appear in all copies. 9311827fbSnicm * 10311827fbSnicm * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11311827fbSnicm * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12311827fbSnicm * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13311827fbSnicm * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14311827fbSnicm * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15311827fbSnicm * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16311827fbSnicm * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17311827fbSnicm */ 18311827fbSnicm 19311827fbSnicm #include <sys/types.h> 20311827fbSnicm 21311827fbSnicm #include "tmux.h" 22311827fbSnicm 23311827fbSnicm /* 244040fbe9Snicm * Enter copy or clock mode. 25311827fbSnicm */ 26311827fbSnicm 2768e0a7f2Snicm static enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmdq_item *); 28311827fbSnicm 29311827fbSnicm const struct cmd_entry cmd_copy_mode_entry = { 30c057646bSnicm .name = "copy-mode", 31c057646bSnicm .alias = NULL, 32c057646bSnicm 33*afeb706aSnicm .args = { "deHMqSs:t:u", 0, 0, NULL }, 34*afeb706aSnicm .usage = "[-deHMqSu] [-s src-pane] " CMD_TARGET_PANE_USAGE, 35c057646bSnicm 36cdfe74adSnicm .source = { 's', CMD_FIND_PANE, 0 }, 37bf0d297eSnicm .target = { 't', CMD_FIND_PANE, 0 }, 388d471e80Snicm 397a61a8ddSnicm .flags = CMD_AFTERHOOK, 40c057646bSnicm .exec = cmd_copy_mode_exec 41311827fbSnicm }; 42311827fbSnicm 434040fbe9Snicm const struct cmd_entry cmd_clock_mode_entry = { 44c057646bSnicm .name = "clock-mode", 45c057646bSnicm .alias = NULL, 46c057646bSnicm 47a51dead1Snicm .args = { "t:", 0, 0, NULL }, 48c057646bSnicm .usage = CMD_TARGET_PANE_USAGE, 49c057646bSnicm 50bf0d297eSnicm .target = { 't', CMD_FIND_PANE, 0 }, 516d6e1a22Snicm 527a61a8ddSnicm .flags = CMD_AFTERHOOK, 53c057646bSnicm .exec = cmd_copy_mode_exec 544040fbe9Snicm }; 554040fbe9Snicm 56dc1f0f5fSnicm static enum cmd_retval 5768e0a7f2Snicm cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) 58311827fbSnicm { 5990d7ba38Snicm struct args *args = cmd_get_args(self); 60823b6d6dSnicm struct key_event *event = cmdq_get_event(item); 61040343aeSnicm struct cmd_find_state *source = cmdq_get_source(item); 62040343aeSnicm struct cmd_find_state *target = cmdq_get_target(item); 63040343aeSnicm struct client *c = cmdq_get_client(item); 64e048bb79Snicm struct session *s; 65040343aeSnicm struct window_pane *wp = target->wp, *swp; 66311827fbSnicm 6737821860Snicm if (args_has(args, 'q')) { 6837821860Snicm window_pane_reset_mode_all(wp); 6937821860Snicm return (CMD_RETURN_NORMAL); 7037821860Snicm } 7137821860Snicm 72e048bb79Snicm if (args_has(args, 'M')) { 73823b6d6dSnicm if ((wp = cmd_mouse_pane(&event->m, &s, NULL)) == NULL) 74e048bb79Snicm return (CMD_RETURN_NORMAL); 75e048bb79Snicm if (c == NULL || c->session != s) 76e048bb79Snicm return (CMD_RETURN_NORMAL); 773447b427Snicm } 78311827fbSnicm 7990d7ba38Snicm if (cmd_get_entry(self) == &cmd_clock_mode_entry) { 80cdfe74adSnicm window_pane_set_mode(wp, NULL, &window_clock_mode, NULL, NULL); 814040fbe9Snicm return (CMD_RETURN_NORMAL); 824040fbe9Snicm } 834040fbe9Snicm 84cdfe74adSnicm if (args_has(args, 's')) 85040343aeSnicm swp = source->wp; 86cdfe74adSnicm else 87cdfe74adSnicm swp = wp; 88cdfe74adSnicm if (!window_pane_set_mode(wp, swp, &window_copy_mode, NULL, args)) { 892c8678f7Snicm if (args_has(args, 'M')) 90823b6d6dSnicm window_copy_start_drag(c, &event->m); 917df29c9dSnicm } 9290d7ba38Snicm if (args_has(args, 'u')) 93d799fdbdSnicm window_copy_pageup(wp, 0); 9438deddc0Snicm if (args_has(args, 'd')) 9538deddc0Snicm window_copy_pagedown(wp, 0, args_has(args, 'e')); 96*afeb706aSnicm if (args_has(args, 'S')) { 97*afeb706aSnicm window_copy_scroll(wp, c->tty.mouse_slider_mpos, event->m.y, 98*afeb706aSnicm args_has(args, 'e')); 99*afeb706aSnicm return (CMD_RETURN_NORMAL); 100*afeb706aSnicm } 101311827fbSnicm 102a224d0d3Snicm return (CMD_RETURN_NORMAL); 103311827fbSnicm } 104