mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
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:
parent
9c3ccc182e
commit
793c37923e
2 changed files with 30 additions and 7 deletions
33
selection.c
33
selection.c
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue