diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2012-08-02 14:23:42 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2012-08-02 14:23:42 +0100 |
commit | efaca1c1fa7238aa0edc46a0e3e0eda61efda682 (patch) | |
tree | 997c6793ff437c8ed2e69a70f7568341009f29c3 /desktop/selection.c | |
parent | 1d827d2cf32fc6bcc3d2b39362ec67309c097f19 (diff) | |
download | netsurf-efaca1c1fa7238aa0edc46a0e3e0eda61efda682.tar.gz netsurf-efaca1c1fa7238aa0edc46a0e3e0eda61efda682.tar.bz2 |
Add core function for copy to clipboard, so we don't need to expose render/box.h internals to front ends.
Diffstat (limited to 'desktop/selection.c')
-rw-r--r-- | desktop/selection.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/desktop/selection.c b/desktop/selection.c index a3d93efa6..6679be6bc 100644 --- a/desktop/selection.c +++ b/desktop/selection.c @@ -730,6 +730,55 @@ void selection_redraw(struct selection *s, unsigned start_idx, unsigned end_idx) /** + * Selection traversal routine for appending text to the current contents + * of the clipboard. + * + * \param text pointer to text being added, or NULL for newline + * \param length length of text to be appended (bytes) + * \param box pointer to text box, or NULL if from textplain + * \param handle unused handle, we don't need one + * \param whitespace_text whitespace to place before text for formatting + * may be NULL + * \param whitespace_length length of whitespace_text + * \return true iff successful and traversal should continue + */ + +static bool selection_copy_handler(const char *text, size_t length, + struct box *box, void *handle, const char *whitespace_text, + size_t whitespace_length) +{ + bool add_space = box != NULL ? box->space != 0 : false; + + /* add any whitespace which precedes the text from this box */ + if (whitespace_text != NULL && whitespace_length > 0) { + if (!gui_add_to_clipboard(whitespace_text, + whitespace_length, false)) { + return false; + } + } + + /* add the text from this box */ + if (!gui_add_to_clipboard(text, length, add_space)) + return false; + + return true; +} + + +/** + * Copy the selected contents to the clipboard + * + * \param s selection + * \return true iff successful, ie. cut operation can proceed without losing data + */ + +bool selection_copy_to_clipboard(struct selection *s) +{ + return selection_traverse(s, selection_copy_handler, NULL); +} + + +/** * Clears the current selection, optionally causing the screen to be updated. * * \param s selection object |