diff options
author | Tiago Cunha <tcunha@gmx.com> | 2012-01-21 19:31:59 +0000 |
---|---|---|
committer | Tiago Cunha <tcunha@gmx.com> | 2012-01-21 19:31:59 +0000 |
commit | 4bea5590372e69ac90330281c471cf99e3a8653a (patch) | |
tree | ec52deca56c473534f80011ddc6a48da7a1a3e67 | |
parent | 674de910ca4c8651d6c9749775e960cb224332f9 (diff) | |
download | rtmux-4bea5590372e69ac90330281c471cf99e3a8653a.tar.gz rtmux-4bea5590372e69ac90330281c471cf99e3a8653a.tar.bz2 rtmux-4bea5590372e69ac90330281c471cf99e3a8653a.zip |
Sync OpenBSD patchset 1004:
Add a -R flag to send-keys to reset the terminal. Written ages ago and
Suggested by someone, I forget who.
-rw-r--r-- | cmd-send-keys.c | 22 | ||||
-rw-r--r-- | input.c | 12 | ||||
-rw-r--r-- | screen-write.c | 18 | ||||
-rw-r--r-- | tmux.1 | 4 | ||||
-rw-r--r-- | tmux.h | 1 |
5 files changed, 44 insertions, 13 deletions
diff --git a/cmd-send-keys.c b/cmd-send-keys.c index b9835df6..34037418 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -19,6 +19,7 @@ #include <sys/types.h> #include <stdlib.h> +#include <string.h> #include "tmux.h" @@ -30,8 +31,8 @@ int cmd_send_keys_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_send_keys_entry = { "send-keys", "send", - "t:", 0, -1, - "[-t target-pane] key ...", + "Rt:", 0, -1, + "[-R] [-t target-pane] key ...", 0, NULL, NULL, @@ -44,12 +45,29 @@ cmd_send_keys_exec(struct cmd *self, struct cmd_ctx *ctx) struct args *args = self->args; struct window_pane *wp; struct session *s; + struct input_ctx *ictx; const char *str; int i, key; if (cmd_find_pane(ctx, args_get(args, 't'), &s, &wp) == NULL) return (-1); + if (args_has(args, 'R')) { + ictx = &wp->ictx; + + memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell); + memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell); + ictx->old_cx = 0; + ictx->old_cy = 0; + + if (wp->mode == NULL) + screen_write_start(&ictx->ctx, wp, &wp->base); + else + screen_write_start(&ictx->ctx, NULL, &wp->base); + screen_write_reset(&ictx->ctx); + screen_write_stop(&ictx->ctx); + } + for (i = 0; i < args->argc; i++) { str = args->argv[i]; @@ -978,17 +978,7 @@ input_esc_dispatch(struct input_ctx *ictx) ictx->old_cx = 0; ictx->old_cy = 0; - screen_reset_tabs(sctx->s); - - screen_write_scrollregion(sctx, 0, screen_size_y(sctx->s) - 1); - - screen_write_insertmode(sctx, 0); - screen_write_kcursormode(sctx, 0); - screen_write_kkeypadmode(sctx, 0); - screen_write_mousemode_off(sctx); - - screen_write_clearscreen(sctx); - screen_write_cursormove(sctx, 0, 0); + screen_write_reset(sctx->s); break; case INPUT_ESC_IND: screen_write_linefeed(sctx, 0); diff --git a/screen-write.c b/screen-write.c index 7559a773..2f53b04f 100644 --- a/screen-write.c +++ b/screen-write.c @@ -46,6 +46,24 @@ screen_write_stop(unused struct screen_write_ctx *ctx) { } + +/* Reset screen state. */ +void +screen_write_reset(struct screen_write_ctx *ctx) +{ + screen_reset_tabs(ctx->s); + + screen_write_scrollregion(ctx, 0, screen_size_y(ctx->s) - 1); + + screen_write_insertmode(ctx, 0); + screen_write_kcursormode(ctx, 0); + screen_write_kkeypadmode(ctx, 0); + screen_write_mousemode_off(ctx); + + screen_write_clearscreen(ctx); + screen_write_cursormove(ctx, 0, 0); +} + /* Write character. */ void screen_write_putc( @@ -1638,6 +1638,7 @@ are listed; this may be one of: or .Em emacs-copy . .It Xo Ic send-keys +.Fl R .Op Fl t Ar target-pane .Ar key Ar ... .Xc @@ -1652,6 +1653,9 @@ or ) to send; if the string is not recognised as a key, it is sent as a series of characters. All arguments are sent sequentially from first to last. +The +.Fl R +flag causes the terminal state to be reset. .It Ic send-prefix Op Fl t Ar target-pane Send the prefix key to a window as if it was pressed. If multiple prefix keys are configured, only the first is sent. @@ -1828,6 +1828,7 @@ char *grid_view_string_cells(struct grid *, u_int, u_int, u_int); void screen_write_start( struct screen_write_ctx *, struct window_pane *, struct screen *); void screen_write_stop(struct screen_write_ctx *); +void screen_write_reset(struct screen_write_ctx *); size_t printflike2 screen_write_cstrlen(int, const char *, ...); void printflike5 screen_write_cnputs(struct screen_write_ctx *, ssize_t, struct grid_cell *, int, const char *, ...); |