mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
Merge with git+ssh://pasky.or.cz/srv/git/elinks.git
This commit is contained in:
commit
0a1b522fdd
@ -948,7 +948,7 @@ menu_kbd_handler(struct menu *menu, struct term_event *ev)
|
||||
|
||||
default:
|
||||
{
|
||||
int key = get_kbd_key(ev);
|
||||
term_event_key_T key = get_kbd_key(ev);
|
||||
|
||||
if (is_kbd_fkey(key)
|
||||
|| check_kbd_modifier(ev, KBD_MOD_ALT)) {
|
||||
|
@ -354,7 +354,7 @@ static struct key key_table[] = {
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
long
|
||||
term_event_key_T
|
||||
read_key(unsigned char *key_str)
|
||||
{
|
||||
struct key *key;
|
||||
@ -366,7 +366,7 @@ read_key(unsigned char *key_str)
|
||||
if (!strcasecmp(key->str, key_str))
|
||||
return key->num;
|
||||
|
||||
return -1;
|
||||
return KBD_UNDEF;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -173,7 +173,7 @@ action_requires_form(enum keymap_id keymap_id, action_id_T action_id)
|
||||
return action && (action->flags & ACTION_REQUIRE_FORM);
|
||||
}
|
||||
|
||||
long read_key(unsigned char *);
|
||||
term_event_key_T read_key(unsigned char *);
|
||||
unsigned char *get_keymap_name(enum keymap_id);
|
||||
|
||||
int parse_keystroke(unsigned char *, struct term_event_keyboard *);
|
||||
@ -187,7 +187,7 @@ void add_keystroke_to_string(struct string *str, struct term_event_keyboard *kbd
|
||||
* converted from unicode_val_T to that. \
|
||||
* #ifdef CONFIG_UTF_8, the code is correct. */ \
|
||||
kbd.key = accesskey; \
|
||||
kbd.modifier = 0; \
|
||||
kbd.modifier = KBD_MOD_NONE; \
|
||||
add_keystroke_to_string(str, &kbd, 0); \
|
||||
} while (0)
|
||||
|
||||
|
@ -495,7 +495,6 @@ cp2u_shared(const struct codepage_desc *from, unsigned char c)
|
||||
return UCS_NO_CHAR;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UTF_8
|
||||
/* Slow algorithm, used for converting input from the terminal. */
|
||||
unicode_val_T
|
||||
cp2u(int from, unsigned char c)
|
||||
@ -510,7 +509,6 @@ cp2u(int from, unsigned char c)
|
||||
if (c < 0x80) return c;
|
||||
else return cp2u_shared(&codepages[from], c);
|
||||
}
|
||||
#endif /* CONFIG_UTF_8 */
|
||||
|
||||
/* This slow and ugly code is used by the terminal utf_8_io */
|
||||
unsigned char *
|
||||
|
@ -65,9 +65,9 @@ inline int unicode_to_cell(unicode_val_T);
|
||||
unicode_val_T unicode_fold_label_case(unicode_val_T);
|
||||
inline int strlen_utf8(unsigned char **);
|
||||
inline unicode_val_T utf_8_to_unicode(unsigned char **, unsigned char *);
|
||||
unicode_val_T cp2u(int, unsigned char);
|
||||
#endif /* CONFIG_UTF_8 */
|
||||
|
||||
unicode_val_T cp2u(int, unsigned char);
|
||||
unsigned char *cp2utf_8(int, int);
|
||||
|
||||
unsigned char *u2cp_(unicode_val_T, int, int no_nbsp_hack);
|
||||
|
@ -3,13 +3,15 @@
|
||||
|
||||
struct itrm;
|
||||
|
||||
/* Values <= -0x100 are special; e.g. KBD_ENTER.
|
||||
* Values between -0xFF and -2 are not used yet; treat as special.
|
||||
* Value == -1 is KBD_UNDEF; not sent via socket.
|
||||
* Values >= 0 are characters received from the terminal;
|
||||
* in UCS-4 #ifdef CONFIG_UTF_8. */
|
||||
typedef int term_event_key_T;
|
||||
|
||||
struct term_event_keyboard {
|
||||
/* Values <= -0x100 are special; e.g. KBD_ENTER.
|
||||
* Values between -0xFF and -2 are not used yet; treat as special.
|
||||
* Value == -1 is KBD_UNDEF; not sent via socket.
|
||||
* Values >= 0 are characters received from the terminal;
|
||||
* in UCS-4 #ifdef CONFIG_UTF_8. */
|
||||
int key;
|
||||
term_event_key_T key;
|
||||
int modifier;
|
||||
};
|
||||
|
||||
@ -22,6 +24,8 @@ struct interlink_event_keyboard {
|
||||
int modifier;
|
||||
};
|
||||
|
||||
/* Values for term_event_key_T */
|
||||
|
||||
#define KBD_UNDEF -1
|
||||
|
||||
#define KBD_ENTER (-0x100)
|
||||
@ -51,12 +55,20 @@ struct interlink_event_keyboard {
|
||||
#define KBD_F10 (-0x129)
|
||||
#define KBD_F11 (-0x12a)
|
||||
#define KBD_F12 (-0x12b)
|
||||
static inline int is_kbd_fkey(int key) { return key <= KBD_F1 && key >= KBD_F12; }
|
||||
static inline int is_kbd_fkey(term_event_key_T key) { return key <= KBD_F1 && key >= KBD_F12; }
|
||||
#define number_to_kbd_fkey(num) (KBD_F1 - (num) + 1)
|
||||
#define kbd_fkey_to_number(key) (KBD_F1 - (key) + 1)
|
||||
|
||||
#define KBD_CTRL_C (-0x200)
|
||||
|
||||
/* int is_kbd_character(term_event_key_T key);
|
||||
* Return true if @key is a character in some charset, rather than a
|
||||
* special key. The character is not necessarily printable. As for
|
||||
* which charset it is in, see the definition of term_event_key_T. */
|
||||
#define is_kbd_character(key) ((key) >= 0)
|
||||
|
||||
/* Values for term_event_keyboard.modifier and
|
||||
* interlink_event_keyboard.modifier */
|
||||
#define KBD_MOD_NONE 0
|
||||
#define KBD_MOD_SHIFT 1
|
||||
#define KBD_MOD_CTRL 2
|
||||
|
@ -1178,26 +1178,38 @@ enum frame_event_status
|
||||
try_document_key(struct session *ses, struct document_view *doc_view,
|
||||
struct term_event *ev)
|
||||
{
|
||||
long key;
|
||||
unicode_val_T key;
|
||||
int passed = -1;
|
||||
int i; /* GOD I HATE C! --FF */ /* YEAH, BRAINFUCK RULEZ! --pasky */
|
||||
|
||||
assert(ses && doc_view && doc_view->document && doc_view->vs && ev);
|
||||
if_assert_failed return FRAME_EVENT_IGNORED;
|
||||
|
||||
if (!check_kbd_modifier(ev, KBD_MOD_ALT)) {
|
||||
/* We accept those only in alt-combo. */
|
||||
if (!check_kbd_modifier(ev, KBD_MOD_ALT)
|
||||
|| !is_kbd_character(get_kbd_key(ev))) {
|
||||
/* We accept only alt-character combos. */
|
||||
return FRAME_EVENT_IGNORED;
|
||||
}
|
||||
|
||||
/* The key is a character. Convert it to Unicode so that it
|
||||
* can be compared with link.accesskey. */
|
||||
#ifdef CONFIG_UTF_8
|
||||
key = get_kbd_key(ev);
|
||||
#else /* !CONFIG_UTF_8 */
|
||||
key = cp2u(get_opt_codepage_tree(ses->tab->term->spec,
|
||||
"charset"),
|
||||
get_kbd_key(ev));
|
||||
#endif /* !CONFIG_UTF_8 */
|
||||
/* If @key now is 0 (which is used in link.accesskey if there
|
||||
* is no access key) or UCS_REPLACEMENT_CHARACTER, then the
|
||||
* results may be a little odd, but not really harmful. */
|
||||
|
||||
/* Run through all the links and see if one of them is bound to the
|
||||
* key we test.. */
|
||||
key = get_kbd_key(ev);
|
||||
|
||||
for (i = 0; i < doc_view->document->nlinks; i++) {
|
||||
struct link *link = &doc_view->document->links[i];
|
||||
|
||||
if (key == link->accesskey) { /* FIXME: key vs unicode ... */
|
||||
if (key == link->accesskey) {
|
||||
if (passed != i && i <= doc_view->vs->current_link) {
|
||||
/* This is here in order to rotate between
|
||||
* links with same accesskey. */
|
||||
|
@ -637,7 +637,19 @@ enum frame_event_status
|
||||
try_mark_key(struct session *ses, struct document_view *doc_view,
|
||||
struct term_event *ev)
|
||||
{
|
||||
unsigned char mark = get_kbd_key(ev);
|
||||
unsigned char mark;
|
||||
|
||||
/* set_mark and goto_mark allow only a subset of the ASCII
|
||||
* character repertoire as mark characters. If get_kbd_key(ev)
|
||||
* is something else (i.e. a special key or a non-ASCII
|
||||
* character), map it to an ASCII character that the functions
|
||||
* will not accept, so the results are consistent.
|
||||
* When CONFIG_UTF_8 is not defined, this assumes that codes
|
||||
* 0 to 0x7F in all codepages match ASCII. */
|
||||
if (get_kbd_key(ev) >= 0 && get_kbd_key(ev) <= 0x7F)
|
||||
mark = get_kbd_key(ev);
|
||||
else
|
||||
mark = 0;
|
||||
|
||||
switch (ses->kbdprefix.mark) {
|
||||
case KP_MARK_NOTHING:
|
||||
|
Loading…
Reference in New Issue
Block a user