1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Ability to copy to multiple clipboards at once.

This commit is contained in:
Simon Tatham 2017-12-10 15:45:45 +00:00
parent cd7348281b
commit 131a8e9468
5 changed files with 63 additions and 33 deletions

View File

@ -1088,9 +1088,9 @@ void term_blink(Terminal *, int set_cursor);
void term_do_paste(Terminal *, const wchar_t *, int);
void term_nopaste(Terminal *);
int term_ldisc(Terminal *, int option);
void term_copyall(Terminal *, int clipboard);
void term_copyall(Terminal *, const int *, int);
void term_reconfig(Terminal *, Conf *);
void term_request_copy(Terminal *, int clipboard);
void term_request_copy(Terminal *, const int *clipboards, int n_clipboards);
void term_request_paste(Terminal *, int clipboard);
void term_seen_key_event(Terminal *);
int term_data(Terminal *, int is_stderr, const char *data, int len);

View File

@ -1707,9 +1707,10 @@ Terminal *term_init(Conf *myconf, struct unicode_data *ucsdata,
term->last_selected_attr = NULL;
term->last_selected_tc = NULL;
term->last_selected_len = 0;
/* frontends will typically overwrite these with clipboard ids they
/* frontends will typically extend these with clipboard ids they
* know about */
term->mouse_select_clipboard = CLIP_NULL;
term->mouse_select_clipboards[0] = CLIP_LOCAL;
term->n_mouse_select_clipboards = 1;
term->mouse_paste_clipboard = CLIP_NULL;
return term;
@ -5648,7 +5649,7 @@ static void clip_addchar(clip_workbuf *b, wchar_t chr, int attr, truecolour tc)
}
static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel,
int clipboard)
const int *clipboards, int n_clipboards)
{
clip_workbuf buf;
int old_top_x;
@ -5808,19 +5809,36 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel,
#if SELECTION_NUL_TERMINATED
clip_addchar(&buf, 0, 0, term->basic_erase_char.truecolour);
#endif
/* Finally, transfer all that to the clipboard. */
sfree(term->last_selected_text);
sfree(term->last_selected_attr);
sfree(term->last_selected_tc);
term->last_selected_text = buf.textbuf;
term->last_selected_attr = buf.attrbuf;
term->last_selected_tc = buf.tcbuf;
term->last_selected_len = buf.bufpos;
write_clip(term->frontend, clipboard,
buf.textbuf, buf.attrbuf, buf.tcbuf, buf.bufpos, desel);
/* Finally, transfer all that to the clipboard(s). */
{
int i;
int clip_local = FALSE;
for (i = 0; i < n_clipboards; i++) {
if (clipboards[i] == CLIP_LOCAL) {
clip_local = TRUE;
} else if (clipboards[i] != CLIP_NULL) {
write_clip(term->frontend, clipboards[i],
buf.textbuf, buf.attrbuf, buf.tcbuf, buf.bufpos,
desel);
}
}
if (clip_local) {
sfree(term->last_selected_text);
sfree(term->last_selected_attr);
sfree(term->last_selected_tc);
term->last_selected_text = buf.textbuf;
term->last_selected_attr = buf.attrbuf;
term->last_selected_tc = buf.tcbuf;
term->last_selected_len = buf.bufpos;
} else {
sfree(buf.textbuf);
sfree(buf.attrbuf);
sfree(buf.tcbuf);
}
}
}
void term_copyall(Terminal *term, int clipboard)
void term_copyall(Terminal *term, const int *clipboards, int n_clipboards)
{
pos top;
pos bottom;
@ -5829,7 +5847,7 @@ void term_copyall(Terminal *term, int clipboard)
top.x = 0;
bottom.y = find_last_nonempty_line(term, screen);
bottom.x = term->cols;
clipme(term, top, bottom, 0, TRUE, clipboard);
clipme(term, top, bottom, 0, TRUE, clipboards, n_clipboards);
}
static void paste_from_clip_local(void *vterm)
@ -5838,16 +5856,19 @@ static void paste_from_clip_local(void *vterm)
term_do_paste(term, term->last_selected_text, term->last_selected_len);
}
void term_request_copy(Terminal *term, int clipboard)
void term_request_copy(Terminal *term, const int *clipboards, int n_clipboards)
{
assert(clipboard != CLIP_LOCAL);
if (clipboard != CLIP_NULL) {
write_clip(term->frontend, clipboard,
term->last_selected_text,
term->last_selected_attr,
term->last_selected_tc,
term->last_selected_len,
FALSE);
int i;
for (i = 0; i < n_clipboards; i++) {
assert(clipboards[i] != CLIP_LOCAL);
if (clipboards[i] != CLIP_NULL) {
write_clip(term->frontend, clipboards[i],
term->last_selected_text,
term->last_selected_attr,
term->last_selected_tc,
term->last_selected_len,
FALSE);
}
}
}
@ -6447,7 +6468,8 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
*/
clipme(term, term->selstart, term->selend,
(term->seltype == RECTANGULAR), FALSE,
term->mouse_select_clipboard);
term->mouse_select_clipboards,
term->n_mouse_select_clipboards);
term->selstate = SELECTED;
} else
term->selstate = NO_SELECTION;
@ -6523,7 +6545,8 @@ static void deselect(Terminal *term)
void term_lost_clipboard_ownership(Terminal *term, int clipboard)
{
if (clipboard != term->mouse_select_clipboard)
if (!(term->n_mouse_select_clipboards > 1 &&
clipboard == term->mouse_select_clipboards[1]))
return;
deselect(term);

View File

@ -332,7 +332,8 @@ struct terminal_tag {
int *last_selected_attr;
truecolour *last_selected_tc;
size_t last_selected_len;
int mouse_select_clipboard;
int mouse_select_clipboards[N_CLIPBOARDS];
int n_mouse_select_clipboards;
int mouse_paste_clipboard;
};

View File

@ -4130,7 +4130,8 @@ void reset_terminal_menuitem(GtkMenuItem *item, gpointer data)
void copy_all_menuitem(GtkMenuItem *item, gpointer data)
{
struct gui_data *inst = (struct gui_data *)data;
term_copyall(inst->term, CLIP_SYSTEM);
static const int clips[] = { CLIP_PRIMARY, CLIP_CLIPBOARD };
term_copyall(inst->term, clips, lenof(clips));
}
void special_menuitem(GtkMenuItem *item, gpointer data)
@ -5004,7 +5005,8 @@ void new_session_window(Conf *conf, const char *geometry_string)
inst->eventlogstuff = eventlogstuff_new();
inst->term = term_init(inst->conf, &inst->ucsdata, inst);
inst->term->mouse_select_clipboard = MOUSE_SELECT_CLIPBOARD;
inst->term->mouse_select_clipboards[
inst->term->n_mouse_select_clipboards++] = MOUSE_SELECT_CLIPBOARD;
inst->term->mouse_paste_clipboard = MOUSE_PASTE_CLIPBOARD;
inst->logctx = log_init(inst, inst->conf);
term_provide_logctx(inst->term, inst->logctx);

View File

@ -637,7 +637,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
* timer_change_notify() which will expect hwnd to exist.)
*/
term = term_init(conf, &ucsdata, NULL);
term->mouse_select_clipboard = CLIP_SYSTEM;
term->mouse_select_clipboards[
term->n_mouse_select_clipboards++] = CLIP_SYSTEM;
term->mouse_paste_clipboard = CLIP_SYSTEM;
logctx = log_init(NULL, conf);
term_provide_logctx(term, logctx);
@ -2330,7 +2331,10 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
}
break;
case IDM_COPYALL:
term_copyall(term, CLIP_SYSTEM);
{
static const int clips[] = { CLIP_SYSTEM };
term_copyall(term, clips, lenof(clips));
}
break;
case IDM_PASTE:
term_request_paste(term, CLIP_SYSTEM);