* 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> 2001-08-12 Pavel Roskin <proski@gnu.org>
* learn.c (learn_save): Fix memory leak. * learn.c (learn_save): Fix memory leak.

View File

@ -370,24 +370,28 @@ static int push_char (int c)
return 1; 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; key_def *base;
if (strlen (seq) > sizeof (seq_buffer)-1) if (strlen (seq) > sizeof (seq_buffer)-1)
return; return 0;
for (base = keys; (base != 0) && *seq; ){ for (base = keys; (base != 0) && *seq; ){
if (*seq == base->ch){ if (*seq == base->ch){
if (base->child == 0){ if (base->child == 0){
if (*(seq+1)){ if (*(seq+1)){
base->child = create_sequence (seq+1, code, action); base->child = create_sequence (seq+1, code, action);
return; return 1;
} else { } else {
/* The sequence clashes */ /* The sequence matches an existing one. */
base->code = code; base->code = code;
base->action = action; base->action = action;
return; return 1;
} }
} else { } else {
base = base->child; base = base->child;
@ -398,11 +402,18 @@ void define_sequence (int code, char *seq, int action)
base = base->next; base = base->next;
else { else {
base->next = create_sequence (seq, code, action); 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); keys = create_sequence (seq, code, action);
return 1;
} }
static int *pending_keys; static int *pending_keys;

View File

@ -63,7 +63,7 @@ int is_quit_char (int c);
#define MCKEY_MOUSE -2 #define MCKEY_MOUSE -2
void do_define_key (int code, char *strcap); 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 */ /* internally used in key.c, defined in keyxtra.c */
void load_xtra_key_defines (void); 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 /* Esc hides the dialog and do not allow definitions of
* regular characters * regular characters
*/ */
int seq_ok;
if (*seq && strcmp (seq, "\\e") && strcmp (seq, "\\e\\e") if (*seq && strcmp (seq, "\\e") && strcmp (seq, "\\e\\e")
&& strcmp (seq, "^m" ) && strcmp (seq, "^m" )
&& (seq [1] || (*seq < ' ' || *seq > '~'))){ && (seq [1] || (*seq < ' ' || *seq > '~'))){
@ -114,9 +116,13 @@ _("Please press the %s\n"
learnchanged = 1; learnchanged = 1;
learnkeys [action - B_USER].sequence = seq; learnkeys [action - B_USER].sequence = seq;
seq = convert_controls (seq); seq = convert_controls (seq);
define_sequence (key_name_conv_tab [action - B_USER].code, seq, seq_ok = define_sequence (key_name_conv_tab [action - B_USER].code,
MCKEY_NOACTION); seq, MCKEY_NOACTION);
} else { } else {
seq_ok = 0;
}
if (!seq_ok) {
message (0, _(" Cannot accept this key "), message (0, _(" Cannot accept this key "),
_(" You have entered \"%s\""), seq); _(" You have entered \"%s\""), seq);
} }