[Patch] Cannot delete last char in insert mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Udo Richter wrote:
> Hi list,
> 
> I've fixed a small editing bug: For menu string edit items, when in 
> insert mode, its impossible to delete the last character of the string. 
> Steps to reproduce:
> 
> - Go into some edit field: [A]BCDEF
> - Switch to insert mode  : []ABCDEF
> - Move into the string   : ABC[]DEF
> - Press yellow key       : ABC[]EF
> - Press yellow key       : ABC[]F
> - Press yellow key       : ABC[]F - nothing happens.
> 
> This doesn't happen if you move the cursor to the end once, as this will 
> insert a blind space: ABCDEF[]_
> 
> 
> The attached patch fixes this in one possible way: It deletes the last 
> char, but keeps the cursor position by inserting a whitespace:
> 
> ABC[]F -> ABC[]_
> 
> Without the whitespace, the cursor would have to move in an ugly way:
> 
> ABC[]F -> AB[]C -> A[]B -> []A -> []_
> 
> The implementation requires another quirk: To do the delete-towards-left 
> at the end of the string, just as the overwrite mode does, the delete 
> key behaves differently if it deletes a final whitespace: Instead of 
> deleting the whitespace, the second last char is deleted:
> 
> ABC[]F -> ABC[]_ -> AB[]_ -> A[]_ -> []_
> 
> 
> Cheers,
> 
> Udo
> 
> 
> ------------------------------------------------------------------------
> 
> --- vdr-1.4.1-2-orig/menuitems.c	2006-07-24 00:24:25.176897944 +0200
> +++ vdr-1.4.1/menuitems.c	2006-07-24 01:19:52.383818056 +0200
> @@ -395,6 +399,16 @@
>                      if (strlen(value) > 1) {
>                         if (!insert || pos < int(strlen(value)) - 1)
>                            memmove(value + pos, value + pos + 1, strlen(value) - pos);
> +                       else if (insert && pos == int(strlen(value)) - 1) {
> +                          // in insert mode, deleting the last char replaces it with whitespace to keep cursor pos
> +                          if (value[pos] != ' ' || pos < 1)
> +                             value[pos] = ' ';
> +                          else {
> +                             // unless the last char is already a whitespace
> +                             value[pos-1] = ' ';
> +                             value[pos] = 0;
> +                             }
> +                          }
>                         // reduce position, if we removed the last character
>                         if (pos == int(strlen(value)))
>                            pos--;

I agree with the 'if...' part of your fix, but I don't like the 'else...' part.
If I do just

--- menuitems.c 2006/07/23 09:42:17     1.46
+++ menuitems.c 2006/07/29 11:31:57
@@ -395,6 +395,11 @@
                      if (strlen(value) > 1) {
                         if (!insert || pos < int(strlen(value)) - 1)
                            memmove(value + pos, value + pos + 1, strlen(value) - pos);
+                       else if (insert && pos == int(strlen(value)) - 1) {
+                          // in insert mode, deleting the last character replaces it with a blank to keep the cursor position
+                          if (value[pos] != ' ' || pos < 1)
+                             value[pos] = ' ';
+                          }
                         // reduce position, if we removed the last character
                         if (pos == int(strlen(value)))
                            pos--;

it works as I would expect it.

Klaus


[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux