diff options
| author | Stefan Monnier | 2001-10-14 22:45:14 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2001-10-14 22:45:14 +0000 |
| commit | 845e4cf4d4ce8467528a9d96284052e42dc122b0 (patch) | |
| tree | 88f69b3dd164f62dd9fc8d458b9635c693544581 /src | |
| parent | 99776d43e2bca8f64487870c9fb0010ebc08be11 (diff) | |
| download | emacs-845e4cf4d4ce8467528a9d96284052e42dc122b0.tar.gz emacs-845e4cf4d4ce8467528a9d96284052e42dc122b0.zip | |
(access_keymap): Unify handling of `t' and generic-char.
If a parent is reached and noinherit is set, exit immediately.
Use AREF and ASIZE macros. Call get_keyelt before checking KEYMAPP.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 4 | ||||
| -rw-r--r-- | src/keymap.c | 69 |
2 files changed, 33 insertions, 40 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index a4374db8a99..e59a04459f5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,5 +1,9 @@ | |||
| 1 | 2001-10-14 Stefan Monnier <monnier@cs.yale.edu> | 1 | 2001-10-14 Stefan Monnier <monnier@cs.yale.edu> |
| 2 | 2 | ||
| 3 | * keymap.c (access_keymap): Unify handling of `t' and generic-char. | ||
| 4 | If a parent is reached and noinherit is set, exit immediately. | ||
| 5 | Use AREF and ASIZE macros. Call get_keyelt before checking KEYMAPP. | ||
| 6 | |||
| 3 | * s/ms-w32.h (EXEC_SUFFIXES): | 7 | * s/ms-w32.h (EXEC_SUFFIXES): |
| 4 | * s/msdos.h (EXEC_SUFFIXES): | 8 | * s/msdos.h (EXEC_SUFFIXES): |
| 5 | * process.h (EXEC_SUFFIXES): Remove. | 9 | * process.h (EXEC_SUFFIXES): Remove. |
diff --git a/src/keymap.c b/src/keymap.c index 50f27273c72..75a12ead3ca 100644 --- a/src/keymap.c +++ b/src/keymap.c | |||
| @@ -476,8 +476,7 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 476 | int noinherit; | 476 | int noinherit; |
| 477 | int autoload; | 477 | int autoload; |
| 478 | { | 478 | { |
| 479 | int noprefix = 0; | 479 | Lisp_Object val = Qunbound; |
| 480 | Lisp_Object val; | ||
| 481 | 480 | ||
| 482 | /* If idx is a list (some sort of mouse click, perhaps?), | 481 | /* If idx is a list (some sort of mouse click, perhaps?), |
| 483 | the index we want to use is the car of the list, which | 482 | the index we want to use is the car of the list, which |
| @@ -517,12 +516,13 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 517 | 516 | ||
| 518 | { | 517 | { |
| 519 | Lisp_Object tail; | 518 | Lisp_Object tail; |
| 520 | Lisp_Object t_binding; | 519 | Lisp_Object t_binding = Qnil; |
| 521 | Lisp_Object generic_binding; | 520 | |
| 521 | /* If `t_ok' is 2, both `t' and generic-char bindings are accepted. | ||
| 522 | If it is 1, only generic-char bindings are accepted. | ||
| 523 | Otherwise, neither are. */ | ||
| 524 | t_ok = t_ok ? 2 : 0; | ||
| 522 | 525 | ||
| 523 | t_binding = Qnil; | ||
| 524 | generic_binding = Qnil; | ||
| 525 | |||
| 526 | for (tail = XCDR (map); | 526 | for (tail = XCDR (map); |
| 527 | (CONSP (tail) | 527 | (CONSP (tail) |
| 528 | || (tail = get_keymap (tail, 0, autoload), CONSP (tail))); | 528 | || (tail = get_keymap (tail, 0, autoload), CONSP (tail))); |
| @@ -536,7 +536,7 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 536 | /* If NOINHERIT, stop finding prefix definitions | 536 | /* If NOINHERIT, stop finding prefix definitions |
| 537 | after we pass a second occurrence of the `keymap' symbol. */ | 537 | after we pass a second occurrence of the `keymap' symbol. */ |
| 538 | if (noinherit && EQ (binding, Qkeymap)) | 538 | if (noinherit && EQ (binding, Qkeymap)) |
| 539 | noprefix = 1; | 539 | return Qnil; |
| 540 | } | 540 | } |
| 541 | else if (CONSP (binding)) | 541 | else if (CONSP (binding)) |
| 542 | { | 542 | { |
| @@ -544,15 +544,9 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 544 | int c1, c2, charset; | 544 | int c1, c2, charset; |
| 545 | 545 | ||
| 546 | if (EQ (key, idx)) | 546 | if (EQ (key, idx)) |
| 547 | { | 547 | val = XCDR (binding); |
| 548 | val = XCDR (binding); | 548 | else if (t_ok |
| 549 | if (noprefix && KEYMAPP (val)) | 549 | && INTEGERP (idx) |
| 550 | return Qnil; | ||
| 551 | if (CONSP (val)) | ||
| 552 | fix_submap_inheritance (map, idx, val); | ||
| 553 | return get_keyelt (val, autoload); | ||
| 554 | } | ||
| 555 | else if (INTEGERP (idx) | ||
| 556 | && (XINT (idx) & CHAR_MODIFIER_MASK) == 0 | 550 | && (XINT (idx) & CHAR_MODIFIER_MASK) == 0 |
| 557 | && INTEGERP (key) | 551 | && INTEGERP (key) |
| 558 | && (XINT (key) & CHAR_MODIFIER_MASK) == 0 | 552 | && (XINT (key) & CHAR_MODIFIER_MASK) == 0 |
| @@ -566,22 +560,19 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 566 | /* KEY is the generic character of the charset of IDX. | 560 | /* KEY is the generic character of the charset of IDX. |
| 567 | Use KEY's binding if there isn't a binding for IDX | 561 | Use KEY's binding if there isn't a binding for IDX |
| 568 | itself. */ | 562 | itself. */ |
| 569 | generic_binding = XCDR (binding); | 563 | t_binding = XCDR (binding); |
| 564 | t_ok = 0; | ||
| 565 | } | ||
| 566 | else if (t_ok > 1 && EQ (key, Qt)) | ||
| 567 | { | ||
| 568 | t_binding = XCDR (binding); | ||
| 569 | t_ok = 1; | ||
| 570 | } | 570 | } |
| 571 | else if (t_ok && EQ (XCAR (binding), Qt)) | ||
| 572 | t_binding = XCDR (binding); | ||
| 573 | } | 571 | } |
| 574 | else if (VECTORP (binding)) | 572 | else if (VECTORP (binding)) |
| 575 | { | 573 | { |
| 576 | if (NATNUMP (idx) && XFASTINT (idx) < XVECTOR (binding)->size) | 574 | if (NATNUMP (idx) && XFASTINT (idx) < ASIZE (binding)) |
| 577 | { | 575 | val = AREF (binding, XFASTINT (idx)); |
| 578 | val = XVECTOR (binding)->contents[XFASTINT (idx)]; | ||
| 579 | if (noprefix && KEYMAPP (val)) | ||
| 580 | return Qnil; | ||
| 581 | if (CONSP (val)) | ||
| 582 | fix_submap_inheritance (map, idx, val); | ||
| 583 | return get_keyelt (val, autoload); | ||
| 584 | } | ||
| 585 | } | 576 | } |
| 586 | else if (CHAR_TABLE_P (binding)) | 577 | else if (CHAR_TABLE_P (binding)) |
| 587 | { | 578 | { |
| @@ -590,22 +581,20 @@ access_keymap (map, idx, t_ok, noinherit, autoload) | |||
| 590 | All character codes without modifiers are included. */ | 581 | All character codes without modifiers are included. */ |
| 591 | if (NATNUMP (idx) | 582 | if (NATNUMP (idx) |
| 592 | && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0) | 583 | && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0) |
| 593 | { | 584 | val = Faref (binding, idx); |
| 594 | val = Faref (binding, idx); | ||
| 595 | if (noprefix && KEYMAPP (val)) | ||
| 596 | return Qnil; | ||
| 597 | if (CONSP (val)) | ||
| 598 | fix_submap_inheritance (map, idx, val); | ||
| 599 | return get_keyelt (val, autoload); | ||
| 600 | } | ||
| 601 | } | 585 | } |
| 602 | 586 | ||
| 587 | /* If we found a binding, clean it up and return it. */ | ||
| 588 | if (!EQ (val, Qunbound)) | ||
| 589 | { | ||
| 590 | val = get_keyelt (val, autoload); | ||
| 591 | if (KEYMAPP (val)) | ||
| 592 | fix_submap_inheritance (map, idx, val); | ||
| 593 | return val; | ||
| 594 | } | ||
| 603 | QUIT; | 595 | QUIT; |
| 604 | } | 596 | } |
| 605 | 597 | ||
| 606 | if (!NILP (generic_binding)) | ||
| 607 | return get_keyelt (generic_binding, autoload); | ||
| 608 | |||
| 609 | return get_keyelt (t_binding, autoload); | 598 | return get_keyelt (t_binding, autoload); |
| 610 | } | 599 | } |
| 611 | } | 600 | } |