summaryrefslogtreecommitdiff
path: root/platform/x11
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2014-04-17 17:11:45 +0200
committerTor Andersson <tor.andersson@artifex.com>2014-04-23 14:38:43 +0200
commitd11b67fc8140105e1659e89b6aeec61fd5ccbf37 (patch)
treee1b20b6b88bc9866d31decad24f8f2637429bcb7 /platform/x11
parent648ae8838f35f45e57b9a41f41f30a3b6ade3037 (diff)
downloadmupdf-d11b67fc8140105e1659e89b6aeec61fd5ccbf37.tar.xz
Fix 692866: improved handling of newlines when copying text.
Only add newlines between selected lines of text.
Diffstat (limited to 'platform/x11')
-rw-r--r--platform/x11/pdfapp.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index 7ab5488e..6109d601 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -1625,8 +1625,7 @@ void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
fz_rect hitbox;
fz_matrix ctm;
fz_text_page *page = app->page_text;
- int c, i, p;
- int seen = 0;
+ int c, i, p, need_newline;
int block_num;
int x0 = app->selr.x0;
@@ -1637,6 +1636,7 @@ void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
pdfapp_viewctm(&ctm, app);
p = 0;
+ need_newline = 0;
for (block_num = 0; block_num < page->len; block_num++)
{
@@ -1650,20 +1650,10 @@ void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
for (line = block->lines; line < block->lines + block->len; line++)
{
+ int saw_text = 0;
+
for (span = line->first_span; span; span = span->next)
{
- if (seen)
- {
-#ifdef _WIN32
- if (p < ucslen - 1)
- ucsbuf[p++] = '\r';
-#endif
- if (p < ucslen - 1)
- ucsbuf[p++] = '\n';
- }
-
- seen = 0;
-
for (i = 0; i < span->len; i++)
{
fz_text_char_bbox(&hitbox, span, i);
@@ -1673,14 +1663,27 @@ void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
c = '?';
if (hitbox.x1 >= x0 && hitbox.x0 <= x1 && hitbox.y1 >= y0 && hitbox.y0 <= y1)
{
+ saw_text = 1;
+
+ if (need_newline)
+ {
+#ifdef _WIN32
+ if (p < ucslen - 1)
+ ucsbuf[p++] = '\r';
+#endif
+ if (p < ucslen - 1)
+ ucsbuf[p++] = '\n';
+ need_newline = 0;
+ }
+
if (p < ucslen - 1)
ucsbuf[p++] = c;
- seen = 1;
}
}
-
- seen = (seen && span == line->last_span);
}
+
+ if (saw_text)
+ need_newline = 1;
}
}