From 1fe67eff68aaef34e57bb7703809dba32016c248 Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Thu, 16 Aug 2007 14:45:17 +0000 Subject: [PATCH] properly handle more cases of inserting a file/uncutting text with the mark on git-svn-id: svn://svn.savannah.gnu.org/nano/branches/nano_2_0_branch/nano@4158 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- src/files.c | 46 ++++++++++++++++++++++++++++++---------------- src/nano.c | 42 ++++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/src/files.c b/src/files.c index 766168df..3a688e9b 100644 --- a/src/files.c +++ b/src/files.c @@ -697,7 +697,7 @@ void do_insertfile( ssize_t current_y_save = openfile->current_y; bool edittop_inside = FALSE; #ifndef NANO_TINY - bool do_mark_shift = FALSE; + bool right_side_up = FALSE, single_line = FALSE; #endif while (TRUE) { @@ -797,28 +797,34 @@ void do_insertfile( ) continue; +#ifndef NANO_TINY + /* Keep track of whether the mark begins inside the + * partition and will need adjustment. */ + if (openfile->mark_set) { + filestruct *top, *bot; + size_t top_x, bot_x; + + mark_order((const filestruct **)&top, &top_x, + (const filestruct **)&bot, &bot_x, + &right_side_up); + + single_line = (top == bot); + } +#endif + #ifdef ENABLE_MULTIBUFFER if (!ISSET(MULTIBUFFER)) { #endif /* If we're not inserting into a new buffer, partition * the filestruct so that it contains no text and hence - * looks like a new buffer, keep track of whether the - * top of the edit window is inside the partition, and - * keep track of whether the mark begins inside the - * partition and will need adjustment. */ + * looks like a new buffer, and keep track of whether + * the top of the edit window is inside the + * partition. */ filepart = partition_filestruct(openfile->current, openfile->current_x, openfile->current, openfile->current_x); edittop_inside = (openfile->edittop == openfile->fileage); -#ifndef NANO_TINY - if (openfile->mark_set) - do_mark_shift = (openfile->current_x <= - openfile->mark_begin_x || - openfile->current->lineno <= - openfile->mark_begin->lineno); - -#endif #ifdef ENABLE_MULTIBUFFER } #endif @@ -888,7 +894,7 @@ void do_insertfile( #ifndef NANO_TINY if (openfile->mark_set) { openfile->mark_begin = openfile->current; - if (do_mark_shift) + if (!right_side_up) openfile->mark_begin_x += openfile->current_x; } @@ -896,8 +902,16 @@ void do_insertfile( openfile->current_x += current_x_save; } #ifndef NANO_TINY - else if (openfile->mark_set && do_mark_shift) - openfile->mark_begin_x -= openfile->current_x; + else if (openfile->mark_set) { + if (!right_side_up) { + if (single_line) { + openfile->mark_begin = openfile->current; + openfile->mark_begin_x -= current_x_save; + } else + openfile->mark_begin_x -= + openfile->current_x; + } + } #endif /* Update the current y-coordinate to account for the diff --git a/src/nano.c b/src/nano.c index 732bf8d0..811d0f1c 100644 --- a/src/nano.c +++ b/src/nano.c @@ -395,24 +395,31 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot) size_t current_x_save = openfile->current_x; bool edittop_inside; #ifndef NANO_TINY - bool do_mark_shift = FALSE; + bool right_side_up = FALSE, single_line = FALSE; #endif assert(file_top != NULL && file_bot != NULL); - /* Partition the filestruct so that it contains no text, keep track - * of whether the top of the edit window is inside the partition, - * and keep track of whether the mark begins inside the partition - * and will need adjustment. */ +#ifndef NANO_TINY + /* Keep track of whether the mark begins inside the partition and + * will need adjustment. */ + if (openfile->mark_set) { + filestruct *top, *bot; + size_t top_x, bot_x; + + mark_order((const filestruct **)&top, &top_x, + (const filestruct **)&bot, &bot_x, &right_side_up); + + single_line = (top == bot); + } +#endif + + /* Partition the filestruct so that it contains no text, and keep + * track of whether the top of the edit window is inside the + * partition. */ filepart = partition_filestruct(openfile->current, openfile->current_x, openfile->current, openfile->current_x); edittop_inside = (openfile->edittop == openfile->fileage); -#ifndef NANO_TINY - if (openfile->mark_set) - do_mark_shift = (openfile->current_x <= - openfile->mark_begin_x || openfile->current->lineno <= - openfile->mark_begin->lineno); -#endif /* Put the top and bottom of the filestruct at copies of file_top * and file_bot. */ @@ -430,15 +437,22 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot) #ifndef NANO_TINY if (openfile->mark_set) { openfile->mark_begin = openfile->current; - if (do_mark_shift) + if (!right_side_up) openfile->mark_begin_x += openfile->current_x; } #endif openfile->current_x += current_x_save; } #ifndef NANO_TINY - else if (openfile->mark_set && do_mark_shift) - openfile->mark_begin_x -= openfile->current_x; + else if (openfile->mark_set) { + if (!right_side_up) { + if (single_line) { + openfile->mark_begin = openfile->current; + openfile->mark_begin_x -= current_x_save; + } else + openfile->mark_begin_x -= openfile->current_x; + } + } #endif /* Get the number of characters in the copied text, and add it to -- 2.39.5