#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
+ attr &= 0x7F, attr |= (boldbit)?0x80:0x00
#define ROTE_ATTR_MOD_BLINK(attr, blinkbit) \
- attr &= 0xF7, attr |= (blinkbit)?0x08:0x00
+ 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). */
/* Represents each of the text cells in the terminal screen */
typedef struct RoteCell_ {
- unsigned char ch; /* >= 32, that is, control characters are not
- * allowed to be on the virtual screen */
+ unsigned int ch; /* >= 32, that is, control characters are not
+ * allowed to be on the virtual screen */
- unsigned char attr; /* a color attribute, as described previously */
+ unsigned char attr; /* a color attribute, as described previously */
} RoteCell;
/* Declaration of opaque rote_Term_Private structure */
* 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. */
-
- unsigned char curattr; /* current attribute, that is the attribute
- * that will be used for newly inserted
- * characters */
-
- pid_t childpid; /* pid of the child process running in the
- * terminal; 0 for none. This is READ-ONLY. */
-
- RoteTermPrivate *pd; /* private state data */
-
- bool insert; /* 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) --- */
- bool curpos_dirty; /* whether cursor location has changed */
- bool *line_dirty; /* whether each row is dirty */
- /* --- end dirtiness flags */
+ 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. */
+
+ unsigned char curattr; /* current attribute, that is the attribute
+ * that will be used for newly inserted
+ * characters */
+
+ 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. */
+
+ RoteTermPrivate *pd; /* private state data */
+
+ bool insert; /* 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) --- */
+ bool curpos_dirty; /* 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
* 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 *command);
+pid_t rote_vt_forkpty(RoteTerm *rt, const char *path, const char *argv[]);
/* Disconnects the RoteTerm from its forked child process. This function
* should be called when the child process dies or something of the sort.
* certainly tidy. */
void rote_vt_forsake_child(RoteTerm *rt);
-/* Does some data plumbing, that is, sees if the sub process has
- * something to write to the terminal, and if so, write it. If you
- * called rote_vt_fork to start a forked process, you must call
- * this function regularly to update the terminal.
- *
- * This function will not block, that is, if there is no data to be
- * read from the child process it will return immediately. */
-void rote_vt_update(RoteTerm *rt);
+int rote_vt_read(RoteTerm *rt, char *buf, int buflen);
/* Puts data into the terminal: if there is a forked process running,
* the data will be sent to it. If there is no forked process,
* cursor of the terminal is supposed to be.
*
* This function does not call wrefresh(win); you have to do that yourself.
- * This function automatically calls rote_vt_update prior to drawing
- * so that the drawn contents are accurate.
*/
void rote_vt_draw(RoteTerm *rt, WINDOW *win, int startrow, int startcol,
void (*cur_set_attr)(WINDOW *win, unsigned char attr));
* This function does NOT free() the passed buffer */
void rote_vt_restore_snapshot(RoteTerm *rt, void *snapbuf);
-/* Returns the pseudo tty descriptor associated with the given terminal.
- * Please don't do weird things with it (like close it for instance),
- * or things will break
- *
- * This function returns -1 if the given terminal does not yet have
- * an associated pty. A pty is only associated to a terminal when
- * needed, e.g. on a call to rote_vt_forkpty. */
-int rote_vt_get_pty_fd(RoteTerm *rt);
-
-/* Declaration of custom escape sequence callback type. See the
- * rote_vt_add_es_handler function for more info */
-typedef int (*rote_es_handler_t)(RoteTerm *rt, const char *es);
-
-/* Installs a custom escape sequence handler for the given RoteTerm.
- * The handler will be called by the library every time it tries to
- * recognize an escape sequence; depending on the return value of the
- * handler, it will proceed in a different manner. See the description
- * of the possible return values (ROTE_HANDLERESULT_* constants) below
- * for more info.
- *
- * This handler will be called EACH TIME THE ESCAPE SEQUENCE BUFFER
- * RECEIVES A CHARACTER. Therefore, it must execute speedily in order
- * not to create too heavy a performance penalty. In particular, the
- * writer of the handler should take care to quickly test for invalid
- * or incomplete escape sequences before trying to do more elaborate
- * parsing.
- *
- * The handler will NOT be called with an empty escape sequence (i.e.
- * one in which only the initial ESC was received).
- *
- * The custom handler receives the terminal it pertains to and the
- * escape sequence as a string (without the initial escape character).
- *
- * The handler may of course modify the terminal as it sees fit, taking
- * care not to corrupt it of course (in particular, it should appropriately
- * raise the line_dirty[] and curpos_dirty flags to indicate what it has
- * changed).
- */
-void rote_vt_install_handler(RoteTerm *rt, rote_es_handler_t handler);
-
-/* Possible return values for the custom handler function and their
- * meanings: */
-#define ROTE_HANDLERESULT_OK 0 /* means escape sequence was handled */
-
-#define ROTE_HANDLERESULT_NOTYET 1 /* means the escape sequence was not
- * recognized yet, but there is hope that
- * it still will once more characters
- * arrive (i.e. it is not yet complete).
- *
- * The library will thus continue collecting
- * characters and calling the handler as
- * each character arrives until
- * either OK or NOWAY is returned.
- */
-
-#define ROTE_HANDLERESULT_NOWAY 2 /* means the escape sequence was not
- * recognized, and there is no chance
- * that it will even if more characters
- * are added to it. */
-
#endif /* MADTTY_MADTTY_H */