aboutsummaryrefslogtreecommitdiff
path: root/window-copy.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2014-03-06 11:50:07 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2014-03-06 11:50:07 +0000
commit8c0edcbfa3bd78bb8adaba13aad29a06d8988de8 (patch)
treeccd88d63c207ccb28a1af76bcc62c28ab863ef75 /window-copy.c
parentb7f6356053638188a162df0d1912a6317e9d593d (diff)
downloadrtmux-8c0edcbfa3bd78bb8adaba13aad29a06d8988de8.tar.gz
rtmux-8c0edcbfa3bd78bb8adaba13aad29a06d8988de8.tar.bz2
rtmux-8c0edcbfa3bd78bb8adaba13aad29a06d8988de8.zip
Add setb -a to append and a copy mode append command, from J Raynor with minor
changes.
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/window-copy.c b/window-copy.c
index 527c95c2..e3164f6f 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -58,6 +58,7 @@ void window_copy_copy_buffer(struct window_pane *, int, void *, size_t);
void window_copy_copy_pipe(
struct window_pane *, struct session *, int, const char *);
void window_copy_copy_selection(struct window_pane *, int);
+void window_copy_append_selection(struct window_pane *, int);
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);
@@ -414,6 +415,13 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key)
cmd = mode_key_lookup(&data->mdata, key, &arg);
switch (cmd) {
+ case MODEKEYCOPY_APPENDSELECTION:
+ if (sess != NULL) {
+ window_copy_append_selection(wp, data->numprefix);
+ window_pane_reset_mode(wp);
+ return;
+ }
+ break;
case MODEKEYCOPY_CANCEL:
window_pane_reset_mode(wp);
return;
@@ -1492,6 +1500,46 @@ window_copy_copy_selection(struct window_pane *wp, int idx)
}
void
+window_copy_append_selection(struct window_pane *wp, int idx)
+{
+ char *buf;
+ struct paste_buffer *pb;
+ size_t len;
+ u_int limit;
+ struct screen_write_ctx ctx;
+
+ buf = window_copy_get_selection(wp, &len);
+ if (buf == NULL)
+ return;
+
+ if (options_get_number(&global_options, "set-clipboard")) {
+ screen_write_start(&ctx, wp, NULL);
+ screen_write_setselection(&ctx, buf, len);
+ screen_write_stop(&ctx);
+ }
+
+ if (idx == -1)
+ idx = 0;
+
+ if (idx == 0 && paste_get_top(&global_buffers) == NULL) {
+ limit = options_get_number(&global_options, "buffer-limit");
+ paste_add(&global_buffers, buf, len, limit);
+ return;
+ }
+
+ pb = paste_get_index(&global_buffers, idx);
+ if (pb != NULL) {
+ buf = xrealloc(buf, 1, len + pb->size);
+ memmove(buf + pb->size, buf, len);
+ memcpy(buf, pb->data, pb->size);
+ len += pb->size;
+ }
+
+ if (paste_replace(&global_buffers, idx, buf, len) != 0)
+ free(buf);
+}
+
+void
window_copy_copy_line(struct window_pane *wp,
char **buf, size_t *off, u_int sy, u_int sx, u_int ex)
{