Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2026-03-03 16:01:09 +00:00
5 changed files with 116 additions and 4 deletions

View File

@@ -36,7 +36,7 @@ const struct cmd_entry cmd_copy_mode_entry = {
.source = { 's', CMD_FIND_PANE, 0 }, .source = { 's', CMD_FIND_PANE, 0 },
.target = { 't', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 },
.flags = CMD_AFTERHOOK, .flags = CMD_AFTERHOOK|CMD_READONLY,
.exec = cmd_copy_mode_exec .exec = cmd_copy_mode_exec
}; };

View File

@@ -39,7 +39,8 @@ const struct cmd_entry cmd_send_keys_entry = {
.target = { 't', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 },
.flags = CMD_AFTERHOOK|CMD_CLIENT_CFLAG|CMD_CLIENT_CANFAIL, .flags = CMD_AFTERHOOK|CMD_CLIENT_CFLAG|CMD_CLIENT_CANFAIL|
CMD_READONLY,
.exec = cmd_send_keys_exec .exec = cmd_send_keys_exec
}; };
@@ -167,6 +168,11 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
u_int count = args_count(args); u_int count = args_count(args);
char *cause = NULL; char *cause = NULL;
if (tc->flags & CLIENT_READONLY && !args_has(args, 'X')) {
cmdq_error(item, "client is read-only");
return (CMD_RETURN_ERROR);
}
if (args_has(args, 'N')) { if (args_has(args, 'N')) {
np = args_strtonum_and_expand(args, 'N', 1, UINT_MAX, item, np = args_strtonum_and_expand(args, 'N', 1, UINT_MAX, item,
&cause); &cause);

View File

@@ -688,6 +688,7 @@ key_bindings_dispatch(struct key_binding *bd, struct cmdq_item *item,
readonly = 1; readonly = 1;
else else
readonly = cmd_list_all_have(bd->cmdlist, CMD_READONLY); readonly = cmd_list_all_have(bd->cmdlist, CMD_READONLY);
if (!readonly) if (!readonly)
new_item = cmdq_get_callback(key_bindings_read_only, NULL); new_item = cmdq_get_callback(key_bindings_read_only, NULL);
else { else {

View File

@@ -96,7 +96,9 @@ server_redraw_window(struct window *w)
struct client *c; struct client *c;
TAILQ_FOREACH(c, &clients, entry) { TAILQ_FOREACH(c, &clients, entry) {
if (c->session != NULL && c->session->curw->window == w) if (c->session != NULL &&
c->session->curw != NULL &&
c->session->curw->window == w)
server_redraw_client(c); server_redraw_client(c);
} }
} }
@@ -107,7 +109,9 @@ server_redraw_window_borders(struct window *w)
struct client *c; struct client *c;
TAILQ_FOREACH(c, &clients, entry) { TAILQ_FOREACH(c, &clients, entry) {
if (c->session != NULL && c->session->curw->window == w) if (c->session != NULL &&
c->session->curw != NULL &&
c->session->curw->window == w)
c->flags |= CLIENT_REDRAWBORDERS; c->flags |= CLIENT_REDRAWBORDERS;
} }
} }

View File

@@ -2759,351 +2759,424 @@ static const struct {
u_int minargs; u_int minargs;
u_int maxargs; u_int maxargs;
struct args_parse args; struct args_parse args;
#define WINDOW_COPY_CMD_FLAG_READONLY 0x1
int flags;
enum window_copy_cmd_clear clear; enum window_copy_cmd_clear clear;
enum window_copy_cmd_action (*f)(struct window_copy_cmd_state *); enum window_copy_cmd_action (*f)(struct window_copy_cmd_state *);
} window_copy_cmd_table[] = { } window_copy_cmd_table[] = {
{ .command = "append-selection", { .command = "append-selection",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_append_selection .f = window_copy_cmd_append_selection
}, },
{ .command = "append-selection-and-cancel", { .command = "append-selection-and-cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_append_selection_and_cancel .f = window_copy_cmd_append_selection_and_cancel
}, },
{ .command = "back-to-indentation", { .command = "back-to-indentation",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_back_to_indentation .f = window_copy_cmd_back_to_indentation
}, },
{ .command = "begin-selection", { .command = "begin-selection",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_begin_selection .f = window_copy_cmd_begin_selection
}, },
{ .command = "bottom-line", { .command = "bottom-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_bottom_line .f = window_copy_cmd_bottom_line
}, },
{ .command = "cancel", { .command = "cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_cancel .f = window_copy_cmd_cancel
}, },
{ .command = "clear-selection", { .command = "clear-selection",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_clear_selection .f = window_copy_cmd_clear_selection
}, },
{ .command = "copy-end-of-line", { .command = "copy-end-of-line",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_end_of_line .f = window_copy_cmd_copy_end_of_line
}, },
{ .command = "copy-end-of-line-and-cancel", { .command = "copy-end-of-line-and-cancel",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_end_of_line_and_cancel .f = window_copy_cmd_copy_end_of_line_and_cancel
}, },
{ .command = "copy-pipe-end-of-line", { .command = "copy-pipe-end-of-line",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe_end_of_line .f = window_copy_cmd_copy_pipe_end_of_line
}, },
{ .command = "copy-pipe-end-of-line-and-cancel", { .command = "copy-pipe-end-of-line-and-cancel",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe_end_of_line_and_cancel .f = window_copy_cmd_copy_pipe_end_of_line_and_cancel
}, },
{ .command = "copy-line", { .command = "copy-line",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_line .f = window_copy_cmd_copy_line
}, },
{ .command = "copy-line-and-cancel", { .command = "copy-line-and-cancel",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_line_and_cancel .f = window_copy_cmd_copy_line_and_cancel
}, },
{ .command = "copy-pipe-line", { .command = "copy-pipe-line",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe_line .f = window_copy_cmd_copy_pipe_line
}, },
{ .command = "copy-pipe-line-and-cancel", { .command = "copy-pipe-line-and-cancel",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe_line_and_cancel .f = window_copy_cmd_copy_pipe_line_and_cancel
}, },
{ .command = "copy-pipe-no-clear", { .command = "copy-pipe-no-clear",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_NEVER, .clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_copy_pipe_no_clear .f = window_copy_cmd_copy_pipe_no_clear
}, },
{ .command = "copy-pipe", { .command = "copy-pipe",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe .f = window_copy_cmd_copy_pipe
}, },
{ .command = "copy-pipe-and-cancel", { .command = "copy-pipe-and-cancel",
.args = { "CP", 0, 2, NULL }, .args = { "CP", 0, 2, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_pipe_and_cancel .f = window_copy_cmd_copy_pipe_and_cancel
}, },
{ .command = "copy-selection-no-clear", { .command = "copy-selection-no-clear",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_NEVER, .clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_copy_selection_no_clear .f = window_copy_cmd_copy_selection_no_clear
}, },
{ .command = "copy-selection", { .command = "copy-selection",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_selection .f = window_copy_cmd_copy_selection
}, },
{ .command = "copy-selection-and-cancel", { .command = "copy-selection-and-cancel",
.args = { "CP", 0, 1, NULL }, .args = { "CP", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_copy_selection_and_cancel .f = window_copy_cmd_copy_selection_and_cancel
}, },
{ .command = "cursor-down", { .command = "cursor-down",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_cursor_down .f = window_copy_cmd_cursor_down
}, },
{ .command = "cursor-down-and-cancel", { .command = "cursor-down-and-cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_cursor_down_and_cancel .f = window_copy_cmd_cursor_down_and_cancel
}, },
{ .command = "cursor-left", { .command = "cursor-left",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_cursor_left .f = window_copy_cmd_cursor_left
}, },
{ .command = "cursor-right", { .command = "cursor-right",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_cursor_right .f = window_copy_cmd_cursor_right
}, },
{ .command = "cursor-up", { .command = "cursor-up",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_cursor_up .f = window_copy_cmd_cursor_up
}, },
{ .command = "cursor-centre-vertical", { .command = "cursor-centre-vertical",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_centre_vertical, .f = window_copy_cmd_centre_vertical,
}, },
{ .command = "cursor-centre-horizontal", { .command = "cursor-centre-horizontal",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_centre_horizontal, .f = window_copy_cmd_centre_horizontal,
}, },
{ .command = "end-of-line", { .command = "end-of-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_end_of_line .f = window_copy_cmd_end_of_line
}, },
{ .command = "goto-line", { .command = "goto-line",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_goto_line .f = window_copy_cmd_goto_line
}, },
{ .command = "halfpage-down", { .command = "halfpage-down",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_halfpage_down .f = window_copy_cmd_halfpage_down
}, },
{ .command = "halfpage-down-and-cancel", { .command = "halfpage-down-and-cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_halfpage_down_and_cancel .f = window_copy_cmd_halfpage_down_and_cancel
}, },
{ .command = "halfpage-up", { .command = "halfpage-up",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_halfpage_up .f = window_copy_cmd_halfpage_up
}, },
{ .command = "history-bottom", { .command = "history-bottom",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_history_bottom .f = window_copy_cmd_history_bottom
}, },
{ .command = "history-top", { .command = "history-top",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_history_top .f = window_copy_cmd_history_top
}, },
{ .command = "jump-again", { .command = "jump-again",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_again .f = window_copy_cmd_jump_again
}, },
{ .command = "jump-backward", { .command = "jump-backward",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_backward .f = window_copy_cmd_jump_backward
}, },
{ .command = "jump-forward", { .command = "jump-forward",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_forward .f = window_copy_cmd_jump_forward
}, },
{ .command = "jump-reverse", { .command = "jump-reverse",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_reverse .f = window_copy_cmd_jump_reverse
}, },
{ .command = "jump-to-backward", { .command = "jump-to-backward",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_to_backward .f = window_copy_cmd_jump_to_backward
}, },
{ .command = "jump-to-forward", { .command = "jump-to-forward",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_jump_to_forward .f = window_copy_cmd_jump_to_forward
}, },
{ .command = "jump-to-mark", { .command = "jump-to-mark",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_jump_to_mark .f = window_copy_cmd_jump_to_mark
}, },
{ .command = "next-prompt", { .command = "next-prompt",
.args = { "o", 0, 0, NULL }, .args = { "o", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_next_prompt .f = window_copy_cmd_next_prompt
}, },
{ .command = "previous-prompt", { .command = "previous-prompt",
.args = { "o", 0, 0, NULL }, .args = { "o", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_previous_prompt .f = window_copy_cmd_previous_prompt
}, },
{ .command = "middle-line", { .command = "middle-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_middle_line .f = window_copy_cmd_middle_line
}, },
{ .command = "next-matching-bracket", { .command = "next-matching-bracket",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_next_matching_bracket .f = window_copy_cmd_next_matching_bracket
}, },
{ .command = "next-paragraph", { .command = "next-paragraph",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_next_paragraph .f = window_copy_cmd_next_paragraph
}, },
{ .command = "next-space", { .command = "next-space",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_next_space .f = window_copy_cmd_next_space
}, },
{ .command = "next-space-end", { .command = "next-space-end",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_next_space_end .f = window_copy_cmd_next_space_end
}, },
{ .command = "next-word", { .command = "next-word",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_next_word .f = window_copy_cmd_next_word
}, },
{ .command = "next-word-end", { .command = "next-word-end",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_next_word_end .f = window_copy_cmd_next_word_end
}, },
{ .command = "other-end", { .command = "other-end",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_other_end .f = window_copy_cmd_other_end
}, },
{ .command = "page-down", { .command = "page-down",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_page_down .f = window_copy_cmd_page_down
}, },
{ .command = "page-down-and-cancel", { .command = "page-down-and-cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_page_down_and_cancel .f = window_copy_cmd_page_down_and_cancel
}, },
{ .command = "page-up", { .command = "page-up",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_page_up .f = window_copy_cmd_page_up
}, },
{ .command = "pipe-no-clear", { .command = "pipe-no-clear",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_NEVER, .clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_pipe_no_clear .f = window_copy_cmd_pipe_no_clear
}, },
{ .command = "pipe", { .command = "pipe",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_pipe .f = window_copy_cmd_pipe
}, },
{ .command = "pipe-and-cancel", { .command = "pipe-and-cancel",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_pipe_and_cancel .f = window_copy_cmd_pipe_and_cancel
}, },
{ .command = "previous-matching-bracket", { .command = "previous-matching-bracket",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_previous_matching_bracket .f = window_copy_cmd_previous_matching_bracket
}, },
{ .command = "previous-paragraph", { .command = "previous-paragraph",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_previous_paragraph .f = window_copy_cmd_previous_paragraph
}, },
{ .command = "previous-space", { .command = "previous-space",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_previous_space .f = window_copy_cmd_previous_space
}, },
{ .command = "previous-word", { .command = "previous-word",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_previous_word .f = window_copy_cmd_previous_word
}, },
{ .command = "rectangle-on", { .command = "rectangle-on",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_rectangle_on .f = window_copy_cmd_rectangle_on
}, },
{ .command = "rectangle-off", { .command = "rectangle-off",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_rectangle_off .f = window_copy_cmd_rectangle_off
}, },
{ .command = "rectangle-toggle", { .command = "rectangle-toggle",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_rectangle_toggle .f = window_copy_cmd_rectangle_toggle
}, },
{ .command = "refresh-from-pane", { .command = "refresh-from-pane",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_refresh_from_pane .f = window_copy_cmd_refresh_from_pane
}, },
{ .command = "scroll-bottom", { .command = "scroll-bottom",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_scroll_bottom .f = window_copy_cmd_scroll_bottom
}, },
{ .command = "scroll-down", { .command = "scroll-down",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_scroll_down .f = window_copy_cmd_scroll_down
}, },
{ .command = "scroll-down-and-cancel", { .command = "scroll-down-and-cancel",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_scroll_down_and_cancel .f = window_copy_cmd_scroll_down_and_cancel
}, },
@@ -3124,101 +3197,121 @@ static const struct {
}, },
{ .command = "scroll-middle", { .command = "scroll-middle",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_scroll_middle .f = window_copy_cmd_scroll_middle
}, },
{ .command = "scroll-to-mouse", { .command = "scroll-to-mouse",
.args = { "e", 0, 0, NULL }, .args = { "e", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_scroll_to_mouse .f = window_copy_cmd_scroll_to_mouse
}, },
{ .command = "scroll-top", { .command = "scroll-top",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_scroll_top .f = window_copy_cmd_scroll_top
}, },
{ .command = "scroll-up", { .command = "scroll-up",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_scroll_up .f = window_copy_cmd_scroll_up
}, },
{ .command = "search-again", { .command = "search-again",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_again .f = window_copy_cmd_search_again
}, },
{ .command = "search-backward", { .command = "search-backward",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_backward .f = window_copy_cmd_search_backward
}, },
{ .command = "search-backward-text", { .command = "search-backward-text",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_backward_text .f = window_copy_cmd_search_backward_text
}, },
{ .command = "search-backward-incremental", { .command = "search-backward-incremental",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_backward_incremental .f = window_copy_cmd_search_backward_incremental
}, },
{ .command = "search-forward", { .command = "search-forward",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_forward .f = window_copy_cmd_search_forward
}, },
{ .command = "search-forward-text", { .command = "search-forward-text",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_forward_text .f = window_copy_cmd_search_forward_text
}, },
{ .command = "search-forward-incremental", { .command = "search-forward-incremental",
.args = { "", 1, 1, NULL }, .args = { "", 1, 1, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_forward_incremental .f = window_copy_cmd_search_forward_incremental
}, },
{ .command = "search-reverse", { .command = "search-reverse",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_search_reverse .f = window_copy_cmd_search_reverse
}, },
{ .command = "select-line", { .command = "select-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_select_line .f = window_copy_cmd_select_line
}, },
{ .command = "select-word", { .command = "select-word",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_select_word .f = window_copy_cmd_select_word
}, },
{ .command = "selection-mode", { .command = "selection-mode",
.args = { "", 0, 1, NULL }, .args = { "", 0, 1, NULL },
.flags = 0,
.clear = 0, .clear = 0,
.f = window_copy_cmd_selection_mode .f = window_copy_cmd_selection_mode
}, },
{ .command = "set-mark", { .command = "set-mark",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_set_mark .f = window_copy_cmd_set_mark
}, },
{ .command = "start-of-line", { .command = "start-of-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_start_of_line .f = window_copy_cmd_start_of_line
}, },
{ .command = "stop-selection", { .command = "stop-selection",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = 0,
.clear = WINDOW_COPY_CMD_CLEAR_ALWAYS, .clear = WINDOW_COPY_CMD_CLEAR_ALWAYS,
.f = window_copy_cmd_stop_selection .f = window_copy_cmd_stop_selection
}, },
{ .command = "toggle-position", { .command = "toggle-position",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_NEVER, .clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_toggle_position .f = window_copy_cmd_toggle_position
}, },
{ .command = "top-line", { .command = "top-line",
.args = { "", 0, 0, NULL }, .args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY, .clear = WINDOW_COPY_CMD_CLEAR_EMACS_ONLY,
.f = window_copy_cmd_top_line .f = window_copy_cmd_top_line
} }
@@ -3258,6 +3351,14 @@ window_copy_command(struct window_mode_entry *wme, struct client *c,
action = WINDOW_COPY_CMD_NOTHING; action = WINDOW_COPY_CMD_NOTHING;
for (i = 0; i < nitems(window_copy_cmd_table); i++) { for (i = 0; i < nitems(window_copy_cmd_table); i++) {
if (strcmp(window_copy_cmd_table[i].command, command) == 0) { if (strcmp(window_copy_cmd_table[i].command, command) == 0) {
if (c->flags & CLIENT_READONLY &&
(~window_copy_cmd_table[i].flags &
WINDOW_COPY_CMD_FLAG_READONLY)) {
status_message_set(c, -1, 1, 0, 0,
"client is read-only");
return;
}
cs.wargs = args_parse(&window_copy_cmd_table[i].args, cs.wargs = args_parse(&window_copy_cmd_table[i].args,
args_values(args), count, &error); args_values(args), count, &error);