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