mirror of
https://github.com/tmate-io/tmate-ssh-server.git
synced 2020-11-18 19:53:51 -08:00
Synchronize copy-mode
This commit is contained in:
parent
fc4eaeb89f
commit
edd194c23c
@ -153,7 +153,6 @@ static void handle_message(msgpack_object obj)
|
|||||||
{
|
{
|
||||||
struct tmate_unpacker _uk;
|
struct tmate_unpacker _uk;
|
||||||
struct tmate_unpacker *uk = &_uk;
|
struct tmate_unpacker *uk = &_uk;
|
||||||
int cmd;
|
|
||||||
|
|
||||||
init_unpacker(uk, obj);
|
init_unpacker(uk, obj);
|
||||||
|
|
||||||
|
@ -180,3 +180,39 @@ void tmate_status(const char *left, const char *right)
|
|||||||
old_left = xstrdup(left);
|
old_left = xstrdup(left);
|
||||||
old_right = xstrdup(right);
|
old_right = xstrdup(right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tmate_sync_copy_mode(struct window_pane *wp)
|
||||||
|
{
|
||||||
|
struct window_copy_mode_data *data = wp->modedata;
|
||||||
|
|
||||||
|
pack(array, 3);
|
||||||
|
pack(int, TMATE_SYNC_COPY_MODE);
|
||||||
|
|
||||||
|
pack(int, wp->id);
|
||||||
|
|
||||||
|
if (wp->mode != &window_copy_mode) {
|
||||||
|
pack(array, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pack(array, 5);
|
||||||
|
|
||||||
|
pack(int, data->oy);
|
||||||
|
pack(int, data->cx);
|
||||||
|
pack(int, data->cy);
|
||||||
|
|
||||||
|
if (data->screen.sel.flag) {
|
||||||
|
pack(array, 3);
|
||||||
|
pack(int, data->selx);
|
||||||
|
pack(int, data->sely);
|
||||||
|
pack(int, data->rectflag);
|
||||||
|
} else
|
||||||
|
pack(array, 0);
|
||||||
|
|
||||||
|
if (data->inputprompt) {
|
||||||
|
pack(array, 3);
|
||||||
|
pack(int, data->inputtype);
|
||||||
|
pack(string, data->inputprompt);
|
||||||
|
pack(string, data->inputstr);
|
||||||
|
} else
|
||||||
|
pack(array, 0);
|
||||||
|
}
|
||||||
|
2
tmate.h
2
tmate.h
@ -25,6 +25,7 @@ enum tmate_commands {
|
|||||||
TMATE_EXEC_CMD,
|
TMATE_EXEC_CMD,
|
||||||
TMATE_FAILED_CMD,
|
TMATE_FAILED_CMD,
|
||||||
TMATE_STATUS,
|
TMATE_STATUS,
|
||||||
|
TMATE_SYNC_COPY_MODE,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tmate_encoder {
|
struct tmate_encoder {
|
||||||
@ -42,6 +43,7 @@ extern int tmate_should_replicate_cmd(const struct cmd_entry *cmd);
|
|||||||
extern void tmate_exec_cmd(const char *cmd);
|
extern void tmate_exec_cmd(const char *cmd);
|
||||||
extern void tmate_failed_cmd(int client_id, const char *cause);
|
extern void tmate_failed_cmd(int client_id, const char *cause);
|
||||||
extern void tmate_status(const char *left, const char *right);
|
extern void tmate_status(const char *left, const char *right);
|
||||||
|
extern void tmate_sync_copy_mode(struct window_pane *wp);
|
||||||
|
|
||||||
/* tmate-decoder.c */
|
/* tmate-decoder.c */
|
||||||
|
|
||||||
|
64
tmux.h
64
tmux.h
@ -2235,6 +2235,70 @@ void layout_set_active_changed(struct window *);
|
|||||||
extern const struct window_mode window_clock_mode;
|
extern const struct window_mode window_clock_mode;
|
||||||
|
|
||||||
/* window-copy.c */
|
/* window-copy.c */
|
||||||
|
enum window_copy_input_type {
|
||||||
|
WINDOW_COPY_OFF,
|
||||||
|
WINDOW_COPY_NUMERICPREFIX,
|
||||||
|
WINDOW_COPY_SEARCHUP,
|
||||||
|
WINDOW_COPY_SEARCHDOWN,
|
||||||
|
WINDOW_COPY_JUMPFORWARD,
|
||||||
|
WINDOW_COPY_JUMPBACK,
|
||||||
|
WINDOW_COPY_JUMPTOFORWARD,
|
||||||
|
WINDOW_COPY_JUMPTOBACK,
|
||||||
|
WINDOW_COPY_GOTOLINE,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy-mode's visible screen (the "screen" field) is filled from one of
|
||||||
|
* two sources: the original contents of the pane (used when we
|
||||||
|
* actually enter via the "copy-mode" command, to copy the contents of
|
||||||
|
* the current pane), or else a series of lines containing the output
|
||||||
|
* from an output-writing tmux command (such as any of the "show-*" or
|
||||||
|
* "list-*" commands).
|
||||||
|
*
|
||||||
|
* In either case, the full content of the copy-mode grid is pointed at
|
||||||
|
* by the "backing" field, and is copied into "screen" as needed (that
|
||||||
|
* is, when scrolling occurs). When copy-mode is backed by a pane,
|
||||||
|
* backing points directly at that pane's screen structure (&wp->base);
|
||||||
|
* when backed by a list of output-lines from a command, it points at
|
||||||
|
* a newly-allocated screen structure (which is deallocated when the
|
||||||
|
* mode ends).
|
||||||
|
*/
|
||||||
|
struct window_copy_mode_data {
|
||||||
|
struct screen screen;
|
||||||
|
|
||||||
|
struct screen *backing;
|
||||||
|
int backing_written; /* backing display has started */
|
||||||
|
|
||||||
|
struct mode_key_data mdata;
|
||||||
|
|
||||||
|
u_int oy;
|
||||||
|
|
||||||
|
u_int selx;
|
||||||
|
u_int sely;
|
||||||
|
|
||||||
|
u_int rectflag; /* are we in rectangle copy mode? */
|
||||||
|
|
||||||
|
u_int cx;
|
||||||
|
u_int cy;
|
||||||
|
|
||||||
|
u_int lastcx; /* position in last line with content */
|
||||||
|
u_int lastsx; /* size of last line with content */
|
||||||
|
|
||||||
|
enum window_copy_input_type inputtype;
|
||||||
|
const char *inputprompt;
|
||||||
|
char *inputstr;
|
||||||
|
|
||||||
|
int numprefix;
|
||||||
|
|
||||||
|
enum window_copy_input_type searchtype;
|
||||||
|
char *searchstr;
|
||||||
|
|
||||||
|
enum window_copy_input_type jumptype;
|
||||||
|
char jumpchar;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern const struct window_mode window_copy_mode;
|
extern const struct window_mode window_copy_mode;
|
||||||
void window_copy_init_from_pane(struct window_pane *);
|
void window_copy_init_from_pane(struct window_pane *);
|
||||||
void window_copy_init_for_output(struct window_pane *);
|
void window_copy_init_for_output(struct window_pane *);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
|
#include "tmate.h"
|
||||||
|
|
||||||
struct screen *window_copy_init(struct window_pane *);
|
struct screen *window_copy_init(struct window_pane *);
|
||||||
void window_copy_free(struct window_pane *);
|
void window_copy_free(struct window_pane *);
|
||||||
@ -89,68 +90,6 @@ const struct window_mode window_copy_mode = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum window_copy_input_type {
|
|
||||||
WINDOW_COPY_OFF,
|
|
||||||
WINDOW_COPY_NUMERICPREFIX,
|
|
||||||
WINDOW_COPY_SEARCHUP,
|
|
||||||
WINDOW_COPY_SEARCHDOWN,
|
|
||||||
WINDOW_COPY_JUMPFORWARD,
|
|
||||||
WINDOW_COPY_JUMPBACK,
|
|
||||||
WINDOW_COPY_JUMPTOFORWARD,
|
|
||||||
WINDOW_COPY_JUMPTOBACK,
|
|
||||||
WINDOW_COPY_GOTOLINE,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy-mode's visible screen (the "screen" field) is filled from one of
|
|
||||||
* two sources: the original contents of the pane (used when we
|
|
||||||
* actually enter via the "copy-mode" command, to copy the contents of
|
|
||||||
* the current pane), or else a series of lines containing the output
|
|
||||||
* from an output-writing tmux command (such as any of the "show-*" or
|
|
||||||
* "list-*" commands).
|
|
||||||
*
|
|
||||||
* In either case, the full content of the copy-mode grid is pointed at
|
|
||||||
* by the "backing" field, and is copied into "screen" as needed (that
|
|
||||||
* is, when scrolling occurs). When copy-mode is backed by a pane,
|
|
||||||
* backing points directly at that pane's screen structure (&wp->base);
|
|
||||||
* when backed by a list of output-lines from a command, it points at
|
|
||||||
* a newly-allocated screen structure (which is deallocated when the
|
|
||||||
* mode ends).
|
|
||||||
*/
|
|
||||||
struct window_copy_mode_data {
|
|
||||||
struct screen screen;
|
|
||||||
|
|
||||||
struct screen *backing;
|
|
||||||
int backing_written; /* backing display has started */
|
|
||||||
|
|
||||||
struct mode_key_data mdata;
|
|
||||||
|
|
||||||
u_int oy;
|
|
||||||
|
|
||||||
u_int selx;
|
|
||||||
u_int sely;
|
|
||||||
|
|
||||||
u_int rectflag; /* are we in rectangle copy mode? */
|
|
||||||
|
|
||||||
u_int cx;
|
|
||||||
u_int cy;
|
|
||||||
|
|
||||||
u_int lastcx; /* position in last line with content */
|
|
||||||
u_int lastsx; /* size of last line with content */
|
|
||||||
|
|
||||||
enum window_copy_input_type inputtype;
|
|
||||||
const char *inputprompt;
|
|
||||||
char *inputstr;
|
|
||||||
|
|
||||||
int numprefix;
|
|
||||||
|
|
||||||
enum window_copy_input_type searchtype;
|
|
||||||
char *searchstr;
|
|
||||||
|
|
||||||
enum window_copy_input_type jumptype;
|
|
||||||
char jumpchar;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct screen *
|
struct screen *
|
||||||
window_copy_init(struct window_pane *wp)
|
window_copy_init(struct window_pane *wp)
|
||||||
{
|
{
|
||||||
@ -223,6 +162,8 @@ window_copy_init_from_pane(struct window_pane *wp)
|
|||||||
window_copy_write_line(wp, &ctx, i);
|
window_copy_write_line(wp, &ctx, i);
|
||||||
screen_write_cursormove(&ctx, data->cx, data->cy);
|
screen_write_cursormove(&ctx, data->cx, data->cy);
|
||||||
screen_write_stop(&ctx);
|
screen_write_stop(&ctx);
|
||||||
|
|
||||||
|
tmate_sync_copy_mode(wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -359,8 +300,8 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy)
|
|||||||
window_copy_redraw_screen(wp);
|
window_copy_redraw_screen(wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
window_copy_key(struct window_pane *wp, struct session *sess, int key)
|
__window_copy_key(struct window_pane *wp, struct session *sess, int key)
|
||||||
{
|
{
|
||||||
const char *word_separators;
|
const char *word_separators;
|
||||||
struct window_copy_mode_data *data = wp->modedata;
|
struct window_copy_mode_data *data = wp->modedata;
|
||||||
@ -739,6 +680,13 @@ input_off:
|
|||||||
window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
|
window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
window_copy_key(struct window_pane *wp, struct session *sess, int key)
|
||||||
|
{
|
||||||
|
__window_copy_key(wp, sess, key);
|
||||||
|
tmate_sync_copy_mode(wp);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
window_copy_key_input(struct window_pane *wp, int key)
|
window_copy_key_input(struct window_pane *wp, int key)
|
||||||
{
|
{
|
||||||
@ -826,8 +774,8 @@ window_copy_key_numeric_prefix(struct window_pane *wp, int key)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
window_copy_mouse(
|
__window_copy_mouse(
|
||||||
struct window_pane *wp, struct session *sess, struct mouse_event *m)
|
struct window_pane *wp, struct session *sess, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
struct window_copy_mode_data *data = wp->modedata;
|
struct window_copy_mode_data *data = wp->modedata;
|
||||||
@ -888,6 +836,14 @@ reset_mode:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
window_copy_mouse(
|
||||||
|
struct window_pane *wp, struct session *sess, struct mouse_event *m)
|
||||||
|
{
|
||||||
|
__window_copy_mouse(wp, sess, m);
|
||||||
|
tmate_sync_copy_mode(wp);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py)
|
window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user