aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arguments.c27
-rw-r--r--cfg.c18
-rw-r--r--cmd-attach-session.c4
-rw-r--r--cmd-bind-key.c61
-rw-r--r--cmd-break-pane.c4
-rw-r--r--cmd-capture-pane.c21
-rw-r--r--cmd-choose-buffer.c4
-rw-r--r--cmd-choose-client.c8
-rw-r--r--cmd-choose-tree.c4
-rw-r--r--cmd-clear-history.c4
-rw-r--r--cmd-command-prompt.c22
-rw-r--r--cmd-confirm-before.c12
-rw-r--r--cmd-copy-mode.c4
-rw-r--r--cmd-detach-client.c4
-rw-r--r--cmd-display-message.c4
-rw-r--r--cmd-find-window.c18
-rw-r--r--cmd-find.c98
-rw-r--r--cmd-if-shell.c16
-rw-r--r--cmd-join-pane.c18
-rw-r--r--cmd-kill-pane.c4
-rw-r--r--cmd-kill-server.c4
-rw-r--r--cmd-kill-session.c4
-rw-r--r--cmd-kill-window.c4
-rw-r--r--cmd-list-buffers.c4
-rw-r--r--cmd-list-clients.c4
-rw-r--r--cmd-list-keys.c24
-rw-r--r--cmd-list-panes.c20
-rw-r--r--cmd-list-sessions.c4
-rw-r--r--cmd-list-windows.c14
-rw-r--r--cmd-load-buffer.c9
-rw-r--r--cmd-lock-server.c4
-rw-r--r--cmd-move-window.c4
-rw-r--r--cmd-new-session.c4
-rw-r--r--cmd-new-window.c4
-rw-r--r--cmd-paste-buffer.c7
-rw-r--r--cmd-pipe-pane.c8
-rw-r--r--cmd-queue.c3
-rw-r--r--cmd-refresh-client.c4
-rw-r--r--cmd-rename-session.c4
-rw-r--r--cmd-rename-window.c4
-rw-r--r--cmd-resize-pane.c15
-rw-r--r--cmd-respawn-pane.c4
-rw-r--r--cmd-respawn-window.c4
-rw-r--r--cmd-rotate-window.c4
-rw-r--r--cmd-run-shell.c16
-rw-r--r--cmd-save-buffer.c4
-rw-r--r--cmd-select-layout.c4
-rw-r--r--cmd-select-pane.c4
-rw-r--r--cmd-select-window.c4
-rw-r--r--cmd-send-keys.c40
-rw-r--r--cmd-set-buffer.c4
-rw-r--r--cmd-set-environment.c4
-rw-r--r--cmd-set-hook.c4
-rw-r--r--cmd-set-option.c60
-rw-r--r--cmd-show-environment.c14
-rw-r--r--cmd-show-messages.c12
-rw-r--r--cmd-show-options.c16
-rw-r--r--cmd-source-file.c8
-rw-r--r--cmd-split-window.c4
-rw-r--r--cmd-string.c31
-rw-r--r--cmd-swap-pane.c4
-rw-r--r--cmd-swap-window.c4
-rw-r--r--cmd-switch-client.c4
-rw-r--r--cmd-unbind-key.c10
-rw-r--r--cmd-wait-for.c45
-rw-r--r--environ.c7
-rw-r--r--format.c126
-rw-r--r--grid.c40
-rw-r--r--hooks.c3
-rw-r--r--job.c8
-rw-r--r--key-bindings.c140
-rw-r--r--key-string.c8
-rw-r--r--layout-set.c20
-rw-r--r--mode-key.c581
-rw-r--r--names.c12
-rw-r--r--notify.c15
-rw-r--r--options.c3
-rw-r--r--osdep-openbsd.c10
-rw-r--r--paste.c4
-rw-r--r--screen-redraw.c54
-rw-r--r--screen.c16
-rw-r--r--server-client.c212
-rw-r--r--server-fn.c11
-rw-r--r--server.c39
-rw-r--r--session.c32
-rw-r--r--signal.c12
-rw-r--r--status.c386
-rw-r--r--tmux.1204
-rw-r--r--tmux.c13
-rw-r--r--tmux.h113
-rw-r--r--tty-keys.c4
-rw-r--r--tty-term.c10
-rw-r--r--tty.c94
-rw-r--r--utf8.c27
-rw-r--r--window-choose.c109
-rw-r--r--window-clock.c34
-rw-r--r--window-copy.c1130
-rw-r--r--window.c19
98 files changed, 2096 insertions, 2215 deletions
diff --git a/arguments.c b/arguments.c
index 9e096353..5a2ea41b 100644
--- a/arguments.c
+++ b/arguments.c
@@ -34,6 +34,7 @@ struct args_entry {
RB_ENTRY(args_entry) entry;
};
+static void args_set(struct args *, u_char, const char *);
static struct args_entry *args_find(struct args *, u_char);
static int args_cmp(struct args_entry *, struct args_entry *);
@@ -46,30 +47,6 @@ args_cmp(struct args_entry *a1, struct args_entry *a2)
return (a1->flag - a2->flag);
}
-/* Create an arguments set with no flags. */
-struct args *
-args_create(int argc, ...)
-{
- struct args *args;
- va_list ap;
- int i;
-
- args = xcalloc(1, sizeof *args);
-
- args->argc = argc;
- if (argc == 0)
- args->argv = NULL;
- else
- args->argv = xcalloc(argc, sizeof *args->argv);
-
- va_start(ap, argc);
- for (i = 0; i < argc; i++)
- args->argv[i] = xstrdup(va_arg(ap, char *));
- va_end(ap);
-
- return (args);
-}
-
/* Find a flag in the arguments tree. */
static struct args_entry *
args_find(struct args *args, u_char ch)
@@ -205,7 +182,7 @@ args_has(struct args *args, u_char ch)
}
/* Set argument value in the arguments tree. */
-void
+static void
args_set(struct args *args, u_char ch, const char *value)
{
struct args_entry *entry;
diff --git a/cfg.c b/cfg.c
index 32a92e1b..463c42a2 100644
--- a/cfg.c
+++ b/cfg.c
@@ -27,15 +27,15 @@
#include "tmux.h"
-char *cfg_file;
-struct cmd_q *cfg_cmd_q;
-int cfg_finished;
-int cfg_references;
-char **cfg_causes;
-u_int cfg_ncauses;
-struct client *cfg_client;
+char *cfg_file;
+static struct cmd_q *cfg_cmd_q;
+int cfg_finished;
+int cfg_references;
+static char **cfg_causes;
+static u_int cfg_ncauses;
+struct client *cfg_client;
-void cfg_default_done(struct cmd_q *);
+static void cfg_default_done(struct cmd_q *);
void
set_cfg_file(const char *path)
@@ -125,7 +125,7 @@ load_cfg(const char *path, struct cmd_q *cmdq, int quiet)
return (found);
}
-void
+static void
cfg_default_done(__unused struct cmd_q *cmdq)
{
if (--cfg_references != 0)
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 53c1df31..daab428f 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -30,7 +30,7 @@
* Attach existing session to the current terminal.
*/
-enum cmd_retval cmd_attach_session_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_attach_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_attach_session_entry = {
.name = "attach-session",
@@ -154,7 +154,7 @@ cmd_attach_session(struct cmd_q *cmdq, int dflag, int rflag, const char *cflag,
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_attach_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index 88767245..69314788 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -27,24 +27,24 @@
* Bind a key to a command, this recurses through cmd_*.
*/
-enum cmd_retval cmd_bind_key_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_bind_key_exec(struct cmd *, struct cmd_q *);
-enum cmd_retval cmd_bind_key_mode_table(struct cmd *, struct cmd_q *,
- key_code);
+static enum cmd_retval cmd_bind_key_mode_table(struct cmd *, struct cmd_q *,
+ key_code);
const struct cmd_entry cmd_bind_key_entry = {
.name = "bind-key",
.alias = "bind",
- .args = { "cnrR:t:T:", 1, -1 },
- .usage = "[-cnr] [-t mode-table] [-R repeat-count] [-T key-table] key "
+ .args = { "cnrt:T:", 1, -1 },
+ .usage = "[-cnr] [-t mode-table] [-T key-table] key "
"command [arguments]",
.flags = 0,
.exec = cmd_bind_key_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_bind_key_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -93,16 +93,14 @@ cmd_bind_key_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
{
struct args *args = self->args;
- const char *tablename, *arg;
+ const char *tablename;
const struct mode_key_table *mtab;
struct mode_key_binding *mbind, mtmp;
enum mode_key_cmd cmd;
- char *cause;
- u_int repeat;
tablename = args_get(args, 't');
if ((mtab = mode_key_findtable(tablename)) == NULL) {
@@ -116,44 +114,9 @@ cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
return (CMD_RETURN_ERROR);
}
- switch (cmd) {
- case MODEKEYCOPY_APPENDSELECTION:
- case MODEKEYCOPY_COPYSELECTION:
- case MODEKEYCOPY_STARTNAMEDBUFFER:
- if (args->argc == 2)
- arg = NULL;
- else {
- arg = args->argv[2];
- if (strcmp(arg, "-x") != 0) {
- cmdq_error(cmdq, "unknown argument");
- return (CMD_RETURN_ERROR);
- }
- }
- break;
- case MODEKEYCOPY_COPYPIPE:
- if (args->argc != 3) {
- cmdq_error(cmdq, "no argument given");
- return (CMD_RETURN_ERROR);
- }
- arg = args->argv[2];
- break;
- default:
- if (args->argc != 2) {
- cmdq_error(cmdq, "no argument allowed");
- return (CMD_RETURN_ERROR);
- }
- arg = NULL;
- break;
- }
-
- repeat = 1;
- if (args_has(args, 'R')) {
- repeat = args_strtonum(args, 'R', 1, SHRT_MAX, &cause);
- if (cause != NULL) {
- cmdq_error(cmdq, "repeat count %s", cause);
- free(cause);
- return (CMD_RETURN_ERROR);
- }
+ if (args->argc != 2) {
+ cmdq_error(cmdq, "no argument allowed");
+ return (CMD_RETURN_ERROR);
}
mtmp.key = key;
@@ -164,8 +127,6 @@ cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
mbind->mode = mtmp.mode;
RB_INSERT(mode_key_tree, mtab->tree, mbind);
}
- mbind->repeat = repeat;
mbind->cmd = cmd;
- mbind->arg = arg != NULL ? xstrdup(arg) : NULL;
return (CMD_RETURN_NORMAL);
}
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index 85873227..b57542aa 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -28,7 +28,7 @@
#define BREAK_PANE_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
-enum cmd_retval cmd_break_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_break_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_break_pane_entry = {
.name = "break-pane",
@@ -44,7 +44,7 @@ const struct cmd_entry cmd_break_pane_entry = {
.exec = cmd_break_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_break_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index 33f6cf08..e468674d 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -27,13 +27,14 @@
* Write the entire contents of a pane to a buffer or stdout.
*/
-enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *);
-char *cmd_capture_pane_append(char *, size_t *, char *, size_t);
-char *cmd_capture_pane_pending(struct args *, struct window_pane *,
- size_t *);
-char *cmd_capture_pane_history(struct args *, struct cmd_q *,
- struct window_pane *, size_t *);
+static char *cmd_capture_pane_append(char *, size_t *, char *,
+ size_t);
+static char *cmd_capture_pane_pending(struct args *,
+ struct window_pane *, size_t *);
+static char *cmd_capture_pane_history(struct args *, struct cmd_q *,
+ struct window_pane *, size_t *);
const struct cmd_entry cmd_capture_pane_entry = {
.name = "capture-pane",
@@ -49,7 +50,7 @@ const struct cmd_entry cmd_capture_pane_entry = {
.exec = cmd_capture_pane_exec
};
-char *
+static char *
cmd_capture_pane_append(char *buf, size_t *len, char *line, size_t linelen)
{
buf = xrealloc(buf, *len + linelen + 1);
@@ -58,7 +59,7 @@ cmd_capture_pane_append(char *buf, size_t *len, char *line, size_t linelen)
return (buf);
}
-char *
+static char *
cmd_capture_pane_pending(struct args *args, struct window_pane *wp,
size_t *len)
{
@@ -90,7 +91,7 @@ cmd_capture_pane_pending(struct args *args, struct window_pane *wp,
return (buf);
}
-char *
+static char *
cmd_capture_pane_history(struct args *args, struct cmd_q *cmdq,
struct window_pane *wp, size_t *len)
{
@@ -175,7 +176,7 @@ cmd_capture_pane_history(struct args *args, struct cmd_q *cmdq,
return (buf);
}
-enum cmd_retval
+static enum cmd_retval
cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index 90872e90..fee4958a 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -30,7 +30,7 @@
#define CHOOSE_BUFFER_TEMPLATE \
"#{buffer_name}: #{buffer_size} bytes: #{buffer_sample}"
-enum cmd_retval cmd_choose_buffer_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_choose_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_choose_buffer_entry = {
.name = "choose-buffer",
@@ -45,7 +45,7 @@ const struct cmd_entry cmd_choose_buffer_entry = {
.exec = cmd_choose_buffer_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index b9a24be6..67d184b3 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -33,9 +33,9 @@
"#{?client_utf8, (utf8),}#{?client_readonly, (ro),} " \
"(last used #{t:client_activity})"
-enum cmd_retval cmd_choose_client_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_choose_client_exec(struct cmd *, struct cmd_q *);
-void cmd_choose_client_callback(struct window_choose_data *);
+static void cmd_choose_client_callback(struct window_choose_data *);
const struct cmd_entry cmd_choose_client_entry = {
.name = "choose-client",
@@ -54,7 +54,7 @@ struct cmd_choose_client_data {
struct client *client;
};
-enum cmd_retval
+static enum cmd_retval
cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -110,7 +110,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-void
+static void
cmd_choose_client_callback(struct window_choose_data *cdata)
{
struct client *c;
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index db9222ba..13bbe2a7 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -41,7 +41,7 @@
"#{window_index}: #{window_name}#{window_flags} " \
"\"#{pane_title}\""
-enum cmd_retval cmd_choose_tree_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_choose_tree_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_choose_tree_entry = {
.name = "choose-tree",
@@ -83,7 +83,7 @@ const struct cmd_entry cmd_choose_window_entry = {
.exec = cmd_choose_tree_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-clear-history.c b/cmd-clear-history.c
index 62683ff6..a1da256d 100644
--- a/cmd-clear-history.c
+++ b/cmd-clear-history.c
@@ -24,7 +24,7 @@
* Clear pane history.
*/
-enum cmd_retval cmd_clear_history_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_clear_history_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_clear_history_entry = {
.name = "clear-history",
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_clear_history_entry = {
.exec = cmd_clear_history_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_clear_history_exec(__unused struct cmd *self, struct cmd_q *cmdq)
{
struct window_pane *wp = cmdq->state.tflag.wp;
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index 3ec22865..09ab9813 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -29,17 +29,17 @@
* Prompt for command in client.
*/
-enum cmd_retval cmd_command_prompt_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_command_prompt_exec(struct cmd *, struct cmd_q *);
-int cmd_command_prompt_callback(void *, const char *);
-void cmd_command_prompt_free(void *);
+static int cmd_command_prompt_callback(void *, const char *);
+static void cmd_command_prompt_free(void *);
const struct cmd_entry cmd_command_prompt_entry = {
.name = "command-prompt",
.alias = NULL,
- .args = { "I:p:t:", 0, 1 },
- .usage = "[-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " "
+ .args = { "1I:p:t:", 0, 1 },
+ .usage = "[-1] [-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " "
"[template]",
.tflag = CMD_CLIENT,
@@ -58,7 +58,7 @@ struct cmd_command_prompt_cdata {
int idx;
};
-enum cmd_retval
+static enum cmd_retval
cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -67,6 +67,7 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
struct client *c = cmdq->state.c;
char *prompt, *ptr, *input = NULL;
size_t n;
+ int flags;
if (c->prompt_string != NULL)
return (CMD_RETURN_NORMAL);
@@ -108,14 +109,17 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
input = strsep(&cdata->next_input, ",");
}
+ flags = 0;
+ if (args_has(args, '1'))
+ flags |= PROMPT_SINGLE;
status_prompt_set(c, prompt, input, cmd_command_prompt_callback,
- cmd_command_prompt_free, cdata, 0);
+ cmd_command_prompt_free, cdata, flags);
free(prompt);
return (CMD_RETURN_NORMAL);
}
-int
+static int
cmd_command_prompt_callback(void *data, const char *s)
{
struct cmd_command_prompt_cdata *cdata = data;
@@ -162,7 +166,7 @@ cmd_command_prompt_callback(void *data, const char *s)
return (0);
}
-void
+static void
cmd_command_prompt_free(void *data)
{
struct cmd_command_prompt_cdata *cdata = data;
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index b5a12821..4241aefb 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -28,10 +28,10 @@
* Asks for confirmation before executing a command.
*/
-enum cmd_retval cmd_confirm_before_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_confirm_before_exec(struct cmd *, struct cmd_q *);
-int cmd_confirm_before_callback(void *, const char *);
-void cmd_confirm_before_free(void *);
+static int cmd_confirm_before_callback(void *, const char *);
+static void cmd_confirm_before_free(void *);
const struct cmd_entry cmd_confirm_before_entry = {
.name = "confirm-before",
@@ -51,7 +51,7 @@ struct cmd_confirm_before_data {
struct client *client;
};
-enum cmd_retval
+static enum cmd_retval
cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -83,7 +83,7 @@ cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-int
+static int
cmd_confirm_before_callback(void *data, const char *s)
{
struct cmd_confirm_before_data *cdata = data;
@@ -113,7 +113,7 @@ cmd_confirm_before_callback(void *data, const char *s)
return (0);
}
-void
+static void
cmd_confirm_before_free(void *data)
{
struct cmd_confirm_before_data *cdata = data;
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index d785e893..6b99c347 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -24,7 +24,7 @@
* Enter copy or clock mode.
*/
-enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_copy_mode_entry = {
.name = "copy-mode",
@@ -52,7 +52,7 @@ const struct cmd_entry cmd_clock_mode_entry = {
.exec = cmd_copy_mode_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index 80c6555f..814ba091 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -26,7 +26,7 @@
* Detach a client.
*/
-enum cmd_retval cmd_detach_client_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_detach_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_detach_client_entry = {
.name = "detach-client",
@@ -55,7 +55,7 @@ const struct cmd_entry cmd_suspend_client_entry = {
.exec = cmd_detach_client_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-display-message.c b/cmd-display-message.c
index 217d164a..05e84561 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -32,7 +32,7 @@
"#{window_name}, current pane #{pane_index} " \
"- (%H:%M %d-%b-%y)"
-enum cmd_retval cmd_display_message_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_display_message_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_display_message_entry = {
.name = "display-message",
@@ -49,7 +49,7 @@ const struct cmd_entry cmd_display_message_entry = {
.exec = cmd_display_message_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_display_message_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-find-window.c b/cmd-find-window.c
index 6324f26a..6ab6fbcf 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -33,9 +33,9 @@
"[#{window_width}x#{window_height}] " \
"(#{window_panes} panes) #{window_find_matches}"
-enum cmd_retval cmd_find_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_find_window_exec(struct cmd *, struct cmd_q *);
-void cmd_find_window_callback(struct window_choose_data *);
+static void cmd_find_window_callback(struct window_choose_data *);
/* Flags for determining matching behavior. */
#define CMD_FIND_WINDOW_BY_TITLE 0x1
@@ -68,11 +68,11 @@ struct cmd_find_window_data {
};
TAILQ_HEAD(cmd_find_window_list, cmd_find_window_data);
-u_int cmd_find_window_match_flags(struct args *);
-void cmd_find_window_match(struct cmd_find_window_list *, int,
- struct winlink *, const char *, const char *);
+static u_int cmd_find_window_match_flags(struct args *);
+static void cmd_find_window_match(struct cmd_find_window_list *, int,
+ struct winlink *, const char *, const char *);
-u_int
+static u_int
cmd_find_window_match_flags(struct args *args)
{
u_int match_flags = 0;
@@ -92,7 +92,7 @@ cmd_find_window_match_flags(struct args *args)
return (match_flags);
}
-void
+static void
cmd_find_window_match(struct cmd_find_window_list *find_list,
int match_flags, struct winlink *wl, const char *str,
const char *searchstr)
@@ -138,7 +138,7 @@ cmd_find_window_match(struct cmd_find_window_list *find_list,
free(find_data);
}
-enum cmd_retval
+static enum cmd_retval
cmd_find_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -216,7 +216,7 @@ out:
return (CMD_RETURN_NORMAL);
}
-void
+static void
cmd_find_window_callback(struct window_choose_data *cdata)
{
struct session *s;
diff --git a/cmd-find.c b/cmd-find.c
index f95c143b..890e4c97 100644
--- a/cmd-find.c
+++ b/cmd-find.c
@@ -26,33 +26,35 @@
#include "tmux.h"
-struct session *cmd_find_try_TMUX(struct client *, struct window *);
-int cmd_find_client_better(struct client *, struct client *);
-struct client *cmd_find_best_client(struct client **, u_int);
-int cmd_find_session_better(struct session *, struct session *,
- int);
-struct session *cmd_find_best_session(struct session **, u_int, int);
-int cmd_find_best_session_with_window(struct cmd_find_state *);
-int cmd_find_best_winlink_with_window(struct cmd_find_state *);
-
-int cmd_find_current_session_with_client(struct cmd_find_state *);
-int cmd_find_current_session(struct cmd_find_state *);
-struct client *cmd_find_current_client(struct cmd_q *);
-
-const char *cmd_find_map_table(const char *[][2], const char *);
-
-int cmd_find_get_session(struct cmd_find_state *, const char *);
-int cmd_find_get_window(struct cmd_find_state *, const char *);
-int cmd_find_get_window_with_session(struct cmd_find_state *, const char *);
-int cmd_find_get_window_with_pane(struct cmd_find_state *);
-int cmd_find_get_pane(struct cmd_find_state *, const char *);
-int cmd_find_get_pane_with_session(struct cmd_find_state *, const char *);
-int cmd_find_get_pane_with_window(struct cmd_find_state *, const char *);
-
-const char *cmd_find_session_table[][2] = {
+static struct session *cmd_find_try_TMUX(struct client *, struct window *);
+static int cmd_find_client_better(struct client *, struct client *);
+static struct client *cmd_find_best_client(struct client **, u_int);
+static int cmd_find_session_better(struct session *, struct session *,
+ int);
+static struct session *cmd_find_best_session(struct session **, u_int, int);
+static int cmd_find_best_session_with_window(struct cmd_find_state *);
+static int cmd_find_best_winlink_with_window(struct cmd_find_state *);
+
+static int cmd_find_current_session_with_client(struct cmd_find_state *);
+static int cmd_find_current_session(struct cmd_find_state *);
+static struct client *cmd_find_current_client(struct cmd_q *);
+
+static const char *cmd_find_map_table(const char *[][2], const char *);
+
+static int cmd_find_get_session(struct cmd_find_state *, const char *);
+static int cmd_find_get_window(struct cmd_find_state *, const char *);
+static int cmd_find_get_window_with_session(struct cmd_find_state *,
+ const char *);
+static int cmd_find_get_pane(struct cmd_find_state *, const char *);
+static int cmd_find_get_pane_with_session(struct cmd_find_state *,
+ const char *);
+static int cmd_find_get_pane_with_window(struct cmd_find_state *,
+ const char *);
+
+static const char *cmd_find_session_table[][2] = {
{ NULL, NULL }
};
-const char *cmd_find_window_table[][2] = {
+static const char *cmd_find_window_table[][2] = {
{ "{start}", "^" },
{ "{last}", "!" },
{ "{end}", "$" },
@@ -60,7 +62,7 @@ const char *cmd_find_window_table[][2] = {
{ "{previous}", "-" },
{ NULL, NULL }
};
-const char *cmd_find_pane_table[][2] = {
+static const char *cmd_find_pane_table[][2] = {
{ "{last}", "!" },
{ "{next}", "+" },
{ "{previous}", "-" },
@@ -80,7 +82,7 @@ const char *cmd_find_pane_table[][2] = {
};
/* Get session from TMUX if present. */
-struct session *
+static struct session *
cmd_find_try_TMUX(struct client *c, struct window *w)
{
struct environ_entry *envent;
@@ -107,7 +109,7 @@ cmd_find_try_TMUX(struct client *c, struct window *w)
}
/* Is this client better? */
-int
+static int
cmd_find_client_better(struct client *c, struct client *than)
{
if (than == NULL)
@@ -116,7 +118,7 @@ cmd_find_client_better(struct client *c, struct client *than)
}
/* Find best client from a list, or all if list is NULL. */
-struct client *
+static struct client *
cmd_find_best_client(struct client **clist, u_int csize)
{
struct client *c_loop, *c;
@@ -142,7 +144,7 @@ cmd_find_best_client(struct client **clist, u_int csize)
}
/* Is this session better? */
-int
+static int
cmd_find_session_better(struct session *s, struct session *than, int flags)
{
int attached;
@@ -160,7 +162,7 @@ cmd_find_session_better(struct session *s, struct session *than, int flags)
}
/* Find best session from a list, or all if list is NULL. */
-struct session *
+static struct session *
cmd_find_best_session(struct session **slist, u_int ssize, int flags)
{
struct session *s_loop, *s;
@@ -182,7 +184,7 @@ cmd_find_best_session(struct session **slist, u_int ssize, int flags)
}
/* Find best session and winlink for window. */
-int
+static int
cmd_find_best_session_with_window(struct cmd_find_state *fs)
{
struct session **slist = NULL;
@@ -219,7 +221,7 @@ fail:
* Find the best winlink for a window (the current if it contains the pane,
* otherwise the first).
*/
-int
+static int
cmd_find_best_winlink_with_window(struct cmd_find_state *fs)
{
struct winlink *wl, *wl_loop;
@@ -243,7 +245,7 @@ cmd_find_best_winlink_with_window(struct cmd_find_state *fs)
}
/* Find current session when we have an unattached client. */
-int
+static int
cmd_find_current_session_with_client(struct cmd_find_state *fs)
{
struct window_pane *wp;
@@ -307,7 +309,7 @@ unknown_pane:
* Work out the best current state. If this function succeeds, the state is
* guaranteed to be completely filled in.
*/
-int
+static int
cmd_find_current_session(struct cmd_find_state *fs)
{
/* If we know the current client, use it. */
@@ -337,7 +339,7 @@ cmd_find_current_session(struct cmd_find_state *fs)
}
/* Work out the best current client. */
-struct client *
+static struct client *
cmd_find_current_client(struct cmd_q *cmdq)
{
struct cmd_find_state current;
@@ -383,7 +385,7 @@ cmd_find_current_client(struct cmd_q *cmdq)
}
/* Maps string in table. */
-const char *
+static const char *
cmd_find_map_table(const char *table[][2], const char *s)
{
u_int i;
@@ -396,7 +398,7 @@ cmd_find_map_table(const char *table[][2], const char *s)
}
/* Find session from string. Fills in s. */
-int
+static int
cmd_find_get_session(struct cmd_find_state *fs, const char *session)
{
struct session *s, *s_loop;
@@ -460,7 +462,7 @@ cmd_find_get_session(struct cmd_find_state *fs, const char *session)
}
/* Find window from string. Fills in s, wl, w. */
-int
+static int
cmd_find_get_window(struct cmd_find_state *fs, const char *window)
{
log_debug("%s: %s", __func__, window);
@@ -496,7 +498,7 @@ cmd_find_get_window(struct cmd_find_state *fs, const char *window)
* Find window from string, assuming it is in given session. Needs s, fills in
* wl and w.
*/
-int
+static int
cmd_find_get_window_with_session(struct cmd_find_state *fs, const char *window)
{
struct winlink *wl;
@@ -646,18 +648,8 @@ cmd_find_get_window_with_session(struct cmd_find_state *fs, const char *window)
return (-1);
}
-/* Find window from given pane. Needs wp, fills in s and wl and w. */
-int
-cmd_find_get_window_with_pane(struct cmd_find_state *fs)
-{
- log_debug("%s", __func__);
-
- fs->w = fs->wp->window;
- return (cmd_find_best_session_with_window(fs));
-}
-
/* Find pane from string. Fills in s, wl, w, wp. */
-int
+static int
cmd_find_get_pane(struct cmd_find_state *fs, const char *pane)
{
log_debug("%s: %s", __func__, pane);
@@ -694,7 +686,7 @@ cmd_find_get_pane(struct cmd_find_state *fs, const char *pane)
* Find pane from string, assuming it is in given session. Needs s, fills in wl
* and w and wp.
*/
-int
+static int
cmd_find_get_pane_with_session(struct cmd_find_state *fs, const char *pane)
{
log_debug("%s: %s", __func__, pane);
@@ -721,7 +713,7 @@ cmd_find_get_pane_with_session(struct cmd_find_state *fs, const char *pane)
* Find pane from string, assuming it is in the given window. Needs w, fills in
* wp.
*/
-int
+static int
cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)
{
const char *errstr;
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index 3dc20cd1..615da2b6 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -29,11 +29,11 @@
* Executes a tmux command if a shell command returns true or false.
*/
-enum cmd_retval cmd_if_shell_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_if_shell_exec(struct cmd *, struct cmd_q *);
-void cmd_if_shell_callback(struct job *);
-void cmd_if_shell_done(struct cmd_q *);
-void cmd_if_shell_free(void *);
+static void cmd_if_shell_callback(struct job *);
+static void cmd_if_shell_done(struct cmd_q *);
+static void cmd_if_shell_free(void *);
const struct cmd_entry cmd_if_shell_entry = {
.name = "if-shell",
@@ -63,7 +63,7 @@ struct cmd_if_shell_data {
int references;
};
-enum cmd_retval
+static enum cmd_retval
cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -137,7 +137,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_WAIT);
}
-void
+static void
cmd_if_shell_callback(struct job *job)
{
struct cmd_if_shell_data *cdata = job->data;
@@ -174,7 +174,7 @@ cmd_if_shell_callback(struct job *job)
cmd_list_free(cmdlist);
}
-void
+static void
cmd_if_shell_done(struct cmd_q *cmdq1)
{
struct cmd_if_shell_data *cdata = cmdq1->data;
@@ -197,7 +197,7 @@ cmd_if_shell_done(struct cmd_q *cmdq1)
free(cdata);
}
-void
+static void
cmd_if_shell_free(void *data)
{
struct cmd_if_shell_data *cdata = data;
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index 933958a1..c5f6cc16 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -28,9 +28,7 @@
* Join or move a pane into another (like split/swap/kill).
*/
-enum cmd_retval cmd_join_pane_exec(struct cmd *, struct cmd_q *);
-
-enum cmd_retval join_pane(struct cmd *, struct cmd_q *, int);
+static enum cmd_retval cmd_join_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_join_pane_entry = {
.name = "join-pane",
@@ -60,15 +58,9 @@ const struct cmd_entry cmd_move_pane_entry = {
.exec = cmd_join_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_join_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
- return (join_pane(self, cmdq, self->entry == &cmd_join_pane_entry));
-}
-
-enum cmd_retval
-join_pane(struct cmd *self, struct cmd_q *cmdq, int not_same_window)
-{
struct args *args = self->args;
struct session *dst_s;
struct winlink *src_wl, *dst_wl;
@@ -78,6 +70,12 @@ join_pane(struct cmd *self, struct cmd_q *cmdq, int not_same_window)
int size, percentage, dst_idx;
enum layout_type type;
struct layout_cell *lc;
+ int not_same_window;
+
+ if (self->entry == &cmd_join_pane_entry)
+ not_same_window = 1;
+ else
+ not_same_window = 0;
dst_s = cmdq->state.tflag.s;
dst_wl = cmdq->state.tflag.wl;
diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index ebb2b8d6..76829aa3 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -26,7 +26,7 @@
* Kill pane.
*/
-enum cmd_retval cmd_kill_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_kill_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_pane_entry = {
.name = "kill-pane",
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_kill_pane_entry = {
.exec = cmd_kill_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_kill_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct winlink *wl = cmdq->state.tflag.wl;
diff --git a/cmd-kill-server.c b/cmd-kill-server.c
index d1940c33..bbb4e8a0 100644
--- a/cmd-kill-server.c
+++ b/cmd-kill-server.c
@@ -27,7 +27,7 @@
* Kill the server and do nothing else.
*/
-enum cmd_retval cmd_kill_server_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_kill_server_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_server_entry = {
.name = "kill-server",
@@ -51,7 +51,7 @@ const struct cmd_entry cmd_start_server_entry = {
.exec = cmd_kill_server_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_kill_server_exec(struct cmd *self, __unused struct cmd_q *cmdq)
{
if (self->entry == &cmd_kill_server_entry)
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index c77e45bb..ec7d5fb2 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -27,7 +27,7 @@
* Note this deliberately has no alias to make it hard to hit by accident.
*/
-enum cmd_retval cmd_kill_session_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_kill_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_session_entry = {
.name = "kill-session",
@@ -42,7 +42,7 @@ const struct cmd_entry cmd_kill_session_entry = {
.exec = cmd_kill_session_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_kill_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 9d388ce5..c7534d5c 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -24,7 +24,7 @@
* Destroy window.
*/
-enum cmd_retval cmd_kill_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_kill_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_window_entry = {
.name = "kill-window",
@@ -52,7 +52,7 @@ const struct cmd_entry cmd_unlink_window_entry = {
.exec = cmd_kill_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index 238b2776..41ad865b 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -30,7 +30,7 @@
#define LIST_BUFFERS_TEMPLATE \
"#{buffer_name}: #{buffer_size} bytes: \"#{buffer_sample}\""
-enum cmd_retval cmd_list_buffers_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_list_buffers_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_buffers_entry = {
.name = "list-buffers",
@@ -43,7 +43,7 @@ const struct cmd_entry cmd_list_buffers_entry = {
.exec = cmd_list_buffers_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_list_buffers_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index f318ac18..efe19652 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -33,7 +33,7 @@
"[#{client_width}x#{client_height} #{client_termname}]" \
"#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
-enum cmd_retval cmd_list_clients_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_list_clients_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_clients_entry = {
.name = "list-clients",
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_list_clients_entry = {
.exec = cmd_list_clients_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index d5f516fa..85cb4744 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -138,8 +138,7 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
const char *tablename, *key, *cmdstr, *mode;
const struct mode_key_table *mtab;
struct mode_key_binding *mbind;
- char repeat[16];
- int width, keywidth, repeatwidth, any_mode;
+ int width, keywidth, any_mode;
tablename = args_get(args, 't');
if ((mtab = mode_key_findtable(tablename)) == NULL) {
@@ -147,7 +146,7 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_ERROR);
}
- keywidth = repeatwidth = 0;
+ keywidth = 0;
any_mode = 0;
RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
key = key_string_lookup_key(mbind->key);
@@ -158,13 +157,6 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
width = strlen(key);
if (width > keywidth)
keywidth = width;
-
- if (mbind->repeat != 1) {
- snprintf(repeat, sizeof repeat, "%u", mbind->repeat);
- width = strlen(repeat);
- if (width > repeatwidth)
- repeatwidth = width;
- }
}
RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
@@ -173,20 +165,12 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
mode = "";
if (mbind->mode != 0)
mode = "c";
- snprintf(repeat, sizeof repeat, "%u", mbind->repeat);
cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
if (cmdstr != NULL) {
- cmdq_print(cmdq,
- "bind-key -%st %s%s%s%*s %*s %s%s%s%s",
+ cmdq_print(cmdq, "bind-key -%st %s%s %*s %s",
mode, any_mode && *mode == '\0' ? " " : "",
mtab->name,
- mbind->repeat != 1 ? " -R " :
- (repeatwidth == 0 ? "" : " "),
- repeatwidth, mbind->repeat != 1 ? repeat : "",
- (int)keywidth, key, cmdstr,
- mbind->arg != NULL ? " \"" : "",
- mbind->arg != NULL ? mbind->arg : "",
- mbind->arg != NULL ? "\"": "");
+ (int)keywidth, key, cmdstr);
}
}
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 76e06a71..9d78589a 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -26,13 +26,13 @@
* List panes on given window.
*/
-enum cmd_retval cmd_list_panes_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_list_panes_exec(struct cmd *, struct cmd_q *);
-void cmd_list_panes_server(struct cmd *, struct cmd_q *);
-void cmd_list_panes_session(struct cmd *, struct session *, struct cmd_q *,
- int);
-void cmd_list_panes_window(struct cmd *, struct session *, struct winlink *,
- struct cmd_q *, int);
+static void cmd_list_panes_server(struct cmd *, struct cmd_q *);
+static void cmd_list_panes_session(struct cmd *, struct session *,
+ struct cmd_q *, int);
+static void cmd_list_panes_window(struct cmd *, struct session *,
+ struct winlink *, struct cmd_q *, int);
const struct cmd_entry cmd_list_panes_entry = {
.name = "list-panes",
@@ -47,7 +47,7 @@ const struct cmd_entry cmd_list_panes_entry = {
.exec = cmd_list_panes_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -64,7 +64,7 @@ cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-void
+static void
cmd_list_panes_server(struct cmd *self, struct cmd_q *cmdq)
{
struct session *s;
@@ -73,7 +73,7 @@ cmd_list_panes_server(struct cmd *self, struct cmd_q *cmdq)
cmd_list_panes_session(self, s, cmdq, 2);
}
-void
+static void
cmd_list_panes_session(struct cmd *self, struct session *s, struct cmd_q *cmdq,
int type)
{
@@ -83,7 +83,7 @@ cmd_list_panes_session(struct cmd *self, struct session *s, struct cmd_q *cmdq,
cmd_list_panes_window(self, s, wl, cmdq, type);
}
-void
+static void
cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
struct cmd_q *cmdq, int type)
{
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index 27e80dbc..30a1f586 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -36,7 +36,7 @@
"#{session_group}#{?session_grouped,),}" \
"#{?session_attached, (attached),}"
-enum cmd_retval cmd_list_sessions_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_list_sessions_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_sessions_entry = {
.name = "list-sessions",
@@ -49,7 +49,7 @@ const struct cmd_entry cmd_list_sessions_entry = {
.exec = cmd_list_sessions_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_list_sessions_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index 11a5fddf..7ca49b3e 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -39,11 +39,11 @@
"(#{window_panes} panes) " \
"[#{window_width}x#{window_height}] "
-enum cmd_retval cmd_list_windows_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_list_windows_exec(struct cmd *, struct cmd_q *);
-void cmd_list_windows_server(struct cmd *, struct cmd_q *);
-void cmd_list_windows_session(struct cmd *, struct session *,
- struct cmd_q *, int);
+static void cmd_list_windows_server(struct cmd *, struct cmd_q *);
+static void cmd_list_windows_session(struct cmd *, struct session *,
+ struct cmd_q *, int);
const struct cmd_entry cmd_list_windows_entry = {
.name = "list-windows",
@@ -58,7 +58,7 @@ const struct cmd_entry cmd_list_windows_entry = {
.exec = cmd_list_windows_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_list_windows_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -71,7 +71,7 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-void
+static void
cmd_list_windows_server(struct cmd *self, struct cmd_q *cmdq)
{
struct session *s;
@@ -80,7 +80,7 @@ cmd_list_windows_server(struct cmd *self, struct cmd_q *cmdq)
cmd_list_windows_session(self, s, cmdq, 1);
}
-void
+static void
cmd_list_windows_session(struct cmd *self, struct session *s,
struct cmd_q *cmdq, int type)
{
diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c
index de76b855..d97d139c 100644
--- a/cmd-load-buffer.c
+++ b/cmd-load-buffer.c
@@ -31,8 +31,9 @@
* Loads a paste buffer from a file.
*/
-enum cmd_retval cmd_load_buffer_exec(struct cmd *, struct cmd_q *);
-void cmd_load_buffer_callback(struct client *, int, void *);
+static enum cmd_retval cmd_load_buffer_exec(struct cmd *, struct cmd_q *);
+
+static void cmd_load_buffer_callback(struct client *, int, void *);
const struct cmd_entry cmd_load_buffer_entry = {
.name = "load-buffer",
@@ -45,7 +46,7 @@ const struct cmd_entry cmd_load_buffer_entry = {
.exec = cmd_load_buffer_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_load_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -132,7 +133,7 @@ error:
return (CMD_RETURN_ERROR);
}
-void
+static void
cmd_load_buffer_callback(struct client *c, int closed, void *data)
{
const char *bufname = data;
diff --git a/cmd-lock-server.c b/cmd-lock-server.c
index 01597169..2eef9952 100644
--- a/cmd-lock-server.c
+++ b/cmd-lock-server.c
@@ -24,7 +24,7 @@
* Lock commands.
*/
-enum cmd_retval cmd_lock_server_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_lock_server_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_lock_server_entry = {
.name = "lock-server",
@@ -63,7 +63,7 @@ const struct cmd_entry cmd_lock_client_entry = {
.exec = cmd_lock_server_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_lock_server_exec(struct cmd *self, __unused struct cmd_q *cmdq)
{
if (self->entry == &cmd_lock_server_entry)
diff --git a/cmd-move-window.c b/cmd-move-window.c
index aa683b83..1d423646 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -26,7 +26,7 @@
* Move a window.
*/
-enum cmd_retval cmd_move_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_move_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_move_window_entry = {
.name = "move-window",
@@ -56,7 +56,7 @@ const struct cmd_entry cmd_link_window_entry = {
.exec = cmd_move_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 357ffed1..f48872fc 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -33,7 +33,7 @@
#define NEW_SESSION_TEMPLATE "#{session_name}:"
-enum cmd_retval cmd_new_session_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_new_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_new_session_entry = {
.name = "new-session",
@@ -63,7 +63,7 @@ const struct cmd_entry cmd_has_session_entry = {
.exec = cmd_new_session_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 2a647b9f..edd44150 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -32,7 +32,7 @@
#define NEW_WINDOW_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
-enum cmd_retval cmd_new_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_new_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_new_window_entry = {
.name = "new-window",
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_new_window_entry = {
.exec = cmd_new_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
index e0c29d28..9bb2af5f 100644
--- a/cmd-paste-buffer.c
+++ b/cmd-paste-buffer.c
@@ -27,10 +27,7 @@
* Paste paste buffer if present.
*/
-enum cmd_retval cmd_paste_buffer_exec(struct cmd *, struct cmd_q *);
-
-void cmd_paste_buffer_filter(struct window_pane *,
- const char *, size_t, const char *, int);
+static enum cmd_retval cmd_paste_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_paste_buffer_entry = {
.name = "paste-buffer",
@@ -46,7 +43,7 @@ const struct cmd_entry cmd_paste_buffer_entry = {
.exec = cmd_paste_buffer_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_paste_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index 0d13b356..7a99d352 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -32,9 +32,9 @@
* Open pipe to redirect pane output. If already open, close first.
*/
-enum cmd_retval cmd_pipe_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_pipe_pane_exec(struct cmd *, struct cmd_q *);
-void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *);
+static void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *);
const struct cmd_entry cmd_pipe_pane_entry = {
.name = "pipe-pane",
@@ -49,7 +49,7 @@ const struct cmd_entry cmd_pipe_pane_entry = {
.exec = cmd_pipe_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -141,7 +141,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
}
}
-void
+static void
cmd_pipe_pane_error_callback(__unused struct bufferevent *bufev,
__unused short what, void *data)
{
diff --git a/cmd-queue.c b/cmd-queue.c
index e9073c92..5a81f88e 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -26,6 +26,7 @@
#include "tmux.h"
static enum cmd_retval cmdq_continue_one(struct cmd_q *);
+static void cmdq_flush(struct cmd_q *);
/* Create new command queue. */
struct cmd_q *
@@ -319,7 +320,7 @@ out:
}
/* Flush command queue. */
-void
+static void
cmdq_flush(struct cmd_q *cmdq)
{
struct cmd_q_item *item, *item1;
diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c
index 79e5aad0..79747f2c 100644
--- a/cmd-refresh-client.c
+++ b/cmd-refresh-client.c
@@ -24,7 +24,7 @@
* Refresh client.
*/
-enum cmd_retval cmd_refresh_client_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_refresh_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_refresh_client_entry = {
.name = "refresh-client",
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_refresh_client_entry = {
.exec = cmd_refresh_client_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_refresh_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index b40f44f7..7e9fd015 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -26,7 +26,7 @@
* Change session name.
*/
-enum cmd_retval cmd_rename_session_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_rename_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rename_session_entry = {
.name = "rename-session",
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_rename_session_entry = {
.exec = cmd_rename_session_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_rename_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-rename-window.c b/cmd-rename-window.c
index a1f15eef..ee53fcb3 100644
--- a/cmd-rename-window.c
+++ b/cmd-rename-window.c
@@ -26,7 +26,7 @@
* Rename a window.
*/
-enum cmd_retval cmd_rename_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_rename_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rename_window_entry = {
.name = "rename-window",
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_rename_window_entry = {
.exec = cmd_rename_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_rename_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c
index fa52ab14..36726688 100644
--- a/cmd-resize-pane.c
+++ b/cmd-resize-pane.c
@@ -26,9 +26,10 @@
* Increase or decrease pane size.
*/
-enum cmd_retval cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
-void cmd_resize_pane_mouse_update(struct client *, struct mouse_event *);
+static void cmd_resize_pane_mouse_update(struct client *,
+ struct mouse_event *);
const struct cmd_entry cmd_resize_pane_entry = {
.name = "resize-pane",
@@ -44,7 +45,7 @@ const struct cmd_entry cmd_resize_pane_entry = {
.exec = cmd_resize_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -123,7 +124,7 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-void
+static void
cmd_resize_pane_mouse_update(struct client *c, struct mouse_event *m)
{
struct winlink *wl;
@@ -154,12 +155,14 @@ cmd_resize_pane_mouse_update(struct client *c, struct mouse_event *m)
continue;
if (wp->xoff + wp->sx == m->lx &&
- wp->yoff <= 1 + ly && wp->yoff + wp->sy >= ly) {
+ wp->yoff <= 1 + ly &&
+ wp->yoff + wp->sy >= ly) {
layout_resize_pane(wp, LAYOUT_LEFTRIGHT, m->x - m->lx, 0);
found = 1;
}
if (wp->yoff + wp->sy == ly &&
- wp->xoff <= 1 + m->lx && wp->xoff + wp->sx >= m->lx) {
+ wp->xoff <= 1 + m->lx &&
+ wp->xoff + wp->sx >= m->lx) {
layout_resize_pane(wp, LAYOUT_TOPBOTTOM, y - ly, 0);
found = 1;
}
diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c
index ba2c1cd2..3a7c8090 100644
--- a/cmd-respawn-pane.c
+++ b/cmd-respawn-pane.c
@@ -28,7 +28,7 @@
* Respawn a pane (restart the command). Kill existing if -k given.
*/
-enum cmd_retval cmd_respawn_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_respawn_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_respawn_pane_entry = {
.name = "respawn-pane",
@@ -43,7 +43,7 @@ const struct cmd_entry cmd_respawn_pane_entry = {
.exec = cmd_respawn_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_respawn_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c
index 95fc0cb4..42f7db19 100644
--- a/cmd-respawn-window.c
+++ b/cmd-respawn-window.c
@@ -27,7 +27,7 @@
* Respawn a window (restart the command). Kill existing if -k given.
*/
-enum cmd_retval cmd_respawn_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_respawn_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_respawn_window_entry = {
.name = "respawn-window",
@@ -42,7 +42,7 @@ const struct cmd_entry cmd_respawn_window_entry = {
.exec = cmd_respawn_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_respawn_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
index 94eca37d..bda810c3 100644
--- a/cmd-rotate-window.c
+++ b/cmd-rotate-window.c
@@ -24,7 +24,7 @@
* Rotate the panes in a window.
*/
-enum cmd_retval cmd_rotate_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_rotate_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rotate_window_entry = {
.name = "rotate-window",
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_rotate_window_entry = {
.exec = cmd_rotate_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_rotate_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct winlink *wl = cmdq->state.tflag.wl;
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index d87a061f..55c98ad3 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -29,11 +29,11 @@
* Runs a command without a window.
*/
-enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_q *);
-void cmd_run_shell_callback(struct job *);
-void cmd_run_shell_free(void *);
-void cmd_run_shell_print(struct job *, const char *);
+static void cmd_run_shell_callback(struct job *);
+static void cmd_run_shell_free(void *);
+static void cmd_run_shell_print(struct job *, const char *);
const struct cmd_entry cmd_run_shell_entry = {
.name = "run-shell",
@@ -55,7 +55,7 @@ struct cmd_run_shell_data {
int wp_id;
};
-void
+static void
cmd_run_shell_print(struct job *job, const char *msg)
{
struct cmd_run_shell_data *cdata = job->data;
@@ -74,7 +74,7 @@ cmd_run_shell_print(struct job *job, const char *msg)
window_copy_add(wp, "%s", msg);
}
-enum cmd_retval
+static enum cmd_retval
cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -113,7 +113,7 @@ cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_WAIT);
}
-void
+static void
cmd_run_shell_callback(struct job *job)
{
struct cmd_run_shell_data *cdata = job->data;
@@ -161,7 +161,7 @@ cmd_run_shell_callback(struct job *job)
free(msg);
}
-void
+static void
cmd_run_shell_free(void *data)
{
struct cmd_run_shell_data *cdata = data;
diff --git a/cmd-save-buffer.c b/cmd-save-buffer.c
index 56472565..51927f9e 100644
--- a/cmd-save-buffer.c
+++ b/cmd-save-buffer.c
@@ -31,7 +31,7 @@
* Saves a paste buffer to a file.
*/
-enum cmd_retval cmd_save_buffer_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_save_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_save_buffer_entry = {
.name = "save-buffer",
@@ -55,7 +55,7 @@ const struct cmd_entry cmd_show_buffer_entry = {
.exec = cmd_save_buffer_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_save_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-select-layout.c b/cmd-select-layout.c
index 44f01bb7..48d2ac30 100644
--- a/cmd-select-layout.c
+++ b/cmd-select-layout.c
@@ -26,7 +26,7 @@
* Switch window to selected layout.
*/
-enum cmd_retval cmd_select_layout_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_select_layout_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_layout_entry = {
.name = "select-layout",
@@ -67,7 +67,7 @@ const struct cmd_entry cmd_previous_layout_entry = {
.exec = cmd_select_layout_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 14d53d48..956d42a8 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -24,7 +24,7 @@
* Select pane.
*/
-enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_pane_entry = {
.name = "select-pane",
@@ -52,7 +52,7 @@ const struct cmd_entry cmd_last_pane_entry = {
.exec = cmd_select_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 78228067..a1413ae0 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -26,7 +26,7 @@
* Select window by index.
*/
-enum cmd_retval cmd_select_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_select_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_window_entry = {
.name = "select-window",
@@ -80,7 +80,7 @@ const struct cmd_entry cmd_last_window_entry = {
.exec = cmd_select_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct winlink *wl = cmdq->state.tflag.wl;
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index 92c75ec3..e3b8d6e4 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -27,14 +27,14 @@
* Send keys to client.
*/
-enum cmd_retval cmd_send_keys_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_send_keys_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_send_keys_entry = {
.name = "send-keys",
.alias = "send",
- .args = { "lRMt:", 0, -1 },
- .usage = "[-lRM] " CMD_TARGET_PANE_USAGE " key ...",
+ .args = { "lXRMN:t:", 0, -1 },
+ .usage = "[-lXRM] [-N repeat-count] " CMD_TARGET_PANE_USAGE " key ...",
.tflag = CMD_PANE,
@@ -55,16 +55,48 @@ const struct cmd_entry cmd_send_prefix_entry = {
.exec = cmd_send_keys_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
+ struct client *c = cmdq->state.c;
struct window_pane *wp = cmdq->state.tflag.wp;
struct session *s = cmdq->state.tflag.s;
struct mouse_event *m = &cmdq->item->mouse;
const u_char *keystr;
int i, literal;
key_code key;
+ u_int np;
+ char *cause = NULL;
+
+ if (args_has(args, 'N')) {
+ if (wp->mode == NULL || wp->mode->command == NULL) {
+ cmdq_error(cmdq, "not in a mode");
+ return (CMD_RETURN_ERROR);
+ }
+ np = args_strtonum(args, 'N', 1, UINT_MAX, &cause);
+ if (cause != NULL) {
+ cmdq_error(cmdq, "prefix %s", cause);
+ free(cause);
+ return (CMD_RETURN_ERROR);
+ }
+ wp->modeprefix = np;
+ }
+
+ if (args_has(args, 'X')) {
+ if (wp->mode == NULL || wp->mode->command == NULL) {
+ cmdq_error(cmdq, "not in a mode");
+ return (CMD_RETURN_ERROR);
+ }
+ if (!m->valid)
+ wp->mode->command(wp, c, s, args, NULL);
+ else
+ wp->mode->command(wp, c, s, args, m);
+ return (CMD_RETURN_NORMAL);
+ }
+
+ if (args_has(args, 'N')) /* only with -X */
+ return (CMD_RETURN_NORMAL);
if (args_has(args, 'M')) {
wp = cmd_mouse_pane(m, &s, NULL);
diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
index 1f0cf3d8..41ea73d9 100644
--- a/cmd-set-buffer.c
+++ b/cmd-set-buffer.c
@@ -27,7 +27,7 @@
* Add, set, append to or delete a paste buffer.
*/
-enum cmd_retval cmd_set_buffer_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_set_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_set_buffer_entry = {
.name = "set-buffer",
@@ -51,7 +51,7 @@ const struct cmd_entry cmd_delete_buffer_entry = {
.exec = cmd_set_buffer_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_set_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-set-environment.c b/cmd-set-environment.c
index ba295ea6..bfb39a4a 100644
--- a/cmd-set-environment.c
+++ b/cmd-set-environment.c
@@ -27,7 +27,7 @@
* Set an environment variable.
*/
-enum cmd_retval cmd_set_environment_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_set_environment_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_set_environment_entry = {
.name = "set-environment",
@@ -42,7 +42,7 @@ const struct cmd_entry cmd_set_environment_entry = {
.exec = cmd_set_environment_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-set-hook.c b/cmd-set-hook.c
index 4d7cf908..2e8bcb0f 100644
--- a/cmd-set-hook.c
+++ b/cmd-set-hook.c
@@ -27,7 +27,7 @@
* Set or show global or session hooks.
*/
-enum cmd_retval cmd_set_hook_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_set_hook_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_set_hook_entry = {
.name = "set-hook",
@@ -55,7 +55,7 @@ const struct cmd_entry cmd_show_hooks_entry = {
.exec = cmd_set_hook_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_set_hook_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 0f116b6f..8f7e469c 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -27,40 +27,40 @@
* Set an option.
*/
-enum cmd_retval cmd_set_option_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_set_option_exec(struct cmd *, struct cmd_q *);
-enum cmd_retval cmd_set_option_user(struct cmd *, struct cmd_q *,
+static enum cmd_retval cmd_set_option_user(struct cmd *, struct cmd_q *,
const char *, const char *);
-int cmd_set_option_unset(struct cmd *, struct cmd_q *,
- const struct options_table_entry *, struct options *,
- const char *);
-int cmd_set_option_set(struct cmd *, struct cmd_q *,
- const struct options_table_entry *, struct options *,
- const char *);
+static int cmd_set_option_unset(struct cmd *, struct cmd_q *,
+ const struct options_table_entry *, struct options *,
+ const char *);
+static int cmd_set_option_set(struct cmd *, struct cmd_q *,
+ const struct options_table_entry *, struct options *,
+ const char *);
-struct options_entry *cmd_set_option_string(struct cmd *, struct cmd_q *,
- const struct options_table_entry *, struct options *,
- const char *);
-struct options_entry *cmd_set_option_number(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_string(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_key(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_number(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_colour(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_key(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_attributes(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_colour(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_flag(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_attributes(struct cmd *,
+ struct cmd_q *, const struct options_table_entry *,
+ struct options *, const char *);
+static struct options_entry *cmd_set_option_flag(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
-struct options_entry *cmd_set_option_style(struct cmd *, struct cmd_q *,
+static struct options_entry *cmd_set_option_style(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
@@ -90,7 +90,7 @@ const struct cmd_entry cmd_set_window_option_entry = {
.exec = cmd_set_option_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -223,7 +223,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
}
/* Set user option. */
-enum cmd_retval
+static enum cmd_retval
cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
const char *valstr)
{
@@ -301,7 +301,7 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
}
/* Unset an option. */
-int
+static int
cmd_set_option_unset(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -331,7 +331,7 @@ cmd_set_option_unset(struct cmd *self, struct cmd_q *cmdq,
}
/* Set an option. */
-int
+static int
cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -386,7 +386,7 @@ cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
}
/* Set a string option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_string(struct cmd *self, __unused struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -408,7 +408,7 @@ cmd_set_option_string(struct cmd *self, __unused struct cmd_q *cmdq,
}
/* Set a number option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_number(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -426,7 +426,7 @@ cmd_set_option_number(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set a key option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_key(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -443,7 +443,7 @@ cmd_set_option_key(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set a colour option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_colour(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -459,7 +459,7 @@ cmd_set_option_colour(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set an attributes option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_attributes(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -475,7 +475,7 @@ cmd_set_option_attributes(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set a flag option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_flag(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -503,7 +503,7 @@ cmd_set_option_flag(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set a choice option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_choice(__unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
@@ -538,7 +538,7 @@ cmd_set_option_choice(__unused struct cmd *self, struct cmd_q *cmdq,
}
/* Set a style option. */
-struct options_entry *
+static struct options_entry *
cmd_set_option_style(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index 29e89274..5ad0bb8a 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -27,11 +27,11 @@
* Show environment.
*/
-enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *);
-char *cmd_show_environment_escape(struct environ_entry *);
-void cmd_show_environment_print(struct cmd *, struct cmd_q *,
- struct environ_entry *);
+static char *cmd_show_environment_escape(struct environ_entry *);
+static void cmd_show_environment_print(struct cmd *, struct cmd_q *,
+ struct environ_entry *);
const struct cmd_entry cmd_show_environment_entry = {
.name = "show-environment",
@@ -46,7 +46,7 @@ const struct cmd_entry cmd_show_environment_entry = {
.exec = cmd_show_environment_exec
};
-char *
+static char *
cmd_show_environment_escape(struct environ_entry *envent)
{
const char *value = envent->value;
@@ -64,7 +64,7 @@ cmd_show_environment_escape(struct environ_entry *envent)
return (ret);
}
-void
+static void
cmd_show_environment_print(struct cmd *self, struct cmd_q *cmdq,
struct environ_entry *envent)
{
@@ -87,7 +87,7 @@ cmd_show_environment_print(struct cmd *self, struct cmd_q *cmdq,
cmdq_print(cmdq, "unset %s;", envent->name);
}
-enum cmd_retval
+static enum cmd_retval
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-show-messages.c b/cmd-show-messages.c
index fa796eed..416857bf 100644
--- a/cmd-show-messages.c
+++ b/cmd-show-messages.c
@@ -28,7 +28,7 @@
* Show client message log.
*/
-enum cmd_retval cmd_show_messages_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_show_messages_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_show_messages_entry = {
.name = "show-messages",
@@ -54,10 +54,10 @@ const struct cmd_entry cmd_server_info_entry = {
.exec = cmd_show_messages_exec
};
-int cmd_show_messages_terminals(struct cmd_q *, int);
-int cmd_show_messages_jobs(struct cmd_q *, int);
+static int cmd_show_messages_terminals(struct cmd_q *, int);
+static int cmd_show_messages_jobs(struct cmd_q *, int);
-int
+static int
cmd_show_messages_terminals(struct cmd_q *cmdq, int blank)
{
struct tty_term *term;
@@ -78,7 +78,7 @@ cmd_show_messages_terminals(struct cmd_q *cmdq, int blank)
return (n != 0);
}
-int
+static int
cmd_show_messages_jobs(struct cmd_q *cmdq, int blank)
{
struct job *job;
@@ -97,7 +97,7 @@ cmd_show_messages_jobs(struct cmd_q *cmdq, int blank)
return (n != 0);
}
-enum cmd_retval
+static enum cmd_retval
cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-show-options.c b/cmd-show-options.c
index 322f532c..89d8f219 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -27,12 +27,12 @@
* Show options.
*/
-enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmd_q *);
-enum cmd_retval cmd_show_options_one(struct cmd *, struct cmd_q *,
- struct options *, int);
-enum cmd_retval cmd_show_options_all(struct cmd *, struct cmd_q *,
- struct options *, enum options_table_scope);
+static enum cmd_retval cmd_show_options_one(struct cmd *, struct cmd_q *,
+ struct options *, int);
+static enum cmd_retval cmd_show_options_all(struct cmd *, struct cmd_q *,
+ struct options *, enum options_table_scope);
const struct cmd_entry cmd_show_options_entry = {
.name = "show-options",
@@ -60,7 +60,7 @@ const struct cmd_entry cmd_show_window_options_entry = {
.exec = cmd_show_options_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -110,7 +110,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
return (cmd_show_options_one(self, cmdq, oo, quiet));
}
-enum cmd_retval
+static enum cmd_retval
cmd_show_options_one(struct cmd *self, struct cmd_q *cmdq,
struct options *oo, int quiet)
{
@@ -160,7 +160,7 @@ retry:
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_show_options_all(struct cmd *self, struct cmd_q *cmdq, struct options *oo,
enum options_table_scope scope)
{
diff --git a/cmd-source-file.c b/cmd-source-file.c
index ecebbaca..ef3ac7ac 100644
--- a/cmd-source-file.c
+++ b/cmd-source-file.c
@@ -26,9 +26,9 @@
* Sources a configuration file.
*/
-enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmd_q *);
-void cmd_source_file_done(struct cmd_q *);
+static void cmd_source_file_done(struct cmd_q *);
const struct cmd_entry cmd_source_file_entry = {
.name = "source-file",
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_source_file_entry = {
.exec = cmd_source_file_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -76,7 +76,7 @@ cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_WAIT);
}
-void
+static void
cmd_source_file_done(struct cmd_q *cmdq1)
{
struct cmd_q *cmdq = cmdq1->data;
diff --git a/cmd-split-window.c b/cmd-split-window.c
index 978efdee..81db078a 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -32,7 +32,7 @@
#define SPLIT_WINDOW_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
-enum cmd_retval cmd_split_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_split_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_split_window_entry = {
.name = "split-window",
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_split_window_entry = {
.exec = cmd_split_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-string.c b/cmd-string.c
index 757d4cdb..2cf63294 100644
--- a/cmd-string.c
+++ b/cmd-string.c
@@ -31,14 +31,14 @@
* Parse a command from a string.
*/
-int cmd_string_getc(const char *, size_t *);
-void cmd_string_ungetc(size_t *);
-void cmd_string_copy(char **, char *, size_t *);
-char *cmd_string_string(const char *, size_t *, char, int);
-char *cmd_string_variable(const char *, size_t *);
-char *cmd_string_expand_tilde(const char *, size_t *);
-
-int
+static int cmd_string_getc(const char *, size_t *);
+static void cmd_string_ungetc(size_t *);
+static void cmd_string_copy(char **, char *, size_t *);
+static char *cmd_string_string(const char *, size_t *, char, int);
+static char *cmd_string_variable(const char *, size_t *);
+static char *cmd_string_expand_tilde(const char *, size_t *);
+
+static int
cmd_string_getc(const char *s, size_t *p)
{
const u_char *ucs = s;
@@ -48,7 +48,7 @@ cmd_string_getc(const char *s, size_t *p)
return (ucs[(*p)++]);
}
-void
+static void
cmd_string_ungetc(size_t *p)
{
(*p)--;
@@ -173,7 +173,7 @@ out:
return (rval);
}
-void
+static void
cmd_string_copy(char **dst, char *src, size_t *len)
{
size_t srclen;
@@ -187,7 +187,7 @@ cmd_string_copy(char **dst, char *src, size_t *len)
free(src);
}
-char *
+static char *
cmd_string_string(const char *s, size_t *p, char endch, int esc)
{
int ch;
@@ -245,7 +245,7 @@ error:
return (NULL);
}
-char *
+static char *
cmd_string_variable(const char *s, size_t *p)
{
int ch, fch;
@@ -314,7 +314,7 @@ error:
return (NULL);
}
-char *
+static char *
cmd_string_expand_tilde(const char *s, size_t *p)
{
struct passwd *pw;
@@ -337,7 +337,10 @@ cmd_string_expand_tilde(const char *s, size_t *p)
cp = user = xmalloc(strlen(s));
for (;;) {
last = cmd_string_getc(s, p);
- if (last == EOF || last == '/' || last == ' '|| last == '\t')
+ if (last == EOF ||
+ last == '/' ||
+ last == ' '||
+ last == '\t')
break;
*cp++ = last;
}
diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
index 13575e0a..e5f5c810 100644
--- a/cmd-swap-pane.c
+++ b/cmd-swap-pane.c
@@ -26,7 +26,7 @@
* Swap two panes.
*/
-enum cmd_retval cmd_swap_pane_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_swap_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_swap_pane_entry = {
.name = "swap-pane",
@@ -42,7 +42,7 @@ const struct cmd_entry cmd_swap_pane_entry = {
.exec = cmd_swap_pane_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct window *src_w, *dst_w;
diff --git a/cmd-swap-window.c b/cmd-swap-window.c
index 14907d2d..904a974d 100644
--- a/cmd-swap-window.c
+++ b/cmd-swap-window.c
@@ -26,7 +26,7 @@
* Swap one window with another.
*/
-enum cmd_retval cmd_swap_window_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_swap_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_swap_window_entry = {
.name = "swap-window",
@@ -42,7 +42,7 @@ const struct cmd_entry cmd_swap_window_entry = {
.exec = cmd_swap_window_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_swap_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct session *src, *dst;
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index 6e2ee2a0..cc3212db 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -27,7 +27,7 @@
* Switch client to a different session.
*/
-enum cmd_retval cmd_switch_client_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_switch_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_switch_client_entry = {
.name = "switch-client",
@@ -44,7 +44,7 @@ const struct cmd_entry cmd_switch_client_entry = {
.exec = cmd_switch_client_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index 7452fd9f..00c7779b 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -26,9 +26,9 @@
* Unbind key from command.
*/
-enum cmd_retval cmd_unbind_key_exec(struct cmd *, struct cmd_q *);
-enum cmd_retval cmd_unbind_key_mode_table(struct cmd *, struct cmd_q *,
- key_code);
+static enum cmd_retval cmd_unbind_key_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_unbind_key_mode_table(struct cmd *, struct cmd_q *,
+ key_code);
const struct cmd_entry cmd_unbind_key_entry = {
.name = "unbind-key",
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_unbind_key_entry = {
.exec = cmd_unbind_key_exec
};
-enum cmd_retval
+static enum cmd_retval
cmd_unbind_key_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -98,7 +98,7 @@ cmd_unbind_key_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_unbind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
{
struct args *args = self->args;
diff --git a/cmd-wait-for.c b/cmd-wait-for.c
index 81b01627..fb2fb699 100644
--- a/cmd-wait-for.c
+++ b/cmd-wait-for.c
@@ -28,7 +28,7 @@
* Block or wake a client on a named wait channel.
*/
-enum cmd_retval cmd_wait_for_exec(struct cmd *, struct cmd_q *);
+static enum cmd_retval cmd_wait_for_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_wait_for_entry = {
.name = "wait-for",
@@ -52,31 +52,30 @@ struct wait_channel {
RB_ENTRY(wait_channel) entry;
};
RB_HEAD(wait_channels, wait_channel);
-struct wait_channels wait_channels = RB_INITIALIZER(wait_channels);
+static struct wait_channels wait_channels = RB_INITIALIZER(wait_channels);
-int wait_channel_cmp(struct wait_channel *, struct wait_channel *);
-RB_PROTOTYPE(wait_channels, wait_channel, entry, wait_channel_cmp);
-RB_GENERATE(wait_channels, wait_channel, entry, wait_channel_cmp);
+static int wait_channel_cmp(struct wait_channel *, struct wait_channel *);
+RB_GENERATE_STATIC(wait_channels, wait_channel, entry, wait_channel_cmp);
-int
+static int
wait_channel_cmp(struct wait_channel *wc1, struct wait_channel *wc2)
{
return (strcmp(wc1->name, wc2->name));
}
-enum cmd_retval cmd_wait_for_signal(struct cmd_q *, const char *,
- struct wait_channel *);
-enum cmd_retval cmd_wait_for_wait(struct cmd_q *, const char *,
- struct wait_channel *);
-enum cmd_retval cmd_wait_for_lock(struct cmd_q *, const char *,
- struct wait_channel *);
-enum cmd_retval cmd_wait_for_unlock(struct cmd_q *, const char *,
- struct wait_channel *);
+static enum cmd_retval cmd_wait_for_signal(struct cmd_q *, const char *,
+ struct wait_channel *);
+static enum cmd_retval cmd_wait_for_wait(struct cmd_q *, const char *,
+ struct wait_channel *);
+static enum cmd_retval cmd_wait_for_lock(struct cmd_q *, const char *,
+ struct wait_channel *);
+static enum cmd_retval cmd_wait_for_unlock(struct cmd_q *, const char *,
+ struct wait_channel *);
-struct wait_channel *cmd_wait_for_add(const char *);
-void cmd_wait_for_remove(struct wait_channel *wc);
+static struct wait_channel *cmd_wait_for_add(const char *);
+static void cmd_wait_for_remove(struct wait_channel *wc);
-struct wait_channel *
+static struct wait_channel *
cmd_wait_for_add(const char *name)
{
struct wait_channel *wc;
@@ -97,7 +96,7 @@ cmd_wait_for_add(const char *name)
return (wc);
}
-void
+static void
cmd_wait_for_remove(struct wait_channel *wc)
{
if (wc->locked)
@@ -113,7 +112,7 @@ cmd_wait_for_remove(struct wait_channel *wc)
free(wc);
}
-enum cmd_retval
+static enum cmd_retval
cmd_wait_for_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
@@ -132,7 +131,7 @@ cmd_wait_for_exec(struct cmd *self, struct cmd_q *cmdq)
return (cmd_wait_for_wait(cmdq, name, wc));
}
-enum cmd_retval
+static enum cmd_retval
cmd_wait_for_signal(__unused struct cmd_q *cmdq, const char *name,
struct wait_channel *wc)
{
@@ -158,7 +157,7 @@ cmd_wait_for_signal(__unused struct cmd_q *cmdq, const char *name,
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_wait_for_wait(struct cmd_q *cmdq, const char *name,
struct wait_channel *wc)
{
@@ -185,7 +184,7 @@ cmd_wait_for_wait(struct cmd_q *cmdq, const char *name,
return (CMD_RETURN_WAIT);
}
-enum cmd_retval
+static enum cmd_retval
cmd_wait_for_lock(struct cmd_q *cmdq, const char *name,
struct wait_channel *wc)
{
@@ -207,7 +206,7 @@ cmd_wait_for_lock(struct cmd_q *cmdq, const char *name,
return (CMD_RETURN_NORMAL);
}
-enum cmd_retval
+static enum cmd_retval
cmd_wait_for_unlock(struct cmd_q *cmdq, const char *name,
struct wait_channel *wc)
{
diff --git a/environ.c b/environ.c
index 5d06afbf..016d256a 100644
--- a/environ.c
+++ b/environ.c
@@ -28,11 +28,10 @@
*/
RB_HEAD(environ, environ_entry);
-int environ_cmp(struct environ_entry *, struct environ_entry *);
-RB_PROTOTYPE(environ, environ_entry, entry, environ_cmp);
-RB_GENERATE(environ, environ_entry, entry, environ_cmp);
+static int environ_cmp(struct environ_entry *, struct environ_entry *);
+RB_GENERATE_STATIC(environ, environ_entry, entry, environ_cmp);
-int
+static int
environ_cmp(struct environ_entry *envent1, struct environ_entry *envent2)
{
return (strcmp(envent1->name, envent2->name));
diff --git a/format.c b/format.c
index 20d35906..efa9721d 100644
--- a/format.c
+++ b/format.c
@@ -40,35 +40,41 @@
struct format_entry;
typedef void (*format_cb)(struct format_tree *, struct format_entry *);
-void format_job_callback(struct job *);
-char *format_job_get(struct format_tree *, const char *);
-void format_job_timer(int, short, void *);
-
-void format_cb_host(struct format_tree *, struct format_entry *);
-void format_cb_host_short(struct format_tree *, struct format_entry *);
-void format_cb_pid(struct format_tree *, struct format_entry *);
-void format_cb_session_alerts(struct format_tree *, struct format_entry *);
-void format_cb_window_layout(struct format_tree *, struct format_entry *);
-void format_cb_window_visible_layout(struct format_tree *,
- struct format_entry *);
-void format_cb_start_command(struct format_tree *, struct format_entry *);
-void format_cb_current_command(struct format_tree *, struct format_entry *);
-void format_cb_current_path(struct format_tree *, struct format_entry *);
-void format_cb_history_bytes(struct format_tree *, struct format_entry *);
-void format_cb_pane_tabs(struct format_tree *, struct format_entry *);
-
-char *format_find(struct format_tree *, const char *, int);
-void format_add_cb(struct format_tree *, const char *, format_cb);
-void format_add_tv(struct format_tree *, const char *, struct timeval *);
-int format_replace(struct format_tree *, const char *, size_t, char **,
- size_t *, size_t *);
-char *format_time_string(time_t);
-
-void format_defaults_pane_tabs(struct format_tree *, struct window_pane *);
-void format_defaults_session(struct format_tree *, struct session *);
-void format_defaults_client(struct format_tree *, struct client *);
-void format_defaults_winlink(struct format_tree *, struct session *,
- struct winlink *);
+static void format_job_callback(struct job *);
+static char *format_job_get(struct format_tree *, const char *);
+static void format_job_timer(int, short, void *);
+
+static void format_cb_host(struct format_tree *, struct format_entry *);
+static void format_cb_host_short(struct format_tree *,
+ struct format_entry *);
+static void format_cb_pid(struct format_tree *, struct format_entry *);
+static void format_cb_session_alerts(struct format_tree *,
+ struct format_entry *);
+static void format_cb_window_layout(struct format_tree *,
+ struct format_entry *);
+static void format_cb_window_visible_layout(struct format_tree *,
+ struct format_entry *);
+static void format_cb_start_command(struct format_tree *,
+ struct format_entry *);
+static void format_cb_current_command(struct format_tree *,
+ struct format_entry *);
+static void format_cb_history_bytes(struct format_tree *,
+ struct format_entry *);
+static void format_cb_pane_tabs(struct format_tree *,
+ struct format_entry *);
+
+static char *format_find(struct format_tree *, const char *, int);
+static void format_add_cb(struct format_tree *, const char *, format_cb);
+static void format_add_tv(struct format_tree *, const char *,
+ struct timeval *);
+static int format_replace(struct format_tree *, const char *, size_t,
+ char **, size_t *, size_t *);
+
+static void format_defaults_session(struct format_tree *,
+ struct session *);
+static void format_defaults_client(struct format_tree *, struct client *);
+static void format_defaults_winlink(struct format_tree *, struct session *,
+ struct winlink *);
/* Entry in format job tree. */
struct format_job {
@@ -84,14 +90,13 @@ struct format_job {
};
/* Format job tree. */
-struct event format_job_event;
-int format_job_cmp(struct format_job *, struct format_job *);
-RB_HEAD(format_job_tree, format_job) format_jobs = RB_INITIALIZER();
-RB_PROTOTYPE(format_job_tree, format_job, entry, format_job_cmp);
-RB_GENERATE(format_job_tree, format_job, entry, format_job_cmp);
+static struct event format_job_event;
+static int format_job_cmp(struct format_job *, struct format_job *);
+static RB_HEAD(format_job_tree, format_job) format_jobs = RB_INITIALIZER();
+RB_GENERATE_STATIC(format_job_tree, format_job, entry, format_job_cmp);
/* Format job tree comparison function. */
-int
+static int
format_job_cmp(struct format_job *fj1, struct format_job *fj2)
{
return (strcmp(fj1->cmd, fj2->cmd));
@@ -122,19 +127,18 @@ struct format_tree {
RB_HEAD(format_entry_tree, format_entry) tree;
};
-int format_entry_cmp(struct format_entry *, struct format_entry *);
-RB_PROTOTYPE(format_entry_tree, format_entry, entry, format_entry_cmp);
-RB_GENERATE(format_entry_tree, format_entry, entry, format_entry_cmp);
+static int format_entry_cmp(struct format_entry *, struct format_entry *);
+RB_GENERATE_STATIC(format_entry_tree, format_entry, entry, format_entry_cmp);
/* Format entry tree comparison function. */
-int
+static int
format_entry_cmp(struct format_entry *fe1, struct format_entry *fe2)
{
return (strcmp(fe1->key, fe2->key));
}
/* Single-character uppercase aliases. */
-const char *format_upper[] = {
+static const char *format_upper[] = {
NULL, /* A */
NULL, /* B */
NULL, /* C */
@@ -164,7 +168,7 @@ const char *format_upper[] = {
};
/* Single-character lowercase aliases. */
-const char *format_lower[] = {
+static const char *format_lower[] = {
NULL, /* a */
NULL, /* b */
NULL, /* c */
@@ -194,7 +198,7 @@ const char *format_lower[] = {
};
/* Format job callback. */
-void
+static void
format_job_callback(struct job *job)
{
struct format_job *fj = job->data;
@@ -226,7 +230,7 @@ format_job_callback(struct job *job)
}
/* Find a job. */
-char *
+static char *
format_job_get(struct format_tree *ft, const char *cmd)
{
struct format_job fj0, *fj;
@@ -260,7 +264,7 @@ format_job_get(struct format_tree *ft, const char *cmd)
}
/* Remove old jobs. */
-void
+static void
format_job_timer(__unused int fd, __unused short events, __unused void *arg)
{
struct format_job *fj, *fj1;
@@ -289,7 +293,7 @@ format_job_timer(__unused int fd, __unused short events, __unused void *arg)
}
/* Callback for host. */
-void
+static void
format_cb_host(__unused struct format_tree *ft, struct format_entry *fe)
{
char host[HOST_NAME_MAX + 1];
@@ -301,7 +305,7 @@ format_cb_host(__unused struct format_tree *ft, struct format_entry *fe)
}
/* Callback for host_short. */
-void
+static void
format_cb_host_short(__unused struct format_tree *ft, struct format_entry *fe)
{
char host[HOST_NAME_MAX + 1], *cp;
@@ -316,14 +320,14 @@ format_cb_host_short(__unused struct format_tree *ft, struct format_entry *fe)
}
/* Callback for pid. */
-void
+static void
format_cb_pid(__unused struct format_tree *ft, struct format_entry *fe)
{
xasprintf(&fe->value, "%ld", (long)getpid());
}
/* Callback for session_alerts. */
-void
+static void
format_cb_session_alerts(struct format_tree *ft, struct format_entry *fe)
{
struct session *s = ft->s;
@@ -353,7 +357,7 @@ format_cb_session_alerts(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for window_layout. */
-void
+static void
format_cb_window_layout(struct format_tree *ft, struct format_entry *fe)
{
struct window *w = ft->w;
@@ -368,7 +372,7 @@ format_cb_window_layout(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for window_visible_layout. */
-void
+static void
format_cb_window_visible_layout(struct format_tree *ft, struct format_entry *fe)
{
struct window *w = ft->w;
@@ -380,7 +384,7 @@ format_cb_window_visible_layout(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for pane_start_command. */
-void
+static void
format_cb_start_command(struct format_tree *ft, struct format_entry *fe)
{
struct window_pane *wp = ft->wp;
@@ -392,7 +396,7 @@ format_cb_start_command(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for pane_current_command. */
-void
+static void
format_cb_current_command(struct format_tree *ft, struct format_entry *fe)
{
struct window_pane *wp = ft->wp;
@@ -430,7 +434,7 @@ format_cb_current_path(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for history_bytes. */
-void
+static void
format_cb_history_bytes(struct format_tree *ft, struct format_entry *fe)
{
struct window_pane *wp = ft->wp;
@@ -455,7 +459,7 @@ format_cb_history_bytes(struct format_tree *ft, struct format_entry *fe)
}
/* Callback for pane_tabs. */
-void
+static void
format_cb_pane_tabs(struct format_tree *ft, struct format_entry *fe)
{
struct window_pane *wp = ft->wp;
@@ -556,7 +560,7 @@ format_add(struct format_tree *ft, const char *key, const char *fmt, ...)
}
/* Add a key and time. */
-void
+static void
format_add_tv(struct format_tree *ft, const char *key, struct timeval *tv)
{
struct format_entry *fe;
@@ -580,7 +584,7 @@ format_add_tv(struct format_tree *ft, const char *key, struct timeval *tv)
}
/* Add a key and function. */
-void
+static void
format_add_cb(struct format_tree *ft, const char *key, format_cb cb)
{
struct format_entry *fe;
@@ -604,7 +608,7 @@ format_add_cb(struct format_tree *ft, const char *key, format_cb cb)
}
/* Find a format entry. */
-char *
+static char *
format_find(struct format_tree *ft, const char *key, int modifiers)
{
struct format_entry *fe, fe_find;
@@ -699,7 +703,7 @@ found:
* Replace a key/value pair in buffer. #{blah} is expanded directly,
* #{?blah,a,b} is replace with a if blah exists and is nonzero else b.
*/
-int
+static int
format_replace(struct format_tree *ft, const char *key, size_t keylen,
char **buf, size_t *len, size_t *off)
{
@@ -1019,7 +1023,7 @@ format_defaults(struct format_tree *ft, struct client *c, struct session *s,
}
/* Set default format keys for a session. */
-void
+static void
format_defaults_session(struct format_tree *ft, struct session *s)
{
struct session_group *sg;
@@ -1048,7 +1052,7 @@ format_defaults_session(struct format_tree *ft, struct session *s)
}
/* Set default format keys for a client. */
-void
+static void
format_defaults_client(struct format_tree *ft, struct client *c)
{
struct session *s;
@@ -1115,7 +1119,7 @@ format_defaults_window(struct format_tree *ft, struct window *w)
}
/* Set default format keys for a winlink. */
-void
+static void
format_defaults_winlink(struct format_tree *ft, struct session *s,
struct winlink *wl)
{
diff --git a/grid.c b/grid.c
index 50766a88..35de2aef 100644
--- a/grid.c
+++ b/grid.c
@@ -43,16 +43,20 @@ const struct grid_cell_entry grid_default_entry = {
0, { .data = { 0, 8, 8, ' ' } }
};
-void grid_reflow_copy(struct grid_line *, u_int, struct grid_line *l,
- u_int, u_int);
-void grid_reflow_join(struct grid *, u_int *, struct grid_line *, u_int);
-void grid_reflow_split(struct grid *, u_int *, struct grid_line *, u_int,
- u_int);
-void grid_reflow_move(struct grid *, u_int *, struct grid_line *);
-size_t grid_string_cells_fg(const struct grid_cell *, int *);
-size_t grid_string_cells_bg(const struct grid_cell *, int *);
-void grid_string_cells_code(const struct grid_cell *,
- const struct grid_cell *, char *, size_t, int);
+static void grid_expand_line(struct grid *, u_int, u_int);
+
+static void grid_reflow_copy(struct grid_line *, u_int, struct grid_line *,
+ u_int, u_int);
+static void grid_reflow_join(struct grid *, u_int *, struct grid_line *,
+ u_int);
+static void grid_reflow_split(struct grid *, u_int *, struct grid_line *,
+ u_int, u_int);
+static void grid_reflow_move(struct grid *, u_int *, struct grid_line *);
+
+static size_t grid_string_cells_fg(const struct grid_cell *, int *);
+static size_t grid_string_cells_bg(const struct grid_cell *, int *);
+static void grid_string_cells_code(const struct grid_cell *,
+ const struct grid_cell *, char *, size_t, int);
/* Copy default into a cell. */
static void
@@ -242,7 +246,7 @@ grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower)
}
/* Expand line to fit to cell. */
-void
+static void
grid_expand_line(struct grid *gd, u_int py, u_int sx)
{
struct grid_line *gl;
@@ -473,7 +477,7 @@ grid_move_cells(struct grid *gd, u_int dx, u_int px, u_int py, u_int nx)
}
/* Get ANSI foreground sequence. */
-size_t
+static size_t
grid_string_cells_fg(const struct grid_cell *gc, int *values)
{
size_t n;
@@ -522,7 +526,7 @@ grid_string_cells_fg(const struct grid_cell *gc, int *values)
}
/* Get ANSI background sequence. */
-size_t
+static size_t
grid_string_cells_bg(const struct grid_cell *gc, int *values)
{
size_t n;
@@ -575,7 +579,7 @@ grid_string_cells_bg(const struct grid_cell *gc, int *values)
* given a current state. The output buffer must be able to hold at least 57
* bytes.
*/
-void
+static void
grid_string_cells_code(const struct grid_cell *lastgc,
const struct grid_cell *gc, char *buf, size_t len, int escape_c0)
{
@@ -773,7 +777,7 @@ grid_duplicate_lines(struct grid *dst, u_int dy, struct grid *src, u_int sy,
}
/* Copy a section of a line. */
-void
+static void
grid_reflow_copy(struct grid_line *dst_gl, u_int to, struct grid_line *src_gl,
u_int from, u_int to_copy)
{
@@ -798,7 +802,7 @@ grid_reflow_copy(struct grid_line *dst_gl, u_int to, struct grid_line *src_gl,
}
/* Join line data. */
-void
+static void
grid_reflow_join(struct grid *dst, u_int *py, struct grid_line *src_gl,
u_int new_x)
{
@@ -833,7 +837,7 @@ grid_reflow_join(struct grid *dst, u_int *py, struct grid_line *src_gl,
}
/* Split line data. */
-void
+static void
grid_reflow_split(struct grid *dst, u_int *py, struct grid_line *src_gl,
u_int new_x, u_int offset)
{
@@ -873,7 +877,7 @@ grid_reflow_split(struct grid *dst, u_int *py, struct grid_line *src_gl,
}
/* Move line data. */
-void
+static void
grid_reflow_move(struct grid *dst, u_int *py, struct grid_line *src_gl)
{
struct grid_line *dst_gl;
diff --git a/hooks.c b/hooks.c
index c1a016ae..62ea05d1 100644
--- a/hooks.c
+++ b/hooks.c
@@ -29,8 +29,7 @@ struct hooks {
};
static int hooks_cmp(struct hook *, struct hook *);
-RB_PROTOTYPE(hooks_tree, hook, entry, hooks_cmp);
-RB_GENERATE(hooks_tree, hook, entry, hooks_cmp);
+RB_GENERATE_STATIC(hooks_tree, hook, entry, hooks_cmp);
static struct hook *hooks_find1(struct hooks *, const char *);
static void hooks_free1(struct hooks *, struct hook *);
diff --git a/job.c b/job.c
index 957897f3..58160911 100644
--- a/job.c
+++ b/job.c
@@ -32,8 +32,8 @@
* output.
*/
-void job_callback(struct bufferevent *, short, void *);
-void job_write_callback(struct bufferevent *, void *);
+static void job_callback(struct bufferevent *, short, void *);
+static void job_write_callback(struct bufferevent *, void *);
/* All jobs list. */
struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
@@ -148,7 +148,7 @@ job_free(struct job *job)
}
/* Called when output buffer falls below low watermark (default is 0). */
-void
+static void
job_write_callback(__unused struct bufferevent *bufev, void *data)
{
struct job *job = data;
@@ -164,7 +164,7 @@ job_write_callback(__unused struct bufferevent *bufev, void *data)
}
/* Job buffer error callback. */
-void
+static void
job_callback(__unused struct bufferevent *bufev, __unused short events,
void *data)
{
diff --git a/key-bindings.c b/key-bindings.c
index 0d13385d..f6b17c3c 100644
--- a/key-bindings.c
+++ b/key-bindings.c
@@ -232,6 +232,146 @@ key_bindings_init(void)
"bind -n MouseDrag1Pane if -Ft= '#{mouse_any_flag}' 'if -Ft= \"#{pane_in_mode}\" \"copy-mode -M\" \"send-keys -M\"' 'copy-mode -M'",
"bind -n MouseDown3Pane if-shell -Ft= '#{mouse_any_flag}' 'select-pane -t=; send-keys -M' 'select-pane -mt='",
"bind -n WheelUpPane if-shell -Ft= '#{mouse_any_flag}' 'send-keys -M' 'if -Ft= \"#{pane_in_mode}\" \"send-keys -M\" \"copy-mode -et=\"'",
+
+ "bind -Tcopy-mode C-Space send -X begin-selection",
+ "bind -Tcopy-mode C-a send -X start-of-line",
+ "bind -Tcopy-mode C-c send -X cancel",
+ "bind -Tcopy-mode C-e send -X end-of-line",
+ "bind -Tcopy-mode C-f send -X cursor-right",
+ "bind -Tcopy-mode C-g send -X clear-selection",
+ "bind -Tcopy-mode C-k send -X copy-end-of-line",
+ "bind -Tcopy-mode C-n send -X cursor-down",
+ "bind -Tcopy-mode C-p send -X cursor-up",
+ "bind -Tcopy-mode C-r command-prompt -p'search up' \"send -X search-backward '%%'\"",
+ "bind -Tcopy-mode C-s command-prompt -p'search down' \"send -X search-forward '%%'\"",
+ "bind -Tcopy-mode C-v send -X page-down",
+ "bind -Tcopy-mode C-w send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode Escape send -X cancel",
+ "bind -Tcopy-mode Space send -X page-down",
+ "bind -Tcopy-mode , send -X jump-reverse",
+ "bind -Tcopy-mode \\; send -X jump-again",
+ "bind -Tcopy-mode F command-prompt -1p'jump backward' \"send -X jump-backward '%%'\"",
+ "bind -Tcopy-mode N send -X search-reverse",
+ "bind -Tcopy-mode R send -X rectangle-toggle",
+ "bind -Tcopy-mode T command-prompt -1p'jump to backward' \"send -X jump-to-backward '%%'\"",
+ "bind -Tcopy-mode f command-prompt -1p'jump forward' \"send -X jump-forward '%%'\"",
+ "bind -Tcopy-mode g command-prompt -p'goto line' \"send -X goto-line '%%'\"",
+ "bind -Tcopy-mode n send -X search-again",
+ "bind -Tcopy-mode q send -X cancel",
+ "bind -Tcopy-mode t command-prompt -1p'jump to forward' \"send -X jump-to-forward '%%'\"",
+ "bind -Tcopy-mode MouseDrag1Pane send -X begin-selection",
+ "bind -Tcopy-mode MouseDragEnd1Pane send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up",
+ "bind -Tcopy-mode WheelDownPane send -N5 -X scroll-down",
+ "bind -Tcopy-mode DoubleClick1Pane send -X select-word",
+ "bind -Tcopy-mode TripleClick1Pane send -X select-line",
+ "bind -Tcopy-mode NPage send -X page-down",
+ "bind -Tcopy-mode PPage send -X page-up",
+ "bind -Tcopy-mode Up send -X cursor-up",
+ "bind -Tcopy-mode Down send -X cursor-down",
+ "bind -Tcopy-mode Left send -X cursor-left",
+ "bind -Tcopy-mode Right send -X cursor-right",
+ "bind -Tcopy-mode M-1 command-prompt -p'repeat' -I1 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-2 command-prompt -p'repeat' -I2 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-3 command-prompt -p'repeat' -I3 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-4 command-prompt -p'repeat' -I4 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-5 command-prompt -p'repeat' -I5 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-6 command-prompt -p'repeat' -I6 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-7 command-prompt -p'repeat' -I7 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-8 command-prompt -p'repeat' -I8 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-9 command-prompt -p'repeat' -I9 \"send -N '%%'\"",
+ "bind -Tcopy-mode M-< send -X history-top",
+ "bind -Tcopy-mode M-> send -X history-bottom",
+ "bind -Tcopy-mode M-R send -X top-line",
+ "bind -Tcopy-mode M-b send -X previous-word",
+ "bind -Tcopy-mode M-f send -X next-word-end",
+ "bind -Tcopy-mode M-m send -X back-to-indentation",
+ "bind -Tcopy-mode M-r send -X middle-line",
+ "bind -Tcopy-mode M-v send -X page-up",
+ "bind -Tcopy-mode M-w send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode M-{ send -X previous-paragraph",
+ "bind -Tcopy-mode M-} send -X next-paragraph",
+ "bind -Tcopy-mode M-Up send -X halfpage-up",
+ "bind -Tcopy-mode M-Down send -X halfpage-down",
+ "bind -Tcopy-mode C-Up send -X scroll-up",
+ "bind -Tcopy-mode C-Down send -X scroll-down",
+
+ "bind -Tcopy-mode-vi C-b send -X page-up",
+ "bind -Tcopy-mode-vi C-c send -X cancel",
+ "bind -Tcopy-mode-vi C-d send -X halfpage-down",
+ "bind -Tcopy-mode-vi C-e send -X scroll-down",
+ "bind -Tcopy-mode-vi C-f send -X page-down",
+ "bind -Tcopy-mode-vi C-h send -X cursor-left",
+ "bind -Tcopy-mode-vi C-j send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode-vi Enter send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode-vi C-u send -X halfpage-up",
+ "bind -Tcopy-mode-vi C-v send -X rectangle-toggle",
+ "bind -Tcopy-mode-vi C-y send -X scroll-up",
+ "bind -Tcopy-mode-vi Escape send -X clear-selection",
+ "bind -Tcopy-mode-vi Space send -X begin-selection",
+ "bind -Tcopy-mode-vi '$' send -X end-of-line",
+ "bind -Tcopy-mode-vi , send -X jump-reverse",
+ "bind -Tcopy-mode-vi / command-prompt -p'search down' \"send -X search-forward '%%'\"",
+ "bind -Tcopy-mode-vi 0 send -X start-of-line",
+ "bind -Tcopy-mode-vi 1 command-prompt -p'repeat' -I1 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 2 command-prompt -p'repeat' -I2 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 3 command-prompt -p'repeat' -I3 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 4 command-prompt -p'repeat' -I4 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 5 command-prompt -p'repeat' -I5 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 6 command-prompt -p'repeat' -I6 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 7 command-prompt -p'repeat' -I7 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 8 command-prompt -p'repeat' -I8 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi 9 command-prompt -p'repeat' -I9 \"send -N '%%'\"",
+ "bind -Tcopy-mode-vi : command-prompt -p'goto line' \"send -X goto-line '%%'\"",
+ "bind -Tcopy-mode-vi \\; send -X jump-again"
+ "bind -Tcopy-mode-vi ? command-prompt -p'search up' \"send -X search-backward '%%'\"",
+ "bind -Tcopy-mode-vi A send -X append-selection-and-cancel",
+ "bind -Tcopy-mode-vi B send -X previous-space",
+ "bind -Tcopy-mode-vi D send -X copy-end-of-line",
+ "bind -Tcopy-mode-vi E send -X next-space-end",
+ "bind -Tcopy-mode-vi F command-prompt -1p'jump backward' \"send -X jump-backward '%%'\"",
+ "bind -Tcopy-mode-vi G send -X history-bottom",
+ "bind -Tcopy-mode-vi H send -X top-line",
+ "bind -Tcopy-mode-vi J send -X scroll-down",
+ "bind -Tcopy-mode-vi K send -X scroll-up",
+ "bind -Tcopy-mode-vi L send -X bottom-line",
+ "bind -Tcopy-mode-vi M send -X middle-line",
+ "bind -Tcopy-mode-vi N send -X search-reverse",
+ "bind -Tcopy-mode-vi T command-prompt -1p'jump to backward' \"send -X jump-to-backward '%%'\"",
+ "bind -Tcopy-mode-vi V send -X select-line",
+ "bind -Tcopy-mode-vi W send -X next-space",
+ "bind -Tcopy-mode-vi ^ send -X back-to-indentation",
+ "bind -Tcopy-mode-vi b send -X previous-word",
+ "bind -Tcopy-mode-vi e send -X next-word-end",
+ "bind -Tcopy-mode-vi f command-prompt -1p'jump forward' \"send -X jump-forward '%%'\"",
+ "bind -Tcopy-mode-vi g send -X history-top",
+ "bind -Tcopy-mode-vi h send -X cursor-left",
+ "bind -Tcopy-mode-vi j send -X cursor-down",
+ "bind -Tcopy-mode-vi k send -X cursor-up",
+ "bind -Tcopy-mode-vi l send -X cursor-right",
+ "bind -Tcopy-mode-vi n send -X search-again",
+ "bind -Tcopy-mode-vi o send -X other-end",
+ "bind -Tcopy-mode-vi q send -X cancel",
+ "bind -Tcopy-mode-vi t command-prompt -1p'jump to forward' \"send -X jump-to-forward '%%'\"",
+ "bind -Tcopy-mode-vi v send -X rectangle-toggle",
+ "bind -Tcopy-mode-vi w send -X next-word",
+ "bind -Tcopy-mode-vi { send -X previous-paragraph",
+ "bind -Tcopy-mode-vi } send -X next-paragraph",
+ "bind -Tcopy-mode-vi MouseDrag1Pane send -X begin-selection",
+ "bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel",
+ "bind -Tcopy-mode-vi WheelUpPane send -N5 -X scroll-up",
+ "bind -Tcopy-mode-vi WheelDownPane send -N5 -X scroll-down",
+ "bind -Tcopy-mode-vi DoubleClick1Pane send -X select-word",
+ "bind -Tcopy-mode-vi TripleClick1Pane send -X select-line",
+ "bind -Tcopy-mode-vi BSpace send -X cursor-left",
+ "bind -Tcopy-mode-vi NPage send -X page-down",
+ "bind -Tcopy-mode-vi PPage send -X page-up",
+ "bind -Tcopy-mode-vi Up send -X cursor-up",
+ "bind -Tcopy-mode-vi Down send -X cursor-down",
+ "bind -Tcopy-mode-vi Left send -X cursor-left",
+ "bind -Tcopy-mode-vi Right send -X cursor-right",
+ "bind -Tcopy-mode-vi C-Up send -X scroll-up",
+ "bind -Tcopy-mode-vi C-Down send -X scroll-down",
};
u_int i;
struct cmd_list *cmdlist;
diff --git a/key-string.c b/key-string.c
index ef5cf17c..d513ec6f 100644
--- a/key-string.c
+++ b/key-string.c
@@ -25,7 +25,7 @@
static key_code key_string_search_table(const char *);
static key_code key_string_get_modifiers(const char **);
-const struct {
+static const struct {
const char *string;
key_code key;
} key_string_table[] = {
@@ -98,6 +98,12 @@ const struct {
KEYC_MOUSE_STRING(MOUSEDRAGEND3, MouseDragEnd3),
KEYC_MOUSE_STRING(WHEELUP, WheelUp),
KEYC_MOUSE_STRING(WHEELDOWN, WheelDown),
+ KEYC_MOUSE_STRING(DOUBLECLICK1, DoubleClick1),
+ KEYC_MOUSE_STRING(DOUBLECLICK2, DoubleClick2),
+ KEYC_MOUSE_STRING(DOUBLECLICK3, DoubleClick3),
+ KEYC_MOUSE_STRING(TRIPLECLICK1, TripleClick1),
+ KEYC_MOUSE_STRING(TRIPLECLICK2, TripleClick2),
+ KEYC_MOUSE_STRING(TRIPLECLICK3, TripleClick3),
};
/* Find key string in table. */
diff --git a/layout-set.c b/layout-set.c
index 4d2b8ca7..db621f61 100644
--- a/layout-set.c
+++ b/layout-set.c
@@ -27,13 +27,13 @@
* one-off and generate a layout tree.
*/
-void layout_set_even_h(struct window *);
-void layout_set_even_v(struct window *);
-void layout_set_main_h(struct window *);
-void layout_set_main_v(struct window *);
-void layout_set_tiled(struct window *);
+static void layout_set_even_h(struct window *);
+static void layout_set_even_v(struct window *);
+static void layout_set_main_h(struct window *);
+static void layout_set_main_v(struct window *);
+static void layout_set_tiled(struct window *);
-const struct {
+static const struct {
const char *name;
void (*arrange)(struct window *);
} layout_sets[] = {
@@ -114,7 +114,7 @@ layout_set_previous(struct window *w)
return (layout);
}
-void
+static void
layout_set_even_h(struct window *w)
{
struct window_pane *wp;
@@ -168,7 +168,7 @@ layout_set_even_h(struct window *w)
server_redraw_window(w);
}
-void
+static void
layout_set_even_v(struct window *w)
{
struct window_pane *wp;
@@ -222,7 +222,7 @@ layout_set_even_v(struct window *w)
server_redraw_window(w);
}
-void
+static void
layout_set_main_h(struct window *w)
{
struct window_pane *wp;
@@ -345,7 +345,7 @@ layout_set_main_h(struct window *w)
server_redraw_window(w);
}
-void
+static void
layout_set_main_v(struct window *w)
{
struct window_pane *wp;
diff --git a/mode-key.c b/mode-key.c
index db728fd1..32333957 100644
--- a/mode-key.c
+++ b/mode-key.c
@@ -38,6 +38,12 @@
* (any matching MODEKEYEDIT_SWITCHMODE*) are special-cased to do this.
*/
+/* Command to string mapping. */
+struct mode_key_cmdstr {
+ enum mode_key_cmd cmd;
+ const char *name;
+};
+
/* Entry in the default mode key tables. */
struct mode_key_entry {
key_code key;
@@ -50,11 +56,10 @@ struct mode_key_entry {
*/
int mode;
enum mode_key_cmd cmd;
- u_int repeat;
};
/* Edit keys command strings. */
-const struct mode_key_cmdstr mode_key_cmdstr_edit[] = {
+static const struct mode_key_cmdstr mode_key_cmdstr_edit[] = {
{ MODEKEYEDIT_BACKSPACE, "backspace" },
{ MODEKEYEDIT_CANCEL, "cancel" },
{ MODEKEYEDIT_COMPLETE, "complete" },
@@ -89,7 +94,7 @@ const struct mode_key_cmdstr mode_key_cmdstr_edit[] = {
};
/* Choice keys command strings. */
-const struct mode_key_cmdstr mode_key_cmdstr_choice[] = {
+static const struct mode_key_cmdstr mode_key_cmdstr_choice[] = {
{ MODEKEYCHOICE_BACKSPACE, "backspace" },
{ MODEKEYCHOICE_BOTTOMLINE, "bottom-line"},
{ MODEKEYCHOICE_CANCEL, "cancel" },
@@ -113,416 +118,207 @@ const struct mode_key_cmdstr mode_key_cmdstr_choice[] = {
{ 0, NULL }
};
-/* Copy keys command strings. */
-const struct mode_key_cmdstr mode_key_cmdstr_copy[] = {
- { MODEKEYCOPY_APPENDSELECTION, "append-selection" },
- { MODEKEYCOPY_BACKTOINDENTATION, "back-to-indentation" },
- { MODEKEYCOPY_BOTTOMLINE, "bottom-line" },
- { MODEKEYCOPY_CANCEL, "cancel" },
- { MODEKEYCOPY_CLEARSELECTION, "clear-selection" },
- { MODEKEYCOPY_COPYPIPE, "copy-pipe" },
- { MODEKEYCOPY_COPYLINE, "copy-line" },
- { MODEKEYCOPY_COPYENDOFLINE, "copy-end-of-line" },
- { MODEKEYCOPY_COPYSELECTION, "copy-selection" },
- { MODEKEYCOPY_DOWN, "cursor-down" },
- { MODEKEYCOPY_ENDOFLINE, "end-of-line" },
- { MODEKEYCOPY_GOTOLINE, "goto-line" },
- { MODEKEYCOPY_HALFPAGEDOWN, "halfpage-down" },
- { MODEKEYCOPY_HALFPAGEUP, "halfpage-up" },
- { MODEKEYCOPY_HISTORYBOTTOM, "history-bottom" },
- { MODEKEYCOPY_HISTORYTOP, "history-top" },
- { MODEKEYCOPY_JUMP, "jump-forward" },
- { MODEKEYCOPY_JUMPAGAIN, "jump-again" },
- { MODEKEYCOPY_JUMPREVERSE, "jump-reverse" },
- { MODEKEYCOPY_JUMPBACK, "jump-backward" },
- { MODEKEYCOPY_JUMPTO, "jump-to-forward" },
- { MODEKEYCOPY_JUMPTOBACK, "jump-to-backward" },
- { MODEKEYCOPY_LEFT, "cursor-left" },
- { MODEKEYCOPY_RECTANGLETOGGLE, "rectangle-toggle" },
- { MODEKEYCOPY_MIDDLELINE, "middle-line" },
- { MODEKEYCOPY_NEXTPAGE, "page-down" },
- { MODEKEYCOPY_NEXTPARAGRAPH, "next-paragraph" },
- { MODEKEYCOPY_NEXTSPACE, "next-space" },
- { MODEKEYCOPY_NEXTSPACEEND, "next-space-end" },
- { MODEKEYCOPY_NEXTWORD, "next-word" },
- { MODEKEYCOPY_NEXTWORDEND, "next-word-end" },
- { MODEKEYCOPY_OTHEREND, "other-end" },
- { MODEKEYCOPY_PREVIOUSPAGE, "page-up" },
- { MODEKEYCOPY_PREVIOUSPARAGRAPH, "previous-paragraph" },
- { MODEKEYCOPY_PREVIOUSSPACE, "previous-space" },
- { MODEKEYCOPY_PREVIOUSWORD, "previous-word" },
- { MODEKEYCOPY_RIGHT, "cursor-right" },
- { MODEKEYCOPY_SCROLLDOWN, "scroll-down" },
- { MODEKEYCOPY_SCROLLUP, "scroll-up" },
- { MODEKEYCOPY_SEARCHAGAIN, "search-again" },
- { MODEKEYCOPY_SEARCHDOWN, "search-forward" },
- { MODEKEYCOPY_SEARCHREVERSE, "search-reverse" },
- { MODEKEYCOPY_SEARCHUP, "search-backward" },
- { MODEKEYCOPY_SELECTLINE, "select-line" },
- { MODEKEYCOPY_STARTNAMEDBUFFER, "start-named-buffer" },
- { MODEKEYCOPY_STARTNUMBERPREFIX, "start-number-prefix" },
- { MODEKEYCOPY_STARTOFLINE, "start-of-line" },
- { MODEKEYCOPY_STARTSELECTION, "begin-selection" },
- { MODEKEYCOPY_TOPLINE, "top-line" },
- { MODEKEYCOPY_UP, "cursor-up" },
-
- { 0, NULL }
-};
-
/* vi editing keys. */
-const struct mode_key_entry mode_key_vi_edit[] = {
- { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL, 1 },
- { '\010' /* C-h */, 0, MODEKEYEDIT_BACKSPACE, 1 },
- { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE, 1 },
- { '\025' /* C-u */, 0, MODEKEYEDIT_DELETELINE, 1 },
- { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD, 1 },
- { '\033' /* Escape */, 0, MODEKEYEDIT_SWITCHMODE, 1 },
- { '\n', 0, MODEKEYEDIT_ENTER, 1 },
- { '\r', 0, MODEKEYEDIT_ENTER, 1 },
- { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE, 1 },
- { KEYC_DC, 0, MODEKEYEDIT_DELETE, 1 },
- { KEYC_DOWN, 0, MODEKEYEDIT_HISTORYDOWN, 1 },
- { KEYC_LEFT, 0, MODEKEYEDIT_CURSORLEFT, 1 },
- { KEYC_RIGHT, 0, MODEKEYEDIT_CURSORRIGHT, 1 },
- { KEYC_UP, 0, MODEKEYEDIT_HISTORYUP, 1 },
- { KEYC_HOME, 0, MODEKEYEDIT_STARTOFLINE, 1 },
- { KEYC_END, 0, MODEKEYEDIT_ENDOFLINE, 1 },
-
- { '$', 1, MODEKEYEDIT_ENDOFLINE, 1 },
- { '0', 1, MODEKEYEDIT_STARTOFLINE, 1 },
- { 'A', 1, MODEKEYEDIT_SWITCHMODEAPPENDLINE, 1 },
- { 'B', 1, MODEKEYEDIT_PREVIOUSSPACE, 1 },
- { 'C', 1, MODEKEYEDIT_SWITCHMODECHANGELINE, 1 },
- { 'D', 1, MODEKEYEDIT_DELETETOENDOFLINE, 1 },
- { 'E', 1, MODEKEYEDIT_NEXTSPACEEND, 1 },
- { 'I', 1, MODEKEYEDIT_SWITCHMODEBEGINLINE, 1 },
- { 'S', 1, MODEKEYEDIT_SWITCHMODESUBSTITUTELINE, 1 },
- { 'W', 1, MODEKEYEDIT_NEXTSPACE, 1 },
- { 'X', 1, MODEKEYEDIT_BACKSPACE, 1 },
- { '\003' /* C-c */, 1, MODEKEYEDIT_CANCEL, 1 },
- { '\010' /* C-h */, 1, MODEKEYEDIT_BACKSPACE, 1 },
- { '\n', 1, MODEKEYEDIT_ENTER, 1 },
- { '\r', 1, MODEKEYEDIT_ENTER, 1 },
- { '^', 1, MODEKEYEDIT_STARTOFLINE, 1 },
- { 'a', 1, MODEKEYEDIT_SWITCHMODEAPPEND, 1 },
- { 'b', 1, MODEKEYEDIT_PREVIOUSWORD, 1 },
- { 'd', 1, MODEKEYEDIT_DELETELINE, 1 },
- { 'e', 1, MODEKEYEDIT_NEXTWORDEND, 1 },
- { 'h', 1, MODEKEYEDIT_CURSORLEFT, 1 },
- { 'i', 1, MODEKEYEDIT_SWITCHMODE, 1 },
- { 'j', 1, MODEKEYEDIT_HISTORYDOWN, 1 },
- { 'k', 1, MODEKEYEDIT_HISTORYUP, 1 },
- { 'l', 1, MODEKEYEDIT_CURSORRIGHT, 1 },
- { 'p', 1, MODEKEYEDIT_PASTE, 1 },
- { 's', 1, MODEKEYEDIT_SWITCHMODESUBSTITUTE, 1 },
- { 'w', 1, MODEKEYEDIT_NEXTWORD, 1 },
- { 'x', 1, MODEKEYEDIT_DELETE, 1 },
- { KEYC_BSPACE, 1, MODEKEYEDIT_BACKSPACE, 1 },
- { KEYC_DC, 1, MODEKEYEDIT_DELETE, 1 },
- { KEYC_DOWN, 1, MODEKEYEDIT_HISTORYDOWN, 1 },
- { KEYC_LEFT, 1, MODEKEYEDIT_CURSORLEFT, 1 },
- { KEYC_RIGHT, 1, MODEKEYEDIT_CURSORRIGHT, 1 },
- { KEYC_UP, 1, MODEKEYEDIT_HISTORYUP, 1 },
-
- { 0, -1, 0, 1 }
+static const struct mode_key_entry mode_key_vi_edit[] = {
+ { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL },
+ { '\010' /* C-h */, 0, MODEKEYEDIT_BACKSPACE },
+ { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE },
+ { '\025' /* C-u */, 0, MODEKEYEDIT_DELETELINE },
+ { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD },
+ { '\033' /* Escape */, 0, MODEKEYEDIT_SWITCHMODE },
+ { '\n', 0, MODEKEYEDIT_ENTER },
+ { '\r', 0, MODEKEYEDIT_ENTER },
+ { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE },
+ { KEYC_DC, 0, MODEKEYEDIT_DELETE },
+ { KEYC_DOWN, 0, MODEKEYEDIT_HISTORYDOWN },
+ { KEYC_LEFT, 0, MODEKEYEDIT_CURSORLEFT },
+ { KEYC_RIGHT, 0, MODEKEYEDIT_CURSORRIGHT },
+ { KEYC_UP, 0, MODEKEYEDIT_HISTORYUP },
+ { KEYC_HOME, 0, MODEKEYEDIT_STARTOFLINE },
+ { KEYC_END, 0, MODEKEYEDIT_ENDOFLINE },
+
+ { '$', 1, MODEKEYEDIT_ENDOFLINE },
+ { '0', 1, MODEKEYEDIT_STARTOFLINE },
+ { 'A', 1, MODEKEYEDIT_SWITCHMODEAPPENDLINE },
+ { 'B', 1, MODEKEYEDIT_PREVIOUSSPACE },
+ { 'C', 1, MODEKEYEDIT_SWITCHMODECHANGELINE },
+ { 'D', 1, MODEKEYEDIT_DELETETOENDOFLINE },
+ { 'E', 1, MODEKEYEDIT_NEXTSPACEEND },
+ { 'I', 1, MODEKEYEDIT_SWITCHMODEBEGINLINE },
+ { 'S', 1, MODEKEYEDIT_SWITCHMODESUBSTITUTELINE },
+ { 'W', 1, MODEKEYEDIT_NEXTSPACE },
+ { 'X', 1, MODEKEYEDIT_BACKSPACE },
+ { '\003' /* C-c */, 1, MODEKEYEDIT_CANCEL },
+ { '\010' /* C-h */, 1, MODEKEYEDIT_BACKSPACE },
+ { '\n', 1, MODEKEYEDIT_ENTER },
+ { '\r', 1, MODEKEYEDIT_ENTER },
+ { '^', 1, MODEKEYEDIT_STARTOFLINE },
+ { 'a', 1, MODEKEYEDIT_SWITCHMODEAPPEND },
+ { 'b', 1, MODEKEYEDIT_PREVIOUSWORD },
+ { 'd', 1, MODEKEYEDIT_DELETELINE },
+ { 'e', 1, MODEKEYEDIT_NEXTWORDEND },
+ { 'h', 1, MODEKEYEDIT_CURSORLEFT },
+ { 'i', 1, MODEKEYEDIT_SWITCHMODE },
+ { 'j', 1, MODEKEYEDIT_HISTORYDOWN },
+ { 'k', 1, MODEKEYEDIT_HISTORYUP },
+ { 'l', 1, MODEKEYEDIT_CURSORRIGHT },
+ { 'p', 1, MODEKEYEDIT_PASTE },
+ { 's', 1, MODEKEYEDIT_SWITCHMODESUBSTITUTE },
+ { 'w', 1, MODEKEYEDIT_NEXTWORD },
+ { 'x', 1, MODEKEYEDIT_DELETE },
+ { KEYC_BSPACE, 1, MODEKEYEDIT_BACKSPACE },
+ { KEYC_DC, 1, MODEKEYEDIT_DELETE },
+ { KEYC_DOWN, 1, MODEKEYEDIT_HISTORYDOWN },
+ { KEYC_LEFT, 1, MODEKEYEDIT_CURSORLEFT },
+ { KEYC_RIGHT, 1, MODEKEYEDIT_CURSORRIGHT },
+ { KEYC_UP, 1, MODEKEYEDIT_HISTORYUP },
+
+ { 0, -1, 0 }
};
struct mode_key_tree mode_key_tree_vi_edit;
/* vi choice selection keys. */
-const struct mode_key_entry mode_key_vi_choice[] = {
- { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP, 1 },
- { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL, 1 },
- { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN, 1 },
- { '\006' /* C-f */, 0, MODEKEYCHOICE_PAGEDOWN, 1 },
- { '\031' /* C-y */, 0, MODEKEYCHOICE_SCROLLUP, 1 },
- { '\n', 0, MODEKEYCHOICE_CHOOSE, 1 },
- { '\r', 0, MODEKEYCHOICE_CHOOSE, 1 },
- { 'j', 0, MODEKEYCHOICE_DOWN, 1 },
- { 'k', 0, MODEKEYCHOICE_UP, 1 },
- { 'q', 0, MODEKEYCHOICE_CANCEL, 1 },
- { KEYC_HOME, 0, MODEKEYCHOICE_STARTOFLIST, 1 },
- { 'g', 0, MODEKEYCHOICE_STARTOFLIST, 1 },
- { 'H', 0, MODEKEYCHOICE_TOPLINE, 1 },
- { 'L', 0, MODEKEYCHOICE_BOTTOMLINE, 1 },
- { 'G', 0, MODEKEYCHOICE_ENDOFLIST, 1 },
- { KEYC_END, 0, MODEKEYCHOICE_ENDOFLIST, 1 },
- { KEYC_BSPACE, 0, MODEKEYCHOICE_BACKSPACE, 1 },
- { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLDOWN, 1 },
- { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN, 1 },
- { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN, 1 },
- { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP, 1 },
- { KEYC_UP | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLUP, 1 },
- { KEYC_UP, 0, MODEKEYCHOICE_UP, 1 },
- { ' ', 0, MODEKEYCHOICE_TREE_TOGGLE, 1 },
- { KEYC_LEFT, 0, MODEKEYCHOICE_TREE_COLLAPSE, 1 },
- { KEYC_RIGHT, 0, MODEKEYCHOICE_TREE_EXPAND, 1 },
- { KEYC_LEFT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_COLLAPSE_ALL, 1 },
- { KEYC_RIGHT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_EXPAND_ALL, 1 },
- { KEYC_MOUSEDOWN1_PANE, 0, MODEKEYCHOICE_CHOOSE, 1 },
- { KEYC_MOUSEDOWN3_PANE, 0, MODEKEYCHOICE_TREE_TOGGLE, 1 },
- { KEYC_WHEELUP_PANE, 0, MODEKEYCHOICE_UP, 1 },
- { KEYC_WHEELDOWN_PANE, 0, MODEKEYCHOICE_DOWN, 1 },
-
- { 0, -1, 0, 1 }
+static const struct mode_key_entry mode_key_vi_choice[] = {
+ { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP },
+ { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
+ { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN },
+ { '\006' /* C-f */, 0, MODEKEYCHOICE_PAGEDOWN },
+ { '\031' /* C-y */, 0, MODEKEYCHOICE_SCROLLUP },
+ { '\n', 0, MODEKEYCHOICE_CHOOSE },
+ { '\r', 0, MODEKEYCHOICE_CHOOSE },
+ { 'j', 0, MODEKEYCHOICE_DOWN },
+ { 'k', 0, MODEKEYCHOICE_UP },
+ { 'q', 0, MODEKEYCHOICE_CANCEL },
+ { KEYC_HOME, 0, MODEKEYCHOICE_STARTOFLIST },
+ { 'g', 0, MODEKEYCHOICE_STARTOFLIST },
+ { 'H', 0, MODEKEYCHOICE_TOPLINE },
+ { 'L', 0, MODEKEYCHOICE_BOTTOMLINE },
+ { 'G', 0, MODEKEYCHOICE_ENDOFLIST },
+ { KEYC_END, 0, MODEKEYCHOICE_ENDOFLIST },
+ { KEYC_BSPACE, 0, MODEKEYCHOICE_BACKSPACE },
+ { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLDOWN },
+ { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN },
+ { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN },
+ { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP },
+ { KEYC_UP | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLUP },
+ { KEYC_UP, 0, MODEKEYCHOICE_UP },
+ { ' ', 0, MODEKEYCHOICE_TREE_TOGGLE },
+ { KEYC_LEFT, 0, MODEKEYCHOICE_TREE_COLLAPSE },
+ { KEYC_RIGHT, 0, MODEKEYCHOICE_TREE_EXPAND },
+ { KEYC_LEFT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_COLLAPSE_ALL },
+ { KEYC_RIGHT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_EXPAND_ALL },
+ { KEYC_MOUSEDOWN1_PANE, 0, MODEKEYCHOICE_CHOOSE },
+ { KEYC_MOUSEDOWN3_PANE, 0, MODEKEYCHOICE_TREE_TOGGLE },
+ { KEYC_WHEELUP_PANE, 0, MODEKEYCHOICE_UP },
+ { KEYC_WHEELDOWN_PANE, 0, MODEKEYCHOICE_DOWN },
+
+ { 0, -1, 0 }
};
struct mode_key_tree mode_key_tree_vi_choice;
-/* vi copy mode keys. */
-const struct mode_key_entry mode_key_vi_copy[] = {
- { ' ', 0, MODEKEYCOPY_STARTSELECTION, 1 },
- { '"', 0, MODEKEYCOPY_STARTNAMEDBUFFER, 1 },
- { '$', 0, MODEKEYCOPY_ENDOFLINE, 1 },
- { ',', 0, MODEKEYCOPY_JUMPREVERSE, 1 },
- { ';', 0, MODEKEYCOPY_JUMPAGAIN, 1 },
- { '/', 0, MODEKEYCOPY_SEARCHDOWN, 1 },
- { '0', 0, MODEKEYCOPY_STARTOFLINE, 1 },
- { '1', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '2', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '3', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '4', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '5', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '6', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '7', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '8', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '9', 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { ':', 0, MODEKEYCOPY_GOTOLINE, 1 },
- { '?', 0, MODEKEYCOPY_SEARCHUP, 1 },
- { 'A', 0, MODEKEYCOPY_APPENDSELECTION, 1 },
- { 'B', 0, MODEKEYCOPY_PREVIOUSSPACE, 1 },
- { 'D', 0, MODEKEYCOPY_COPYENDOFLINE, 1 },
- { 'E', 0, MODEKEYCOPY_NEXTSPACEEND, 1 },
- { 'F', 0, MODEKEYCOPY_JUMPBACK, 1 },
- { 'G', 0, MODEKEYCOPY_HISTORYBOTTOM, 1 },
- { 'H', 0, MODEKEYCOPY_TOPLINE, 1 },
- { 'J', 0, MODEKEYCOPY_SCROLLDOWN, 1 },
- { 'K', 0, MODEKEYCOPY_SCROLLUP, 1 },
- { 'L', 0, MODEKEYCOPY_BOTTOMLINE, 1 },
- { 'M', 0, MODEKEYCOPY_MIDDLELINE, 1 },
- { 'N', 0, MODEKEYCOPY_SEARCHREVERSE, 1 },
- { 'T', 0, MODEKEYCOPY_JUMPTOBACK, 1 },
- { 'V', 0, MODEKEYCOPY_SELECTLINE, 1 },
- { 'W', 0, MODEKEYCOPY_NEXTSPACE, 1 },
- { '\002' /* C-b */, 0, MODEKEYCOPY_PREVIOUSPAGE, 1 },
- { '\003' /* C-c */, 0, MODEKEYCOPY_CANCEL, 1 },
- { '\004' /* C-d */, 0, MODEKEYCOPY_HALFPAGEDOWN, 1 },
- { '\005' /* C-e */, 0, MODEKEYCOPY_SCROLLDOWN, 1 },
- { '\006' /* C-f */, 0, MODEKEYCOPY_NEXTPAGE, 1 },
- { '\010' /* C-h */, 0, MODEKEYCOPY_LEFT, 1 },
- { '\025' /* C-u */, 0, MODEKEYCOPY_HALFPAGEUP, 1 },
- { '\031' /* C-y */, 0, MODEKEYCOPY_SCROLLUP, 1 },
- { '\033' /* Escape */, 0, MODEKEYCOPY_CLEARSELECTION, 1 },
- { '\n', 0, MODEKEYCOPY_COPYSELECTION, 1 },
- { '\r', 0, MODEKEYCOPY_COPYSELECTION, 1 },
- { '^', 0, MODEKEYCOPY_BACKTOINDENTATION, 1 },
- { 'b', 0, MODEKEYCOPY_PREVIOUSWORD, 1 },
- { 'e', 0, MODEKEYCOPY_NEXTWORDEND, 1 },
- { 'f', 0, MODEKEYCOPY_JUMP, 1 },
- { 'g', 0, MODEKEYCOPY_HISTORYTOP, 1 },
- { 'h', 0, MODEKEYCOPY_LEFT, 1 },
- { 'j', 0, MODEKEYCOPY_DOWN, 1 },
- { 'k', 0, MODEKEYCOPY_UP, 1 },
- { 'l', 0, MODEKEYCOPY_RIGHT, 1 },
- { 'n', 0, MODEKEYCOPY_SEARCHAGAIN, 1 },
- { 'o', 0, MODEKEYCOPY_OTHEREND, 1 },
- { 't', 0, MODEKEYCOPY_JUMPTO, 1 },
- { 'q', 0, MODEKEYCOPY_CANCEL, 1 },
- { 'v', 0, MODEKEYCOPY_RECTANGLETOGGLE, 1 },
- { 'w', 0, MODEKEYCOPY_NEXTWORD, 1 },
- { '{', 0, MODEKEYCOPY_PREVIOUSPARAGRAPH, 1 },
- { '}', 0, MODEKEYCOPY_NEXTPARAGRAPH, 1 },
- { KEYC_BSPACE, 0, MODEKEYCOPY_LEFT, 1 },
- { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCOPY_SCROLLDOWN, 1 },
- { KEYC_DOWN, 0, MODEKEYCOPY_DOWN, 1 },
- { KEYC_LEFT, 0, MODEKEYCOPY_LEFT, 1 },
- { KEYC_NPAGE, 0, MODEKEYCOPY_NEXTPAGE, 1 },
- { KEYC_PPAGE, 0, MODEKEYCOPY_PREVIOUSPAGE, 1 },
- { KEYC_RIGHT, 0, MODEKEYCOPY_RIGHT, 1 },
- { KEYC_UP | KEYC_CTRL, 0, MODEKEYCOPY_SCROLLUP, 1 },
- { KEYC_UP, 0, MODEKEYCOPY_UP, 1 },
- { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP, 1 },
- { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN, 1 },
- { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION, 1 },
- { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION, 1 },
-
- { 0, -1, 0, 1 }
-};
-struct mode_key_tree mode_key_tree_vi_copy;
-
/* emacs editing keys. */
-const struct mode_key_entry mode_key_emacs_edit[] = {
- { '\001' /* C-a */, 0, MODEKEYEDIT_STARTOFLINE, 1 },
- { '\002' /* C-b */, 0, MODEKEYEDIT_CURSORLEFT, 1 },
- { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL, 1 },
- { '\004' /* C-d */, 0, MODEKEYEDIT_DELETE, 1 },
- { '\005' /* C-e */, 0, MODEKEYEDIT_ENDOFLINE, 1 },
- { '\006' /* C-f */, 0, MODEKEYEDIT_CURSORRIGHT, 1 },
- { '\010' /* C-H */, 0, MODEKEYEDIT_BACKSPACE, 1 },
- { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE, 1 },
- { '\013' /* C-k */, 0, MODEKEYEDIT_DELETETOENDOFLINE, 1 },
- { '\016' /* C-n */, 0, MODEKEYEDIT_HISTORYDOWN, 1 },
- { '\020' /* C-p */, 0, MODEKEYEDIT_HISTORYUP, 1 },
- { '\024' /* C-t */, 0, MODEKEYEDIT_TRANSPOSECHARS, 1 },
- { '\025' /* C-u */, 0, MODEKEYEDIT_DELETELINE, 1 },
- { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD, 1 },
- { '\031' /* C-y */, 0, MODEKEYEDIT_PASTE, 1 },
- { '\033' /* Escape */, 0, MODEKEYEDIT_CANCEL, 1 },
- { '\n', 0, MODEKEYEDIT_ENTER, 1 },
- { '\r', 0, MODEKEYEDIT_ENTER, 1 },
- { 'b' | KEYC_ESCAPE, 0, MODEKEYEDIT_PREVIOUSWORD, 1 },
- { 'f' | KEYC_ESCAPE, 0, MODEKEYEDIT_NEXTWORDEND, 1 },
- { 'm' | KEYC_ESCAPE, 0, MODEKEYEDIT_STARTOFLINE, 1 },
- { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE, 1 },
- { KEYC_DC, 0, MODEKEYEDIT_DELETE, 1 },
- { KEYC_DOWN, 0, MODEKEYEDIT_HISTORYDOWN, 1 },
- { KEYC_LEFT, 0, MODEKEYEDIT_CURSORLEFT, 1 },
- { KEYC_RIGHT, 0, MODEKEYEDIT_CURSORRIGHT, 1 },
- { KEYC_UP, 0, MODEKEYEDIT_HISTORYUP, 1 },
- { KEYC_HOME, 0, MODEKEYEDIT_STARTOFLINE, 1 },
- { KEYC_END, 0, MODEKEYEDIT_ENDOFLINE, 1 },
-
- { 0, -1, 0, 1 }
+static const struct mode_key_entry mode_key_emacs_edit[] = {
+ { '\001' /* C-a */, 0, MODEKEYEDIT_STARTOFLINE },
+ { '\002' /* C-b */, 0, MODEKEYEDIT_CURSORLEFT },
+ { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL },
+ { '\004' /* C-d */, 0, MODEKEYEDIT_DELETE },
+ { '\005' /* C-e */, 0, MODEKEYEDIT_ENDOFLINE },
+ { '\006' /* C-f */, 0, MODEKEYEDIT_CURSORRIGHT },
+ { '\010' /* C-H */, 0, MODEKEYEDIT_BACKSPACE },
+ { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE },
+ { '\013' /* C-k */, 0, MODEKEYEDIT_DELETETOENDOFLINE },
+ { '\016' /* C-n */, 0, MODEKEYEDIT_HISTORYDOWN },
+ { '\020' /* C-p */, 0, MODEKEYEDIT_HISTORYUP },
+ { '\024' /* C-t */, 0, MODEKEYEDIT_TRANSPOSECHARS },
+ { '\025' /* C-u */, 0, MODEKEYEDIT_DELETELINE },
+ { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD },
+ { '\031' /* C-y */, 0, MODEKEYEDIT_PASTE },
+ { '\033' /* Escape */, 0, MODEKEYEDIT_CANCEL },
+ { '\n', 0, MODEKEYEDIT_ENTER },
+ { '\r', 0, MODEKEYEDIT_ENTER },
+ { 'b' | KEYC_ESCAPE, 0, MODEKEYEDIT_PREVIOUSWORD },
+ { 'f' | KEYC_ESCAPE, 0, MODEKEYEDIT_NEXTWORDEND },
+ { 'm' | KEYC_ESCAPE, 0, MODEKEYEDIT_STARTOFLINE },
+ { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE },
+ { KEYC_DC, 0, MODEKEYEDIT_DELETE },
+ { KEYC_DOWN, 0, MODEKEYEDIT_HISTORYDOWN },
+ { KEYC_LEFT, 0, MODEKEYEDIT_CURSORLEFT },
+ { KEYC_RIGHT, 0, MODEKEYEDIT_CURSORRIGHT },
+ { KEYC_UP, 0, MODEKEYEDIT_HISTORYUP },
+ { KEYC_HOME, 0, MODEKEYEDIT_STARTOFLINE },
+ { KEYC_END, 0, MODEKEYEDIT_ENDOFLINE },
+
+ { 0, -1, 0 }
};
struct mode_key_tree mode_key_tree_emacs_edit;
/* emacs choice selection keys. */
-const struct mode_key_entry mode_key_emacs_choice[] = {
- { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX, 1 },
- { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL, 1 },
- { '\016' /* C-n */, 0, MODEKEYCHOICE_DOWN, 1 },
- { '\020' /* C-p */, 0, MODEKEYCHOICE_UP, 1 },
- { '\026' /* C-v */, 0, MODEKEYCHOICE_PAGEDOWN, 1 },
- { '\033' /* Escape */, 0, MODEKEYCHOICE_CANCEL, 1 },
- { '\n', 0, MODEKEYCHOICE_CHOOSE, 1 },
- { '\r', 0, MODEKEYCHOICE_CHOOSE, 1 },
- { 'q', 0, MODEKEYCHOICE_CANCEL, 1 },
- { 'v' | KEYC_ESCAPE, 0, MODEKEYCHOICE_PAGEUP, 1 },
- { KEYC_HOME, 0, MODEKEYCHOICE_STARTOFLIST, 1 },
- { '<' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTOFLIST, 1 },
- { 'R' | KEYC_ESCAPE, 0, MODEKEYCHOICE_TOPLINE, 1 },
- { '>' | KEYC_ESCAPE, 0, MODEKEYCHOICE_ENDOFLIST, 1 },
- { KEYC_END, 0, MODEKEYCHOICE_ENDOFLIST, 1 },
- { KEYC_BSPACE, 0, MODEKEYCHOICE_BACKSPACE, 1 },
- { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLDOWN, 1 },
- { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN, 1 },
- { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN, 1 },
- { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP, 1 },
- { KEYC_UP | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLUP, 1 },
- { KEYC_UP, 0, MODEKEYCHOICE_UP, 1 },
- { ' ', 0, MODEKEYCHOICE_TREE_TOGGLE, 1 },
- { KEYC_LEFT, 0, MODEKEYCHOICE_TREE_COLLAPSE, 1 },
- { KEYC_RIGHT, 0, MODEKEYCHOICE_TREE_EXPAND, 1 },
- { KEYC_LEFT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_COLLAPSE_ALL, 1 },
- { KEYC_RIGHT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_EXPAND_ALL, 1 },
- { KEYC_MOUSEDOWN1_PANE, 0, MODEKEYCHOICE_CHOOSE, 1 },
- { KEYC_MOUSEDOWN3_PANE, 0, MODEKEYCHOICE_TREE_TOGGLE, 1 },
- { KEYC_WHEELUP_PANE, 0, MODEKEYCHOICE_UP, 5 },
- { KEYC_WHEELDOWN_PANE, 0, MODEKEYCHOICE_DOWN, 5 },
-
- { 0, -1, 0, 1 }
+static const struct mode_key_entry mode_key_emacs_choice[] = {
+ { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
+ { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
+ { '\016' /* C-n */, 0, MODEKEYCHOICE_DOWN },
+ { '\020' /* C-p */, 0, MODEKEYCHOICE_UP },
+ { '\026' /* C-v */, 0, MODEKEYCHOICE_PAGEDOWN },
+ { '\033' /* Escape */, 0, MODEKEYCHOICE_CANCEL },
+ { '\n', 0, MODEKEYCHOICE_CHOOSE },
+ { '\r', 0, MODEKEYCHOICE_CHOOSE },
+ { 'q', 0, MODEKEYCHOICE_CANCEL },
+ { 'v' | KEYC_ESCAPE, 0, MODEKEYCHOICE_PAGEUP },
+ { KEYC_HOME, 0, MODEKEYCHOICE_STARTOFLIST },
+ { '<' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTOFLIST },
+ { 'R' | KEYC_ESCAPE, 0, MODEKEYCHOICE_TOPLINE },
+ { '>' | KEYC_ESCAPE, 0, MODEKEYCHOICE_ENDOFLIST },
+ { KEYC_END, 0, MODEKEYCHOICE_ENDOFLIST },
+ { KEYC_BSPACE, 0, MODEKEYCHOICE_BACKSPACE },
+ { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLDOWN },
+ { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN },
+ { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN },
+ { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP },
+ { KEYC_UP | KEYC_CTRL, 0, MODEKEYCHOICE_SCROLLUP },
+ { KEYC_UP, 0, MODEKEYCHOICE_UP },
+ { ' ', 0, MODEKEYCHOICE_TREE_TOGGLE },
+ { KEYC_LEFT, 0, MODEKEYCHOICE_TREE_COLLAPSE },
+ { KEYC_RIGHT, 0, MODEKEYCHOICE_TREE_EXPAND },
+ { KEYC_LEFT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_COLLAPSE_ALL },
+ { KEYC_RIGHT | KEYC_CTRL, 0, MODEKEYCHOICE_TREE_EXPAND_ALL },
+ { KEYC_MOUSEDOWN1_PANE, 0, MODEKEYCHOICE_CHOOSE },
+ { KEYC_MOUSEDOWN3_PANE, 0, MODEKEYCHOICE_TREE_TOGGLE },
+ { KEYC_WHEELUP_PANE, 0, MODEKEYCHOICE_UP },
+ { KEYC_WHEELDOWN_PANE, 0, MODEKEYCHOICE_DOWN },
+
+ { 0, -1, 0 }
};
struct mode_key_tree mode_key_tree_emacs_choice;
-/* emacs copy mode keys. */
-const struct mode_key_entry mode_key_emacs_copy[] = {
- { ' ', 0, MODEKEYCOPY_NEXTPAGE, 1 },
- { ',', 0, MODEKEYCOPY_JUMPREVERSE, 1 },
- { ';', 0, MODEKEYCOPY_JUMPAGAIN, 1 },
- { '1' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '2' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '3' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '4' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '5' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '6' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '7' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '8' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '9' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX, 1 },
- { '<' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYTOP, 1 },
- { '>' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYBOTTOM, 1 },
- { 'F', 0, MODEKEYCOPY_JUMPBACK, 1 },
- { 'N', 0, MODEKEYCOPY_SEARCHREVERSE, 1 },
- { 'R' | KEYC_ESCAPE, 0, MODEKEYCOPY_TOPLINE, 1 },
- { 'R', 0, MODEKEYCOPY_RECTANGLETOGGLE, 1 },
- { 'T', 0, MODEKEYCOPY_JUMPTOBACK, 1 },
- { '\000' /* C-Space */, 0, MODEKEYCOPY_STARTSELECTION, 1 },
- { '\001' /* C-a */, 0, MODEKEYCOPY_STARTOFLINE, 1 },
- { '\002' /* C-b */, 0, MODEKEYCOPY_LEFT, 1 },
- { '\003' /* C-c */, 0, MODEKEYCOPY_CANCEL, 1 },
- { '\005' /* C-e */, 0, MODEKEYCOPY_ENDOFLINE, 1 },
- { '\006' /* C-f */, 0, MODEKEYCOPY_RIGHT, 1 },
- { '\007' /* C-g */, 0, MODEKEYCOPY_CLEARSELECTION, 1 },
- { '\013' /* C-k */, 0, MODEKEYCOPY_COPYENDOFLINE, 1 },
- { '\016' /* C-n */, 0, MODEKEYCOPY_DOWN, 1 },
- { '\020' /* C-p */, 0, MODEKEYCOPY_UP, 1 },
- { '\022' /* C-r */, 0, MODEKEYCOPY_SEARCHUP, 1 },
- { '\023' /* C-s */, 0, MODEKEYCOPY_SEARCHDOWN, 1 },
- { '\026' /* C-v */, 0, MODEKEYCOPY_NEXTPAGE, 1 },
- { '\027' /* C-w */, 0, MODEKEYCOPY_COPYSELECTION, 1 },
- { '\033' /* Escape */, 0, MODEKEYCOPY_CANCEL, 1 },
- { 'b' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSWORD, 1 },
- { 'f', 0, MODEKEYCOPY_JUMP, 1 },
- { 'f' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTWORDEND, 1 },
- { 'g', 0, MODEKEYCOPY_GOTOLINE, 1 },
- { 'm' | KEYC_ESCAPE, 0, MODEKEYCOPY_BACKTOINDENTATION, 1 },
- { 'n', 0, MODEKEYCOPY_SEARCHAGAIN, 1 },
- { 'q', 0, MODEKEYCOPY_CANCEL, 1 },
- { 'r' | KEYC_ESCAPE, 0, MODEKEYCOPY_MIDDLELINE, 1 },
- { 't', 0, MODEKEYCOPY_JUMPTO, 1 },
- { 'v' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSPAGE, 1 },
- { 'w' | KEYC_ESCAPE, 0, MODEKEYCOPY_COPYSELECTION, 1 },
- { '{' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSPARAGRAPH, 1 },
- { '}' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTPARAGRAPH, 1 },
- { KEYC_DOWN | KEYC_CTRL, 0, MODEKEYCOPY_SCROLLDOWN, 1 },
- { KEYC_DOWN | KEYC_ESCAPE, 0, MODEKEYCOPY_HALFPAGEDOWN, 1 },
- { KEYC_DOWN, 0, MODEKEYCOPY_DOWN, 1 },
- { KEYC_LEFT, 0, MODEKEYCOPY_LEFT, 1 },
- { KEYC_NPAGE, 0, MODEKEYCOPY_NEXTPAGE, 1 },
- { KEYC_PPAGE, 0, MODEKEYCOPY_PREVIOUSPAGE, 1 },
- { KEYC_RIGHT, 0, MODEKEYCOPY_RIGHT, 1 },
- { KEYC_UP | KEYC_CTRL, 0, MODEKEYCOPY_SCROLLUP, 1 },
- { KEYC_UP | KEYC_ESCAPE, 0, MODEKEYCOPY_HALFPAGEUP, 1 },
- { KEYC_UP, 0, MODEKEYCOPY_UP, 1 },
- { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP, 5 },
- { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN, 5 },
- { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION, 1 },
- { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION, 1 },
-
- { 0, -1, 0, 1 }
-};
-struct mode_key_tree mode_key_tree_emacs_copy;
-
/* Table mapping key table names to default settings and trees. */
-const struct mode_key_table mode_key_tables[] = {
+static const struct mode_key_table mode_key_tables[] = {
{ "vi-edit", mode_key_cmdstr_edit,
&mode_key_tree_vi_edit, mode_key_vi_edit },
{ "vi-choice", mode_key_cmdstr_choice,
&mode_key_tree_vi_choice, mode_key_vi_choice },
- { "vi-copy", mode_key_cmdstr_copy,
- &mode_key_tree_vi_copy, mode_key_vi_copy },
{ "emacs-edit", mode_key_cmdstr_edit,
&mode_key_tree_emacs_edit, mode_key_emacs_edit },
{ "emacs-choice", mode_key_cmdstr_choice,
&mode_key_tree_emacs_choice, mode_key_emacs_choice },
- { "emacs-copy", mode_key_cmdstr_copy,
- &mode_key_tree_emacs_copy, mode_key_emacs_copy },
{ NULL, NULL, NULL, NULL }
};
@@ -587,10 +383,8 @@ mode_key_init_trees(void)
for (ment = mtab->table; ment->mode != -1; ment++) {
mbind = xmalloc(sizeof *mbind);
mbind->key = ment->key;
- mbind->repeat = ment->repeat;
mbind->mode = ment->mode;
mbind->cmd = ment->cmd;
- mbind->arg = NULL;
RB_INSERT(mode_key_tree, mtab->tree, mbind);
}
}
@@ -604,8 +398,7 @@ mode_key_init(struct mode_key_data *mdata, struct mode_key_tree *mtree)
}
enum mode_key_cmd
-mode_key_lookup(struct mode_key_data *mdata, key_code key, const char **arg,
- u_int *repeat)
+mode_key_lookup(struct mode_key_data *mdata, key_code key)
{
struct mode_key_binding *mbind, mtmp;
@@ -616,8 +409,6 @@ mode_key_lookup(struct mode_key_data *mdata, key_code key, const char **arg,
return (MODEKEY_NONE);
return (MODEKEY_OTHER);
}
- if (repeat != NULL)
- *repeat = mbind->repeat;
switch (mbind->cmd) {
case MODEKEYEDIT_SWITCHMODE:
@@ -630,8 +421,6 @@ mode_key_lookup(struct mode_key_data *mdata, key_code key, const char **arg,
mdata->mode = 1 - mdata->mode;
/* FALLTHROUGH */
default:
- if (arg != NULL)
- *arg = mbind->arg;
return (mbind->cmd);
}
}
diff --git a/names.c b/names.c
index 485155ff..6a368825 100644
--- a/names.c
+++ b/names.c
@@ -25,10 +25,12 @@
#include "tmux.h"
-void name_time_callback(int, short, void *);
-int name_time_expired(struct window *, struct timeval *);
+static void name_time_callback(int, short, void *);
+static int name_time_expired(struct window *, struct timeval *);
-void
+static char *format_window_name(struct window *);
+
+static void
name_time_callback(__unused int fd, __unused short events, void *arg)
{
struct window *w = arg;
@@ -37,7 +39,7 @@ name_time_callback(__unused int fd, __unused short events, void *arg)
log_debug("@%u name timer expired", w->id);
}
-int
+static int
name_time_expired(struct window *w, struct timeval *tv)
{
struct timeval offset;
@@ -115,7 +117,7 @@ default_window_name(struct window *w)
return (s);
}
-char *
+static char *
format_window_name(struct window *w)
{
struct format_tree *ft;
diff --git a/notify.c b/notify.c
index 696a62bf..d3b6ce63 100644
--- a/notify.c
+++ b/notify.c
@@ -42,12 +42,13 @@ struct notify_entry {
TAILQ_ENTRY(notify_entry) entry;
};
-TAILQ_HEAD(, notify_entry) notify_queue = TAILQ_HEAD_INITIALIZER(notify_queue);
-int notify_enabled = 1;
+TAILQ_HEAD(notify_queue, notify_entry);
+static struct notify_queue notify_queue = TAILQ_HEAD_INITIALIZER(notify_queue);
+static int notify_enabled = 1;
-void notify_drain(void);
-void notify_add(enum notify_type, struct client *, struct session *,
- struct window *);
+static void notify_drain(void);
+static void notify_add(enum notify_type, struct client *, struct session *,
+ struct window *);
void
notify_enable(void)
@@ -62,7 +63,7 @@ notify_disable(void)
notify_enabled = 0;
}
-void
+static void
notify_add(enum notify_type type, struct client *c, struct session *s,
struct window *w)
{
@@ -83,7 +84,7 @@ notify_add(enum notify_type type, struct client *c, struct session *s,
w->references++;
}
-void
+static void
notify_drain(void)
{
struct notify_entry *ne, *ne1;
diff --git a/options.c b/options.c
index cd3bd8ec..845bd7d5 100644
--- a/options.c
+++ b/options.c
@@ -35,8 +35,7 @@ struct options {
};
static int options_cmp(struct options_entry *, struct options_entry *);
-RB_PROTOTYPE(options_tree, options_entry, entry, options_cmp);
-RB_GENERATE(options_tree, options_entry, entry, options_cmp);
+RB_GENERATE_STATIC(options_tree, options_entry, entry, options_cmp);
static void options_free1(struct options *, struct options_entry *);
diff --git a/osdep-openbsd.c b/osdep-openbsd.c
index 1de876a4..b21a6628 100644
--- a/osdep-openbsd.c
+++ b/osdep-openbsd.c
@@ -37,12 +37,12 @@
#define is_stopped(p) \
((p)->p_stat == SSTOP || (p)->p_stat == SDEAD)
-struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
-char *osdep_get_name(int, char *);
-char *osdep_get_cwd(int);
-struct event_base *osdep_event_init(void);
+static struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
+char *osdep_get_name(int, char *);
+char *osdep_get_cwd(int);
+struct event_base *osdep_event_init(void);
-struct kinfo_proc *
+static struct kinfo_proc *
cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2)
{
if (is_runnable(p1) && !is_runnable(p2))
diff --git a/paste.c b/paste.c
index bc2f5c88..cf3e3cdc 100644
--- a/paste.c
+++ b/paste.c
@@ -45,8 +45,8 @@ struct paste_buffer {
static u_int paste_next_index;
static u_int paste_next_order;
static u_int paste_num_automatic;
-RB_HEAD(paste_name_tree, paste_buffer) paste_by_name;
-RB_HEAD(paste_time_tree, paste_buffer) paste_by_time;
+static RB_HEAD(paste_name_tree, paste_buffer) paste_by_name;
+static RB_HEAD(paste_time_tree, paste_buffer) paste_by_time;
static int paste_cmp_names(const struct paste_buffer *,
const struct paste_buffer *);
diff --git a/screen-redraw.c b/screen-redraw.c
index 5e4b0848..00e94d61 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -22,21 +22,22 @@
#include "tmux.h"
-int screen_redraw_cell_border1(struct window_pane *, u_int, u_int);
-int screen_redraw_cell_border(struct client *, u_int, u_int);
-int screen_redraw_check_cell(struct client *, u_int, u_int, int,
- struct window_pane **);
-int screen_redraw_check_is(u_int, u_int, int, int, struct window *,
- struct window_pane *, struct window_pane *);
-
-int screen_redraw_make_pane_status(struct client *, struct window *,
- struct window_pane *);
-void screen_redraw_draw_pane_status(struct client *, int);
-
-void screen_redraw_draw_borders(struct client *, int, int, u_int);
-void screen_redraw_draw_panes(struct client *, u_int);
-void screen_redraw_draw_status(struct client *, u_int);
-void screen_redraw_draw_number(struct client *, struct window_pane *, u_int);
+static int screen_redraw_cell_border1(struct window_pane *, u_int, u_int);
+static int screen_redraw_cell_border(struct client *, u_int, u_int);
+static int screen_redraw_check_cell(struct client *, u_int, u_int, int,
+ struct window_pane **);
+static int screen_redraw_check_is(u_int, u_int, int, int, struct window *,
+ struct window_pane *, struct window_pane *);
+
+static int screen_redraw_make_pane_status(struct client *, struct window *,
+ struct window_pane *);
+static void screen_redraw_draw_pane_status(struct client *, int);
+
+static void screen_redraw_draw_borders(struct client *, int, int, u_int);
+static void screen_redraw_draw_panes(struct client *, u_int);
+static void screen_redraw_draw_status(struct client *, u_int);
+static void screen_redraw_draw_number(struct client *, struct window_pane *,
+ u_int);
#define CELL_INSIDE 0
#define CELL_LEFTRIGHT 1
@@ -59,7 +60,7 @@ void screen_redraw_draw_number(struct client *, struct window_pane *, u_int);
#define CELL_STATUS_BOTTOM 2
/* Check if cell is on the border of a particular pane. */
-int
+static int
screen_redraw_cell_border1(struct window_pane *wp, u_int px, u_int py)
{
/* Inside pane. */
@@ -88,7 +89,7 @@ screen_redraw_cell_border1(struct window_pane *wp, u_int px, u_int py)
}
/* Check if a cell is on the pane border. */
-int
+static int
screen_redraw_cell_border(struct client *c, u_int px, u_int py)
{
struct window *w = c->session->curw->window;
@@ -107,7 +108,7 @@ screen_redraw_cell_border(struct client *c, u_int px, u_int py)
}
/* Check if cell inside a pane. */
-int
+static int
screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status,
struct window_pane **wpp)
{
@@ -116,6 +117,8 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status,
int borders;
u_int right, line;
+ *wpp = NULL;
+
if (px > w->sx || py > w->sy)
return (CELL_OUTSIDE);
@@ -201,12 +204,11 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status,
}
}
- *wpp = NULL;
return (CELL_OUTSIDE);
}
/* Check if the border of a particular pane. */
-int
+static int
screen_redraw_check_is(u_int px, u_int py, int type, int pane_status,
struct window *w, struct window_pane *wantwp, struct window_pane *wp)
{
@@ -259,7 +261,7 @@ screen_redraw_check_is(u_int px, u_int py, int type, int pane_status,
}
/* Update pane status. */
-int
+static int
screen_redraw_make_pane_status(struct client *c, struct window *w,
struct window_pane *wp)
{
@@ -303,7 +305,7 @@ screen_redraw_make_pane_status(struct client *c, struct window *w,
}
/* Draw pane status. */
-void
+static void
screen_redraw_draw_pane_status(struct client *c, int pane_status)
{
struct window *w = c->session->curw->window;
@@ -418,7 +420,7 @@ screen_redraw_pane(struct client *c, struct window_pane *wp)
}
/* Draw the borders. */
-void
+static void
screen_redraw_draw_borders(struct client *c, int status, int pane_status,
u_int top)
{
@@ -505,7 +507,7 @@ screen_redraw_draw_borders(struct client *c, int status, int pane_status,
}
/* Draw the panes. */
-void
+static void
screen_redraw_draw_panes(struct client *c, u_int top)
{
struct window *w = c->session->curw->window;
@@ -524,7 +526,7 @@ screen_redraw_draw_panes(struct client *c, u_int top)
}
/* Draw the status line. */
-void
+static void
screen_redraw_draw_status(struct client *c, u_int top)
{
struct tty *tty = &c->tty;
@@ -536,7 +538,7 @@ screen_redraw_draw_status(struct client *c, u_int top)
}
/* Draw number on a pane. */
-void
+static void
screen_redraw_draw_number(struct client *c, struct window_pane *wp, u_int top)
{
struct tty *tty = &c->tty;
diff --git a/screen.c b/screen.c
index 8e4f8a65..7bde6f9b 100644
--- a/screen.c
+++ b/screen.c
@@ -24,8 +24,10 @@
#include "tmux.h"
-void screen_resize_x(struct screen *, u_int);
-void screen_resize_y(struct screen *, u_int);
+static void screen_resize_x(struct screen *, u_int);
+static void screen_resize_y(struct screen *, u_int);
+
+static void screen_reflow(struct screen *, u_int);
/* Create a new screen. */
void
@@ -139,7 +141,7 @@ screen_resize(struct screen *s, u_int sx, u_int sy, int reflow)
screen_reflow(s, sx);
}
-void
+static void
screen_resize_x(struct screen *s, u_int sx)
{
struct grid *gd = s->grid;
@@ -161,7 +163,7 @@ screen_resize_x(struct screen *s, u_int sx)
gd->sx = sx;
}
-void
+static void
screen_resize_y(struct screen *s, u_int sy)
{
struct grid *gd = s->grid;
@@ -221,8 +223,8 @@ screen_resize_y(struct screen *s, u_int sy)
needed = sy - oldy;
/*
- * Try to pull as much as possible out of scrolled history, if is
- * is enabled.
+ * Try to pull as much as possible out of scrolled history, if
+ * is is enabled.
*/
available = gd->hscrolled;
if (gd->flags & GRID_HISTORY && available > 0) {
@@ -370,7 +372,7 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
}
/* Reflow wrapped lines. */
-void
+static void
screen_reflow(struct screen *s, u_int new_x)
{
struct grid *old = s->grid;
diff --git a/server-client.c b/server-client.c
index 5f1a58f1..591033ce 100644
--- a/server-client.c
+++ b/server-client.c
@@ -30,21 +30,22 @@
#include "tmux.h"
-void server_client_free(int, short, void *);
-void server_client_check_focus(struct window_pane *);
-void server_client_check_resize(struct window_pane *);
-key_code server_client_check_mouse(struct client *);
-void server_client_repeat_timer(int, short, void *);
-void server_client_check_exit(struct client *);
-void server_client_check_redraw(struct client *);
-void server_client_set_title(struct client *);
-void server_client_reset_state(struct client *);
-int server_client_assume_paste(struct session *);
-
-void server_client_dispatch(struct imsg *, void *);
-void server_client_dispatch_command(struct client *, struct imsg *);
-void server_client_dispatch_identify(struct client *, struct imsg *);
-void server_client_dispatch_shell(struct client *);
+static void server_client_free(int, short, void *);
+static void server_client_check_focus(struct window_pane *);
+static void server_client_check_resize(struct window_pane *);
+static key_code server_client_check_mouse(struct client *);
+static void server_client_repeat_timer(int, short, void *);
+static void server_client_click_timer(int, short, void *);
+static void server_client_check_exit(struct client *);
+static void server_client_check_redraw(struct client *);
+static void server_client_set_title(struct client *);
+static void server_client_reset_state(struct client *);
+static int server_client_assume_paste(struct session *);
+
+static void server_client_dispatch(struct imsg *, void *);
+static void server_client_dispatch_command(struct client *, struct imsg *);
+static void server_client_dispatch_identify(struct client *, struct imsg *);
+static void server_client_dispatch_shell(struct client *);
/* Check if this client is inside this server. */
int
@@ -95,6 +96,13 @@ server_client_get_key_table(struct client *c)
return (name);
}
+/* Is this client using the default key table? */
+int
+server_client_is_default_key_table(struct client *c)
+{
+ return (strcmp(c->keytable->name, server_client_get_key_table(c)) == 0);
+}
+
/* Create a new client. */
void
server_client_create(int fd)
@@ -146,6 +154,7 @@ server_client_create(int fd)
c->keytable->references++;
evtimer_set(&c->repeat_timer, server_client_repeat_timer, c);
+ evtimer_set(&c->click_timer, server_client_click_timer, c);
TAILQ_INSERT_TAIL(&clients, c, entry);
log_debug("new client %p", c);
@@ -214,6 +223,7 @@ server_client_lost(struct client *c)
free((void *)c->cwd);
evtimer_del(&c->repeat_timer);
+ evtimer_del(&c->click_timer);
key_bindings_unref_table(c->keytable);
@@ -262,7 +272,7 @@ server_client_unref(struct client *c)
}
/* Free dead client. */
-void
+static void
server_client_free(__unused int fd, __unused short events, void *arg)
{
struct client *c = arg;
@@ -287,17 +297,19 @@ server_client_detach(struct client *c, enum msgtype msgtype)
}
/* Check for mouse keys. */
-key_code
+static key_code
server_client_check_mouse(struct client *c)
{
- struct session *s = c->session;
- struct mouse_event *m = &c->tty.mouse;
- struct window *w;
- struct window_pane *wp;
- enum { NOTYPE, DOWN, UP, DRAG, WHEEL } type = NOTYPE;
- enum { NOWHERE, PANE, STATUS, BORDER } where = NOWHERE;
- u_int x, y, b;
- key_code key;
+ struct session *s = c->session;
+ struct mouse_event *m = &c->tty.mouse;
+ struct window *w;
+ struct window_pane *wp;
+ u_int x, y, b;
+ int flag;
+ key_code key;
+ struct timeval tv;
+ enum { NOTYPE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type = NOTYPE;
+ enum { NOWHERE, PANE, STATUS, BORDER } where = NOWHERE;
log_debug("mouse %02x at %u,%u (last %u,%u) (%d)", m->b, m->x, m->y,
m->lx, m->ly, c->tty.mouse_drag_flag);
@@ -321,10 +333,45 @@ server_client_check_mouse(struct client *c)
x = m->x, y = m->y, b = m->lb;
log_debug("up at %u,%u", x, y);
} else {
+ if (c->flags & CLIENT_DOUBLECLICK) {
+ evtimer_del(&c->click_timer);
+ c->flags &= ~CLIENT_DOUBLECLICK;
+ if (m->b == c->click_button) {
+ type = DOUBLE;
+ x = m->x, y = m->y, b = m->b;
+ log_debug("double-click at %u,%u", x, y);
+ flag = CLIENT_TRIPLECLICK;
+ goto add_timer;
+ }
+ } else if (c->flags & CLIENT_TRIPLECLICK) {
+ evtimer_del(&c->click_timer);
+ c->flags &= ~CLIENT_TRIPLECLICK;
+ if (m->b == c->click_button) {
+ type = TRIPLE;
+ x = m->x, y = m->y, b = m->b;
+ log_debug("triple-click at %u,%u", x, y);
+ goto have_event;
+ }
+ }
+
type = DOWN;
x = m->x, y = m->y, b = m->b;
log_debug("down at %u,%u", x, y);
+ flag = CLIENT_DOUBLECLICK;
+
+ add_timer:
+ if (KEYC_CLICK_TIMEOUT != 0) {
+ c->flags |= flag;
+ c->click_button = m->b;
+
+ tv.tv_sec = KEYC_CLICK_TIMEOUT / 1000;
+ tv.tv_usec = (KEYC_CLICK_TIMEOUT % 1000) * 1000L;
+ evtimer_del(&c->click_timer);
+ evtimer_add(&c->click_timer, &tv);
+ }
}
+
+have_event:
if (type == NOTYPE)
return (KEYC_UNKNOWN);
@@ -537,6 +584,62 @@ server_client_check_mouse(struct client *c)
break;
}
break;
+ case DOUBLE:
+ switch (MOUSE_BUTTONS(b)) {
+ case 0:
+ if (where == PANE)
+ key = KEYC_DOUBLECLICK1_PANE;
+ if (where == STATUS)
+ key = KEYC_DOUBLECLICK1_STATUS;
+ if (where == BORDER)
+ key = KEYC_DOUBLECLICK1_BORDER;
+ break;
+ case 1:
+ if (where == PANE)
+ key = KEYC_DOUBLECLICK2_PANE;
+ if (where == STATUS)
+ key = KEYC_DOUBLECLICK2_STATUS;
+ if (where == BORDER)
+ key = KEYC_DOUBLECLICK2_BORDER;
+ break;
+ case 2:
+ if (where == PANE)
+ key = KEYC_DOUBLECLICK3_PANE;
+ if (where == STATUS)
+ key = KEYC_DOUBLECLICK3_STATUS;
+ if (where == BORDER)
+ key = KEYC_DOUBLECLICK3_BORDER;
+ break;
+ }
+ break;
+ case TRIPLE:
+ switch (MOUSE_BUTTONS(b)) {
+ case 0:
+ if (where == PANE)
+ key = KEYC_TRIPLECLICK1_PANE;
+ if (where == STATUS)
+ key = KEYC_TRIPLECLICK1_STATUS;
+ if (where == BORDER)
+ key = KEYC_TRIPLECLICK1_BORDER;
+ break;
+ case 1:
+ if (where == PANE)
+ key = KEYC_TRIPLECLICK2_PANE;
+ if (where == STATUS)
+ key = KEYC_TRIPLECLICK2_STATUS;
+ if (where == BORDER)
+ key = KEYC_TRIPLECLICK2_BORDER;
+ break;
+ case 2:
+ if (where == PANE)
+ key = KEYC_TRIPLECLICK3_PANE;
+ if (where == STATUS)
+ key = KEYC_TRIPLECLICK3_STATUS;
+ if (where == BORDER)
+ key = KEYC_TRIPLECLICK3_BORDER;
+ break;
+ }
+ break;
}
if (key == KEYC_UNKNOWN)
return (KEYC_UNKNOWN);
@@ -553,7 +656,7 @@ server_client_check_mouse(struct client *c)
}
/* Is this fast enough to probably be a paste? */
-int
+static int
server_client_assume_paste(struct session *s)
{
struct timeval tv;
@@ -585,6 +688,7 @@ server_client_handle_key(struct client *c, key_code key)
struct window *w;
struct window_pane *wp;
struct timeval tv;
+ const char *name;
struct key_table *table;
struct key_binding bd_find, *bd;
int xtimeout;
@@ -593,6 +697,10 @@ server_client_handle_key(struct client *c, key_code key)
if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
return;
w = s->curw->window;
+ if (KEYC_IS_MOUSE(key))
+ wp = cmd_mouse_pane(m, NULL, NULL);
+ else
+ wp = w->active;
/* Update the activity timer. */
if (gettimeofday(&c->activity_time, NULL) != 0)
@@ -643,9 +751,21 @@ server_client_handle_key(struct client *c, key_code key)
goto forward;
retry:
+ /*
+ * Work out the current key table. If the pane is in a mode, use
+ * the mode table instead of the default key table.
+ */
+ name = NULL;
+ if (wp != NULL && wp->mode != NULL && wp->mode->key_table != NULL)
+ name = wp->mode->key_table(wp);
+ if (name == NULL || !server_client_is_default_key_table(c))
+ table = c->keytable;
+ else
+ table = key_bindings_get_table(name, 1);
+
/* Try to see if there is a key binding in the current table. */
bd_find.key = key;
- bd = RB_FIND(key_bindings, &c->keytable->key_bindings, &bd_find);
+ bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
if (bd != NULL) {
/*
* Key was matched in this table. If currently repeating but a
@@ -663,7 +783,6 @@ retry:
* Take a reference to this table to make sure the key binding
* doesn't disappear.
*/
- table = c->keytable;
table->references++;
/*
@@ -702,7 +821,7 @@ retry:
}
/* If no match and we're not in the root table, that's it. */
- if (strcmp(c->keytable->name, server_client_get_key_table(c)) != 0) {
+ if (name == NULL && !server_client_is_default_key_table(c)) {
server_client_set_key_table(c, NULL);
server_status_client(c);
return;
@@ -722,10 +841,6 @@ retry:
forward:
if (c->flags & CLIENT_READONLY)
return;
- if (KEYC_IS_MOUSE(key))
- wp = cmd_mouse_pane(m, NULL, NULL);
- else
- wp = w->active;
if (wp != NULL)
window_pane_key(wp, c, s, key, m);
}
@@ -795,7 +910,7 @@ server_client_resize_event(__unused int fd, __unused short events, void *data)
}
/* Check if pane should be resized. */
-void
+static void
server_client_check_resize(struct window_pane *wp)
{
struct timeval tv = { .tv_usec = 250000 };
@@ -825,7 +940,7 @@ server_client_check_resize(struct window_pane *wp)
}
/* Check whether pane should be focused. */
-void
+static void
server_client_check_focus(struct window_pane *wp)
{
struct client *c;
@@ -886,7 +1001,7 @@ focused:
* tty_region/tty_reset/tty_update_mode already take care of not resetting
* things that are already in their default state.
*/
-void
+static void
server_client_reset_state(struct client *c)
{
struct window *w = c->session->curw->window;
@@ -922,7 +1037,7 @@ server_client_reset_state(struct client *c)
}
/* Repeat time callback. */
-void
+static void
server_client_repeat_timer(__unused int fd, __unused short events, void *data)
{
struct client *c = data;
@@ -934,8 +1049,17 @@ server_client_repeat_timer(__unused int fd, __unused short events, void *data)
}
}
+/* Double-click callback. */
+static void
+server_client_click_timer(__unused int fd, __unused short events, void *data)
+{
+ struct client *c = data;
+
+ c->flags &= ~(CLIENT_DOUBLECLICK|CLIENT_TRIPLECLICK);
+}
+
/* Check if client should be exited. */
-void
+static void
server_client_check_exit(struct client *c)
{
if (!(c->flags & CLIENT_EXIT))
@@ -953,7 +1077,7 @@ server_client_check_exit(struct client *c)
}
/* Check for client redraws. */
-void
+static void
server_client_check_redraw(struct client *c)
{
struct session *s = c->session;
@@ -1009,7 +1133,7 @@ server_client_check_redraw(struct client *c)
}
/* Set client title. */
-void
+static void
server_client_set_title(struct client *c)
{
struct session *s = c->session;
@@ -1034,7 +1158,7 @@ server_client_set_title(struct client *c)
}
/* Dispatch message from client. */
-void
+static void
server_client_dispatch(struct imsg *imsg, void *arg)
{
struct client *c = arg;
@@ -1138,7 +1262,7 @@ server_client_dispatch(struct imsg *imsg, void *arg)
}
/* Handle command message. */
-void
+static void
server_client_dispatch_command(struct client *c, struct imsg *imsg)
{
struct msg_command_data data;
@@ -1191,7 +1315,7 @@ error:
}
/* Handle identify message. */
-void
+static void
server_client_dispatch_identify(struct client *c, struct imsg *imsg)
{
const char *data, *home;
@@ -1303,7 +1427,7 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
}
/* Handle shell message. */
-void
+static void
server_client_dispatch_shell(struct client *c)
{
const char *shell;
diff --git a/server-fn.c b/server-fn.c
index 53d6a7c2..70569945 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -26,8 +26,9 @@
#include "tmux.h"
-struct session *server_next_session(struct session *);
-void server_callback_identify(int, short, void *);
+static struct session *server_next_session(struct session *);
+static void server_callback_identify(int, short, void *);
+static void server_destroy_session_group(struct session *);
void
server_fill_environ(struct session *s, struct environ *env)
@@ -340,7 +341,7 @@ server_destroy_pane(struct window_pane *wp, int hooks)
server_redraw_window(w);
}
-void
+static void
server_destroy_session_group(struct session *s)
{
struct session_group *sg;
@@ -356,7 +357,7 @@ server_destroy_session_group(struct session *s)
}
}
-struct session *
+static struct session *
server_next_session(struct session *s)
{
struct session *s_loop, *s_out;
@@ -455,7 +456,7 @@ server_clear_identify(struct client *c, struct window_pane *wp)
server_redraw_client(c);
}
-void
+static void
server_callback_identify(__unused int fd, __unused short events, void *data)
{
server_clear_identify(data, NULL);
diff --git a/server.c b/server.c
index 66fa8f49..d0a73622 100644
--- a/server.c
+++ b/server.c
@@ -43,21 +43,20 @@
struct clients clients;
struct tmuxproc *server_proc;
-int server_fd;
-int server_exit;
-struct event server_ev_accept;
+static int server_fd;
+static int server_exit;
+static struct event server_ev_accept;
struct cmd_find_state marked_pane;
-int server_create_socket(void);
-int server_loop(void);
-int server_should_exit(void);
-void server_send_exit(void);
-void server_accept(int, short, void *);
-void server_signal(int);
-void server_child_signal(void);
-void server_child_exited(pid_t, int);
-void server_child_stopped(pid_t, int);
+static int server_create_socket(void);
+static int server_loop(void);
+static void server_send_exit(void);
+static void server_accept(int, short, void *);
+static void server_signal(int);
+static void server_child_signal(void);
+static void server_child_exited(pid_t, int);
+static void server_child_stopped(pid_t, int);
/* Set marked pane. */
void
@@ -98,7 +97,7 @@ server_check_marked(void)
}
/* Create server socket. */
-int
+static int
server_create_socket(void)
{
struct sockaddr_un sa;
@@ -189,7 +188,7 @@ server_start(struct event_base *base, int lockfd, char *lockfile)
}
/* Server loop callback. */
-int
+static int
server_loop(void)
{
struct client *c;
@@ -218,7 +217,7 @@ server_loop(void)
}
/* Exit the server by killing all clients and windows. */
-void
+static void
server_send_exit(void)
{
struct client *c, *c1;
@@ -275,7 +274,7 @@ server_update_socket(void)
}
/* Callback for server socket. */
-void
+static void
server_accept(int fd, short events, __unused void *data)
{
struct sockaddr_storage sa;
@@ -328,7 +327,7 @@ server_add_accept(int timeout)
}
/* Signal handler. */
-void
+static void
server_signal(int sig)
{
int fd;
@@ -355,7 +354,7 @@ server_signal(int sig)
}
/* Handle SIGCHLD. */
-void
+static void
server_child_signal(void)
{
int status;
@@ -378,7 +377,7 @@ server_child_signal(void)
}
/* Handle exited children. */
-void
+static void
server_child_exited(pid_t pid, int status)
{
struct window *w, *w1;
@@ -404,7 +403,7 @@ server_child_exited(pid_t pid, int status)
}
/* Handle stopped children. */
-void
+static void
server_child_stopped(pid_t pid, int status)
{
struct window *w;
diff --git a/session.c b/session.c
index 12a593f8..da20bab1 100644
--- a/session.c
+++ b/session.c
@@ -26,16 +26,20 @@
#include "tmux.h"
-struct sessions sessions;
-u_int next_session_id;
-struct session_groups session_groups;
+struct sessions sessions;
+static u_int next_session_id;
+struct session_groups session_groups;
-void session_free(int, short, void *);
+static void session_free(int, short, void *);
-void session_lock_timer(int, short, void *);
+static void session_lock_timer(int, short, void *);
-struct winlink *session_next_alert(struct winlink *);
-struct winlink *session_previous_alert(struct winlink *);
+static struct winlink *session_next_alert(struct winlink *);
+static struct winlink *session_previous_alert(struct winlink *);
+
+static void session_group_remove(struct session *);
+static u_int session_group_count(struct session_group *);
+static void session_group_synchronize1(struct session *, struct session *);
RB_GENERATE(sessions, session, entry, session_cmp);
@@ -181,7 +185,7 @@ session_unref(struct session *s)
}
/* Free session. */
-void
+static void
session_free(__unused int fd, __unused short events, void *arg)
{
struct session *s = arg;
@@ -238,7 +242,7 @@ session_check_name(const char *name)
}
/* Lock session if it has timed out. */
-void
+static void
session_lock_timer(__unused int fd, __unused short events, void *arg)
{
struct session *s = arg;
@@ -425,7 +429,7 @@ session_is_linked(struct session *s, struct window *w)
return (w->references != 1);
}
-struct winlink *
+static struct winlink *
session_next_alert(struct winlink *wl)
{
while (wl != NULL) {
@@ -456,7 +460,7 @@ session_next(struct session *s, int alert)
return (session_set_current(s, wl));
}
-struct winlink *
+static struct winlink *
session_previous_alert(struct winlink *wl)
{
while (wl != NULL) {
@@ -581,7 +585,7 @@ session_group_add(struct session *target, struct session *s)
}
/* Remove a session from its group and destroy the group if empty. */
-void
+static void
session_group_remove(struct session *s)
{
struct session_group *sg;
@@ -598,7 +602,7 @@ session_group_remove(struct session *s)
}
/* Count number of sessions in session group. */
-u_int
+static u_int
session_group_count(struct session_group *sg)
{
struct session *s;
@@ -649,7 +653,7 @@ session_group_synchronize_from(struct session *target)
* winlinks then recreating them, then updating the current window, last window
* stack and alerts.
*/
-void
+static void
session_group_synchronize1(struct session *target, struct session *s)
{
struct winlinks old_windows, *ww;
diff --git a/signal.c b/signal.c
index 19938638..79d23af0 100644
--- a/signal.c
+++ b/signal.c
@@ -24,12 +24,12 @@
#include "tmux.h"
-struct event ev_sighup;
-struct event ev_sigchld;
-struct event ev_sigcont;
-struct event ev_sigterm;
-struct event ev_sigusr1;
-struct event ev_sigwinch;
+static struct event ev_sighup;
+static struct event ev_sigchld;
+static struct event ev_sigcont;
+static struct event ev_sigterm;
+static struct event ev_sigusr1;
+static struct event ev_sigwinch;
void
set_signals(void (*handler)(int, short, void *), void *arg)
diff --git a/status.c b/status.c
index cc86cb02..6ea8c6c3 100644
--- a/status.c
+++ b/status.c
@@ -29,33 +29,33 @@
#include "tmux.h"
-char *status_redraw_get_left(struct client *, time_t, struct grid_cell *,
- size_t *);
-char *status_redraw_get_right(struct client *, time_t, struct grid_cell *,
- size_t *);
-char *status_print(struct client *, struct winlink *, time_t,
- struct grid_cell *);
-char *status_replace(struct client *, struct winlink *, const char *, time_t);
-void status_message_callback(int, short, void *);
-void status_timer_callback(int, short, void *);
-
-const char *status_prompt_up_history(u_int *);
-const char *status_prompt_down_history(u_int *);
-void status_prompt_add_history(const char *);
-
-const char **status_prompt_complete_list(u_int *, const char *);
-char *status_prompt_complete_prefix(const char **, u_int);
-char *status_prompt_complete(struct session *, const char *);
-
-char *status_prompt_find_history_file(void);
+static char *status_redraw_get_left(struct client *, time_t,
+ struct grid_cell *, size_t *);
+static char *status_redraw_get_right(struct client *, time_t,
+ struct grid_cell *, size_t *);
+static char *status_print(struct client *, struct winlink *, time_t,
+ struct grid_cell *);
+static char *status_replace(struct client *, struct winlink *, const char *,
+ time_t);
+static void status_message_callback(int, short, void *);
+static void status_timer_callback(int, short, void *);
+
+static char *status_prompt_find_history_file(void);
+static const char *status_prompt_up_history(u_int *);
+static const char *status_prompt_down_history(u_int *);
+static void status_prompt_add_history(const char *);
+
+static const char **status_prompt_complete_list(u_int *, const char *);
+static char *status_prompt_complete_prefix(const char **, u_int);
+static char *status_prompt_complete(struct session *, const char *);
/* Status prompt history. */
#define PROMPT_HISTORY 100
-char **status_prompt_hlist;
-u_int status_prompt_hsize;
+static char **status_prompt_hlist;
+static u_int status_prompt_hsize;
/* Find the history file to load/save from/to. */
-char *
+static char *
status_prompt_find_history_file(void)
{
const char *home, *history_file;
@@ -144,7 +144,7 @@ status_prompt_save_history(void)
}
/* Status timer callback. */
-void
+static void
status_timer_callback(__unused int fd, __unused short events, void *arg)
{
struct client *c = arg;
@@ -207,7 +207,7 @@ status_at_line(struct client *c)
}
/* Retrieve options for left string. */
-char *
+static char *
status_redraw_get_left(struct client *c, time_t t, struct grid_cell *gc,
size_t *size)
{
@@ -229,7 +229,7 @@ status_redraw_get_left(struct client *c, time_t t, struct grid_cell *gc,
}
/* Retrieve options for right string. */
-char *
+static char *
status_redraw_get_right(struct client *c, time_t t, struct grid_cell *gc,
size_t *size)
{
@@ -493,7 +493,7 @@ out:
}
/* Replace special sequences in fmt. */
-char *
+static char *
status_replace(struct client *c, struct winlink *wl, const char *fmt, time_t t)
{
struct format_tree *ft;
@@ -515,7 +515,7 @@ status_replace(struct client *c, struct winlink *wl, const char *fmt, time_t t)
}
/* Return winlink status line entry and adjust gc as necessary. */
-char *
+static char *
status_print(struct client *c, struct winlink *wl, time_t t,
struct grid_cell *gc)
{
@@ -607,7 +607,7 @@ status_message_clear(struct client *c)
}
/* Clear status line message after timer expires. */
-void
+static void
status_message_callback(__unused int fd, __unused short event, void *data)
{
struct client *c = data;
@@ -662,18 +662,21 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
struct format_tree *ft;
int keys;
time_t t;
+ char *tmp;
ft = format_create(NULL, 0);
format_defaults(ft, c, NULL, NULL, NULL);
+
t = time(NULL);
+ tmp = format_expand_time(ft, input, t);
status_message_clear(c);
status_prompt_clear(c);
c->prompt_string = format_expand_time(ft, msg, t);
- c->prompt_buffer = format_expand_time(ft, input, t);
- c->prompt_index = strlen(c->prompt_buffer);
+ c->prompt_buffer = utf8_fromcstr(tmp);
+ c->prompt_index = utf8_strlen(c->prompt_buffer);
c->prompt_callbackfn = callbackfn;
c->prompt_freefn = freefn;
@@ -692,6 +695,7 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
c->flags |= CLIENT_STATUS;
+ free(tmp);
format_free(ft);
}
@@ -723,22 +727,26 @@ status_prompt_update(struct client *c, const char *msg, const char *input)
{
struct format_tree *ft;
time_t t;
+ char *tmp;
ft = format_create(NULL, 0);
format_defaults(ft, c, NULL, NULL, NULL);
+
t = time(NULL);
+ tmp = format_expand_time(ft, input, t);
free(c->prompt_string);
c->prompt_string = format_expand_time(ft, msg, t);
free(c->prompt_buffer);
- c->prompt_buffer = format_expand_time(ft, input, t);
- c->prompt_index = strlen(c->prompt_buffer);
+ c->prompt_buffer = utf8_fromcstr(tmp);
+ c->prompt_index = utf8_strlen(c->prompt_buffer);
c->prompt_hindex = 0;
c->flags |= CLIENT_STATUS;
+ free(tmp);
format_free(ft);
}
@@ -746,57 +754,80 @@ status_prompt_update(struct client *c, const char *msg, const char *input)
int
status_prompt_redraw(struct client *c)
{
- struct screen_write_ctx ctx;
- struct session *s = c->session;
- struct screen old_status;
- size_t i, size, left, len, off;
- struct grid_cell gc;
+ struct screen_write_ctx ctx;
+ struct session *s = c->session;
+ struct screen old_status;
+ u_int i, offset, left, start, pcursor, pwidth, width;
+ struct grid_cell gc, cursorgc;
if (c->tty.sx == 0 || c->tty.sy == 0)
return (0);
memcpy(&old_status, &c->status, sizeof old_status);
screen_init(&c->status, c->tty.sx, 1, 0);
- len = screen_write_strlen("%s", c->prompt_string);
- if (len > c->tty.sx)
- len = c->tty.sx;
- off = 0;
-
- /* Change colours for command mode. */
if (c->prompt_mdata.mode == 1)
style_apply(&gc, s->options, "message-command-style");
else
style_apply(&gc, s->options, "message-style");
- screen_write_start(&ctx, NULL, &c->status);
+ memcpy(&cursorgc, &gc, sizeof cursorgc);
+ cursorgc.attr ^= GRID_ATTR_REVERSE;
+
+ start = screen_write_strlen("%s", c->prompt_string);
+ if (start > c->tty.sx)
+ start = c->tty.sx;
+ screen_write_start(&ctx, NULL, &c->status);
screen_write_cursormove(&ctx, 0, 0);
- screen_write_nputs(&ctx, len, &gc, "%s", c->prompt_string);
+ screen_write_nputs(&ctx, start, &gc, "%s", c->prompt_string);
+ while (c->status.cx < screen_size_x(&c->status))
+ screen_write_putc(&ctx, &gc, ' ');
+ screen_write_cursormove(&ctx, start, 0);
- left = c->tty.sx - len;
- if (left != 0) {
- size = screen_write_strlen("%s", c->prompt_buffer);
- if (c->prompt_index >= left) {
- off = c->prompt_index - left + 1;
- if (c->prompt_index == size)
- left--;
- size = left;
+ left = c->tty.sx - start;
+ if (left == 0)
+ goto finished;
+
+ pcursor = utf8_strwidth(c->prompt_buffer, c->prompt_index);
+ pwidth = utf8_strwidth(c->prompt_buffer, -1);
+ if (pcursor >= left) {
+ /*
+ * The cursor would be outside the screen so start drawing
+ * with it on the right.
+ */
+ offset = (pcursor - left) + 1;
+ pwidth = left;
+ } else
+ offset = 0;
+ if (pwidth > left)
+ pwidth = left;
+
+ width = 0;
+ for (i = 0; c->prompt_buffer[i].size != 0; i++) {
+ if (width < offset) {
+ width += c->prompt_buffer[i].width;
+ continue;
}
- screen_write_nputs(&ctx, left, &gc, "%s", c->prompt_buffer +
- off);
+ if (width >= offset + pwidth)
+ break;
+ width += c->prompt_buffer[i].width;
+ if (width > offset + pwidth)
+ break;
- for (i = len + size; i < c->tty.sx; i++)
- screen_write_putc(&ctx, &gc, ' ');
+ if (i != c->prompt_index) {
+ utf8_copy(&gc.data, &c->prompt_buffer[i]);
+ screen_write_cell(&ctx, &gc);
+ } else {
+ utf8_copy(&cursorgc.data, &c->prompt_buffer[i]);
+ screen_write_cell(&ctx, &cursorgc);
+ }
}
+ if (c->status.cx < screen_size_x(&c->status) && c->prompt_index >= i)
+ screen_write_putc(&ctx, &cursorgc, ' ');
+finished:
screen_write_stop(&ctx);
- /* Apply fake cursor. */
- off = len + c->prompt_index - off;
- grid_view_get_cell(c->status.grid, off, 0, &gc);
- gc.attr ^= GRID_ATTR_REVERSE;
- grid_view_set_cell(c->status.grid, off, 0, &gc);
-
if (grid_compare(c->status.grid, old_status.grid) == 0) {
screen_free(&old_status);
return (0);
@@ -805,20 +836,38 @@ status_prompt_redraw(struct client *c)
return (1);
}
+/* Is this a separator? */
+static int
+status_prompt_in_list(const char *ws, const struct utf8_data *ud)
+{
+ if (ud->size != 1 || ud->width != 1)
+ return (0);
+ return (strchr(ws, *ud->data) != NULL);
+}
+
+/* Is this a space? */
+static int
+status_prompt_space(const struct utf8_data *ud)
+{
+ if (ud->size != 1 || ud->width != 1)
+ return (0);
+ return (*ud->data == ' ');
+}
+
/* Handle keys in prompt. */
void
status_prompt_key(struct client *c, key_code key)
{
- struct session *sess = c->session;
- struct options *oo = sess->options;
+ struct options *oo = c->session->options;
struct paste_buffer *pb;
- char *s, *first, *last, word[64], swapc;
- const char *histstr, *bufdata, *wsep = NULL;
+ char *s, word[64];
+ const char *histstr, *bufdata, *ws = NULL;
u_char ch;
- size_t size, n, off, idx, bufsize;
+ size_t size, n, off, idx, bufsize, used;
+ struct utf8_data tmp, *first, *last, *ud;
- size = strlen(c->prompt_buffer);
- switch (mode_key_lookup(&c->prompt_mdata, key, NULL, NULL)) {
+ size = utf8_strlen(c->prompt_buffer);
+ switch (mode_key_lookup(&c->prompt_mdata, key)) {
case MODEKEYEDIT_CURSORLEFT:
if (c->prompt_index > 0) {
c->prompt_index--;
@@ -856,7 +905,7 @@ status_prompt_key(struct client *c, key_code key)
}
break;
case MODEKEYEDIT_COMPLETE:
- if (*c->prompt_buffer == '\0')
+ if (c->prompt_buffer[0].size == 0)
break;
idx = c->prompt_index;
@@ -864,40 +913,50 @@ status_prompt_key(struct client *c, key_code key)
idx--;
/* Find the word we are in. */
- first = c->prompt_buffer + idx;
- while (first > c->prompt_buffer && *first != ' ')
+ first = &c->prompt_buffer[idx];
+ while (first > c->prompt_buffer && !status_prompt_space(first))
first--;
- while (*first == ' ')
+ while (first->size != 0 && status_prompt_space(first))
first++;
- last = c->prompt_buffer + idx;
- while (*last != '\0' && *last != ' ')
+ last = &c->prompt_buffer[idx];
+ while (last->size != 0 && !status_prompt_space(last))
last++;
- while (*last == ' ')
+ while (last > c->prompt_buffer && status_prompt_space(last))
last--;
- if (*last != '\0')
+ if (last->size != 0)
last++;
- if (last <= first ||
- ((size_t) (last - first)) > (sizeof word) - 1)
+ if (last <= first)
break;
- memcpy(word, first, last - first);
- word[last - first] = '\0';
+
+ used = 0;
+ for (ud = first; ud < last; ud++) {
+ if (used + ud->size >= sizeof word)
+ break;
+ memcpy(word + used, ud->data, ud->size);
+ used += ud->size;
+ }
+ if (ud != last)
+ break;
+ word[used] = '\0';
/* And try to complete it. */
- if ((s = status_prompt_complete(sess, word)) == NULL)
+ if ((s = status_prompt_complete(c->session, word)) == NULL)
break;
/* Trim out word. */
n = size - (last - c->prompt_buffer) + 1; /* with \0 */
- memmove(first, last, n);
+ memmove(first, last, n * sizeof *c->prompt_buffer);
size -= last - first;
/* Insert the new word. */
size += strlen(s);
off = first - c->prompt_buffer;
- c->prompt_buffer = xrealloc(c->prompt_buffer, size + 1);
+ c->prompt_buffer = xreallocarray(c->prompt_buffer, size + 1,
+ sizeof *c->prompt_buffer);
first = c->prompt_buffer + off;
- memmove(first + strlen(s), first, n);
- memcpy(first, s, strlen(s));
+ memmove(first + strlen(s), first, n * sizeof *c->prompt_buffer);
+ for (idx = 0; idx < strlen(s); idx++)
+ utf8_set(&first[idx], s[idx]);
c->prompt_index = (first - c->prompt_buffer) + strlen(s);
free(s);
@@ -907,11 +966,12 @@ status_prompt_key(struct client *c, key_code key)
case MODEKEYEDIT_BACKSPACE:
if (c->prompt_index != 0) {
if (c->prompt_index == size)
- c->prompt_buffer[--c->prompt_index] = '\0';
+ c->prompt_buffer[--c->prompt_index].size = 0;
else {
memmove(c->prompt_buffer + c->prompt_index - 1,
c->prompt_buffer + c->prompt_index,
- size + 1 - c->prompt_index);
+ (size + 1 - c->prompt_index) *
+ sizeof *c->prompt_buffer);
c->prompt_index--;
}
c->flags |= CLIENT_STATUS;
@@ -922,38 +982,39 @@ status_prompt_key(struct client *c, key_code key)
if (c->prompt_index != size) {
memmove(c->prompt_buffer + c->prompt_index,
c->prompt_buffer + c->prompt_index + 1,
- size + 1 - c->prompt_index);
+ (size + 1 - c->prompt_index) *
+ sizeof *c->prompt_buffer);
c->flags |= CLIENT_STATUS;
}
break;
case MODEKEYEDIT_DELETELINE:
case MODEKEYEDIT_SWITCHMODESUBSTITUTELINE:
- *c->prompt_buffer = '\0';
+ c->prompt_buffer[0].size = 0;
c->prompt_index = 0;
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_DELETETOENDOFLINE:
case MODEKEYEDIT_SWITCHMODECHANGELINE:
if (c->prompt_index < size) {
- c->prompt_buffer[c->prompt_index] = '\0';
+ c->prompt_buffer[c->prompt_index].size = 0;
c->flags |= CLIENT_STATUS;
}
break;
case MODEKEYEDIT_DELETEWORD:
- wsep = options_get_string(oo, "word-separators");
+ ws = options_get_string(oo, "word-separators");
idx = c->prompt_index;
/* Find a non-separator. */
while (idx != 0) {
idx--;
- if (!strchr(wsep, c->prompt_buffer[idx]))
+ if (!status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
/* Find the separator at the beginning of the word. */
while (idx != 0) {
idx--;
- if (strchr(wsep, c->prompt_buffer[idx])) {
+ if (status_prompt_in_list(ws, &c->prompt_buffer[idx])) {
/* Go back to the word. */
idx++;
break;
@@ -962,53 +1023,55 @@ status_prompt_key(struct client *c, key_code key)
memmove(c->prompt_buffer + idx,
c->prompt_buffer + c->prompt_index,
- size + 1 - c->prompt_index);
+ (size + 1 - c->prompt_index) *
+ sizeof *c->prompt_buffer);
memset(c->prompt_buffer + size - (c->prompt_index - idx),
- '\0', c->prompt_index - idx);
+ '\0', (c->prompt_index - idx) * sizeof *c->prompt_buffer);
c->prompt_index = idx;
+
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_NEXTSPACE:
- wsep = " ";
+ ws = " ";
/* FALLTHROUGH */
case MODEKEYEDIT_NEXTWORD:
- if (wsep == NULL)
- wsep = options_get_string(oo, "word-separators");
+ if (ws == NULL)
+ ws = options_get_string(oo, "word-separators");
/* Find a separator. */
while (c->prompt_index != size) {
- c->prompt_index++;
- if (strchr(wsep, c->prompt_buffer[c->prompt_index]))
+ idx = ++c->prompt_index;
+ if (status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
- /* Find the word right after the separation. */
+ /* Find the word right after the separator. */
while (c->prompt_index != size) {
- c->prompt_index++;
- if (!strchr(wsep, c->prompt_buffer[c->prompt_index]))
+ idx = ++c->prompt_index;
+ if (!status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_NEXTSPACEEND:
- wsep = " ";
+ ws = " ";
/* FALLTHROUGH */
case MODEKEYEDIT_NEXTWORDEND:
- if (wsep == NULL)
- wsep = options_get_string(oo, "word-separators");
+ if (ws == NULL)
+ ws = options_get_string(oo, "word-separators");
/* Find a word. */
while (c->prompt_index != size) {
- c->prompt_index++;
- if (!strchr(wsep, c->prompt_buffer[c->prompt_index]))
+ idx = ++c->prompt_index;
+ if (!status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
/* Find the separator at the end of the word. */
while (c->prompt_index != size) {
- c->prompt_index++;
- if (strchr(wsep, c->prompt_buffer[c->prompt_index]))
+ idx = ++c->prompt_index;
+ if (status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
@@ -1020,23 +1083,23 @@ status_prompt_key(struct client *c, key_code key)
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_PREVIOUSSPACE:
- wsep = " ";
+ ws = " ";
/* FALLTHROUGH */
case MODEKEYEDIT_PREVIOUSWORD:
- if (wsep == NULL)
- wsep = options_get_string(oo, "word-separators");
+ if (ws == NULL)
+ ws = options_get_string(oo, "word-separators");
/* Find a non-separator. */
while (c->prompt_index != 0) {
- c->prompt_index--;
- if (!strchr(wsep, c->prompt_buffer[c->prompt_index]))
+ idx = --c->prompt_index;
+ if (!status_prompt_in_list(ws, &c->prompt_buffer[idx]))
break;
}
/* Find the separator at the beginning of the word. */
while (c->prompt_index != 0) {
- c->prompt_index--;
- if (strchr(wsep, c->prompt_buffer[c->prompt_index])) {
+ idx = --c->prompt_index;
+ if (status_prompt_in_list(ws, &c->prompt_buffer[idx])) {
/* Go back to the word. */
c->prompt_index++;
break;
@@ -1050,8 +1113,8 @@ status_prompt_key(struct client *c, key_code key)
if (histstr == NULL)
break;
free(c->prompt_buffer);
- c->prompt_buffer = xstrdup(histstr);
- c->prompt_index = strlen(c->prompt_buffer);
+ c->prompt_buffer = utf8_fromcstr(histstr);
+ c->prompt_index = utf8_strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_HISTORYDOWN:
@@ -1059,8 +1122,8 @@ status_prompt_key(struct client *c, key_code key)
if (histstr == NULL)
break;
free(c->prompt_buffer);
- c->prompt_buffer = xstrdup(histstr);
- c->prompt_index = strlen(c->prompt_buffer);
+ c->prompt_buffer = utf8_fromcstr(histstr);
+ c->prompt_index = utf8_strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS;
break;
case MODEKEYEDIT_PASTE:
@@ -1069,20 +1132,28 @@ status_prompt_key(struct client *c, key_code key)
bufdata = paste_buffer_data(pb, &bufsize);
for (n = 0; n < bufsize; n++) {
ch = (u_char)bufdata[n];
- if (ch < 32 || ch == 127)
+ if (ch < 32 || ch >= 127)
break;
}
- c->prompt_buffer = xrealloc(c->prompt_buffer, size + n + 1);
+ c->prompt_buffer = xreallocarray(c->prompt_buffer, size + n + 1,
+ sizeof *c->prompt_buffer);
if (c->prompt_index == size) {
- memcpy(c->prompt_buffer + c->prompt_index, bufdata, n);
+ for (idx = 0; idx < n; idx++) {
+ ud = &c->prompt_buffer[c->prompt_index + idx];
+ utf8_set(ud, bufdata[idx]);
+ }
c->prompt_index += n;
- c->prompt_buffer[c->prompt_index] = '\0';
+ c->prompt_buffer[c->prompt_index].size = 0;
} else {
memmove(c->prompt_buffer + c->prompt_index + n,
c->prompt_buffer + c->prompt_index,
- size + 1 - c->prompt_index);
- memcpy(c->prompt_buffer + c->prompt_index, bufdata, n);
+ (size + 1 - c->prompt_index) *
+ sizeof *c->prompt_buffer);
+ for (idx = 0; idx < n; idx++) {
+ ud = &c->prompt_buffer[c->prompt_index + idx];
+ utf8_set(ud, bufdata[idx]);
+ }
c->prompt_index += n;
}
@@ -1093,42 +1164,55 @@ status_prompt_key(struct client *c, key_code key)
if (idx < size)
idx++;
if (idx >= 2) {
- swapc = c->prompt_buffer[idx - 2];
- c->prompt_buffer[idx - 2] = c->prompt_buffer[idx - 1];
- c->prompt_buffer[idx - 1] = swapc;
+ utf8_copy(&tmp, &c->prompt_buffer[idx - 2]);
+ utf8_copy(&c->prompt_buffer[idx - 2],
+ &c->prompt_buffer[idx - 1]);
+ utf8_copy(&c->prompt_buffer[idx - 1], &tmp);
c->prompt_index = idx;
c->flags |= CLIENT_STATUS;
}
break;
case MODEKEYEDIT_ENTER:
- if (*c->prompt_buffer != '\0')
- status_prompt_add_history(c->prompt_buffer);
- if (c->prompt_callbackfn(c->prompt_data, c->prompt_buffer) == 0)
+ s = utf8_tocstr(c->prompt_buffer);
+ if (*s != '\0')
+ status_prompt_add_history(s);
+ if (c->prompt_callbackfn(c->prompt_data, s) == 0)
status_prompt_clear(c);
+ free(s);
break;
case MODEKEYEDIT_CANCEL:
if (c->prompt_callbackfn(c->prompt_data, NULL) == 0)
status_prompt_clear(c);
break;
case MODEKEY_OTHER:
- if (key <= 0x1f || key >= 0x7f)
+ if (key <= 0x1f || key >= KEYC_BASE)
break;
- c->prompt_buffer = xrealloc(c->prompt_buffer, size + 2);
+ if (utf8_split(key, &tmp) != UTF8_DONE)
+ break;
+
+ c->prompt_buffer = xreallocarray(c->prompt_buffer, size + 2,
+ sizeof *c->prompt_buffer);
if (c->prompt_index == size) {
- c->prompt_buffer[c->prompt_index++] = key;
- c->prompt_buffer[c->prompt_index] = '\0';
+ utf8_copy(&c->prompt_buffer[c->prompt_index], &tmp);
+ c->prompt_index++;
+ c->prompt_buffer[c->prompt_index].size = 0;
} else {
memmove(c->prompt_buffer + c->prompt_index + 1,
c->prompt_buffer + c->prompt_index,
- size + 1 - c->prompt_index);
- c->prompt_buffer[c->prompt_index++] = key;
+ (size + 1 - c->prompt_index) *
+ sizeof *c->prompt_buffer);
+ utf8_copy(&c->prompt_buffer[c->prompt_index], &tmp);
+ c->prompt_index++;
}
if (c->prompt_flags & PROMPT_SINGLE) {
- if (c->prompt_callbackfn(c->prompt_data,
- c->prompt_buffer) == 0)
+ s = utf8_tocstr(c->prompt_buffer);
+ if (strlen(s) != 1)
+ status_prompt_clear(c);
+ else if (c->prompt_callbackfn(c->prompt_data, s) == 0)
status_prompt_clear(c);
+ free(s);
}
c->flags |= CLIENT_STATUS;
@@ -1139,7 +1223,7 @@ status_prompt_key(struct client *c, key_code key)
}
/* Get previous line from the history. */
-const char *
+static const char *
status_prompt_up_history(u_int *idx)
{
/*
@@ -1154,7 +1238,7 @@ status_prompt_up_history(u_int *idx)
}
/* Get next line from the history. */
-const char *
+static const char *
status_prompt_down_history(u_int *idx)
{
if (status_prompt_hsize == 0 || *idx == 0)
@@ -1166,7 +1250,7 @@ status_prompt_down_history(u_int *idx)
}
/* Add line to the history. */
-void
+static void
status_prompt_add_history(const char *line)
{
size_t size;
@@ -1191,7 +1275,7 @@ status_prompt_add_history(const char *line)
}
/* Build completion list. */
-const char **
+static const char **
status_prompt_complete_list(u_int *size, const char *s)
{
const char **list = NULL, **layout;
@@ -1225,7 +1309,7 @@ status_prompt_complete_list(u_int *size, const char *s)
}
/* Find longest prefix. */
-char *
+static char *
status_prompt_complete_prefix(const char **list, u_int size)
{
char *out;
@@ -1246,8 +1330,8 @@ status_prompt_complete_prefix(const char **list, u_int size)
}
/* Complete word. */
-char *
-status_prompt_complete(struct session *sess, const char *s)
+static char *
+status_prompt_complete(struct session *session, const char *s)
{
const char **list = NULL, *colon;
u_int size = 0, i;
@@ -1300,7 +1384,7 @@ status_prompt_complete(struct session *sess, const char *s)
colon = "";
if (*s == ':') {
- RB_FOREACH(wl, winlinks, &sess->windows) {
+ RB_FOREACH(wl, winlinks, &session->windows) {
xasprintf(&tmp, ":%s", wl->window->name);
if (strncmp(tmp, s, strlen(s)) == 0){
list = xreallocarray(list, size + 1,
diff --git a/tmux.1 b/tmux.1
index 5ab2bf2d..8f1f5e05 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1006,63 +1006,76 @@ It is also entered when a command that produces output, such as
.Ic list-keys ,
is executed from a key binding.
.Pp
-The keys available depend on whether emacs or vi mode is selected
-(see the
+Commands are sent to copy mode using the
+.Fl X
+flag to the
+.Ic send-keys
+command.
+When a key is pressed, copy mode automatically uses one of two key tables,
+depending on the
.Ic mode-keys
-option).
-The following keys are supported as appropriate for the mode:
-.Bl -column "FunctionXXXXXXXXXXXXXXXXX" "viXXXXXXXXXX" "emacs" -offset indent
-.It Sy "Function" Ta Sy "vi" Ta Sy "emacs"
-.It Li "Append selection" Ta "A" Ta ""
-.It Li "Back to indentation" Ta "^" Ta "M-m"
-.It Li "Bottom of history" Ta "G" Ta "M-<"
-.It Li "Clear selection" Ta "Escape" Ta "C-g"
-.It Li "Copy selection" Ta "Enter" Ta "M-w"
-.It Li "Copy to named buffer" Ta \&" Ta ""
-.It Li "Cursor down" Ta "j" Ta "Down"
-.It Li "Cursor left" Ta "h" Ta "Left"
-.It Li "Cursor right" Ta "l" Ta "Right"
-.It Li "Cursor to bottom line" Ta "L" Ta ""
-.It Li "Cursor to middle line" Ta "M" Ta "M-r"
-.It Li "Cursor to top line" Ta "H" Ta "M-R"
-.It Li "Cursor up" Ta "k" Ta "Up"
-.It Li "Delete entire line" Ta "d" Ta "C-u"
-.It Li "Delete/Copy to end of line" Ta "D" Ta "C-k"
-.It Li "End of line" Ta "$" Ta "C-e"
-.It Li "Go to line" Ta ":" Ta "g"
-.It Li "Half page down" Ta "C-d" Ta "M-Down"
-.It Li "Half page up" Ta "C-u" Ta "M-Up"
-.It Li "Jump again" Ta ";" Ta ";"
-.It Li "Jump again in reverse" Ta "," Ta ","
-.It Li "Jump backward" Ta "F" Ta "F"
-.It Li "Jump forward" Ta "f" Ta "f"
-.It Li "Jump to backward" Ta "T" Ta ""
-.It Li "Jump to forward" Ta "t" Ta ""
-.It Li "Next page" Ta "C-f" Ta "Page down"
-.It Li "Next paragraph" Ta "}" Ta "M-}"
-.It Li "Next space" Ta "W" Ta ""
-.It Li "Next space, end of word" Ta "E" Ta ""
-.It Li "Next word" Ta "w" Ta ""
-.It Li "Next word end" Ta "e" Ta "M-f"
-.It Li "Other end of selection" Ta "o" Ta ""
-.It Li "Paste buffer" Ta "p" Ta "C-y"
-.It Li "Previous page" Ta "C-b" Ta "Page up"
-.It Li "Previous paragraph" Ta "{" Ta "M-{"
-.It Li "Previous space" Ta "B" Ta ""
-.It Li "Previous word" Ta "b" Ta "M-b"
-.It Li "Quit mode" Ta "q" Ta "Escape"
-.It Li "Rectangle toggle" Ta "v" Ta "R"
-.It Li "Scroll down" Ta "C-Down or C-e" Ta "C-Down"
-.It Li "Scroll up" Ta "C-Up or C-y" Ta "C-Up"
-.It Li "Search again" Ta "n" Ta "n"
-.It Li "Search again in reverse" Ta "N" Ta "N"
-.It Li "Search backward" Ta "?" Ta "C-r"
-.It Li "Search forward" Ta "/" Ta "C-s"
-.It Li "Select line" Ta "V" Ta ""
-.It Li "Start of line" Ta "0" Ta "C-a"
-.It Li "Start selection" Ta "Space" Ta "C-Space"
-.It Li "Top of history" Ta "g" Ta "M->"
-.It Li "Transpose characters" Ta "" Ta "C-t"
+option:
+.Ic copy-mode
+for emacs, or
+.Ic copy-mode-vi
+for vi.
+Key tables may be viewed with the
+.Ic list-keys
+command.
+.Pp
+The following commands are supported in copy mode:
+.Bl -column "CommandXXXXXXXXXXXXXXXXX" "viXXXXXXXXXX" "emacs" -offset indent
+.It Sy "Command" Ta Sy "vi" Ta Sy "emacs"
+.It Li "append-selection" Ta "" Ta ""
+.It Li "append-selection-and-cancel" Ta "A" Ta ""
+.It Li "back-to-indentation" Ta "^" Ta "M-m"
+.It Li "begin-selection" Ta "Space" Ta "C-Space"
+.It Li "bottom-line" Ta "L" Ta ""
+.It Li "cancel" Ta "q" Ta "Escape"
+.It Li "clear-selection" Ta "Escape" Ta "C-g"
+.It Li "copy-end-of-line" Ta "D" Ta "C-k"
+.It Li "copy-line" Ta "" Ta ""
+.It Li "copy-pipe <command>" Ta "" Ta ""
+.It Li "copy-selection" Ta "" Ta ""
+.It Li "copy-selection-and-cancel" Ta "Enter" Ta "M-w"
+.It Li "cursor-down" Ta "j" Ta "Down"
+.It Li "cursor-left" Ta "h" Ta "Left"
+.It Li "cursor-right" Ta "l" Ta "Right"
+.It Li "cursor-up" Ta "k" Ta "Up"
+.It Li "end-of-line" Ta "$" Ta "C-e"
+.It Li "goto-line <line>" Ta ":" Ta "g"
+.It Li "halfpage-down" Ta "C-d" Ta "M-Down"
+.It Li "halfpage-up" Ta "C-u" Ta "M-Up"
+.It Li "history-bottom" Ta "G" Ta "M-<"
+.It Li "history-top" Ta "g" Ta "M->"
+.It Li "jump-again" Ta ";" Ta ";"
+.It Li "jump-backward <to>" Ta "F" Ta "F"
+.It Li "jump-forward <to>" Ta "f" Ta "f"
+.It Li "jump-reverse" Ta "," Ta ","
+.It Li "jump-to-backward <to>" Ta "T" Ta ""
+.It Li "jump-to-forward <to>" Ta "t" Ta ""
+.It Li "middle-line" Ta "M" Ta "M-r"
+.It Li "next-paragraph" Ta "}" Ta "M-}"
+.It Li "next-space" Ta "W" Ta ""
+.It Li "next-space-end" Ta "E" Ta ""
+.It Li "next-word" Ta "w" Ta ""
+.It Li "next-word-end" Ta "e" Ta "M-f"
+.It Li "other-end" Ta "o" Ta ""
+.It Li "page-down" Ta "C-f" Ta "PageDown"
+.It Li "page-up" Ta "C-b" Ta "PageUp"
+.It Li "previous-paragraph" Ta "{" Ta "M-{"
+.It Li "previous-space" Ta "B" Ta ""
+.It Li "previous-word" Ta "b" Ta "M-b"
+.It Li "rectangle-toggle" Ta "v" Ta "R"
+.It Li "scroll-down" Ta "C-e" Ta "C-Down"
+.It Li "scroll-up" Ta "C-y" Ta "C-Up"
+.It Li "search-again" Ta "n" Ta "n"
+.It Li "search-backward <for>" Ta "?" Ta "C-r"
+.It Li "search-forward <for>" Ta "/" Ta "C-s"
+.It Li "search-reverse" Ta "N" Ta "N"
+.It Li "select-line" Ta "V" Ta ""
+.It Li "start-of-line" Ta "0" Ta "C-a"
+.It Li "top-line" Ta "H" Ta "M-R"
.El
.Pp
The next and previous word keys use space and the
@@ -1094,59 +1107,18 @@ will then jump to the next occurrence.
Commands in copy mode may be prefaced by an optional repeat count.
With vi key bindings, a prefix is entered using the number keys; with
emacs, the Alt (meta) key and a number begins prefix entry.
-For example, to move the cursor forward by ten words, use
-.Ql M-1 0 M-f
-in emacs mode, and
-.Ql 10w
-in vi.
.Pp
Mode key bindings are defined in a set of named tables:
.Em vi-edit
and
.Em emacs-edit
-for keys used when line editing at the command prompt;
+for keys used when line editing at the command prompt; and
.Em vi-choice
and
.Em emacs-choice
for keys used when choosing from lists (such as produced by the
.Ic choose-window
-command); and
-.Em vi-copy
-and
-.Em emacs-copy
-used in copy mode.
-The tables may be viewed with the
-.Ic list-keys
-command and keys modified or removed with
-.Ic bind-key
-and
-.Ic unbind-key .
-If
-.Ic append-selection ,
-.Ic copy-selection ,
-or
-.Ic start-named-buffer
-are given the
-.Fl x
-flag,
-.Nm
-will not exit copy mode after copying.
-.Ic copy-pipe
-copies the selection and pipes it to a command.
-For example the following will bind
-.Ql C-w
-not to exit after copying and
-.Ql C-q
-to copy the selection into
-.Pa /tmp
-as well as the paste buffer:
-.Bd -literal -offset indent
-bind-key -temacs-copy C-w copy-selection -x
-bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"
-.Ed
-.Pp
-The paste buffer key pastes the first line from the top paste buffer on the
-stack.
+command).
.Pp
The synopsis for the
.Ic copy-mode
@@ -2137,7 +2109,6 @@ Commands related to key bindings are as follows:
.Bl -tag -width Ds
.It Xo Ic bind-key
.Op Fl cnr
-.Op Fl R Ar repeat-count
.Op Fl t Ar mode-table
.Op Fl T Ar key-table
.Ar key Ar command Op Ar arguments
@@ -2196,19 +2167,6 @@ is bound in
the binding for command mode with
.Fl c
or for normal mode without.
-For keys in the
-.Em vi-copy
-or
-.Em emacs-copy
-tables,
-.Fl R
-specifies how many times the command should be repeated.
-.Pp
-See the
-.Sx WINDOWS AND PANES
-section and the
-.Ic list-keys
-command for information on mode key bindings.
.Pp
To view the default bindings and possible commands, see the
.Ic list-keys
@@ -2240,7 +2198,8 @@ are listed; this may be one of:
or
.Em emacs-copy .
.It Xo Ic send-keys
-.Op Fl lMR
+.Op Fl lMRX
+.Op Fl N Ar repeat-count
.Op Fl t Ar target-pane
.Ar key Ar ...
.Xc
@@ -2265,6 +2224,14 @@ flag causes the terminal state to be reset.
.Fl M
passes through a mouse event (only valid if bound to a mouse key binding, see
.Sx MOUSE SUPPORT ) .
+.Pp
+.Fl X
+is used to send a command into copy mode - see
+the
+.Sx WINDOWS AND PANES
+section.
+.Fl N
+specifies a repeat count to a copy mode command.
.It Xo Ic send-prefix
.Op Fl 2
.Op Fl t Ar target-pane
@@ -3371,10 +3338,12 @@ for a pane border or
for the status line).
The following mouse events are available:
.Bl -column "MouseDown1" "MouseDrag1" "WheelDown" -offset indent
+.It Li "WheelUp" Ta "WheelDown" Ta ""
.It Li "MouseDown1" Ta "MouseUp1" Ta "MouseDrag1" Ta "MouseDragEnd1"
.It Li "MouseDown2" Ta "MouseUp2" Ta "MouseDrag2" Ta "MouseDragEnd2"
.It Li "MouseDown3" Ta "MouseUp3" Ta "MouseDrag3" Ta "MouseDragEnd3"
-.It Li "WheelUp" Ta "WheelDown" Ta "" Ta ""
+.It Li "DoubleClick1" Ta "DoubleClick2" Ta "DoubleClick3" Ta "WheelUp"
+.It Li "TripleClick1" Ta "TripleClick2" Ta "TripleClick3" Ta "WheelDown"
.El
.Pp
Each should be suffixed with a location, for example
@@ -3784,6 +3753,7 @@ session option.
Commands related to the status line are as follows:
.Bl -tag -width Ds
.It Xo Ic command-prompt
+.Op Fl 1
.Op Fl I Ar inputs
.Op Fl p Ar prompts
.Op Fl t Ar target-client
@@ -3833,6 +3803,10 @@ Up to nine prompt responses may be replaced
to
.Ql %9
.Pc .
+.Pp
+.Fl 1
+makes the prompt only accept one key press, in this case the resulting input
+is a single character.
.It Xo Ic confirm-before
.Op Fl p Ar prompt
.Op Fl t Ar target-client
diff --git a/tmux.c b/tmux.c
index 1b3332a7..f77c981c 100644
--- a/tmux.c
+++ b/tmux.c
@@ -43,10 +43,13 @@ struct hooks *global_hooks;
struct timeval start_time;
const char *socket_path;
-__dead void usage(void);
-static char *make_label(const char *);
+static __dead void usage(void);
+static char *make_label(const char *);
-__dead void
+static const char *getshell(void);
+static int checkshell(const char *);
+
+static __dead void
usage(void)
{
fprintf(stderr,
@@ -56,7 +59,7 @@ usage(void)
exit(1);
}
-const char *
+static const char *
getshell(void)
{
struct passwd *pw;
@@ -73,7 +76,7 @@ getshell(void)
return (_PATH_BSHELL);
}
-int
+static int
checkshell(const char *shell)
{
if (shell == NULL || *shell == '\0' || *shell != '/')
diff --git a/tmux.h b/tmux.h
index 2c98b2f5..1bcf5503 100644
--- a/tmux.h
+++ b/tmux.h
@@ -40,9 +40,11 @@
extern char **environ;
+struct args;
struct client;
struct environ;
struct input_ctx;
+struct mode_key_cmdstr;
struct mouse_event;
struct options;
struct session;
@@ -106,6 +108,9 @@ struct tmuxproc;
#define KEYC_IS_MOUSE(key) (((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
+/* Multiple click timeout. */
+#define KEYC_CLICK_TIMEOUT 300
+
/* Mouse key codes. */
#define KEYC_MOUSE_KEY(name) \
KEYC_ ## name ## _PANE, \
@@ -144,6 +149,12 @@ enum {
KEYC_MOUSE_KEY(MOUSEDRAGEND3),
KEYC_MOUSE_KEY(WHEELUP),
KEYC_MOUSE_KEY(WHEELDOWN),
+ KEYC_MOUSE_KEY(DOUBLECLICK1),
+ KEYC_MOUSE_KEY(DOUBLECLICK2),
+ KEYC_MOUSE_KEY(DOUBLECLICK3),
+ KEYC_MOUSE_KEY(TRIPLECLICK1),
+ KEYC_MOUSE_KEY(TRIPLECLICK2),
+ KEYC_MOUSE_KEY(TRIPLECLICK3),
/* Backspace key. */
KEYC_BSPACE,
@@ -513,58 +524,6 @@ enum mode_key_cmd {
MODEKEYCHOICE_TREE_EXPAND_ALL,
MODEKEYCHOICE_TREE_TOGGLE,
MODEKEYCHOICE_UP,
-
- /* Copy keys. */
- MODEKEYCOPY_APPENDSELECTION,
- MODEKEYCOPY_BACKTOINDENTATION,
- MODEKEYCOPY_BOTTOMLINE,
- MODEKEYCOPY_CANCEL,
- MODEKEYCOPY_CLEARSELECTION,
- MODEKEYCOPY_COPYPIPE,
- MODEKEYCOPY_COPYLINE,
- MODEKEYCOPY_COPYENDOFLINE,
- MODEKEYCOPY_COPYSELECTION,
- MODEKEYCOPY_DOWN,
- MODEKEYCOPY_ENDOFLINE,
- MODEKEYCOPY_GOTOLINE,
- MODEKEYCOPY_HALFPAGEDOWN,
- MODEKEYCOPY_HALFPAGEUP,
- MODEKEYCOPY_HISTORYBOTTOM,
- MODEKEYCOPY_HISTORYTOP,
- MODEKEYCOPY_JUMP,
- MODEKEYCOPY_JUMPAGAIN,
- MODEKEYCOPY_JUMPREVERSE,
- MODEKEYCOPY_JUMPBACK,
- MODEKEYCOPY_JUMPTO,
- MODEKEYCOPY_JUMPTOBACK,
- MODEKEYCOPY_LEFT,
- MODEKEYCOPY_MIDDLELINE,
- MODEKEYCOPY_NEXTPAGE,
- MODEKEYCOPY_NEXTPARAGRAPH,
- MODEKEYCOPY_NEXTSPACE,
- MODEKEYCOPY_NEXTSPACEEND,
- MODEKEYCOPY_NEXTWORD,
- MODEKEYCOPY_NEXTWORDEND,
- MODEKEYCOPY_OTHEREND,
- MODEKEYCOPY_PREVIOUSPAGE,
- MODEKEYCOPY_PREVIOUSPARAGRAPH,
- MODEKEYCOPY_PREVIOUSSPACE,
- MODEKEYCOPY_PREVIOUSWORD,
- MODEKEYCOPY_RECTANGLETOGGLE,
- MODEKEYCOPY_RIGHT,
- MODEKEYCOPY_SCROLLDOWN,
- MODEKEYCOPY_SCROLLUP,
- MODEKEYCOPY_SEARCHAGAIN,
- MODEKEYCOPY_SEARCHDOWN,
- MODEKEYCOPY_SEARCHREVERSE,
- MODEKEYCOPY_SEARCHUP,
- MODEKEYCOPY_SELECTLINE,
- MODEKEYCOPY_STARTNAMEDBUFFER,
- MODEKEYCOPY_STARTNUMBERPREFIX,
- MODEKEYCOPY_STARTOFLINE,
- MODEKEYCOPY_STARTSELECTION,
- MODEKEYCOPY_TOPLINE,
- MODEKEYCOPY_UP,
};
/* Data required while mode keys are in use. */
@@ -578,22 +537,14 @@ struct mode_key_data {
/* Binding between a key and a command. */
struct mode_key_binding {
key_code key;
- u_int repeat;
int mode;
enum mode_key_cmd cmd;
- const char *arg;
RB_ENTRY(mode_key_binding) entry;
};
RB_HEAD(mode_key_tree, mode_key_binding);
-/* Command to string mapping. */
-struct mode_key_cmdstr {
- enum mode_key_cmd cmd;
- const char *name;
-};
-
/* Named mode key table description. */
struct mode_key_entry;
struct mode_key_table {
@@ -834,6 +785,10 @@ struct window_mode {
void (*resize)(struct window_pane *, u_int, u_int);
void (*key)(struct window_pane *, struct client *, struct session *,
key_code, struct mouse_event *);
+
+ const char *(*key_table)(struct window_pane *);
+ void (*command)(struct window_pane *, struct client *,
+ struct session *, struct args *, struct mouse_event *);
};
#define WINDOW_MODE_TIMEOUT 180
@@ -925,6 +880,7 @@ struct window_pane {
void *modedata;
struct event modetimer;
time_t modelast;
+ u_int modeprefix;
TAILQ_ENTRY(window_pane) entry;
RB_ENTRY(window_pane) tree_entry;
@@ -1266,6 +1222,9 @@ struct client {
struct event repeat_timer;
+ struct event click_timer;
+ u_int click_button;
+
struct event status_timer;
struct screen status;
@@ -1289,6 +1248,8 @@ struct client {
#define CLIENT_256COLOURS 0x20000
#define CLIENT_IDENTIFIED 0x40000
#define CLIENT_STATUSFORCE 0x80000
+#define CLIENT_DOUBLECLICK 0x100000
+#define CLIENT_TRIPLECLICK 0x200000
int flags;
struct key_table *keytable;
@@ -1302,7 +1263,7 @@ struct client {
TAILQ_HEAD(, message_entry) message_log;
char *prompt_string;
- char *prompt_buffer;
+ struct utf8_data *prompt_buffer;
size_t prompt_index;
int (*prompt_callbackfn)(void *, const char *);
void (*prompt_freefn)(void *);
@@ -1556,8 +1517,6 @@ extern struct options *global_w_options;
extern struct environ *global_environ;
extern struct timeval start_time;
extern const char *socket_path;
-const char *getshell(void);
-int checkshell(const char *);
int areshell(const char *);
void setblocking(int, int);
const char *find_home(void);
@@ -1636,13 +1595,10 @@ int printflike(4, 5) hooks_wait(struct hooks *, struct cmd_q *,
struct cmd_find_state *, const char *, ...);
/* mode-key.c */
-extern const struct mode_key_table mode_key_tables[];
extern struct mode_key_tree mode_key_tree_vi_edit;
extern struct mode_key_tree mode_key_tree_vi_choice;
-extern struct mode_key_tree mode_key_tree_vi_copy;
extern struct mode_key_tree mode_key_tree_emacs_edit;
extern struct mode_key_tree mode_key_tree_emacs_choice;
-extern struct mode_key_tree mode_key_tree_emacs_copy;
int mode_key_cmp(struct mode_key_binding *, struct mode_key_binding *);
RB_PROTOTYPE(mode_key_tree, mode_key_binding, entry, mode_key_cmp);
const char *mode_key_tostring(const struct mode_key_cmdstr *,
@@ -1652,8 +1608,7 @@ enum mode_key_cmd mode_key_fromstring(const struct mode_key_cmdstr *,
const struct mode_key_table *mode_key_findtable(const char *);
void mode_key_init_trees(void);
void mode_key_init(struct mode_key_data *, struct mode_key_tree *);
-enum mode_key_cmd mode_key_lookup(struct mode_key_data *, key_code,
- const char **, u_int *);
+enum mode_key_cmd mode_key_lookup(struct mode_key_data *, key_code);
/* notify.c */
void notify_enable(void);
@@ -1718,14 +1673,11 @@ void environ_log(struct environ *, const char *);
/* tty.c */
void tty_create_log(void);
-void tty_init_termios(int, struct termios *, struct bufferevent *);
void tty_raw(struct tty *, const char *);
void tty_attributes(struct tty *, const struct grid_cell *,
const struct window_pane *);
void tty_reset(struct tty *);
-void tty_region_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
void tty_region(struct tty *, u_int, u_int);
-void tty_cursor_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
void tty_cursor(struct tty *, u_int, u_int);
void tty_putcode(struct tty *, enum tty_code_code);
void tty_putcode1(struct tty *, enum tty_code_code, int);
@@ -1743,7 +1695,6 @@ void tty_start_tty(struct tty *);
void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *);
void tty_update_mode(struct tty *, int, struct screen *);
-void tty_force_cursor_colour(struct tty *, const char *);
void tty_draw_pane(struct tty *, const struct window_pane *, u_int, u_int,
u_int);
void tty_draw_line(struct tty *, const struct window_pane *, struct screen *,
@@ -1800,12 +1751,10 @@ void tty_keys_free(struct tty *);
key_code tty_keys_next(struct tty *);
/* arguments.c */
-struct args *args_create(int, ...);
struct args *args_parse(const char *, int, char **);
void args_free(struct args *);
char *args_print(struct args *);
int args_has(struct args *, u_char);
-void args_set(struct args *, u_char, const char *);
const char *args_get(struct args *, u_char);
long long args_strtonum(struct args *, u_char, long long, long long,
char **);
@@ -1869,7 +1818,6 @@ void cmdq_run(struct cmd_q *, struct cmd_list *,
void cmdq_append(struct cmd_q *, struct cmd_list *,
struct mouse_event *);
int cmdq_continue(struct cmd_q *);
-void cmdq_flush(struct cmd_q *);
/* cmd-string.c */
int cmd_string_parse(const char *, struct cmd_list **, const char *,
@@ -1922,6 +1870,7 @@ void server_add_accept(int);
/* server-client.c */
void server_client_set_key_table(struct client *, const char *);
const char *server_client_get_key_table(struct client *);
+int server_client_is_default_key_table(struct client *);
int server_client_check_nested(struct client *);
void server_client_handle_key(struct client *, key_code);
void server_client_create(int);
@@ -1952,7 +1901,6 @@ int server_link_window(struct session *,
struct winlink *, struct session *, int, int, int, char **);
void server_unlink_window(struct session *, struct winlink *);
void server_destroy_pane(struct window_pane *, int);
-void server_destroy_session_group(struct session *);
void server_destroy_session(struct session *);
void server_check_unattached(void);
void server_set_identify(struct client *);
@@ -2018,7 +1966,6 @@ void grid_collect_history(struct grid *);
void grid_scroll_history(struct grid *);
void grid_scroll_history_region(struct grid *, u_int, u_int);
void grid_clear_history(struct grid *);
-void grid_expand_line(struct grid *, u_int, u_int);
const struct grid_line *grid_peek_line(struct grid *, u_int);
void grid_get_cell(struct grid *, u_int, u_int, struct grid_cell *);
void grid_set_cell(struct grid *, u_int, u_int, const struct grid_cell *);
@@ -2114,7 +2061,6 @@ void screen_set_selection(struct screen *,
u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
void screen_clear_selection(struct screen *);
int screen_check_selection(struct screen *, u_int, u_int);
-void screen_reflow(struct screen *, u_int);
/* window.c */
extern struct windows windows;
@@ -2128,7 +2074,6 @@ RB_PROTOTYPE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
struct winlink *winlink_find_by_index(struct winlinks *, int);
struct winlink *winlink_find_by_window(struct winlinks *, struct window *);
struct winlink *winlink_find_by_window_id(struct winlinks *, u_int);
-int winlink_next_index(struct winlinks *, int);
u_int winlink_count(struct winlinks *);
struct winlink *winlink_add(struct winlinks *, int);
void winlink_set_window(struct winlink *, struct window *);
@@ -2172,8 +2117,6 @@ u_int window_count_panes(struct window *);
void window_destroy_panes(struct window *);
struct window_pane *window_pane_find_by_id_str(const char *);
struct window_pane *window_pane_find_by_id(u_int);
-struct window_pane *window_pane_create(struct window *, u_int, u_int, u_int);
-void window_pane_destroy(struct window_pane *);
int window_pane_spawn(struct window_pane *, int, char **,
const char *, const char *, const char *, struct environ *,
struct termios *, char **);
@@ -2259,7 +2202,6 @@ void window_choose_ready(struct window_pane *,
u_int, void (*)(struct window_choose_data *));
struct window_choose_data *window_choose_data_create (int,
struct client *, struct session *);
-void window_choose_data_free(struct window_choose_data *);
void window_choose_data_run(struct window_choose_data *);
struct window_choose_data *window_choose_add_window(struct window_pane *,
struct client *, struct session *, struct winlink *,
@@ -2268,13 +2210,11 @@ struct window_choose_data *window_choose_add_session(struct window_pane *,
struct client *, struct session *, const char *,
const char *, u_int);
void window_choose_expand_all(struct window_pane *);
-void window_choose_collapse_all(struct window_pane *);
void window_choose_set_current(struct window_pane *, u_int);
/* names.c */
void check_window_name(struct window *);
char *default_window_name(struct window *);
-char *format_window_name(struct window *);
char *parse_window_name(const char *);
/* signal.c */
@@ -2331,11 +2271,8 @@ int session_set_current(struct session *, struct winlink *);
struct session_group *session_group_find(struct session *);
u_int session_group_index(struct session_group *);
void session_group_add(struct session *, struct session *);
-void session_group_remove(struct session *);
-u_int session_group_count(struct session_group *);
void session_group_synchronize_to(struct session *);
void session_group_synchronize_from(struct session *);
-void session_group_synchronize1(struct session *, struct session *);
void session_renumber_windows(struct session *);
/* utf8.c */
@@ -2347,6 +2284,8 @@ enum utf8_state utf8_combine(const struct utf8_data *, wchar_t *);
enum utf8_state utf8_split(wchar_t, struct utf8_data *);
int utf8_strvis(char *, const char *, size_t, int);
char *utf8_sanitize(const char *);
+size_t utf8_strlen(const struct utf8_data *);
+u_int utf8_strwidth(const struct utf8_data *, ssize_t);
struct utf8_data *utf8_fromcstr(const char *);
char *utf8_tocstr(struct utf8_data *);
u_int utf8_cstrwidth(const char *);
diff --git a/tty-keys.c b/tty-keys.c
index 81d541a5..174b008e 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -50,7 +50,7 @@ struct tty_default_key_raw {
const char *string;
key_code key;
};
-const struct tty_default_key_raw tty_default_raw_keys[] = {
+static const struct tty_default_key_raw tty_default_raw_keys[] = {
/*
* Numeric keypad. Just use the vt100 escape sequences here and always
* put the terminal into keypad_xmit mode. Translation of numbers
@@ -170,7 +170,7 @@ struct tty_default_key_code {
enum tty_code_code code;
key_code key;
};
-const struct tty_default_key_code tty_default_code_keys[] = {
+static const struct tty_default_key_code tty_default_code_keys[] = {
/* Function keys. */
{ TTYC_KF1, KEYC_F1 },
{ TTYC_KF2, KEYC_F2 },
diff --git a/tty-term.c b/tty-term.c
index a3a26369..591aad19 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -30,8 +30,8 @@
#include "tmux.h"
-void tty_term_override(struct tty_term *, const char *);
-char *tty_term_strip(const char *);
+static void tty_term_override(struct tty_term *, const char *);
+static char *tty_term_strip(const char *);
struct tty_terms tty_terms = LIST_HEAD_INITIALIZER(tty_terms);
@@ -56,7 +56,7 @@ struct tty_term_code_entry {
const char *name;
};
-const struct tty_term_code_entry tty_term_codes[] = {
+static const struct tty_term_code_entry tty_term_codes[] = {
[TTYC_ACSC] = { TTYCODE_STRING, "acsc" },
[TTYC_AX] = { TTYCODE_FLAG, "AX" },
[TTYC_BCE] = { TTYCODE_FLAG, "bce" },
@@ -267,7 +267,7 @@ tty_term_ncodes(void)
return (nitems(tty_term_codes));
}
-char *
+static char *
tty_term_strip(const char *s)
{
const char *ptr;
@@ -296,7 +296,7 @@ tty_term_strip(const char *s)
return (xstrdup(buf));
}
-void
+static void
tty_term_override(struct tty_term *term, const char *overrides)
{
const struct tty_term_code_entry *ent;
diff --git a/tty.c b/tty.c
index 6cb0ef67..d8702a2f 100644
--- a/tty.c
+++ b/tty.c
@@ -31,31 +31,39 @@
#include "tmux.h"
-static int tty_log_fd = -1;
-
-void tty_read_callback(struct bufferevent *, void *);
-void tty_error_callback(struct bufferevent *, short, void *);
-
-static int tty_client_ready(struct client *, struct window_pane *);
-
-void tty_set_italics(struct tty *);
-int tty_try_colour(struct tty *, int, const char *);
-
-void tty_colours(struct tty *, const struct grid_cell *);
-void tty_check_fg(struct tty *, struct grid_cell *);
-void tty_check_bg(struct tty *, struct grid_cell *);
-void tty_colours_fg(struct tty *, const struct grid_cell *);
-void tty_colours_bg(struct tty *, const struct grid_cell *);
-
-int tty_large_region(struct tty *, const struct tty_ctx *);
-int tty_fake_bce(const struct tty *, const struct window_pane *);
-void tty_redraw_region(struct tty *, const struct tty_ctx *);
-void tty_emulate_repeat(struct tty *, enum tty_code_code, enum tty_code_code,
- u_int);
-void tty_repeat_space(struct tty *, u_int);
-void tty_cell(struct tty *, const struct grid_cell *,
- const struct window_pane *);
-void tty_default_colours(struct grid_cell *, const struct window_pane *);
+static int tty_log_fd = -1;
+
+static void tty_init_termios(int, struct termios *, struct bufferevent *);
+
+static void tty_read_callback(struct bufferevent *, void *);
+static void tty_error_callback(struct bufferevent *, short, void *);
+
+static int tty_client_ready(struct client *, struct window_pane *);
+
+static void tty_set_italics(struct tty *);
+static int tty_try_colour(struct tty *, int, const char *);
+static void tty_force_cursor_colour(struct tty *, const char *);
+static void tty_cursor_pane(struct tty *, const struct tty_ctx *, u_int,
+ u_int);
+
+static void tty_colours(struct tty *, const struct grid_cell *);
+static void tty_check_fg(struct tty *, struct grid_cell *);
+static void tty_check_bg(struct tty *, struct grid_cell *);
+static void tty_colours_fg(struct tty *, const struct grid_cell *);
+static void tty_colours_bg(struct tty *, const struct grid_cell *);
+
+static void tty_region_pane(struct tty *, const struct tty_ctx *, u_int,
+ u_int);
+static int tty_large_region(struct tty *, const struct tty_ctx *);
+static int tty_fake_bce(const struct tty *, const struct window_pane *);
+static void tty_redraw_region(struct tty *, const struct tty_ctx *);
+static void tty_emulate_repeat(struct tty *, enum tty_code_code,
+ enum tty_code_code, u_int);
+static void tty_repeat_space(struct tty *, u_int);
+static void tty_cell(struct tty *, const struct grid_cell *,
+ const struct window_pane *);
+static void tty_default_colours(struct grid_cell *,
+ const struct window_pane *);
#define tty_use_acs(tty) \
(tty_term_has((tty)->term, TTYC_ACSC) && !((tty)->flags & TTY_UTF8))
@@ -173,7 +181,7 @@ tty_open(struct tty *tty, char **cause)
return (0);
}
-void
+static void
tty_read_callback(__unused struct bufferevent *bufev, void *data)
{
struct tty *tty = data;
@@ -182,13 +190,13 @@ tty_read_callback(__unused struct bufferevent *bufev, void *data)
;
}
-void
+static void
tty_error_callback(__unused struct bufferevent *bufev, __unused short what,
__unused void *data)
{
}
-void
+static void
tty_init_termios(int fd, struct termios *orig_tio, struct bufferevent *bufev)
{
struct termios tio;
@@ -450,7 +458,7 @@ tty_putn(struct tty *tty, const void *buf, size_t len, u_int width)
tty->cx += width;
}
-void
+static void
tty_set_italics(struct tty *tty)
{
const char *s;
@@ -477,7 +485,7 @@ tty_set_title(struct tty *tty, const char *title)
tty_putcode(tty, TTYC_FSL);
}
-void
+static void
tty_force_cursor_colour(struct tty *tty, const char *ccolour)
{
if (*ccolour == '\0')
@@ -559,7 +567,7 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
tty->mode = mode;
}
-void
+static void
tty_emulate_repeat(struct tty *tty, enum tty_code_code code,
enum tty_code_code code1, u_int n)
{
@@ -571,7 +579,7 @@ tty_emulate_repeat(struct tty *tty, enum tty_code_code code,
}
}
-void
+static void
tty_repeat_space(struct tty *tty, u_int n)
{
while (n-- > 0)
@@ -583,7 +591,7 @@ tty_repeat_space(struct tty *tty, u_int n)
* probably several times now? Currently yes if it is more than 50% of the
* pane.
*/
-int
+static int
tty_large_region(__unused struct tty *tty, const struct tty_ctx *ctx)
{
struct window_pane *wp = ctx->wp;
@@ -595,7 +603,7 @@ tty_large_region(__unused struct tty *tty, const struct tty_ctx *ctx)
* Return if BCE is needed but the terminal doesn't have it - it'll need to be
* emulated.
*/
-int
+static int
tty_fake_bce(const struct tty *tty, const struct window_pane *wp)
{
struct grid_cell gc;
@@ -614,7 +622,7 @@ tty_fake_bce(const struct tty *tty, const struct window_pane *wp)
* CSR not supported, or window is a pane that doesn't take up the full
* width of the terminal.
*/
-void
+static void
tty_redraw_region(struct tty *tty, const struct tty_ctx *ctx)
{
struct window_pane *wp = ctx->wp;
@@ -1129,7 +1137,7 @@ tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx)
tty_cursor(tty, 0, 0);
}
-void
+static void
tty_cell(struct tty *tty, const struct grid_cell *gc,
const struct window_pane *wp)
{
@@ -1181,7 +1189,7 @@ tty_reset(struct tty *tty)
}
/* Set region inside pane. */
-void
+static void
tty_region_pane(struct tty *tty, const struct tty_ctx *ctx, u_int rupper,
u_int rlower)
{
@@ -1214,7 +1222,7 @@ tty_region(struct tty *tty, u_int rupper, u_int rlower)
}
/* Move cursor inside pane. */
-void
+static void
tty_cursor_pane(struct tty *tty, const struct tty_ctx *ctx, u_int cx, u_int cy)
{
tty_cursor(tty, ctx->xoff + cx, ctx->yoff + cy);
@@ -1419,7 +1427,7 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
tty_putcode(tty, TTYC_SMACS);
}
-void
+static void
tty_colours(struct tty *tty, const struct grid_cell *gc)
{
struct grid_cell *tc = &tty->cell;
@@ -1559,7 +1567,7 @@ tty_check_bg(struct tty *tty, struct grid_cell *gc)
gc->bg -= 90;
}
-void
+static void
tty_colours_fg(struct tty *tty, const struct grid_cell *gc)
{
struct grid_cell *tc = &tty->cell;
@@ -1589,7 +1597,7 @@ save_fg:
tc->fg = gc->fg;
}
-void
+static void
tty_colours_bg(struct tty *tty, const struct grid_cell *gc)
{
struct grid_cell *tc = &tty->cell;
@@ -1619,7 +1627,7 @@ save_bg:
tc->bg = gc->bg;
}
-int
+static int
tty_try_colour(struct tty *tty, int colour, const char *type)
{
u_char r, g, b;
@@ -1672,7 +1680,7 @@ fallback_256:
return (0);
}
-void
+static void
tty_default_colours(struct grid_cell *gc, const struct window_pane *wp)
{
struct window *w = wp->window;
diff --git a/utf8.c b/utf8.c
index eb9b47a9..9d3f8735 100644
--- a/utf8.c
+++ b/utf8.c
@@ -261,6 +261,33 @@ utf8_sanitize(const char *src)
return (dst);
}
+/* Get UTF-8 buffer length. */
+size_t
+utf8_strlen(const struct utf8_data *s)
+{
+ size_t i;
+
+ for (i = 0; s[i].size != 0; i++)
+ /* nothing */;
+ return (i);
+}
+
+/* Get UTF-8 string width. */
+u_int
+utf8_strwidth(const struct utf8_data *s, ssize_t n)
+{
+ ssize_t i;
+ u_int width;
+
+ width = 0;
+ for (i = 0; s[i].size != 0; i++) {
+ if (n != -1 && n == i)
+ break;
+ width += s[i].width;
+ }
+ return (width);
+}
+
/*
* Convert a string into a buffer of UTF-8 characters. Terminated by size == 0.
* Caller frees.
diff --git a/window-choose.c b/window-choose.c
index 715915b6..02c10257 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -24,27 +24,32 @@
#include "tmux.h"
-struct screen *window_choose_init(struct window_pane *);
-void window_choose_free(struct window_pane *);
-void window_choose_resize(struct window_pane *, u_int, u_int);
-void window_choose_key(struct window_pane *, struct client *,
- struct session *, key_code, struct mouse_event *);
+static struct screen *window_choose_init(struct window_pane *);
+static void window_choose_free(struct window_pane *);
+static void window_choose_resize(struct window_pane *, u_int, u_int);
+static void window_choose_key(struct window_pane *, struct client *,
+ struct session *, key_code, struct mouse_event *);
-void window_choose_default_callback(struct window_choose_data *);
-struct window_choose_mode_item *window_choose_get_item(struct window_pane *,
- key_code, struct mouse_event *);
+static void window_choose_default_callback(struct window_choose_data *);
+static struct window_choose_mode_item *window_choose_get_item(
+ struct window_pane *, key_code, struct mouse_event *);
-void window_choose_fire_callback(struct window_pane *,
- struct window_choose_data *);
-void window_choose_redraw_screen(struct window_pane *);
-void window_choose_write_line(struct window_pane *,
- struct screen_write_ctx *, u_int);
+static void window_choose_fire_callback(struct window_pane *,
+ struct window_choose_data *);
+static void window_choose_redraw_screen(struct window_pane *);
+static void window_choose_write_line(struct window_pane *,
+ struct screen_write_ctx *, u_int);
-void window_choose_scroll_up(struct window_pane *);
-void window_choose_scroll_down(struct window_pane *);
+static void window_choose_scroll_up(struct window_pane *);
+static void window_choose_scroll_down(struct window_pane *);
-void window_choose_collapse(struct window_pane *, struct session *, u_int);
-void window_choose_expand(struct window_pane *, struct session *, u_int);
+static void window_choose_collapse(struct window_pane *, struct session *,
+ u_int);
+static void window_choose_expand(struct window_pane *, struct session *,
+ u_int);
+static void window_choose_collapse_all(struct window_pane *);
+
+static void window_choose_data_free(struct window_choose_data *);
enum window_choose_input_type {
WINDOW_CHOOSE_NORMAL = -1,
@@ -52,10 +57,10 @@ enum window_choose_input_type {
};
const struct window_mode window_choose_mode = {
- window_choose_init,
- window_choose_free,
- window_choose_resize,
- window_choose_key,
+ .init = window_choose_init,
+ .free = window_choose_free,
+ .resize = window_choose_resize,
+ .key = window_choose_key,
};
struct window_choose_mode_item {
@@ -86,12 +91,14 @@ struct window_choose_mode_data {
void (*callbackfn)(struct window_choose_data *);
};
-void window_choose_free1(struct window_choose_mode_data *);
-int window_choose_key_index(struct window_choose_mode_data *, u_int);
-int window_choose_index_key(struct window_choose_mode_data *, key_code);
-void window_choose_prompt_input(enum window_choose_input_type,
- const char *, struct window_pane *, key_code);
-void window_choose_reset_top(struct window_pane *, u_int);
+static void window_choose_free1(struct window_choose_mode_data *);
+static int window_choose_key_index(struct window_choose_mode_data *,
+ u_int);
+static int window_choose_index_key(struct window_choose_mode_data *,
+ key_code);
+static void window_choose_prompt_input(enum window_choose_input_type,
+ const char *, struct window_pane *, key_code);
+static void window_choose_reset_top(struct window_pane *, u_int);
void
window_choose_add(struct window_pane *wp, struct window_choose_data *wcd)
@@ -122,7 +129,7 @@ window_choose_set_current(struct window_pane *wp, u_int cur)
window_choose_reset_top(wp, screen_size_y(s));
}
-void
+static void
window_choose_reset_top(struct window_pane *wp, u_int sy)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -156,7 +163,7 @@ window_choose_ready(struct window_pane *wp, u_int cur,
window_choose_collapse_all(wp);
}
-struct screen *
+static struct screen *
window_choose_init(struct window_pane *wp)
{
struct window_choose_mode_data *data;
@@ -218,7 +225,7 @@ window_choose_data_create(int type, struct client *c, struct session *s)
return (wcd);
}
-void
+static void
window_choose_data_free(struct window_choose_data *wcd)
{
server_client_unref(wcd->start_client);
@@ -260,7 +267,7 @@ window_choose_data_run(struct window_choose_data *cdata)
cmd_list_free(cmdlist);
}
-void
+static void
window_choose_default_callback(struct window_choose_data *wcd)
{
if (wcd == NULL)
@@ -271,14 +278,14 @@ window_choose_default_callback(struct window_choose_data *wcd)
window_choose_data_run(wcd);
}
-void
+static void
window_choose_free(struct window_pane *wp)
{
if (wp->modedata != NULL)
window_choose_free1(wp->modedata);
}
-void
+static void
window_choose_free1(struct window_choose_mode_data *data)
{
struct window_choose_mode_item *item;
@@ -301,7 +308,7 @@ window_choose_free1(struct window_choose_mode_data *data)
free(data);
}
-void
+static void
window_choose_resize(struct window_pane *wp, u_int sx, u_int sy)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -312,7 +319,7 @@ window_choose_resize(struct window_pane *wp, u_int sx, u_int sy)
window_choose_redraw_screen(wp);
}
-void
+static void
window_choose_fire_callback(struct window_pane *wp,
struct window_choose_data *wcd)
{
@@ -326,7 +333,7 @@ window_choose_fire_callback(struct window_pane *wp,
window_choose_free1(data);
}
-void
+static void
window_choose_prompt_input(enum window_choose_input_type input_type,
const char *prompt, struct window_pane *wp, key_code key)
{
@@ -344,7 +351,7 @@ window_choose_prompt_input(enum window_choose_input_type input_type,
window_choose_redraw_screen(wp);
}
-void
+static void
window_choose_collapse(struct window_pane *wp, struct session *s, u_int pos)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -395,7 +402,7 @@ window_choose_collapse(struct window_pane *wp, struct session *s, u_int pos)
}
}
-void
+static void
window_choose_collapse_all(struct window_pane *wp)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -446,7 +453,7 @@ window_choose_expand_all(struct window_pane *wp)
window_choose_reset_top(wp, screen_size_y(scr));
}
-void
+static void
window_choose_expand(struct window_pane *wp, struct session *s, u_int pos)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -518,7 +525,7 @@ window_choose_expand(struct window_pane *wp, struct session *s, u_int pos)
}
}
-struct window_choose_mode_item *
+static struct window_choose_mode_item *
window_choose_get_item(struct window_pane *wp, key_code key,
struct mouse_event *m)
{
@@ -537,7 +544,7 @@ window_choose_get_item(struct window_pane *wp, key_code key,
return (&data->list[idx]);
}
-void
+static void
window_choose_key(struct window_pane *wp, __unused struct client *c,
__unused struct session *sess, key_code key, struct mouse_event *m)
{
@@ -552,7 +559,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
items = data->list_size;
if (data->input_type == WINDOW_CHOOSE_GOTO_ITEM) {
- switch (mode_key_lookup(&data->mdata, key, NULL, NULL)) {
+ switch (mode_key_lookup(&data->mdata, key)) {
case MODEKEYCHOICE_CANCEL:
data->input_type = WINDOW_CHOOSE_NORMAL;
window_choose_redraw_screen(wp);
@@ -582,7 +589,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
return;
}
- switch (mode_key_lookup(&data->mdata, key, NULL, NULL)) {
+ switch (mode_key_lookup(&data->mdata, key)) {
case MODEKEYCHOICE_CANCEL:
window_choose_fire_callback(wp, NULL);
break;
@@ -769,7 +776,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
}
-void
+static void
window_choose_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
u_int py)
{
@@ -827,7 +834,7 @@ window_choose_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
}
-int
+static int
window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
{
static const char keys[] = "0123456789"
@@ -837,7 +844,7 @@ window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
int mkey;
for (ptr = keys; *ptr != '\0'; ptr++) {
- mkey = mode_key_lookup(&data->mdata, *ptr, NULL, NULL);
+ mkey = mode_key_lookup(&data->mdata, *ptr);
if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER)
continue;
if (idx-- == 0)
@@ -846,7 +853,7 @@ window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
return (-1);
}
-int
+static int
window_choose_index_key(struct window_choose_mode_data *data, key_code key)
{
static const char keys[] = "0123456789"
@@ -857,7 +864,7 @@ window_choose_index_key(struct window_choose_mode_data *data, key_code key)
u_int idx = 0;
for (ptr = keys; *ptr != '\0'; ptr++) {
- mkey = mode_key_lookup(&data->mdata, *ptr, NULL, NULL);
+ mkey = mode_key_lookup(&data->mdata, *ptr);
if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER)
continue;
if (key == (key_code)*ptr)
@@ -867,7 +874,7 @@ window_choose_index_key(struct window_choose_mode_data *data, key_code key)
return (-1);
}
-void
+static void
window_choose_redraw_screen(struct window_pane *wp)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -881,7 +888,7 @@ window_choose_redraw_screen(struct window_pane *wp)
screen_write_stop(&ctx);
}
-void
+static void
window_choose_scroll_up(struct window_pane *wp)
{
struct window_choose_mode_data *data = wp->modedata;
@@ -900,7 +907,7 @@ window_choose_scroll_up(struct window_pane *wp)
screen_write_stop(&ctx);
}
-void
+static void
window_choose_scroll_down(struct window_pane *wp)
{
struct window_choose_mode_data *data = wp->modedata;
diff --git a/window-clock.c b/window-clock.c
index f6dc85cd..c80e9af7 100644
--- a/window-clock.c
+++ b/window-clock.c
@@ -24,20 +24,20 @@
#include "tmux.h"
-struct screen *window_clock_init(struct window_pane *);
-void window_clock_free(struct window_pane *);
-void window_clock_resize(struct window_pane *, u_int, u_int);
-void window_clock_key(struct window_pane *, struct client *,
- struct session *, key_code, struct mouse_event *);
+static struct screen *window_clock_init(struct window_pane *);
+static void window_clock_free(struct window_pane *);
+static void window_clock_resize(struct window_pane *, u_int, u_int);
+static void window_clock_key(struct window_pane *, struct client *,
+ struct session *, key_code, struct mouse_event *);
-void window_clock_timer_callback(int, short, void *);
-void window_clock_draw_screen(struct window_pane *);
+static void window_clock_timer_callback(int, short, void *);
+static void window_clock_draw_screen(struct window_pane *);
const struct window_mode window_clock_mode = {
- window_clock_init,
- window_clock_free,
- window_clock_resize,
- window_clock_key,
+ .init = window_clock_init,
+ .free = window_clock_free,
+ .resize = window_clock_resize,
+ .key = window_clock_key,
};
struct window_clock_mode_data {
@@ -119,7 +119,7 @@ const char window_clock_table[14][5][5] = {
{ 1,0,0,0,1 } },
};
-void
+static void
window_clock_timer_callback(__unused int fd, __unused short events, void *arg)
{
struct window_pane *wp = arg;
@@ -142,7 +142,7 @@ window_clock_timer_callback(__unused int fd, __unused short events, void *arg)
server_redraw_window(wp->window);
}
-struct screen *
+static struct screen *
window_clock_init(struct window_pane *wp)
{
struct window_clock_mode_data *data;
@@ -164,7 +164,7 @@ window_clock_init(struct window_pane *wp)
return (s);
}
-void
+static void
window_clock_free(struct window_pane *wp)
{
struct window_clock_mode_data *data = wp->modedata;
@@ -174,7 +174,7 @@ window_clock_free(struct window_pane *wp)
free(data);
}
-void
+static void
window_clock_resize(struct window_pane *wp, u_int sx, u_int sy)
{
struct window_clock_mode_data *data = wp->modedata;
@@ -184,7 +184,7 @@ window_clock_resize(struct window_pane *wp, u_int sx, u_int sy)
window_clock_draw_screen(wp);
}
-void
+static void
window_clock_key(struct window_pane *wp, __unused struct client *c,
__unused struct session *sess, __unused key_code key,
__unused struct mouse_event *m)
@@ -192,7 +192,7 @@ window_clock_key(struct window_pane *wp, __unused struct client *c,
window_pane_reset_mode(wp);
}
-void
+static void
window_clock_draw_screen(struct window_pane *wp)
{
struct window_clock_mode_data *data = wp->modedata;
diff --git a/window-copy.c b/window-copy.c
index f1379604..d282e25e 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -24,95 +24,99 @@
#include "tmux.h"
-struct screen *window_copy_init(struct window_pane *);
-void window_copy_free(struct window_pane *);
-void window_copy_pagedown(struct window_pane *, int);
-void window_copy_next_paragraph(struct window_pane *);
-void window_copy_previous_paragraph(struct window_pane *);
-void window_copy_resize(struct window_pane *, u_int, u_int);
-void window_copy_key(struct window_pane *, struct client *, struct session *,
- key_code, struct mouse_event *);
-int window_copy_key_input(struct window_pane *, key_code);
-int window_copy_key_numeric_prefix(struct window_pane *, key_code);
-
-void window_copy_redraw_selection(struct window_pane *, u_int);
-void window_copy_redraw_lines(struct window_pane *, u_int, u_int);
-void window_copy_redraw_screen(struct window_pane *);
-void window_copy_write_line(struct window_pane *, struct screen_write_ctx *,
- u_int);
-void window_copy_write_lines(struct window_pane *,
- struct screen_write_ctx *, u_int, u_int);
-
-void window_copy_scroll_to(struct window_pane *, u_int, u_int);
-int window_copy_search_compare(struct grid *, u_int, u_int, struct grid *,
- u_int, int);
-int window_copy_search_lr(struct grid *, struct grid *, u_int *, u_int,
- u_int, u_int, int);
-int window_copy_search_rl(struct grid *, struct grid *, u_int *, u_int,
- u_int, u_int, int);
-void window_copy_move_left(struct screen *, u_int *, u_int *);
-void window_copy_move_right(struct screen *, u_int *, u_int *);
-int window_copy_is_lowercase(const char *);
-void window_copy_search_jump(struct window_pane *, struct grid *,
- struct grid *, u_int, u_int, u_int, int, int, int);
-void window_copy_search(struct window_pane *, const char *, int, int);
-void window_copy_search_up(struct window_pane *, const char *, int);
-void window_copy_search_down(struct window_pane *, const char *, int);
-void window_copy_goto_line(struct window_pane *, const char *);
-void window_copy_update_cursor(struct window_pane *, u_int, u_int);
-void window_copy_start_selection(struct window_pane *);
-int window_copy_update_selection(struct window_pane *, int);
-void *window_copy_get_selection(struct window_pane *, size_t *);
-void window_copy_copy_buffer(struct window_pane *, const char *, void *,
- size_t);
-void window_copy_copy_pipe(struct window_pane *, struct session *,
- const char *, const char *);
-void window_copy_copy_selection(struct window_pane *, const char *);
-void window_copy_append_selection(struct window_pane *, const char *);
-void window_copy_clear_selection(struct window_pane *);
-void window_copy_copy_line(struct window_pane *, char **, size_t *, u_int,
- u_int, u_int);
-int window_copy_in_set(struct window_pane *, u_int, u_int, const char *);
-u_int window_copy_find_length(struct window_pane *, u_int);
-void window_copy_cursor_start_of_line(struct window_pane *);
-void window_copy_cursor_back_to_indentation(struct window_pane *);
-void window_copy_cursor_end_of_line(struct window_pane *);
-void window_copy_other_end(struct window_pane *);
-void window_copy_cursor_left(struct window_pane *);
-void window_copy_cursor_right(struct window_pane *);
-void window_copy_cursor_up(struct window_pane *, int);
-void window_copy_cursor_down(struct window_pane *, int);
-void window_copy_cursor_jump(struct window_pane *);
-void window_copy_cursor_jump_back(struct window_pane *);
-void window_copy_cursor_jump_to(struct window_pane *, int);
-void window_copy_cursor_jump_to_back(struct window_pane *, int);
-void window_copy_cursor_next_word(struct window_pane *, const char *);
-void window_copy_cursor_next_word_end(struct window_pane *, const char *);
-void window_copy_cursor_previous_word(struct window_pane *, const char *);
-void window_copy_scroll_up(struct window_pane *, u_int);
-void window_copy_scroll_down(struct window_pane *, u_int);
-void window_copy_rectangle_toggle(struct window_pane *);
-void window_copy_drag_update(struct client *, struct mouse_event *);
-void window_copy_drag_release(struct client *, struct mouse_event *);
+static const char *window_copy_key_table(struct window_pane *);
+static void window_copy_command(struct window_pane *, struct client *,
+ struct session *, struct args *, struct mouse_event *);
+static struct screen *window_copy_init(struct window_pane *);
+static void window_copy_free(struct window_pane *);
+static void window_copy_pagedown(struct window_pane *, int);
+static void window_copy_next_paragraph(struct window_pane *);
+static void window_copy_previous_paragraph(struct window_pane *);
+static void window_copy_resize(struct window_pane *, u_int, u_int);
+
+static void window_copy_redraw_selection(struct window_pane *, u_int);
+static void window_copy_redraw_lines(struct window_pane *, u_int, u_int);
+static void window_copy_redraw_screen(struct window_pane *);
+static void window_copy_write_line(struct window_pane *,
+ struct screen_write_ctx *, u_int);
+static void window_copy_write_lines(struct window_pane *,
+ struct screen_write_ctx *, u_int, u_int);
+
+static void window_copy_scroll_to(struct window_pane *, u_int, u_int);
+static int window_copy_search_compare(struct grid *, u_int, u_int,
+ struct grid *, u_int, int);
+static int window_copy_search_lr(struct grid *, struct grid *, u_int *,
+ u_int, u_int, u_int, int);
+static int window_copy_search_rl(struct grid *, struct grid *, u_int *,
+ u_int, u_int, u_int, int);
+static void window_copy_move_left(struct screen *, u_int *, u_int *);
+static void window_copy_move_right(struct screen *, u_int *, u_int *);
+static int window_copy_is_lowercase(const char *);
+static void window_copy_search_jump(struct window_pane *, struct grid *,
+ struct grid *, u_int, u_int, u_int, int, int, int);
+static void window_copy_search(struct window_pane *, const char *, int,
+ int);
+static void window_copy_search_up(struct window_pane *, const char *, int);
+static void window_copy_search_down(struct window_pane *, const char *,
+ int);
+static void window_copy_goto_line(struct window_pane *, const char *);
+static void window_copy_update_cursor(struct window_pane *, u_int, u_int);
+static void window_copy_start_selection(struct window_pane *);
+static int window_copy_update_selection(struct window_pane *, int);
+static void *window_copy_get_selection(struct window_pane *, size_t *);
+static void window_copy_copy_buffer(struct window_pane *, const char *,
+ void *, size_t);
+static void window_copy_copy_pipe(struct window_pane *, struct session *,
+ const char *, const char *);
+static void window_copy_copy_selection(struct window_pane *, const char *);
+static void window_copy_append_selection(struct window_pane *,
+ const char *);
+static void window_copy_clear_selection(struct window_pane *);
+static void window_copy_copy_line(struct window_pane *, char **, size_t *,
+ u_int, u_int, u_int);
+static int window_copy_in_set(struct window_pane *, u_int, u_int,
+ const char *);
+static u_int window_copy_find_length(struct window_pane *, u_int);
+static void window_copy_cursor_start_of_line(struct window_pane *);
+static void window_copy_cursor_back_to_indentation(struct window_pane *);
+static void window_copy_cursor_end_of_line(struct window_pane *);
+static void window_copy_other_end(struct window_pane *);
+static void window_copy_cursor_left(struct window_pane *);
+static void window_copy_cursor_right(struct window_pane *);
+static void window_copy_cursor_up(struct window_pane *, int);
+static void window_copy_cursor_down(struct window_pane *, int);
+static void window_copy_cursor_jump(struct window_pane *);
+static void window_copy_cursor_jump_back(struct window_pane *);
+static void window_copy_cursor_jump_to(struct window_pane *, int);
+static void window_copy_cursor_jump_to_back(struct window_pane *, int);
+static void window_copy_cursor_next_word(struct window_pane *,
+ const char *);
+static void window_copy_cursor_next_word_end(struct window_pane *,
+ const char *);
+static void window_copy_cursor_previous_word(struct window_pane *,
+ const char *);
+static void window_copy_scroll_up(struct window_pane *, u_int);
+static void window_copy_scroll_down(struct window_pane *, u_int);
+static void window_copy_rectangle_toggle(struct window_pane *);
+static void window_copy_move_mouse(struct mouse_event *);
+static void window_copy_drag_update(struct client *, struct mouse_event *);
const struct window_mode window_copy_mode = {
- window_copy_init,
- window_copy_free,
- window_copy_resize,
- window_copy_key,
+ .init = window_copy_init,
+ .free = window_copy_free,
+ .resize = window_copy_resize,
+ .key_table = window_copy_key_table,
+ .command = window_copy_command,
};
-enum window_copy_input_type {
+enum {
WINDOW_COPY_OFF,
- WINDOW_COPY_NAMEDBUFFER,
- WINDOW_COPY_NUMERICPREFIX,
WINDOW_COPY_SEARCHUP,
WINDOW_COPY_SEARCHDOWN,
WINDOW_COPY_JUMPFORWARD,
- WINDOW_COPY_JUMPBACK,
+ WINDOW_COPY_JUMPBACKWARD,
WINDOW_COPY_JUMPTOFORWARD,
- WINDOW_COPY_JUMPTOBACK,
- WINDOW_COPY_GOTOLINE,
+ WINDOW_COPY_JUMPTOBACKWARD,
};
/*
@@ -132,47 +136,37 @@ enum window_copy_input_type {
* mode ends).
*/
struct window_copy_mode_data {
- struct screen screen;
+ struct screen screen;
- struct screen *backing;
- int backing_written; /* backing display started */
+ struct screen *backing;
+ int backing_written; /* backing display started */
- struct mode_key_data mdata;
+ u_int oy;
- u_int oy;
+ u_int selx;
+ u_int sely;
- u_int selx;
- u_int sely;
+ int rectflag; /* in rectangle copy mode? */
+ int scroll_exit; /* exit on scroll to end? */
- int rectflag; /* in rectangle copy mode? */
- int scroll_exit; /* exit on scroll to end? */
+ u_int cx;
+ u_int cy;
- u_int cx;
- u_int cy;
+ u_int lastcx; /* position in last line w/ content */
+ u_int lastsx; /* size of last line w/ content */
- u_int lastcx; /* position in last line w/ content */
- u_int lastsx; /* size of last line w/ content */
+ int searchtype;
+ char *searchstr;
- enum window_copy_input_type inputtype;
- const char *inputprompt;
- char *inputstr;
- int inputexit;
-
- int numprefix;
-
- enum window_copy_input_type searchtype;
- char *searchstr;
-
- enum window_copy_input_type jumptype;
- char jumpchar;
+ int jumptype;
+ char jumpchar;
};
-struct screen *
+static struct screen *
window_copy_init(struct window_pane *wp)
{
struct window_copy_mode_data *data;
struct screen *s;
- int keys;
wp->modedata = data = xmalloc(sizeof *data);
data->oy = 0;
@@ -187,11 +181,6 @@ window_copy_init(struct window_pane *wp)
data->rectflag = 0;
data->scroll_exit = 0;
- data->inputtype = WINDOW_COPY_OFF;
- data->inputprompt = NULL;
- data->inputstr = xstrdup("");
- data->numprefix = -1;
-
data->searchtype = WINDOW_COPY_OFF;
data->searchstr = NULL;
@@ -203,13 +192,7 @@ window_copy_init(struct window_pane *wp)
s = &data->screen;
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
-
- keys = options_get_number(wp->window->options, "mode-keys");
- if (keys == MODEKEY_EMACS)
- mode_key_init(&data->mdata, &mode_key_tree_emacs_copy);
- else
- mode_key_init(&data->mdata, &mode_key_tree_vi_copy);
- s->sel.modekeys = keys;
+ s->sel.modekeys = options_get_number(wp->window->options, "mode-keys");
data->backing = NULL;
@@ -252,7 +235,7 @@ window_copy_init_for_output(struct window_pane *wp)
screen_size_y(&wp->base), UINT_MAX);
}
-void
+static void
window_copy_free(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -261,7 +244,6 @@ window_copy_free(struct window_pane *wp)
bufferevent_enable(wp->event, EV_READ|EV_WRITE);
free(data->searchstr);
- free(data->inputstr);
if (data->backing != &wp->base) {
screen_free(data->backing);
@@ -371,7 +353,7 @@ window_copy_pageup(struct window_pane *wp, int half_page)
window_copy_redraw_screen(wp);
}
-void
+static void
window_copy_pagedown(struct window_pane *wp, int half_page)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -419,7 +401,7 @@ window_copy_pagedown(struct window_pane *wp, int half_page)
window_copy_redraw_screen(wp);
}
-void
+static void
window_copy_previous_paragraph(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -436,7 +418,7 @@ window_copy_previous_paragraph(struct window_pane *wp)
window_copy_scroll_to(wp, 0, oy);
}
-void
+static void
window_copy_next_paragraph(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -456,7 +438,7 @@ window_copy_next_paragraph(struct window_pane *wp)
window_copy_scroll_to(wp, ox, oy);
}
-void
+static void
window_copy_resize(struct window_pane *wp, u_int sx, u_int sy)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -483,532 +465,351 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy)
window_copy_redraw_screen(wp);
}
-void
-window_copy_key(struct window_pane *wp, struct client *c, struct session *sess,
- key_code key, struct mouse_event *m)
+static const char *
+window_copy_key_table(struct window_pane *wp)
+{
+ if (options_get_number(wp->window->options, "mode-keys") == MODEKEY_VI)
+ return ("copy-mode-vi");
+ return ("copy-mode");
+}
+
+static void
+window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
+ struct args *args, struct mouse_event *m)
{
- const char *word_separators;
struct window_copy_mode_data *data = wp->modedata;
- struct screen *s = &data->screen;
- u_int np;
- int keys;
- enum mode_key_cmd cmd;
- const char *arg, *ss;
-
- np = 1;
- if (data->numprefix > 0)
- np = data->numprefix;
-
- if (data->inputtype == WINDOW_COPY_JUMPFORWARD ||
- data->inputtype == WINDOW_COPY_JUMPBACK ||
- data->inputtype == WINDOW_COPY_JUMPTOFORWARD ||
- data->inputtype == WINDOW_COPY_JUMPTOBACK) {
- /* Ignore keys with modifiers. */
- if ((key & KEYC_MASK_MOD) == 0) {
- data->jumpchar = key;
- if (data->inputtype == WINDOW_COPY_JUMPFORWARD) {
- for (; np != 0; np--)
- window_copy_cursor_jump(wp);
- }
- if (data->inputtype == WINDOW_COPY_JUMPBACK) {
- for (; np != 0; np--)
- window_copy_cursor_jump_back(wp);
- }
- if (data->inputtype == WINDOW_COPY_JUMPTOFORWARD) {
- for (; np != 0; np--)
- window_copy_cursor_jump_to(wp, 0);
- }
- if (data->inputtype == WINDOW_COPY_JUMPTOBACK) {
- for (; np != 0; np--)
- window_copy_cursor_jump_to_back(wp, 0);
- }
- }
- data->jumptype = data->inputtype;
- data->inputtype = WINDOW_COPY_OFF;
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return;
- } else if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) {
- if (window_copy_key_numeric_prefix(wp, key) == 0)
- return;
- data->inputtype = WINDOW_COPY_OFF;
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- } else if (data->inputtype != WINDOW_COPY_OFF) {
- if (window_copy_key_input(wp, key) != 0)
- goto input_off;
+ struct screen *sn = &data->screen;
+ const char *command, *argument, *ws, *ss;
+ u_int np = wp->modeprefix;
+
+ if (args->argc == 0)
return;
- }
+ command = args->argv[0];
- cmd = mode_key_lookup(&data->mdata, key, &arg, &np);
- if (data->numprefix > 0)
- np = data->numprefix;
- if (cmd != MODEKEYCOPY_PREVIOUSPAGE &&
- cmd != MODEKEYCOPY_NEXTPAGE &&
- cmd != MODEKEYCOPY_SCROLLUP &&
- cmd != MODEKEYCOPY_SCROLLDOWN &&
- cmd != MODEKEYCOPY_HALFPAGEUP &&
- cmd != MODEKEYCOPY_HALFPAGEDOWN)
- data->scroll_exit = 0;
- switch (cmd) {
- case MODEKEYCOPY_APPENDSELECTION:
- if (sess != NULL) {
- window_copy_append_selection(wp, NULL);
- if (arg == NULL) {
- window_pane_reset_mode(wp);
- return;
- }
+ if (m != NULL && m->valid)
+ window_copy_move_mouse(m);
+
+ if (args->argc == 1) {
+ if (strcmp(command, "append-selection") == 0) {
+ if (s != NULL)
+ window_copy_append_selection(wp, NULL);
window_copy_clear_selection(wp);
window_copy_redraw_screen(wp);
}
- break;
- case MODEKEYCOPY_CANCEL:
- window_pane_reset_mode(wp);
- return;
- case MODEKEYCOPY_OTHEREND:
- if (np % 2)
- window_copy_other_end(wp);
- break;
- case MODEKEYCOPY_LEFT:
- for (; np != 0; np--)
- window_copy_cursor_left(wp);
- break;
- case MODEKEYCOPY_RIGHT:
- for (; np != 0; np--)
- window_copy_cursor_right(wp);
- break;
- case MODEKEYCOPY_UP:
- for (; np != 0; np--)
- window_copy_cursor_up(wp, 0);
- break;
- case MODEKEYCOPY_DOWN:
- for (; np != 0; np--)
- window_copy_cursor_down(wp, 0);
- break;
- case MODEKEYCOPY_SCROLLUP:
- for (; np != 0; np--)
- window_copy_cursor_up(wp, 1);
- break;
- case MODEKEYCOPY_SCROLLDOWN:
- for (; np != 0; np--)
- window_copy_cursor_down(wp, 1);
- if (data->scroll_exit && data->oy == 0) {
+ if (strcmp(command, "append-selection-and-cancel") == 0) {
+ if (s != NULL)
+ window_copy_append_selection(wp, NULL);
+ window_copy_clear_selection(wp);
+ window_copy_redraw_screen(wp);
window_pane_reset_mode(wp);
- return;
}
- break;
- case MODEKEYCOPY_PREVIOUSPAGE:
- for (; np != 0; np--)
- window_copy_pageup(wp, 0);
- break;
- case MODEKEYCOPY_NEXTPAGE:
- for (; np != 0; np--)
- window_copy_pagedown(wp, 0);
- break;
- case MODEKEYCOPY_PREVIOUSPARAGRAPH:
- for (; np != 0; np--)
- window_copy_previous_paragraph(wp);
- break;
- case MODEKEYCOPY_NEXTPARAGRAPH:
- for (; np != 0; np--)
- window_copy_next_paragraph(wp);
- break;
- case MODEKEYCOPY_HALFPAGEUP:
- for (; np != 0; np--)
- window_copy_pageup(wp, 1);
- break;
- case MODEKEYCOPY_HALFPAGEDOWN:
- for (; np != 0; np--)
- window_copy_pagedown(wp, 1);
- break;
- case MODEKEYCOPY_TOPLINE:
- data->cx = 0;
- data->cy = 0;
- window_copy_update_selection(wp, 1);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_MIDDLELINE:
- data->cx = 0;
- data->cy = (screen_size_y(s) - 1) / 2;
- window_copy_update_selection(wp, 1);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_BOTTOMLINE:
- data->cx = 0;
- data->cy = screen_size_y(s) - 1;
- window_copy_update_selection(wp, 1);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_HISTORYTOP:
- data->cx = 0;
- data->cy = 0;
- data->oy = screen_hsize(data->backing);
- window_copy_update_selection(wp, 1);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_HISTORYBOTTOM:
- data->cx = 0;
- data->cy = screen_size_y(s) - 1;
- data->oy = 0;
- window_copy_update_selection(wp, 1);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_STARTSELECTION:
- if (KEYC_IS_MOUSE(key)) {
- if (c != NULL)
+ if (strcmp(command, "back-to-indentation") == 0)
+ window_copy_cursor_back_to_indentation(wp);
+ if (strcmp(command, "begin-selection") == 0) {
+ if (m != NULL)
window_copy_start_drag(c, m);
- } else {
- s->sel.lineflag = LINE_SEL_NONE;
- window_copy_start_selection(wp);
+ else {
+ sn->sel.lineflag = LINE_SEL_NONE;
+ window_copy_start_selection(wp);
+ window_copy_redraw_screen(wp);
+ }
+ }
+ if (strcmp(command, "bottom-line") == 0) {
+ data->cx = 0;
+ data->cy = screen_size_y(sn) - 1;
+ window_copy_update_selection(wp, 1);
window_copy_redraw_screen(wp);
}
- break;
- case MODEKEYCOPY_SELECTLINE:
- s->sel.lineflag = LINE_SEL_LEFT_RIGHT;
- data->rectflag = 0;
- /* FALLTHROUGH */
- case MODEKEYCOPY_COPYLINE:
- window_copy_cursor_start_of_line(wp);
- /* FALLTHROUGH */
- case MODEKEYCOPY_COPYENDOFLINE:
- window_copy_start_selection(wp);
- for (; np > 1; np--)
- window_copy_cursor_down(wp, 0);
- window_copy_cursor_end_of_line(wp);
- window_copy_redraw_screen(wp);
-
- /* If a copy command then copy the selection and exit. */
- if (sess != NULL &&
- (cmd == MODEKEYCOPY_COPYLINE ||
- cmd == MODEKEYCOPY_COPYENDOFLINE)) {
- window_copy_copy_selection(wp, NULL);
+ if (strcmp(command, "cancel") == 0)
window_pane_reset_mode(wp);
- return;
+ if (strcmp(command, "clear-selection") == 0) {
+ window_copy_clear_selection(wp);
+ window_copy_redraw_screen(wp);
}
- break;
- case MODEKEYCOPY_CLEARSELECTION:
- window_copy_clear_selection(wp);
- window_copy_redraw_screen(wp);
- break;
- case MODEKEYCOPY_COPYPIPE:
- if (sess != NULL) {
- window_copy_copy_pipe(wp, sess, NULL, arg);
- window_pane_reset_mode(wp);
- return;
+ if (strcmp(command, "copy-end-of-line") == 0) {
+ window_copy_start_selection(wp);
+ for (; np > 1; np--)
+ window_copy_cursor_down(wp, 0);
+ window_copy_cursor_end_of_line(wp);
+ window_copy_redraw_screen(wp);
+
+ if (s != NULL) {
+ window_copy_copy_selection(wp, NULL);
+ window_pane_reset_mode(wp);
+ }
}
- break;
- case MODEKEYCOPY_COPYSELECTION:
- if (sess != NULL) {
- window_copy_copy_selection(wp, NULL);
- if (arg == NULL) {
+ if (strcmp(command, "copy-line") == 0) {
+ window_copy_cursor_start_of_line(wp);
+ window_copy_start_selection(wp);
+ for (; np > 1; np--)
+ window_copy_cursor_down(wp, 0);
+ window_copy_cursor_end_of_line(wp);
+ window_copy_redraw_screen(wp);
+
+ if (s != NULL) {
+ window_copy_copy_selection(wp, NULL);
window_pane_reset_mode(wp);
- return;
}
+ }
+ if (strcmp(command, "copy-selection") == 0) {
+ if (s != NULL)
+ window_copy_copy_selection(wp, NULL);
window_copy_clear_selection(wp);
window_copy_redraw_screen(wp);
}
- break;
- case MODEKEYCOPY_STARTOFLINE:
- window_copy_cursor_start_of_line(wp);
- break;
- case MODEKEYCOPY_BACKTOINDENTATION:
- window_copy_cursor_back_to_indentation(wp);
- break;
- case MODEKEYCOPY_ENDOFLINE:
- window_copy_cursor_end_of_line(wp);
- break;
- case MODEKEYCOPY_NEXTSPACE:
- for (; np != 0; np--)
- window_copy_cursor_next_word(wp, " ");
- break;
- case MODEKEYCOPY_NEXTSPACEEND:
- for (; np != 0; np--)
- window_copy_cursor_next_word_end(wp, " ");
- break;
- case MODEKEYCOPY_NEXTWORD:
- word_separators =
- options_get_string(sess->options, "word-separators");
- for (; np != 0; np--)
- window_copy_cursor_next_word(wp, word_separators);
- break;
- case MODEKEYCOPY_NEXTWORDEND:
- word_separators =
- options_get_string(sess->options, "word-separators");
- for (; np != 0; np--)
- window_copy_cursor_next_word_end(wp, word_separators);
- break;
- case MODEKEYCOPY_PREVIOUSSPACE:
- for (; np != 0; np--)
- window_copy_cursor_previous_word(wp, " ");
- break;
- case MODEKEYCOPY_PREVIOUSWORD:
- word_separators =
- options_get_string(sess->options, "word-separators");
- for (; np != 0; np--)
- window_copy_cursor_previous_word(wp, word_separators);
- break;
- case MODEKEYCOPY_JUMP:
- data->inputtype = WINDOW_COPY_JUMPFORWARD;
- data->inputprompt = "Jump Forward";
- *data->inputstr = '\0';
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return; /* skip numprefix reset */
- case MODEKEYCOPY_JUMPAGAIN:
- if (data->jumptype == WINDOW_COPY_JUMPFORWARD) {
+ if (strcmp(command, "copy-selection-and-cancel") == 0) {
+ if (s != NULL)
+ window_copy_copy_selection(wp, NULL);
+ window_copy_clear_selection(wp);
+ window_copy_redraw_screen(wp);
+ window_pane_reset_mode(wp);
+ }
+ if (strcmp(command, "cursor-down") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump(wp);
- } else if (data->jumptype == WINDOW_COPY_JUMPBACK) {
+ window_copy_cursor_down(wp, 0);
+ }
+ if (strcmp(command, "cursor-left") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_back(wp);
- } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) {
+ window_copy_cursor_left(wp);
+ }
+ if (strcmp(command, "cursor-right") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_to(wp, 1);
- } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) {
+ window_copy_cursor_right(wp);
+ }
+ if (strcmp(command, "cursor-up") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_to_back(wp, 1);
+ window_copy_cursor_up(wp, 0);
}
- break;
- case MODEKEYCOPY_JUMPREVERSE:
- if (data->jumptype == WINDOW_COPY_JUMPFORWARD) {
+ if (strcmp(command, "end-of-line") == 0)
+ window_copy_cursor_end_of_line(wp);
+ if (strcmp(command, "halfpage-down") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_back(wp);
- } else if (data->jumptype == WINDOW_COPY_JUMPBACK) {
+ window_copy_pagedown(wp, 1);
+ }
+ if (strcmp(command, "halfpage-up") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump(wp);
- } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) {
+ window_copy_pageup(wp, 1);
+ }
+ if (strcmp(command, "history-bottom") == 0) {
+ data->cx = 0;
+ data->cy = screen_size_y(sn) - 1;
+ data->oy = 0;
+ window_copy_update_selection(wp, 1);
+ window_copy_redraw_screen(wp);
+ }
+ if (strcmp(command, "history-top") == 0) {
+ data->cx = 0;
+ data->cy = 0;
+ data->oy = screen_hsize(data->backing);
+ window_copy_update_selection(wp, 1);
+ window_copy_redraw_screen(wp);
+ }
+ if (strcmp(command, "jump-again") == 0) {
+ switch (data->jumptype) {
+ case WINDOW_COPY_JUMPFORWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump(wp);
+ break;
+ case WINDOW_COPY_JUMPBACKWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_back(wp);
+ break;
+ case WINDOW_COPY_JUMPTOFORWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to(wp, 1);
+ break;
+ case WINDOW_COPY_JUMPTOBACKWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to_back(wp, 1);
+ break;
+ }
+ }
+ if (strcmp(command, "jump-reverse") == 0) {
+ switch (data->jumptype) {
+ case WINDOW_COPY_JUMPFORWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_back(wp);
+ break;
+ case WINDOW_COPY_JUMPBACKWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump(wp);
+ break;
+ case WINDOW_COPY_JUMPTOFORWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to_back(wp, 1);
+ break;
+ case WINDOW_COPY_JUMPTOBACKWARD:
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to(wp, 1);
+ break;
+ }
+ }
+ if (strcmp(command, "middle-line") == 0) {
+ data->cx = 0;
+ data->cy = (screen_size_y(sn) - 1) / 2;
+ window_copy_update_selection(wp, 1);
+ window_copy_redraw_screen(wp);
+ }
+ if (strcmp(command, "next-paragraph") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_to_back(wp, 1);
- } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) {
+ window_copy_next_paragraph(wp);
+ }
+ if (strcmp(command, "next-space") == 0) {
for (; np != 0; np--)
- window_copy_cursor_jump_to(wp, 1);
+ window_copy_cursor_next_word(wp, " ");
}
- break;
- case MODEKEYCOPY_JUMPBACK:
- data->inputtype = WINDOW_COPY_JUMPBACK;
- data->inputprompt = "Jump Back";
- *data->inputstr = '\0';
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return; /* skip numprefix reset */
- case MODEKEYCOPY_JUMPTO:
- data->inputtype = WINDOW_COPY_JUMPTOFORWARD;
- data->inputprompt = "Jump To";
- *data->inputstr = '\0';
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return; /* skip numprefix reset */
- case MODEKEYCOPY_JUMPTOBACK:
- data->inputtype = WINDOW_COPY_JUMPTOBACK;
- data->inputprompt = "Jump To Back";
- *data->inputstr = '\0';
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return; /* skip numprefix reset */
- case MODEKEYCOPY_SEARCHUP:
- data->inputtype = WINDOW_COPY_SEARCHUP;
- data->inputprompt = "Search Up";
- goto input_on;
- case MODEKEYCOPY_SEARCHDOWN:
- data->inputtype = WINDOW_COPY_SEARCHDOWN;
- data->inputprompt = "Search Down";
- goto input_on;
- case MODEKEYCOPY_SEARCHAGAIN:
- case MODEKEYCOPY_SEARCHREVERSE:
- switch (data->searchtype) {
- case WINDOW_COPY_OFF:
- case WINDOW_COPY_GOTOLINE:
- case WINDOW_COPY_JUMPFORWARD:
- case WINDOW_COPY_JUMPBACK:
- case WINDOW_COPY_JUMPTOFORWARD:
- case WINDOW_COPY_JUMPTOBACK:
- case WINDOW_COPY_NAMEDBUFFER:
- case WINDOW_COPY_NUMERICPREFIX:
- break;
- case WINDOW_COPY_SEARCHUP:
+ if (strcmp(command, "next-space-end") == 0) {
+ for (; np != 0; np--)
+ window_copy_cursor_next_word_end(wp, " ");
+ }
+ if (strcmp(command, "next-word") == 0) {
+ ws = options_get_string(s->options, "word-separators");
+ for (; np != 0; np--)
+ window_copy_cursor_next_word(wp, ws);
+ }
+ if (strcmp(command, "next-word-end") == 0) {
+ ws = options_get_string(s->options, "word-separators");
+ for (; np != 0; np--)
+ window_copy_cursor_next_word_end(wp, ws);
+ }
+ if (strcmp(command, "other-end") == 0) {
+ if ((np % 2) != 0)
+ window_copy_other_end(wp);
+ }
+ if (strcmp(command, "page-down") == 0) {
+ for (; np != 0; np--)
+ window_copy_pagedown(wp, 0);
+ }
+ if (strcmp(command, "page-up") == 0) {
+ for (; np != 0; np--)
+ window_copy_pageup(wp, 0);
+ }
+ if (strcmp(command, "previous-paragraph") == 0) {
+ for (; np != 0; np--)
+ window_copy_previous_paragraph(wp);
+ }
+ if (strcmp(command, "previous-space") == 0) {
+ for (; np != 0; np--)
+ window_copy_cursor_previous_word(wp, " ");
+ }
+ if (strcmp(command, "previous-word") == 0) {
+ ws = options_get_string(s->options, "word-separators");
+ for (; np != 0; np--)
+ window_copy_cursor_previous_word(wp, ws);
+ }
+ if (strcmp(command, "rectangle-toggle") == 0) {
+ sn->sel.lineflag = LINE_SEL_NONE;
+ window_copy_rectangle_toggle(wp);
+ }
+ if (strcmp(command, "scroll-down") == 0) {
+ for (; np != 0; np--)
+ window_copy_cursor_down(wp, 1);
+ if (data->scroll_exit && data->oy == 0)
+ window_pane_reset_mode(wp);
+ }
+ if (strcmp(command, "scroll-up") == 0) {
+ for (; np != 0; np--)
+ window_copy_cursor_up(wp, 1);
+ }
+ if (strcmp(command, "search-again") == 0) {
ss = data->searchstr;
- if (cmd == MODEKEYCOPY_SEARCHAGAIN) {
+ if (data->searchtype == WINDOW_COPY_SEARCHUP) {
for (; np != 0; np--)
window_copy_search_up(wp, ss, 1);
- } else {
+ } else if (data->searchtype == WINDOW_COPY_SEARCHDOWN) {
for (; np != 0; np--)
window_copy_search_down(wp, ss, 1);
}
- break;
- case WINDOW_COPY_SEARCHDOWN:
+ }
+ if (strcmp(command, "search-reverse") == 0) {
ss = data->searchstr;
- if (cmd == MODEKEYCOPY_SEARCHAGAIN) {
+ if (data->searchtype == WINDOW_COPY_SEARCHUP) {
for (; np != 0; np--)
window_copy_search_down(wp, ss, 1);
- } else {
+ } else if (data->searchtype == WINDOW_COPY_SEARCHDOWN) {
for (; np != 0; np--)
window_copy_search_up(wp, ss, 1);
}
- break;
}
- break;
- case MODEKEYCOPY_GOTOLINE:
- data->inputtype = WINDOW_COPY_GOTOLINE;
- data->inputprompt = "Goto Line";
- *data->inputstr = '\0';
- goto input_on;
- case MODEKEYCOPY_STARTNAMEDBUFFER:
- data->inputtype = WINDOW_COPY_NAMEDBUFFER;
- data->inputexit = (arg == NULL);
- data->inputprompt = "Buffer";
- *data->inputstr = '\0';
- goto input_on;
- case MODEKEYCOPY_STARTNUMBERPREFIX:
- key &= KEYC_MASK_KEY;
- if (key >= '0' && key <= '9') {
- data->inputtype = WINDOW_COPY_NUMERICPREFIX;
- data->numprefix = 0;
- window_copy_key_numeric_prefix(wp, key);
- return;
+ if (strcmp(command, "select-line") == 0) {
+ sn->sel.lineflag = LINE_SEL_LEFT_RIGHT;
+ data->rectflag = 0;
+ window_copy_cursor_start_of_line(wp);
+ window_copy_start_selection(wp);
+ for (; np > 1; np--)
+ window_copy_cursor_down(wp, 0);
+ window_copy_cursor_end_of_line(wp);
+ window_copy_redraw_screen(wp);
}
- break;
- case MODEKEYCOPY_RECTANGLETOGGLE:
- s->sel.lineflag = LINE_SEL_NONE;
- window_copy_rectangle_toggle(wp);
- break;
- default:
- break;
- }
-
- data->numprefix = -1;
- return;
-
-input_on:
- keys = options_get_number(wp->window->options, "mode-keys");
- if (keys == MODEKEY_EMACS)
- mode_key_init(&data->mdata, &mode_key_tree_emacs_edit);
- else
- mode_key_init(&data->mdata, &mode_key_tree_vi_edit);
-
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return;
-
-input_off:
- keys = options_get_number(wp->window->options, "mode-keys");
- if (keys == MODEKEY_EMACS)
- mode_key_init(&data->mdata, &mode_key_tree_emacs_copy);
- else
- mode_key_init(&data->mdata, &mode_key_tree_vi_copy);
-
- data->inputtype = WINDOW_COPY_OFF;
- data->inputprompt = NULL;
-
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
-}
-
-int
-window_copy_key_input(struct window_pane *wp, key_code key)
-{
- struct window_copy_mode_data *data = wp->modedata;
- struct screen *s = &data->screen;
- const char *bufdata;
- size_t inputlen, n, bufsize;
- u_int np;
- struct paste_buffer *pb;
- u_char ch;
-
- switch (mode_key_lookup(&data->mdata, key, NULL, &np)) {
- case MODEKEYEDIT_CANCEL:
- data->numprefix = -1;
- return (-1);
- case MODEKEYEDIT_BACKSPACE:
- inputlen = strlen(data->inputstr);
- if (inputlen > 0)
- data->inputstr[inputlen - 1] = '\0';
- break;
- case MODEKEYEDIT_DELETELINE:
- *data->inputstr = '\0';
- break;
- case MODEKEYEDIT_PASTE:
- if ((pb = paste_get_top(NULL)) == NULL)
- break;
- bufdata = paste_buffer_data(pb, &bufsize);
- for (n = 0; n < bufsize; n++) {
- ch = (u_char)bufdata[n];
- if (ch < 32 || ch == 127)
- break;
+ if (strcmp(command, "select-word") == 0) {
+ sn->sel.lineflag = LINE_SEL_LEFT_RIGHT;
+ data->rectflag = 0;
+ ws = options_get_string(s->options, "word-separators");
+ window_copy_cursor_previous_word(wp, ws);
+ window_copy_start_selection(wp);
+ window_copy_cursor_next_word_end(wp, ws);
+ window_copy_redraw_screen(wp);
}
- inputlen = strlen(data->inputstr);
-
- data->inputstr = xrealloc(data->inputstr, inputlen + n + 1);
- memcpy(data->inputstr + inputlen, bufdata, n);
- data->inputstr[inputlen + n] = '\0';
- break;
- case MODEKEYEDIT_ENTER:
- if (data->numprefix > 0)
- np = data->numprefix;
- switch (data->inputtype) {
- case WINDOW_COPY_OFF:
- case WINDOW_COPY_JUMPFORWARD:
- case WINDOW_COPY_JUMPBACK:
- case WINDOW_COPY_JUMPTOFORWARD:
- case WINDOW_COPY_JUMPTOBACK:
- case WINDOW_COPY_NUMERICPREFIX:
- break;
- case WINDOW_COPY_SEARCHUP:
- data->searchtype = data->inputtype;
- data->searchstr = xstrdup(data->inputstr);
- for (; np != 0; np--)
- window_copy_search_up(wp, data->inputstr, 1);
- break;
- case WINDOW_COPY_SEARCHDOWN:
- data->searchtype = data->inputtype;
- data->searchstr = xstrdup(data->inputstr);
- for (; np != 0; np--)
- window_copy_search_down(wp, data->inputstr, 1);
- break;
- case WINDOW_COPY_NAMEDBUFFER:
- window_copy_copy_selection(wp, data->inputstr);
- *data->inputstr = '\0';
- if (data->inputexit) {
+ if (strcmp(command, "start-of-line") == 0)
+ window_copy_cursor_start_of_line(wp);
+ if (strcmp(command, "top-line") == 0) {
+ data->cx = 0;
+ data->cy = 0;
+ window_copy_update_selection(wp, 1);
+ window_copy_redraw_screen(wp);
+ }
+ } else if (args->argc == 2 && *args->argv[1] != '\0') {
+ argument = args->argv[1];
+ if (strcmp(command, "copy-pipe") == 0) {
+ if (s != NULL) {
+ window_copy_copy_pipe(wp, s, NULL, argument);
window_pane_reset_mode(wp);
- return (0);
}
- window_copy_clear_selection(wp);
- window_copy_redraw_screen(wp);
- break;
- case WINDOW_COPY_GOTOLINE:
- window_copy_goto_line(wp, data->inputstr);
- *data->inputstr = '\0';
- break;
}
- data->numprefix = -1;
- return (1);
- case MODEKEY_OTHER:
- if (key < 32 || key > 126)
- break;
- inputlen = strlen(data->inputstr) + 2;
-
- data->inputstr = xrealloc(data->inputstr, inputlen);
- data->inputstr[inputlen - 2] = key;
- data->inputstr[inputlen - 1] = '\0';
- break;
- default:
- break;
+ if (strcmp(command, "goto-line") == 0)
+ window_copy_goto_line(wp, argument);
+ if (strcmp(command, "jump-backward") == 0) {
+ data->jumptype = WINDOW_COPY_JUMPBACKWARD;
+ data->jumpchar = *argument;
+ for (; np != 0; np--)
+ window_copy_cursor_jump_back(wp);
+ }
+ if (strcmp(command, "jump-forward") == 0) {
+ data->jumptype = WINDOW_COPY_JUMPFORWARD;
+ data->jumpchar = *argument;
+ for (; np != 0; np--)
+ window_copy_cursor_jump(wp);
+ }
+ if (strcmp(command, "jump-to-backward") == 0) {
+ data->jumptype = WINDOW_COPY_JUMPTOBACKWARD;
+ data->jumpchar = *argument;
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to_back(wp, 1);
+ }
+ if (strcmp(command, "jump-to-forward") == 0) {
+ data->jumptype = WINDOW_COPY_JUMPTOFORWARD;
+ data->jumpchar = *argument;
+ for (; np != 0; np--)
+ window_copy_cursor_jump_to(wp, 1);
+ }
+ if (strcmp(command, "search-backward") == 0) {
+ data->searchtype = WINDOW_COPY_SEARCHUP;
+ data->searchstr = xstrdup(argument);
+ for (; np != 0; np--)
+ window_copy_search_up(wp, data->searchstr, 1);
+ }
+ if (strcmp(command, "search-forward") == 0) {
+ data->searchtype = WINDOW_COPY_SEARCHDOWN;
+ data->searchstr = xstrdup(argument);
+ for (; np != 0; np--)
+ window_copy_search_down(wp, data->searchstr, 1);
+ }
}
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return (0);
+ wp->modeprefix = 1;
}
-int
-window_copy_key_numeric_prefix(struct window_pane *wp, key_code key)
-{
- struct window_copy_mode_data *data = wp->modedata;
- struct screen *s = &data->screen;
-
- key &= KEYC_MASK_KEY;
- if (key < '0' || key > '9')
- return (1);
-
- if (data->numprefix >= 100) /* no more than three digits */
- return (0);
- data->numprefix = data->numprefix * 10 + key - '0';
-
- window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
- return (0);
-}
-
-void
+static void
window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1034,7 +835,7 @@ window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py)
window_copy_redraw_screen(wp);
}
-int
+static int
window_copy_search_compare(struct grid *gd, u_int px, u_int py,
struct grid *sgd, u_int spx, int cis)
{
@@ -1055,7 +856,7 @@ window_copy_search_compare(struct grid *gd, u_int px, u_int py,
return (memcmp(ud->data, sud->data, ud->size) == 0);
}
-int
+static int
window_copy_search_lr(struct grid *gd,
struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis)
{
@@ -1080,7 +881,7 @@ window_copy_search_lr(struct grid *gd,
return (0);
}
-int
+static int
window_copy_search_rl(struct grid *gd,
struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis)
{
@@ -1105,7 +906,7 @@ window_copy_search_rl(struct grid *gd,
return (0);
}
-void
+static void
window_copy_move_left(struct screen *s, u_int *fx, u_int *fy)
{
if (*fx == 0) { /* left */
@@ -1117,7 +918,7 @@ window_copy_move_left(struct screen *s, u_int *fx, u_int *fy)
*fx = *fx - 1;
}
-void
+static void
window_copy_move_right(struct screen *s, u_int *fx, u_int *fy)
{
if (*fx == screen_size_x(s) - 1) { /* right */
@@ -1129,7 +930,7 @@ window_copy_move_right(struct screen *s, u_int *fx, u_int *fy)
*fx = *fx + 1;
}
-int
+static int
window_copy_is_lowercase(const char *ptr)
{
while (*ptr != '\0') {
@@ -1146,7 +947,7 @@ window_copy_is_lowercase(const char *ptr)
* up, down otherwise. If wrap then go to begin/end of grid and try again if
* not found.
*/
-void
+static void
window_copy_search_jump(struct window_pane *wp, struct grid *gd,
struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap,
int direction)
@@ -1189,7 +990,7 @@ window_copy_search_jump(struct window_pane *wp, struct grid *gd,
* down. If moveflag is 0 then look for string at the current cursor position
* as well.
*/
-void
+static void
window_copy_search(struct window_pane *wp, const char *searchstr, int direction,
int moveflag)
{
@@ -1229,21 +1030,21 @@ window_copy_search(struct window_pane *wp, const char *searchstr, int direction,
screen_free(&ss);
}
-void
+static void
window_copy_search_up(struct window_pane *wp, const char *searchstr,
int moveflag)
{
window_copy_search(wp, searchstr, 0, moveflag);
}
-void
+static void
window_copy_search_down(struct window_pane *wp, const char *searchstr,
int moveflag)
{
window_copy_search(wp, searchstr, 1, moveflag);
}
-void
+static void
window_copy_goto_line(struct window_pane *wp, const char *linestr)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1259,7 +1060,7 @@ window_copy_goto_line(struct window_pane *wp, const char *linestr)
window_copy_redraw_screen(wp);
}
-void
+static void
window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
u_int py)
{
@@ -1268,7 +1069,7 @@ window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
struct options *oo = wp->window->options;
struct grid_cell gc;
char hdr[512];
- size_t last, xoff = 0, size = 0, limit;
+ size_t last, xoff = 0, size = 0;
style_apply(&gc, oo, "mode-style");
@@ -1280,20 +1081,6 @@ window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
size = screen_size_x(s);
screen_write_cursormove(ctx, screen_size_x(s) - size, 0);
screen_write_puts(ctx, &gc, "%s", hdr);
- } else if (py == last && data->inputtype != WINDOW_COPY_OFF) {
- limit = sizeof hdr;
- if (limit > screen_size_x(s) + 1)
- limit = screen_size_x(s) + 1;
- if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) {
- xoff = size = xsnprintf(hdr, limit,
- "Repeat: %d", data->numprefix);
- } else {
- /* We don't care about truncation. */
- xoff = size = snprintf(hdr, limit,
- "%s: %s", data->inputprompt, data->inputstr);
- }
- screen_write_cursormove(ctx, 0, last);
- screen_write_puts(ctx, &gc, "%s", hdr);
} else
size = 0;
@@ -1311,7 +1098,7 @@ window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
}
}
-void
+static void
window_copy_write_lines(struct window_pane *wp, struct screen_write_ctx *ctx,
u_int py, u_int ny)
{
@@ -1321,7 +1108,7 @@ window_copy_write_lines(struct window_pane *wp, struct screen_write_ctx *ctx,
window_copy_write_line(wp, ctx, py);
}
-void
+static void
window_copy_redraw_selection(struct window_pane *wp, u_int old_y)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1338,7 +1125,7 @@ window_copy_redraw_selection(struct window_pane *wp, u_int old_y)
window_copy_redraw_lines(wp, start, end - start + 1);
}
-void
+static void
window_copy_redraw_lines(struct window_pane *wp, u_int py, u_int ny)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1352,7 +1139,7 @@ window_copy_redraw_lines(struct window_pane *wp, u_int py, u_int ny)
screen_write_stop(&ctx);
}
-void
+static void
window_copy_redraw_screen(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1360,7 +1147,7 @@ window_copy_redraw_screen(struct window_pane *wp)
window_copy_redraw_lines(wp, 0, screen_size_y(&data->screen));
}
-void
+static void
window_copy_update_cursor(struct window_pane *wp, u_int cx, u_int cy)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1381,7 +1168,7 @@ window_copy_update_cursor(struct window_pane *wp, u_int cx, u_int cy)
}
}
-void
+static void
window_copy_start_selection(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1394,7 +1181,7 @@ window_copy_start_selection(struct window_pane *wp)
window_copy_update_selection(wp, 1);
}
-int
+static int
window_copy_update_selection(struct window_pane *wp, int may_redraw)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1446,7 +1233,7 @@ window_copy_update_selection(struct window_pane *wp, int may_redraw)
return (1);
}
-void *
+static void *
window_copy_get_selection(struct window_pane *wp, size_t *len)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1552,7 +1339,7 @@ window_copy_get_selection(struct window_pane *wp, size_t *len)
return (buf);
}
-void
+static void
window_copy_copy_buffer(struct window_pane *wp, const char *bufname, void *buf,
size_t len)
{
@@ -1568,7 +1355,7 @@ window_copy_copy_buffer(struct window_pane *wp, const char *bufname, void *buf,
free(buf);
}
-void
+static void
window_copy_copy_pipe(struct window_pane *wp, struct session *sess,
const char *bufname, const char *arg)
{
@@ -1595,7 +1382,7 @@ window_copy_copy_pipe(struct window_pane *wp, struct session *sess,
window_copy_copy_buffer(wp, bufname, buf, len);
}
-void
+static void
window_copy_copy_selection(struct window_pane *wp, const char *bufname)
{
void *buf;
@@ -1608,7 +1395,7 @@ window_copy_copy_selection(struct window_pane *wp, const char *bufname)
window_copy_copy_buffer(wp, bufname, buf, len);
}
-void
+static void
window_copy_append_selection(struct window_pane *wp, const char *bufname)
{
char *buf;
@@ -1642,7 +1429,7 @@ window_copy_append_selection(struct window_pane *wp, const char *bufname)
free(buf);
}
-void
+static void
window_copy_copy_line(struct window_pane *wp, char **buf, size_t *off, u_int sy,
u_int sx, u_int ex)
{
@@ -1702,7 +1489,7 @@ window_copy_copy_line(struct window_pane *wp, char **buf, size_t *off, u_int sy,
}
}
-void
+static void
window_copy_clear_selection(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1716,7 +1503,7 @@ window_copy_clear_selection(struct window_pane *wp)
window_copy_update_cursor(wp, px, data->cy);
}
-int
+static int
window_copy_in_set(struct window_pane *wp, u_int px, u_int py, const char *set)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1733,7 +1520,7 @@ window_copy_in_set(struct window_pane *wp, u_int px, u_int py, const char *set)
return (strchr(set, *ud->data) != NULL);
}
-u_int
+static u_int
window_copy_find_length(struct window_pane *wp, u_int py)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1759,7 +1546,7 @@ window_copy_find_length(struct window_pane *wp, u_int py)
return (px);
}
-void
+static void
window_copy_cursor_start_of_line(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1781,7 +1568,7 @@ window_copy_cursor_start_of_line(struct window_pane *wp)
window_copy_redraw_lines(wp, data->cy, 1);
}
-void
+static void
window_copy_cursor_back_to_indentation(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1804,7 +1591,7 @@ window_copy_cursor_back_to_indentation(struct window_pane *wp)
window_copy_redraw_lines(wp, data->cy, 1);
}
-void
+static void
window_copy_cursor_end_of_line(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1835,7 +1622,7 @@ window_copy_cursor_end_of_line(struct window_pane *wp)
window_copy_redraw_lines(wp, data->cy, 1);
}
-void
+static void
window_copy_other_end(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1873,7 +1660,7 @@ window_copy_other_end(struct window_pane *wp)
window_copy_redraw_screen(wp);
}
-void
+static void
window_copy_cursor_left(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1890,7 +1677,7 @@ window_copy_cursor_left(struct window_pane *wp)
}
}
-void
+static void
window_copy_cursor_right(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1914,7 +1701,7 @@ window_copy_cursor_right(struct window_pane *wp)
}
}
-void
+static void
window_copy_cursor_up(struct window_pane *wp, int scroll_only)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -1964,7 +1751,7 @@ window_copy_cursor_up(struct window_pane *wp, int scroll_only)
window_copy_cursor_start_of_line(wp);
}
-void
+static void
window_copy_cursor_down(struct window_pane *wp, int scroll_only)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2006,7 +1793,7 @@ window_copy_cursor_down(struct window_pane *wp, int scroll_only)
window_copy_cursor_start_of_line(wp);
}
-void
+static void
window_copy_cursor_jump(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2031,7 +1818,7 @@ window_copy_cursor_jump(struct window_pane *wp)
}
}
-void
+static void
window_copy_cursor_jump_back(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2060,7 +1847,7 @@ window_copy_cursor_jump_back(struct window_pane *wp)
}
}
-void
+static void
window_copy_cursor_jump_to(struct window_pane *wp, int jump_again)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2085,7 +1872,7 @@ window_copy_cursor_jump_to(struct window_pane *wp, int jump_again)
}
}
-void
+static void
window_copy_cursor_jump_to_back(struct window_pane *wp, int jump_again)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2117,7 +1904,7 @@ window_copy_cursor_jump_to_back(struct window_pane *wp, int jump_again)
}
}
-void
+static void
window_copy_cursor_next_word(struct window_pane *wp, const char *separators)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2159,7 +1946,7 @@ window_copy_cursor_next_word(struct window_pane *wp, const char *separators)
window_copy_redraw_lines(wp, data->cy, 1);
}
-void
+static void
window_copy_cursor_next_word_end(struct window_pane *wp,
const char *separators)
{
@@ -2211,7 +1998,7 @@ window_copy_cursor_next_word_end(struct window_pane *wp,
}
/* Move to the previous place where a word begins. */
-void
+static void
window_copy_cursor_previous_word(struct window_pane *wp,
const char *separators)
{
@@ -2249,7 +2036,7 @@ out:
window_copy_redraw_lines(wp, data->cy, 1);
}
-void
+static void
window_copy_scroll_up(struct window_pane *wp, u_int ny)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2279,7 +2066,7 @@ window_copy_scroll_up(struct window_pane *wp, u_int ny)
screen_write_stop(&ctx);
}
-void
+static void
window_copy_scroll_down(struct window_pane *wp, u_int ny)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2319,7 +2106,7 @@ window_copy_scroll_position(struct window_pane *wp)
return (data->oy);
}
-void
+static void
window_copy_rectangle_toggle(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -2336,12 +2123,31 @@ window_copy_rectangle_toggle(struct window_pane *wp)
window_copy_redraw_screen(wp);
}
+static void
+window_copy_move_mouse(struct mouse_event *m)
+{
+ struct window_pane *wp;
+ u_int x, y;
+
+ wp = cmd_mouse_pane(m, NULL, NULL);
+ if (wp == NULL || wp->mode != &window_copy_mode)
+ return;
+
+ if (cmd_mouse_at(wp, m, &x, &y, 1) != 0)
+ return;
+
+ window_copy_update_cursor(wp, x, y);
+}
+
void
window_copy_start_drag(struct client *c, struct mouse_event *m)
{
struct window_pane *wp;
u_int x, y;
+ if (c == NULL)
+ return;
+
wp = cmd_mouse_pane(m, NULL, NULL);
if (wp == NULL || wp->mode != &window_copy_mode)
return;
@@ -2350,14 +2156,14 @@ window_copy_start_drag(struct client *c, struct mouse_event *m)
return;
c->tty.mouse_drag_update = window_copy_drag_update;
- c->tty.mouse_drag_release = NULL; /* will fire MouseUp key */
+ c->tty.mouse_drag_release = NULL; /* will fire MouseDragEnd key */
window_copy_update_cursor(wp, x, y);
window_copy_start_selection(wp);
window_copy_redraw_screen(wp);
}
-void
+static void
window_copy_drag_update(__unused struct client *c, struct mouse_event *m)
{
struct window_pane *wp;
diff --git a/window.c b/window.c
index d91e52bf..7f7cef6e 100644
--- a/window.c
+++ b/window.c
@@ -60,15 +60,23 @@ static u_int next_window_pane_id;
static u_int next_window_id;
static u_int next_active_point;
+static struct window_pane *window_pane_create(struct window *, u_int, u_int,
+ u_int);
+static void window_pane_destroy(struct window_pane *);
+
static void window_pane_set_watermark(struct window_pane *, size_t);
static void window_pane_read_callback(struct bufferevent *, void *);
static void window_pane_error_callback(struct bufferevent *, short, void *);
+static int winlink_next_index(struct winlinks *, int);
+
static struct window_pane *window_pane_choose_best(struct window_pane **,
u_int);
RB_GENERATE(windows, window, entry, window_cmp);
+RB_GENERATE(winlinks, winlink, entry, winlink_cmp);
+RB_GENERATE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
int
window_cmp(struct window *w1, struct window *w2)
@@ -76,16 +84,12 @@ window_cmp(struct window *w1, struct window *w2)
return (w1->id - w2->id);
}
-RB_GENERATE(winlinks, winlink, entry, winlink_cmp);
-
int
winlink_cmp(struct winlink *wl1, struct winlink *wl2)
{
return (wl1->idx - wl2->idx);
}
-RB_GENERATE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
-
int
window_pane_cmp(struct window_pane *wp1, struct window_pane *wp2)
{
@@ -129,7 +133,7 @@ winlink_find_by_window_id(struct winlinks *wwl, u_int id)
return (NULL);
}
-int
+static int
winlink_next_index(struct winlinks *wwl, int idx)
{
int i;
@@ -731,7 +735,7 @@ window_pane_find_by_id(u_int id)
return (RB_FIND(window_pane_tree, &all_window_panes, &wp));
}
-struct window_pane *
+static struct window_pane *
window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
{
struct window_pane *wp;
@@ -782,7 +786,7 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
return (wp);
}
-void
+static void
window_pane_destroy(struct window_pane *wp)
{
window_pane_reset_mode(wp);
@@ -1139,6 +1143,7 @@ window_pane_reset_mode(struct window_pane *wp)
wp->mode->free(wp);
wp->mode = NULL;
+ wp->modeprefix = 1;
wp->screen = &wp->base;
wp->flags |= (PANE_REDRAW|PANE_CHANGED);