* key.h (define_sequence): Change declaration to return int.

* key.c (define_sequence): Return 1 on success, 0 on error.
* learn.c (learn_button): Don't accept sequence if
define_sequence() has failed.
This commit is contained in:
Pavel Roskin 2001-08-14 04:48:26 +00:00
parent 2742c4f9d4
commit 403dfdc24b
4 changed files with 33 additions and 9 deletions

View File

@ -1,3 +1,10 @@
2001-08-14 Pavel Roskin <proski@gnu.org>
* key.h (define_sequence): Change declaration to return int.
* key.c (define_sequence): Return 1 on success, 0 on error.
* learn.c (learn_button): Don't accept sequence if
define_sequence() has failed.
2001-08-12 Pavel Roskin <proski@gnu.org>
* learn.c (learn_save): Fix memory leak.

View File

@ -370,24 +370,28 @@ static int push_char (int c)
return 1;
}
void define_sequence (int code, char *seq, int action)
/*
* Return 1 on success, 0 on error.
* An error happens if SEQ is a beginning of an existing longer sequence.
*/
int define_sequence (int code, char *seq, int action)
{
key_def *base;
if (strlen (seq) > sizeof (seq_buffer)-1)
return;
return 0;
for (base = keys; (base != 0) && *seq; ){
if (*seq == base->ch){
if (base->child == 0){
if (*(seq+1)){
base->child = create_sequence (seq+1, code, action);
return;
return 1;
} else {
/* The sequence clashes */
/* The sequence matches an existing one. */
base->code = code;
base->action = action;
return;
return 1;
}
} else {
base = base->child;
@ -398,11 +402,18 @@ void define_sequence (int code, char *seq, int action)
base = base->next;
else {
base->next = create_sequence (seq, code, action);
return;
return 1;
}
}
}
if (!*seq) {
/* Attempt to redefine a sequence with a shorter sequence. */
return 0;
}
keys = create_sequence (seq, code, action);
return 1;
}
static int *pending_keys;

View File

@ -63,7 +63,7 @@ int is_quit_char (int c);
#define MCKEY_MOUSE -2
void do_define_key (int code, char *strcap);
void define_sequence (int code, char *seq, int action);
int define_sequence (int code, char *seq, int action);
/* internally used in key.c, defined in keyxtra.c */
void load_xtra_key_defines (void);

View File

@ -107,6 +107,8 @@ _("Please press the %s\n"
/* Esc hides the dialog and do not allow definitions of
* regular characters
*/
int seq_ok;
if (*seq && strcmp (seq, "\\e") && strcmp (seq, "\\e\\e")
&& strcmp (seq, "^m" )
&& (seq [1] || (*seq < ' ' || *seq > '~'))){
@ -114,9 +116,13 @@ _("Please press the %s\n"
learnchanged = 1;
learnkeys [action - B_USER].sequence = seq;
seq = convert_controls (seq);
define_sequence (key_name_conv_tab [action - B_USER].code, seq,
MCKEY_NOACTION);
seq_ok = define_sequence (key_name_conv_tab [action - B_USER].code,
seq, MCKEY_NOACTION);
} else {
seq_ok = 0;
}
if (!seq_ok) {
message (0, _(" Cannot accept this key "),
_(" You have entered \"%s\""), seq);
}