+2001-08-21 Gerd Moellmann <gerd@gnu.org>
+
+ * keymap.c (access_keymap): If a binding of the form (GENERIC-CHAR
+ . BINDING) exists, where GENERIC-CHAR is the generic character of
+ the charset of IDX, return BINDING unless there exists a binding
+ for IDX itself.
+
2001-08-16 Gerd Moellmann <gerd@gnu.org>
* xrdb.c (SYSV): Don't define on Solaris 2.
{
Lisp_Object tail;
Lisp_Object t_binding;
+ Lisp_Object generic_binding;
t_binding = Qnil;
+ generic_binding = Qnil;
+
for (tail = XCDR (map);
(CONSP (tail)
|| (tail = get_keymap (tail, 0, autoload), CONSP (tail)));
}
else if (CONSP (binding))
{
- if (EQ (XCAR (binding), idx))
+ Lisp_Object key = XCAR (binding);
+ int c1, c2, charset;
+
+ if (EQ (key, idx))
{
val = XCDR (binding);
if (noprefix && KEYMAPP (val))
fix_submap_inheritance (map, idx, val);
return get_keyelt (val, autoload);
}
- if (t_ok && EQ (XCAR (binding), Qt))
+ else if (INTEGERP (idx)
+ && INTEGERP (key)
+ && !SINGLE_BYTE_CHAR_P (XINT (idx))
+ && !SINGLE_BYTE_CHAR_P (XINT (key))
+ && CHAR_VALID_P (XINT (key), 1)
+ && !CHAR_VALID_P (XINT (key), 0)
+ && (CHAR_CHARSET (XINT (key))
+ == CHAR_CHARSET (XINT (idx))))
+ {
+ /* KEY is the generic character of the charset of IDX.
+ Use KEY's binding if there isn't a binding for IDX
+ itself. */
+ generic_binding = binding;
+ }
+ else if (t_ok && EQ (XCAR (binding), Qt))
t_binding = XCDR (binding);
}
else if (VECTORP (binding))
QUIT;
}
+ if (!NILP (generic_binding))
+ return get_keyelt (generic_binding, autoload);
+
return get_keyelt (t_binding, autoload);
}
}