Correctly display vt100 graphics in non UTF-8 locales.
[apps/madtty.git] / madtty / madtty.h
index 7424429..c790a50 100644 (file)
 #ifndef MADTTY_MADTTY_H
 #define MADTTY_MADTTY_H
 
-#include <ncursesw/curses.h>
+#include <ncurses.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <wchar.h>
 
-/* 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 <command> 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. <data> needs NOT be 0-terminated:
- * its length is solely determined by the <length> 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 */