]> git.wh0rd.org Git - nano.git/commitdiff
properly handle more cases of inserting a file/uncutting text with the
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 16 Aug 2007 14:45:17 +0000 (14:45 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 16 Aug 2007 14:45:17 +0000 (14:45 +0000)
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
src/nano.c

index 766168df2f9d9a8155f5f481678491cfe3b64237..3a688e9bd9b5b6e8cd852ce87e11788aaa93204e 100644 (file)
@@ -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
index 732bf8d021d72e3c94273c65814272c62cb88735..811d0f1ccdf524b628d3030ecfdfef9eeb397f23 100644 (file)
@@ -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