X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=madtty%2Fmadtty.h;h=c790a50a19086e38e3bc85fbb8fc9916c33eab40;hb=226d6a58d4512b37d3f912f7be227f023b25c04c;hp=7424429fc90bd452bc2635e4c924beeb7696e2ab;hpb=1f877e6f07a48bc78f0b38d4fba4306d3a4688a2;p=apps%2Fmadtty.git diff --git a/madtty/madtty.h b/madtty/madtty.h index 7424429..c790a50 100644 --- a/madtty/madtty.h +++ b/madtty/madtty.h @@ -22,170 +22,28 @@ #ifndef MADTTY_MADTTY_H #define MADTTY_MADTTY_H -#include +#include #include #include #include #include #include +#include -/* Color codes: 0 = black, 1 = red, 2 = green, 3 = yellow, 4 = blue, - * 5 = magenta, 6 = cyan, 7 = white. - * - * An 'attribute' as used in this library means an 8-bit value that conveys - * a foreground color code, a background color code, and the bold - * and blink bits. Each cell in the virtual terminal screen is associated - * with an attribute that specifies its appearance. The bits of an attribute, - * from most significant to least significant, are - * - * bit: 7 6 5 4 3 2 1 0 - * content: S F F F H B B B - * | `-,-' | `-,-' - * | | | | - * | | | `----- 3-bit background color code (0 - 7) - * | | `--------- blink bit (if on, text is blinking) - * | `------------- 3-bit foreground color code (0 - 7) - * `----------------- bold bit - * - * It is however recommended that you use the provided macros rather - * than dealing with this format directly. - * - * Sometimes we will call the 'SFFF' nibble above the 'extended - * foreground color code', and the 'HBBB' nibble the 'extended background - * color code'. So the extended color codes are just the regular - * color codes except that they have an additional bit (the most significant - * bit) indicating bold/blink. - */ - -/* retrieve attribute fields */ -#define ROTE_ATTR_BG(attr) ((attr) & 0x07) -#define ROTE_ATTR_FG(attr) (((attr) & 0x70) >> 4) - -/* retrieve 'extended' color codes (see above for info) */ -#define ROTE_ATTR_XBG(attr) ((attr) & 0x0F) -#define ROTE_ATTR_XFG(attr) (((attr) & 0xF0) >> 4) - -/* set attribute fields. This requires attr to be an lvalue, and it will - * be evaluated more than once. Use with care. */ -#define ROTE_ATTR_MOD_BG(attr, newbg) attr &= 0xF8, attr |= (newbg) -#define ROTE_ATTR_MOD_FG(attr, newfg) attr &= 0x8F, attr |= ((newfg) << 4) -#define ROTE_ATTR_MOD_XBG(attr, newxbg) attr &= 0xF0, attr |= (newxbg) -#define ROTE_ATTR_MOD_XFG(attr, newxfg) attr &= 0x0F, attr |= ((newxfg) << 4) -#define ROTE_ATTR_MOD_BOLD(attr, boldbit) \ - attr &= 0x7F, attr |= (boldbit)?0x80:0x00 -#define ROTE_ATTR_MOD_BLINK(attr, blinkbit) \ - attr &= 0xF7, attr |= (blinkbit)?0x08:0x00 - -/* these return non-zero for 'yes', zero for 'no'. Don't rely on them being - * any more specific than that (e.g. being exactly 1 for 'yes' or whatever). */ -#define ROTE_ATTR_BOLD(attr) ((attr) & 0x80) -#define ROTE_ATTR_BLINK(attr) ((attr) & 0x08) - -/* Represents each of the text cells in the terminal screen */ -typedef struct RoteCell_ { - char s[4]; - char len; - uint8_t attr; /* a color attribute, as described previously */ -} RoteCell; - -/* Declaration of opaque rote_Term_Private structure */ -typedef struct RoteTermPrivate_ RoteTermPrivate; - -/* Represents a virtual terminal. You may directly access the fields - * of this structure, but please pay close attention to the fields - * marked read-only or with special usage notes. */ -typedef struct RoteTerm_ { - int rows, cols; /* terminal dimensions, READ-ONLY. You - * can't resize the terminal by changing - * this (a segfault is about all you will - * accomplish). */ - - RoteCell **cells; /* matrix of cells. This - * matrix is indexed as cell[row][column] - * where 0 <= row < rows and - * 0 <= col < cols - * - * You may freely modify the contents of - * the cells. - */ - - int crow, ccol; /* cursor coordinates. READ-ONLY. */ - - uint8_t curattr; /* current attribute, that is the attribute - * that will be used for newly inserted - * characters */ +void madtty_init_colors(void); +int madtty_color_pair(int fg, int bg); +void madtty_init_vt100_graphics(void); - int pty; /* pty of the process */ - pid_t childpid; /* pid of the child process running in the - * terminal; 0 for none. This is READ-ONLY. */ +typedef struct madtty_t madtty_t; - RoteTermPrivate *pd; /* private state data */ - - unsigned insert : 1; /* insert or replace mode */ - - /* --- dirtiness flags: the following flags will be raised when the - * corresponding items are modified. They can only be unset by YOU - * (when, for example, you redraw the term or something) --- */ - unsigned curpos_dirty : 1; /* whether cursor location has changed */ - bool *line_dirty; /* whether each row is dirty */ - /* --- end dirtiness flags */ -} RoteTerm; - -/* Creates a new virtual terminal with the given dimensions. You - * must destroy it with rote_vt_destroy after you are done with it. - * The terminal will be initially blank and the cursor will - * be at the top-left corner. - * - * Returns NULL on error. - */ -RoteTerm *rote_vt_create(int rows, int cols); - -/* Destroys a virtual terminal previously created with - * rote_vt_create. If rt == NULL, does nothing. */ -void rote_vt_destroy(RoteTerm *rt); - -/* Starts a forked process in the terminal. The parameter - * is a shell command to execute (it will be interpreted by '/bin/sh -c') - * Returns the pid of the forked process. - * - * Some useful reminders: If you want to be notified when child processes exit, - * you should handle the SIGCHLD signal. If, on the other hand, you want to - * ignore exitting child processes, you should set the SIGCHLD handler to - * SIG_IGN to prevent child processes from hanging around the system as 'zombie - * processes'. - * - * Continuing to write to a RoteTerm whose child process has died does not - * accomplish a lot, but is not an error and should not cause your program - * to crash or block indefinitely or anything of that sort :-) - * If, however, you want to be tidy and inform the RoteTerm that its - * child has died, call rote_vt_forsake_child when appropriate. - * - * If there is an error, returns -1. Notice that passing an invalid - * command will not cause an error at this level: the shell will try - * to execute the command and will exit with status 127. You can catch - * that by installing a SIGCHLD handler if you want. - */ -pid_t rote_vt_forkpty(RoteTerm *rt, const char *path, const char *argv[]); - -int rote_vt_read(RoteTerm *rt, char *buf, int buflen); -int rote_vt_write(RoteTerm *rt, const char *data, int length); - -/* Inject data into the terminal. needs NOT be 0-terminated: - * its length is solely determined by the parameter. Please - * notice that this writes directly to the terminal, that is, - * this function does NOT send the data to the forked process - * running in the terminal (if any). For that, you might want - * to use rote_vt_write. - */ -int rote_vt_inject(RoteTerm *rt, const char *data, int length); -void rote_vt_draw(RoteTerm *rt, WINDOW *win, int startrow, int startcol); +madtty_t *madtty_create(int rows, int cols); +void madtty_resize(madtty_t *, int rows, int cols); +void madtty_destroy(madtty_t *); +pid_t madtty_forkpty(madtty_t *, const char *, const char *argv[], int *pty); +int madtty_getpty(madtty_t *); -/* Indicates to the terminal that the given key has been pressed. - * This will cause the terminal to rote_vt_write() the appropriate - * escape sequence for that key (that is, the escape sequence - * that the linux text-mode console would produce for it). The argument, - * keycode, must be a CURSES EXTENDED KEYCODE, the ones you get - * when you use keypad(somewin, TRUE) (see man page). */ -void rote_vt_keypress(RoteTerm *rt, int keycode); +int madtty_process(madtty_t *); +void madtty_keypress(madtty_t *, int keycode); +void madtty_draw(madtty_t *, WINDOW *win, int startrow, int startcol); #endif /* MADTTY_MADTTY_H */