Cannot delete last char in insert mode

Message ID 44C4082D.1070201@gmx.de
State New
Headers

Commit Message

Udo Richter July 23, 2006, 11:37 p.m. UTC
  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
  

Patch

--- 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--;