Add core function for copy to clipboard, so we don't need to expose render/box.h internals to front ends.

This commit is contained in:
Michael Drake 2012-08-02 14:23:42 +01:00
parent 1d827d2cf3
commit efaca1c1fa
2 changed files with 51 additions and 0 deletions

View File

@ -729,6 +729,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.
*

View File

@ -95,6 +95,8 @@ bool selection_click(struct selection *s, browser_mouse_state mouse,
void selection_track(struct selection *s, browser_mouse_state mouse,
unsigned idx);
bool selection_copy_to_clipboard(struct selection *s);
/** Handles completion of a drag operation */
/* void selection_drag_end(struct selection *s); */
#define selection_drag_end(s) ((s)->drag_state = DRAG_NONE)