luau/extern/isocline/src/tty.h

161 lines
5.6 KiB
C

/* ----------------------------------------------------------------------------
Copyright (c) 2021, Daan Leijen
This is free software; you can redistribute it and/or modify it
under the terms of the MIT License. A copy of the license can be
found in the "LICENSE" file at the root of this distribution.
-----------------------------------------------------------------------------*/
#pragma once
#ifndef IC_TTY_H
#define IC_TTY_H
#include "common.h"
//-------------------------------------------------------------
// TTY/Keyboard input
//-------------------------------------------------------------
// Key code
typedef uint32_t code_t;
// TTY interface
struct tty_s;
typedef struct tty_s tty_t;
ic_private tty_t* tty_new(alloc_t* mem, int fd_in);
ic_private void tty_free(tty_t* tty);
ic_private bool tty_is_utf8(const tty_t* tty);
ic_private bool tty_start_raw(tty_t* tty);
ic_private void tty_end_raw(tty_t* tty);
ic_private code_t tty_read(tty_t* tty);
ic_private bool tty_read_timeout(tty_t* tty, long timeout_ms, code_t* c );
ic_private void tty_code_pushback( tty_t* tty, code_t c );
ic_private bool code_is_ascii_char(code_t c, char* chr );
ic_private bool code_is_unicode(code_t c, unicode_t* uchr);
ic_private bool code_is_virt_key(code_t c );
ic_private bool tty_term_resize_event(tty_t* tty); // did the terminal resize?
ic_private bool tty_async_stop(const tty_t* tty); // unblock the read asynchronously
ic_private void tty_set_esc_delay(tty_t* tty, long initial_delay_ms, long followup_delay_ms);
// shared between tty.c and tty_esc.c: low level character push
ic_private void tty_cpush_char(tty_t* tty, uint8_t c);
ic_private bool tty_cpop(tty_t* tty, uint8_t* c);
ic_private bool tty_readc_noblock(tty_t* tty, uint8_t* c, long timeout_ms);
ic_private code_t tty_read_esc(tty_t* tty, long esc_initial_timeout, long esc_timeout); // in tty_esc.c
// used by term.c to read back ANSI escape responses
ic_private bool tty_read_esc_response(tty_t* tty, char esc_start, bool final_st, char* buf, ssize_t buflen );
//-------------------------------------------------------------
// Key codes: a code_t is 32 bits.
// we use the bottom 24 (nah, 21) bits for unicode (up to x0010FFFF)
// The codes after x01000000 are for virtual keys
// and events use x02000000.
// The top 4 bits are used for modifiers.
//-------------------------------------------------------------
static inline code_t key_char( char c ) {
// careful about signed character conversion (negative char ~> 0x80 - 0xFF)
return ((uint8_t)c);
}
static inline code_t key_unicode( unicode_t u ) {
return u;
}
#define KEY_MOD_SHIFT (0x10000000U)
#define KEY_MOD_ALT (0x20000000U)
#define KEY_MOD_CTRL (0x40000000U)
#define KEY_NO_MODS(k) (k & 0x0FFFFFFFU)
#define KEY_MODS(k) (k & 0xF0000000U)
#define WITH_SHIFT(x) (x | KEY_MOD_SHIFT)
#define WITH_ALT(x) (x | KEY_MOD_ALT)
#define WITH_CTRL(x) (x | KEY_MOD_CTRL)
#define KEY_NONE (0)
#define KEY_CTRL_A (1)
#define KEY_CTRL_B (2)
#define KEY_CTRL_C (3)
#define KEY_CTRL_D (4)
#define KEY_CTRL_E (5)
#define KEY_CTRL_F (6)
#define KEY_BELL (7)
#define KEY_BACKSP (8)
#define KEY_TAB (9)
#define KEY_LINEFEED (10) // ctrl/shift + enter is considered KEY_LINEFEED
#define KEY_CTRL_K (11)
#define KEY_CTRL_L (12)
#define KEY_ENTER (13)
#define KEY_CTRL_N (14)
#define KEY_CTRL_O (15)
#define KEY_CTRL_P (16)
#define KEY_CTRL_Q (17)
#define KEY_CTRL_R (18)
#define KEY_CTRL_S (19)
#define KEY_CTRL_T (20)
#define KEY_CTRL_U (21)
#define KEY_CTRL_V (22)
#define KEY_CTRL_W (23)
#define KEY_CTRL_X (24)
#define KEY_CTRL_Y (25)
#define KEY_CTRL_Z (26)
#define KEY_ESC (27)
#define KEY_SPACE (32)
#define KEY_RUBOUT (127) // always translated to KEY_BACKSP
#define KEY_UNICODE_MAX (0x0010FFFFU)
#define KEY_VIRT (0x01000000U)
#define KEY_UP (KEY_VIRT+0)
#define KEY_DOWN (KEY_VIRT+1)
#define KEY_LEFT (KEY_VIRT+2)
#define KEY_RIGHT (KEY_VIRT+3)
#define KEY_HOME (KEY_VIRT+4)
#define KEY_END (KEY_VIRT+5)
#define KEY_DEL (KEY_VIRT+6)
#define KEY_PAGEUP (KEY_VIRT+7)
#define KEY_PAGEDOWN (KEY_VIRT+8)
#define KEY_INS (KEY_VIRT+9)
#define KEY_F1 (KEY_VIRT+11)
#define KEY_F2 (KEY_VIRT+12)
#define KEY_F3 (KEY_VIRT+13)
#define KEY_F4 (KEY_VIRT+14)
#define KEY_F5 (KEY_VIRT+15)
#define KEY_F6 (KEY_VIRT+16)
#define KEY_F7 (KEY_VIRT+17)
#define KEY_F8 (KEY_VIRT+18)
#define KEY_F9 (KEY_VIRT+19)
#define KEY_F10 (KEY_VIRT+20)
#define KEY_F11 (KEY_VIRT+21)
#define KEY_F12 (KEY_VIRT+22)
#define KEY_F(n) (KEY_F1 + (n) - 1)
#define KEY_EVENT_BASE (0x02000000U)
#define KEY_EVENT_RESIZE (KEY_EVENT_BASE+1)
#define KEY_EVENT_AUTOTAB (KEY_EVENT_BASE+2)
#define KEY_EVENT_STOP (KEY_EVENT_BASE+3)
// Convenience
#define KEY_CTRL_UP (WITH_CTRL(KEY_UP))
#define KEY_CTRL_DOWN (WITH_CTRL(KEY_DOWN))
#define KEY_CTRL_LEFT (WITH_CTRL(KEY_LEFT))
#define KEY_CTRL_RIGHT (WITH_CTRL(KEY_RIGHT))
#define KEY_CTRL_HOME (WITH_CTRL(KEY_HOME))
#define KEY_CTRL_END (WITH_CTRL(KEY_END))
#define KEY_CTRL_DEL (WITH_CTRL(KEY_DEL))
#define KEY_CTRL_PAGEUP (WITH_CTRL(KEY_PAGEUP))
#define KEY_CTRL_PAGEDOWN (WITH_CTRL(KEY_PAGEDOWN)))
#define KEY_CTRL_INS (WITH_CTRL(KEY_INS))
#define KEY_SHIFT_TAB (WITH_SHIFT(KEY_TAB))
#endif // IC_TTY_H