mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
163 lines
5.1 KiB
C
163 lines
5.1 KiB
C
#ifndef EL__TERMINAL_KBD_H
|
|
#define EL__TERMINAL_KBD_H
|
|
|
|
#include "intl/charsets.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Some constants for the strings inside of {struct terminal}. */
|
|
|
|
#define MAX_TERM_LEN 32 /* this must be multiple of 8! (alignment problems) */
|
|
#define MAX_CWD_LEN 256 /* this must be multiple of 8! (alignment problems) */
|
|
|
|
struct itrm;
|
|
|
|
/** A character received from a terminal. */
|
|
#ifdef CONFIG_UTF8
|
|
typedef unicode_val_T term_event_char_T; /* in UCS-4 */
|
|
#else
|
|
typedef unsigned char term_event_char_T; /* in the charset of the terminal */
|
|
#endif
|
|
|
|
/** A key received from a terminal, without modifiers. The value is
|
|
* either from term_event_char_T or from enum term_event_special_key.
|
|
* To check which one it is, use is_kbd_character().
|
|
*
|
|
* - Values <= -0x100 are special; from enum term_event_special_key.
|
|
* - 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; from term_event_char_T.
|
|
*
|
|
* Any at least 32-bit signed integer type would work here; using an
|
|
* exact-width type hurts portability in principle, but some other
|
|
* parts of ELinks already require the existence of uint32_t. */
|
|
typedef int32_t term_event_key_T;
|
|
|
|
/** Values for term_event_keyboard.modifier and
|
|
* interlink_event_keyboard.modifier */
|
|
enum term_event_modifier {
|
|
KBD_MOD_NONE = 0,
|
|
KBD_MOD_SHIFT = 1,
|
|
KBD_MOD_CTRL = 2,
|
|
KBD_MOD_ALT = 4,
|
|
|
|
/** The character is part of a string being pasted from the
|
|
* terminal. parse_keystroke() does not support this flag, so
|
|
* keystrokes that include it cannot be bound to any actions,
|
|
* and ELinks will instead insert the characters if possible. */
|
|
KBD_MOD_PASTE = 8,
|
|
};
|
|
|
|
typedef unsigned char term_event_modifier_T;
|
|
|
|
/** A key received from a terminal, with modifiers. */
|
|
struct term_event_keyboard {
|
|
term_event_key_T key;
|
|
term_event_modifier_T modifier;
|
|
};
|
|
|
|
/** Like struct term_event_keyboard but used in the interlink protocol
|
|
* between ELinks processes. Because the processes may be running
|
|
* different versions of ELinks, especially if a new version has just
|
|
* been installed, this structure should be kept binary compatible as
|
|
* long as possible. See bug 793 for a list of pending changes to the
|
|
* protocol. */
|
|
struct interlink_event_keyboard {
|
|
/** This is like term_event_key_T but carries individual bytes
|
|
* rather than entire characters, and uses different values
|
|
* for special keys.
|
|
*
|
|
* - Values <= -2 are not used, for ELinks 0.11 compatibility.
|
|
* - Value == -1 is KBD_UNDEF; not sent via socket.
|
|
* - Values between 0 and 0xFF are bytes received from the terminal.
|
|
* - Values >= 0x100 are special; absolute values of constants
|
|
* from enum term_event_special_key, e.g. -KBD_ENTER. */
|
|
int key;
|
|
/** The values are from term_event_modifier_T, but the type
|
|
* must be int so that the representation remains compatible
|
|
* with ELinks 0.11. */
|
|
int modifier;
|
|
};
|
|
|
|
/** Codes of special keys, for use in term_event_key_T.
|
|
* The enum has a tag mainly to let you cast numbers to it in GDB and see
|
|
* their names. ELinks doesn't use this enum type as term_event_key_T,
|
|
* because it might be 16-bit and Unicode characters wouldn't then fit. */
|
|
enum term_event_special_key {
|
|
KBD_UNDEF = -1,
|
|
|
|
KBD_ENTER = -0x100,
|
|
KBD_BS = -0x101,
|
|
KBD_TAB = -0x102,
|
|
KBD_ESC = -0x103,
|
|
KBD_LEFT = -0x104,
|
|
KBD_RIGHT = -0x105,
|
|
KBD_UP = -0x106,
|
|
KBD_DOWN = -0x107,
|
|
KBD_INS = -0x108,
|
|
KBD_DEL = -0x109,
|
|
KBD_HOME = -0x10a,
|
|
KBD_END = -0x10b,
|
|
KBD_PAGE_UP = -0x10c,
|
|
KBD_PAGE_DOWN = -0x10d,
|
|
|
|
KBD_F1 = -0x120,
|
|
KBD_F2 = -0x121,
|
|
KBD_F3 = -0x122,
|
|
KBD_F4 = -0x123,
|
|
KBD_F5 = -0x124,
|
|
KBD_F6 = -0x125,
|
|
KBD_F7 = -0x126,
|
|
KBD_F8 = -0x127,
|
|
KBD_F9 = -0x128,
|
|
KBD_F10 = -0x129,
|
|
KBD_F11 = -0x12a,
|
|
KBD_F12 = -0x12b,
|
|
|
|
KBD_CTRL_C = -0x200
|
|
};
|
|
|
|
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)
|
|
|
|
/**Check whether @a key is a character or a special key.
|
|
* @code int is_kbd_character(term_event_key_T key); @endcode
|
|
* Return true if @a key is a character from ::term_event_char_T.
|
|
* (The character is not necessarily printable.)
|
|
* Return false if @a key is a special key from enum term_event_special_key. */
|
|
#define is_kbd_character(key) ((key) >= 0)
|
|
|
|
void
|
|
handle_trm(int std_in, int std_out, int sock_in, int sock_out, int ctl_in,
|
|
void *init_string, int init_len, int remote);
|
|
|
|
void itrm_queue_event(struct itrm *itrm, char *data, int len);
|
|
void block_itrm(void);
|
|
int unblock_itrm(void);
|
|
void free_all_itrms(void);
|
|
void resize_terminal(void);
|
|
void dispatch_special(const char *);
|
|
void kbd_ctrl_c(void);
|
|
int is_blocked(void);
|
|
void get_terminal_name(char[MAX_TERM_LEN]);
|
|
|
|
#define kbd_get_key(kbd_) ((kbd_)->key)
|
|
#define kbd_key_is(kbd_, key) (kbd_get_key(kbd_) == (key))
|
|
|
|
#define kbd_get_modifier(kbd_) ((kbd_)->modifier)
|
|
#define kbd_modifier_is(kbd_, mod) (kbd_get_modifier(kbd_) == (mod))
|
|
|
|
#define kbd_set(kbd_, key_, modifier_) do { \
|
|
(kbd_)->key = (key_); \
|
|
(kbd_)->modifier = (modifier_); \
|
|
} while (0)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|