275 lines
7.9 KiB
C
275 lines
7.9 KiB
C
#ifndef _TERMPTY_H__
|
|
#define _TERMPTY_H__ 1
|
|
|
|
#include "config.h"
|
|
|
|
typedef struct _Termpty Termpty;
|
|
typedef struct _Termcell Termcell;
|
|
typedef struct _Termatt Termatt;
|
|
typedef struct _Termsave Termsave;
|
|
typedef struct _Termsavecomp Termsavecomp;
|
|
typedef struct _Termblock Termblock;
|
|
typedef struct _Termexp Termexp;
|
|
|
|
#define COL_DEF 0
|
|
#define COL_BLACK 1
|
|
#define COL_RED 2
|
|
#define COL_GREEN 3
|
|
#define COL_YELLOW 4
|
|
#define COL_BLUE 5
|
|
#define COL_MAGENTA 6
|
|
#define COL_CYAN 7
|
|
#define COL_WHITE 8
|
|
#define COL_INVIS 9
|
|
|
|
#define COL_INVERSE 10
|
|
#define COL_INVERSEBG 11
|
|
|
|
#define MOUSE_OFF 0
|
|
#define MOUSE_X10 1 // Press only
|
|
#define MOUSE_NORMAL 2 // Press+release only
|
|
#define MOUSE_NORMAL_BTN_MOVE 3 // Press+release+motion while pressed
|
|
#define MOUSE_NORMAL_ALL_MOVE 4 // Press+release+all motion
|
|
|
|
#define MOUSE_EXT_NONE 0
|
|
#define MOUSE_EXT_UTF8 1
|
|
#define MOUSE_EXT_SGR 2
|
|
#define MOUSE_EXT_URXVT 3
|
|
|
|
// Only for testing purpose
|
|
//#define SUPPORT_80_132_COLUMNS 1
|
|
|
|
#define MOVIE_STATE_PLAY 0
|
|
#define MOVIE_STATE_PAUSE 1
|
|
#define MOVIE_STATE_STOP 2
|
|
|
|
struct _Termatt
|
|
{
|
|
unsigned char fg, bg;
|
|
unsigned short bold : 1;
|
|
unsigned short faint : 1;
|
|
unsigned short italic : 1;
|
|
unsigned short dblwidth : 1;
|
|
unsigned short underline : 1;
|
|
unsigned short blink : 1; // don't intend to support this currently
|
|
unsigned short blink2 : 1; // don't intend to support this currently
|
|
unsigned short inverse : 1;
|
|
unsigned short invisible : 1;
|
|
unsigned short strike : 1;
|
|
unsigned short fg256 : 1;
|
|
unsigned short bg256 : 1;
|
|
unsigned short fgintense : 1;
|
|
unsigned short bgintense : 1;
|
|
// below used for working out text from selections
|
|
unsigned short autowrapped : 1;
|
|
unsigned short newline : 1;
|
|
unsigned short tab : 1;
|
|
unsigned short fraktur : 1;
|
|
#if defined(SUPPORT_80_132_COLUMNS)
|
|
unsigned short is_80_132_mode_allowed : 1;
|
|
unsigned short bit_padding : 13;
|
|
#else
|
|
unsigned short bit_padding : 14;
|
|
#endif
|
|
};
|
|
|
|
struct _Termpty
|
|
{
|
|
Evas_Object *obj;
|
|
Ecore_Event_Handler *hand_exe_exit;
|
|
Ecore_Fd_Handler *hand_fd;
|
|
struct {
|
|
struct {
|
|
void (*func) (void *data);
|
|
void *data;
|
|
} change, set_title, set_icon, cancel_sel, exited, bell, command;
|
|
} cb;
|
|
struct {
|
|
const char *title, *icon, *user_title;
|
|
} prop;
|
|
const char *cur_cmd;
|
|
Termcell *screen, *screen2;
|
|
int circular_offset;
|
|
int circular_offset2;
|
|
Eina_Unicode *buf;
|
|
size_t buflen;
|
|
unsigned char oldbuf[4];
|
|
Termsave *back;
|
|
size_t backsize, backpos;
|
|
struct {
|
|
int screen_y;
|
|
int backlog_y;
|
|
} backlog_beacon;
|
|
int w, h;
|
|
int fd, slavefd;
|
|
#ifdef ENABLE_FUZZING
|
|
int fd_dev_null;
|
|
#endif
|
|
struct {
|
|
int curid;
|
|
Eina_Hash *blocks;
|
|
Eina_Hash *chid_map;
|
|
Eina_List *active;
|
|
Eina_List *expecting;
|
|
unsigned char on : 1;
|
|
} block;
|
|
struct {
|
|
/* start is always the start of the selection
|
|
* so end.y can be < start.y */
|
|
struct {
|
|
int x, y;
|
|
} start, end, orig;
|
|
time_t last_click;
|
|
unsigned char is_active : 1;
|
|
unsigned char is_box : 1;
|
|
unsigned char makesel : 1;
|
|
unsigned char by_word : 1;
|
|
unsigned char by_line : 1;
|
|
unsigned char is_top_to_bottom : 1;
|
|
} selection;
|
|
struct {
|
|
Termatt att;
|
|
unsigned char charset;
|
|
unsigned char charsetch;
|
|
unsigned char chset[4];
|
|
int scroll_y1, scroll_y2;
|
|
int had_cr_x, had_cr_y;
|
|
int margin_top; // soon, more to come...
|
|
unsigned int multibyte : 1;
|
|
unsigned int alt_kp : 1;
|
|
unsigned int insert : 1;
|
|
unsigned int appcursor : 1;
|
|
unsigned int wrap : 1;
|
|
unsigned int wrapnext : 1;
|
|
unsigned int crlf : 1;
|
|
unsigned int had_cr : 1;
|
|
unsigned int send_bs : 1;
|
|
unsigned int kbd_lock : 1;
|
|
unsigned int reverse : 1;
|
|
unsigned int no_autorepeat : 1;
|
|
unsigned int cjk_ambiguous_wide : 1;
|
|
unsigned int hide_cursor : 1;
|
|
} termstate;
|
|
struct {
|
|
int cx, cy;
|
|
} cursor_state, cursor_save;
|
|
int exit_code;
|
|
pid_t pid;
|
|
unsigned int altbuf : 1;
|
|
unsigned int mouse_mode : 3;
|
|
unsigned int mouse_ext : 2;
|
|
unsigned int bracketed_paste : 1;
|
|
};
|
|
|
|
struct _Termcell
|
|
{
|
|
Eina_Unicode codepoint;
|
|
Termatt att;
|
|
unsigned char padding[2];
|
|
};
|
|
|
|
struct _Termsave
|
|
{
|
|
unsigned int gen : 8;
|
|
unsigned int comp : 1;
|
|
unsigned int z : 1;
|
|
unsigned int w : 22;
|
|
/* TODO: union ? */
|
|
Termcell *cells;
|
|
};
|
|
|
|
/* TODO: RESIZE rewrite Termsavecomp */
|
|
struct _Termsavecomp
|
|
{
|
|
unsigned int gen : 8;
|
|
unsigned int comp : 1;
|
|
unsigned int z : 1;
|
|
unsigned int w : 22; // compressed size in bytes
|
|
unsigned int wout; // output width in Termcells
|
|
};
|
|
|
|
struct _Termblock
|
|
{
|
|
Termpty *pty;
|
|
const char *path, *link, *chid;
|
|
Evas_Object *obj;
|
|
Eina_List *cmds;
|
|
int id;
|
|
int type;
|
|
int refs;
|
|
short w, h;
|
|
short x, y;
|
|
unsigned char scale_stretch : 1;
|
|
unsigned char scale_center : 1;
|
|
unsigned char scale_fill : 1;
|
|
unsigned char thumb : 1;
|
|
unsigned char edje : 1;
|
|
|
|
unsigned char active : 1;
|
|
unsigned char was_active : 1;
|
|
unsigned char was_active_before : 1;
|
|
|
|
unsigned char mov_state : 2; // movie state marker
|
|
};
|
|
|
|
struct _Termexp
|
|
{
|
|
int ch, left, id;
|
|
int x, y, w, h;
|
|
};
|
|
|
|
void termpty_init(void);
|
|
void termpty_shutdown(void);
|
|
|
|
Termpty *termpty_new(const char *cmd, Eina_Bool login_shell, const char *cd,
|
|
int w, int h, int backscroll, Eina_Bool xterm_256color,
|
|
Eina_Bool erase_is_del, const char *emotion_mod);
|
|
void termpty_free(Termpty *ty);
|
|
|
|
void termpty_backlog_lock(void);
|
|
void termpty_backlog_unlock(void);
|
|
|
|
Termcell *termpty_cellrow_get(Termpty *ty, int y, ssize_t *wret);
|
|
ssize_t termpty_row_length(Termpty *ty, int y);
|
|
void termpty_write(Termpty *ty, const char *input, int len);
|
|
void termpty_resize(Termpty *ty, int new_w, int new_h);
|
|
void termpty_backlog_size_set(Termpty *ty, size_t size);
|
|
ssize_t termpty_backlog_length(Termpty *ty);
|
|
void termpty_backscroll_adjust(Termpty *ty, int *scroll);
|
|
|
|
pid_t termpty_pid_get(const Termpty *ty);
|
|
void termpty_block_free(Termblock *tb);
|
|
Termblock *termpty_block_new(Termpty *ty, int w, int h, const char *path, const char *link);
|
|
void termpty_block_insert(Termpty *ty, int ch, Termblock *blk);
|
|
int termpty_block_id_get(Termcell *cell, int *x, int *y);
|
|
Termblock *termpty_block_get(Termpty *ty, int id);
|
|
void termpty_block_chid_update(Termpty *ty, Termblock *blk);
|
|
Termblock *termpty_block_chid_get(Termpty *ty, const char *chid);
|
|
|
|
void termpty_cell_copy(Termpty *ty, Termcell *src, Termcell *dst, int n);
|
|
void termpty_cell_fill(Termpty *ty, Termcell *src, Termcell *dst, int n);
|
|
void termpty_cell_codepoint_att_fill(Termpty *ty, Eina_Unicode codepoint, Termatt att, Termcell *dst, int n);
|
|
void termpty_screen_swap(Termpty *ty);
|
|
|
|
ssize_t termpty_line_length(const Termcell *cells, ssize_t nb_cells);
|
|
|
|
Config *termpty_config_get(const Termpty *ty);
|
|
void termpty_handle_buf(Termpty *ty, const Eina_Unicode *codepoints, int len);
|
|
|
|
extern int _termpty_log_dom;
|
|
|
|
#define TERMPTY_SCREEN(Tpty, X, Y) \
|
|
Tpty->screen[X + (((Y + Tpty->circular_offset) % Tpty->h) * Tpty->w)]
|
|
#define TERMPTY_FMTCLR(Tatt) \
|
|
(Tatt).autowrapped = (Tatt).newline = (Tatt).tab = 0
|
|
|
|
#define TERMPTY_RESTRICT_FIELD(Field, Min, Max) \
|
|
do { \
|
|
if (Field >= Max) \
|
|
Field = Max - 1; \
|
|
else if (Field < Min) \
|
|
Field = Min; \
|
|
} while (0)
|
|
|
|
#endif
|