selection: add text_from_clipboard()

This function reads data from the clipboard, and calls a user-provided
callback for each chunk of clipboard data.
This commit is contained in:
Daniel Eklöf 2019-07-19 14:20:00 +02:00
parent 9c3ccc182e
commit 793c37923e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 30 additions and 7 deletions

View file

@ -454,7 +454,9 @@ selection_to_clipboard(struct terminal *term, uint32_t serial)
} }
void void
selection_from_clipboard(struct terminal *term, uint32_t serial) text_from_clipboard(struct terminal *term, uint32_t serial,
void (*cb)(const char *data, size_t size, void *user),
void *user)
{ {
struct clipboard *clipboard = &term->selection.clipboard; struct clipboard *clipboard = &term->selection.clipboard;
if (clipboard->data_offer == NULL) if (clipboard->data_offer == NULL)
@ -478,9 +480,6 @@ selection_from_clipboard(struct terminal *term, uint32_t serial)
/* Don't keep our copy of the write-end open (or we'll never get EOF) */ /* Don't keep our copy of the write-end open (or we'll never get EOF) */
close(write_fd); close(write_fd);
if (term->bracketed_paste)
vt_to_slave(term, "\033[200~", 6);
/* Read until EOF */ /* Read until EOF */
while (true) { while (true) {
char text[256]; char text[256];
@ -492,13 +491,33 @@ selection_from_clipboard(struct terminal *term, uint32_t serial)
} else if (amount == 0) } else if (amount == 0)
break; break;
vt_to_slave(term, text, amount); cb(text, amount, user);
} }
close(read_fd);
}
static void
from_clipboard_cb(const char *data, size_t size, void *user)
{
struct terminal *term = user;
vt_to_slave(term, data, size);
}
void
selection_from_clipboard(struct terminal *term, uint32_t serial)
{
struct clipboard *clipboard = &term->selection.clipboard;
if (clipboard->data_offer == NULL)
return;
if (term->bracketed_paste)
vt_to_slave(term, "\033[200~", 6);
text_from_clipboard(term, serial, &from_clipboard_cb, term);
if (term->bracketed_paste) if (term->bracketed_paste)
vt_to_slave(term, "\033[201~", 6); vt_to_slave(term, "\033[201~", 6);
close(read_fd);
} }
void void

View file

@ -18,3 +18,7 @@ void selection_from_clipboard(struct terminal *term, uint32_t serial);
void selection_from_primary(struct terminal *term); void selection_from_primary(struct terminal *term);
bool text_to_clipboard(struct terminal *term, char *text, uint32_t serial); bool text_to_clipboard(struct terminal *term, char *text, uint32_t serial);
void text_from_clipboard(
struct terminal *term, uint32_t serial,
void (*cb)(const char *data, size_t size, void *user),
void *user);