summaryrefslogtreecommitdiff
path: root/desktop/textinput.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-07-19 09:22:21 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-07-19 09:22:21 +0000
commite0da359a36930dd47c98f90dc8e7a6272bf4145d (patch)
tree4cc0dd48d434638e93bb6d0fb7a18011fa6f85ae /desktop/textinput.c
parent3d76ba0472a1b914e68e72ebb99ecb13a886c5d0 (diff)
downloadnetsurf-e0da359a36930dd47c98f90dc8e7a6272bf4145d.tar.gz
netsurf-e0da359a36930dd47c98f90dc8e7a6272bf4145d.tar.bz2
Modify textarea_cut to allow caller to specify whether to place removed text on the clipboard.
svn path=/trunk/netsurf/; revision=4703
Diffstat (limited to 'desktop/textinput.c')
-rw-r--r--desktop/textinput.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/desktop/textinput.c b/desktop/textinput.c
index 6d9f7d5d2..918b6d42b 100644
--- a/desktop/textinput.c
+++ b/desktop/textinput.c
@@ -84,7 +84,7 @@ static struct box *line_above(struct box *text_box);
static struct box *line_below(struct box *text_box);
static bool textarea_cut(struct browser_window *bw,
struct box *start_box, unsigned start_idx,
- struct box *end_box, unsigned end_idx);
+ struct box *end_box, unsigned end_idx, bool clipboard);
static void textarea_reflow(struct browser_window *bw, struct box *textarea,
struct box *inline_container);
static bool word_left(const char *text, size_t *poffset, size_t *pchars);
@@ -396,7 +396,7 @@ bool browser_window_textarea_callback(struct browser_window *bw,
if (selection_exists)
selection_clear(bw->sel, false);
- textarea_cut(bw, start_box, 0, text_box, char_offset);
+ textarea_cut(bw, start_box, 0, text_box, char_offset, false);
text_box = start_box;
char_offset = 0;
reflow = true;
@@ -415,7 +415,8 @@ bool browser_window_textarea_callback(struct browser_window *bw,
char_offset < text_box->length + text_box->space) {
/* there's something at the end of the line to delete */
textarea_cut(bw, text_box, char_offset,
- end_box, end_box->length + end_box->space);
+ end_box, end_box->length + end_box->space,
+ false);
reflow = true;
break;
}
@@ -494,7 +495,7 @@ bool browser_window_textarea_callback(struct browser_window *bw,
if (selection_exists)
selection_clear(bw->sel, false);
- textarea_cut(bw, start_box, 0, end_box, end_box->length);
+ textarea_cut(bw, start_box, 0, end_box, end_box->length, false);
text_box = start_box;
char_offset = 0;
@@ -521,7 +522,7 @@ bool browser_window_textarea_callback(struct browser_window *bw,
if (start_box && end_box) {
selection_clear(bw->sel, false);
textarea_cut(bw, start_box, start_idx,
- end_box, end_idx);
+ end_box, end_idx, true);
text_box = start_box;
char_offset = start_idx;
reflow = true;
@@ -1004,7 +1005,8 @@ bool browser_window_input_callback(struct browser_window *bw,
if (selection_exists)
selection_clear(bw->sel, false);
- textarea_cut(bw, text_box, 0, text_box, text_box->length);
+ textarea_cut(bw, text_box, 0, text_box, text_box->length,
+ false);
box_offset = 0;
changed = true;
@@ -1028,7 +1030,7 @@ bool browser_window_input_callback(struct browser_window *bw,
if (start_box && end_box) {
selection_clear(bw->sel, false);
textarea_cut(bw, start_box, start_idx,
- end_box, end_idx);
+ end_box, end_idx, true);
text_box = start_box;
box_offset = start_idx;
@@ -1094,7 +1096,7 @@ bool browser_window_input_callback(struct browser_window *bw,
if (box_offset == 0)
return true;
- textarea_cut(bw, text_box, 0, text_box, box_offset);
+ textarea_cut(bw, text_box, 0, text_box, box_offset, false);
box_offset = 0;
changed = true;
@@ -1108,7 +1110,7 @@ bool browser_window_input_callback(struct browser_window *bw,
return true;
textarea_cut(bw, text_box, box_offset,
- text_box, text_box->length);
+ text_box, text_box->length, false);
changed = true;
break;
@@ -1948,25 +1950,28 @@ struct box *textarea_insert_break(struct browser_window *bw,
/**
- * Cut a range of text to the global clipboard.
+ * Cut a range of text from a text box,
+ * possibly placing it on the global clipboard.
*
* \param bw browser window
* \param start_box text box at start of range
* \param start_idx index (bytes) within start box
* \param end_box text box at end of range
* \param end_idx index (bytes) within end box
+ * \param clipboard whether to place text on the clipboard
* \return true iff successful
*/
bool textarea_cut(struct browser_window *bw,
struct box *start_box, unsigned start_idx,
- struct box *end_box, unsigned end_idx)
+ struct box *end_box, unsigned end_idx,
+ bool clipboard)
{
struct box *box = start_box;
bool success = true;
bool del = false; /* caller expects start_box to persist */
- if (!gui_empty_clipboard())
+ if (clipboard && !gui_empty_clipboard())
return false;
while (box && box != end_box) {
@@ -1974,14 +1979,16 @@ bool textarea_cut(struct browser_window *bw,
struct box *next = box->next;
if (box->type == BOX_BR) {
- if (!gui_add_to_clipboard("\n", 1, false)) {
+ if (clipboard &&
+ !gui_add_to_clipboard("\n", 1, false)) {
gui_commit_clipboard();
return false;
}
box_unlink_and_free(box);
} else {
/* append box text to clipboard and then delete it */
- if (!gui_add_to_clipboard(box->text + start_idx,
+ if (clipboard &&
+ !gui_add_to_clipboard(box->text + start_idx,
box->length - start_idx, box->space)) {
gui_commit_clipboard();
return false;
@@ -1989,7 +1996,8 @@ bool textarea_cut(struct browser_window *bw,
if (del) {
if (!delete_handler(bw, box, start_idx,
- (box->length + box->space) - start_idx)) {
+ (box->length + box->space) -
+ start_idx) && clipboard) {
gui_commit_clipboard();
return false;
}
@@ -2006,7 +2014,7 @@ bool textarea_cut(struct browser_window *bw,
/* and the last box */
if (box) {
- if (gui_add_to_clipboard(box->text + start_idx,
+ if (clipboard && gui_add_to_clipboard(box->text + start_idx,
end_idx - start_idx, end_idx > box->length)) {
if (del) {
if (!delete_handler(bw, box, start_idx,
@@ -2021,7 +2029,10 @@ bool textarea_cut(struct browser_window *bw,
}
}
- return gui_commit_clipboard() ? success : false;
+ if (clipboard && !gui_commit_clipboard())
+ success = false;
+
+ return success;
}