--- rxvt-unicode/src/rxvtlib.h.in 2003/11/24 17:28:08 1.1 +++ rxvt-unicode/src/rxvtlib.h.in 2007/10/31 09:55:24 1.78 @@ -1,31 +1,9 @@ -/* - * $Id: rxvtlib.h.in,v 1.1 2003/11/24 17:28:08 pcg Exp $ - */ - -#ifndef _RXVTLIB_H_ /* include once only */ +#ifndef _RXVTLIB_H_ /* include once only */ #define _RXVTLIB_H_ -/* - * section 1 generated by GNU autoconf for @build@ - * this section may be changed as appropriate _before_ building - */ -/***************************************************************************** - * SECTION 1 * - *****************************************************************************/ - -/* - * The following line MUST not be changed without also changing - * config.h in the main directory before building - */ -// none anymore - -/***************************************************************************** - * INCLUDES * - *****************************************************************************/ - -#include -#include -#include +#include +#include +#include @include_stdarg_h@ @include_stdlib_h@ @include_stdint_h@ @@ -44,8 +22,20 @@ #include #include +#if HAVE_CWCHAR +# include +#elif HAVE_WCHAR_H +# include +#else +// stdlib.h might provide it +#endif + +using namespace std; + extern "C" { -#include /* Xlib, Xutil, Xresource, Xfuncproto */ +#include +#include +#include } /* @@ -62,109 +52,105 @@ /* whatever normal size corresponds to a unsigned integer pointer */ @rxvt_u_intp_define@ -/***************************************************************************** - * SECTION 2 * - * DO NOT TOUCH ANYTHING BELOW HERE * - *****************************************************************************/ - struct rxvt_fontset; struct rxvt_color; -struct rxvt_vars; /* defined later on */ -struct rxvt_hidden; /* not defined here */ - -extern struct rxvt_vars *rxvt_current_term; - -#if EXPLICIT_CONTEXT - -# define pR struct rxvt_vars *rxvt_term -# define aR rxvt_term -# define pR_ pR, -# define aR_ aR, - -# define R rxvt_term +struct rxvt_vars; /* defined later on */ +struct rxvt_term; +struct rxvt_im; +struct rxvt_drawable; -# define SET_R(r) rxvt_current_term = (r) -# define GET_R rxvt_current_term +typedef struct rxvt_term *rxvt_t; -#else - -# define pR -# define pR_ -# define aR -# define aR_ - -# define R rxvt_current_term - -# define SET_R(r) rxvt_current_term = (r) -# define GET_R R - -#endif +extern rxvt_t rxvt_current_term; -#define dR rxvt_t *rxvt_term = GET_R - -#define scrollbar_visible(rxvtvars) ((rxvtvars)->scrollBar.state) -#define menubar_visible(rxvtvars) ((rxvtvars)->menuBar.state) +#define SET_R(r) rxvt_current_term = const_cast(r) +#define GET_R rxvt_current_term typedef struct { - int32_t row; - int32_t col; + int row; + int col; } row_col_t; -#if UNICODE3 +#if UNICODE_3 typedef uint32_t text_t; #else typedef uint16_t text_t; // saves lots of memory #endif typedef uint32_t rend_t; +typedef int32_t tlen_t; // was int16_t, but this results in smaller code and memory use +typedef int32_t tlen_t_; // specifically for use in the line_t structure + +struct line_t; /* - * TermWin elements limits - * width : 1 <= width - * height : 1 <= height - * ncol : 1 <= ncol <= MAX(int16_t) - * nrow : 1 <= nrow <= MAX(int16_t) - * saveLines : 0 <= saveLines <= MAX(int16_t) - * nscrolled : 0 <= nscrolled <= saveLines - * view_start: 0 <= view_start <= nscrolled + * terminal limits: + * + * width : 1 <= width + * height : 1 <= height + * ncol : 1 <= ncol <= MAX(tlen_t) + * nrow : 1 <= nrow <= MAX(int) + * saveLines : 0 <= saveLines <= MAX(int) + * term_start : 0 <= term_start < saveLines + * total_rows : nrow + saveLines + * + * top_row : -saveLines <= top_row <= 0 + * view_start : top_row <= view_start <= 0 + * + * | most coordinates are stored relative to term_start, + * ROW_BUF | which is the first line of the terminal screen + * |························= row_buf[0] + * |························= row_buf[1] + * |························= row_buf[2] etc. + * | + * +------------+···········= term_start + top_row + * | scrollback | + * | scrollback +---------+·= term_start + view_start + * | scrollback | display | + * | scrollback | display | + * +------------+·display·+·= term_start + * | terminal | display | + * | terminal +---------+ + * | terminal | + * | terminal | + * +------------+···········= term_stat + nrow - 1 + * | + * | + * END······················= total_rows */ -typedef struct { - uint16_t width; /* window width [pixels] */ - uint16_t height; /* window height [pixels] */ - uint16_t fwidth; /* font width [pixels] */ - uint16_t fheight; /* font height [pixels] */ - uint16_t fbase; /* font ascent (baseline) [pixels] */ - uint16_t propfont; /* font proportional flags */ - uint16_t ncol; /* window columns [characters] */ - uint16_t nrow; /* window rows [characters] */ - uint16_t focus; /* window has focus */ - uint16_t mapped; /* window state mapped? */ - uint16_t int_bwidth; /* internal border width */ - uint16_t ext_bwidth; /* external border width */ - uint16_t lineSpace; /* number of extra pixels between rows */ - uint16_t saveLines; /* number of lines that fit in scrollback */ - uint16_t nscrolled; /* number of line actually scrolled */ - uint16_t view_start; /* scrollback view starts here */ - Window parent[6]; /* parent identifiers - we're parent[0] */ - Window vt; /* vt100 window */ - GC gc; /* GC for drawing */ - Pixmap pixmap; - rxvt_fontset *fontset; -} TermWin_t; +struct TermWin_t { + int width; /* window width [pixels] */ + int height; /* window height [pixels] */ + int fwidth; /* font width [pixels] */ + int fheight; /* font height [pixels] */ + int fbase; /* font ascent (baseline) [pixels] */ + int ncol; /* window columns [characters] */ + int nrow; /* window rows [characters] */ + int focus; /* window has focus */ + int mapped; /* window state mapped? */ + int int_bwidth; /* internal border width */ + int ext_bwidth; /* external border width */ + int lineSpace; /* number of extra pixels between rows */ + int saveLines; /* number of lines that fit in scrollback */ + int total_rows; /* total number of rows in this terminal */ + int term_start; /* term lines start here */ + int view_start; /* scrollback view starts here */ + int top_row; /* topmost row index of scrollback */ + Window parent[6]; /* parent identifiers - we're parent[0] */ + Window vt; /* vt100 window */ + GC gc; /* GC for drawing */ + Pixmap pixmap; + rxvt_drawable *drawable; + rxvt_fontset *fontset[4]; +}; /* * screen accounting: * screen_t elements - * text: Contains all text information including the scrollback buffer. - * Each line is length TermWin.ncol - * tlen: The length of the line or -1 for wrapped lines. - * rend: Contains rendition information: font, bold, colour, etc. - * * Note: Each line for both text and rend are only allocated on demand, and - * text[x] is allocated <=> rend[x] is allocated for all x. - * row: Cursor row position : 0 <= row < TermWin.nrow - * col: Cursor column position : 0 <= col < TermWin.ncol - * tscroll: Scrolling region top row inclusive : 0 <= row < TermWin.nrow - * bscroll: Scrolling region bottom row inclusive : 0 <= row < TermWin.nrow + * row: Cursor row position : 0 <= row < nrow + * col: Cursor column position : 0 <= col < ncol + * tscroll: Scrolling region top row inclusive : 0 <= row < nrow + * bscroll: Scrolling region bottom row inclusive : 0 <= row < nrow * * selection_t elements * clicks: 1, 2 or 3 clicks - 4 indicates a special condition of 1 where @@ -172,174 +158,105 @@ * beg: row/column of beginning of selection : never past mark * mark: row/column of initial click : never past end * end: row/column of one character past end of selection - * * Note: -TermWin.nscrolled <= beg.row <= mark.row <= end.row < TermWin.nrow + * * Note: -nsaved <= beg.row <= mark.row <= end.row < nrow * * Note: col == -1 ==> we're left of screen * - * Layout of text/rend information in the screen_t text/rend structures: - * Rows [0] ... [TermWin.saveLines - 1] - * scrollback region : we're only here if TermWin.view_start != 0 - * Rows [TermWin.saveLines] ... [TermWin.saveLines + TermWin.nrow - 1] - * normal `unscrolled' screen region */ typedef struct { - text_t **text; /* _all_ the text */ - int16_t *tlen; /* length of each text line */ - rend_t **rend; /* rendition, uses RS_ flags */ - row_col_t cur; /* cursor position on the screen */ - uint16_t tscroll; /* top of settable scroll region */ - uint16_t bscroll; /* bottom of settable scroll region */ - uint16_t charset; /* character set number [0..3] */ - unsigned int flags; /* see below */ - row_col_t s_cur; /* saved cursor position */ - uint16_t s_charset; /* saved character set number [0..3] */ - char s_charset_char; - rend_t s_rstyle; /* saved rendition style */ + row_col_t cur; /* cursor position on the screen */ + int tscroll; /* top of settable scroll region */ + int bscroll; /* bottom of settable scroll region */ + unsigned int charset; /* character set number [0..3] */ + unsigned int flags; /* see below */ + row_col_t s_cur; /* saved cursor position */ + unsigned int s_charset; /* saved character set number [0..3] */ + char s_charset_char; + rend_t s_rstyle; /* saved rendition style */ } screen_t; enum selection_op_t { - SELECTION_CLEAR = 0, /* nothing selected */ - SELECTION_INIT, /* marked a point */ - SELECTION_BEGIN, /* started a selection */ - SELECTION_CONT, /* continued selection */ - SELECTION_DONE /* selection put in CUT_BUFFER0 */ + SELECTION_CLEAR = 0, /* nothing selected */ + SELECTION_INIT, /* marked a point */ + SELECTION_BEGIN, /* started a selection */ + SELECTION_CONT, /* continued selection */ + SELECTION_DONE /* selection put in CUT_BUFFER0 */ }; typedef struct { - unsigned char *text; /* selected text */ - uint32_t len; /* length of selected text */ - short screen; /* screen being used */ - short clicks; /* number of clicks */ - selection_op_t op; /* current operation */ - row_col_t beg; /* beginning of selection <= mark */ - row_col_t mark; /* point of initial click <= end */ - row_col_t end; /* one character past end point */ + wchar_t *text; /* selected text */ + unsigned int len; /* length of selected text */ + unsigned int screen; /* screen being used */ + unsigned int clicks; /* number of clicks */ + selection_op_t op; /* current operation */ + bool rect; /* rectangular selection? */ + row_col_t beg; /* beginning of selection <= mark */ + row_col_t mark; /* point of initial click <= end */ + row_col_t end; /* one character past end point */ } selection_t; -typedef enum { - OLD_SELECT, OLD_WORD_SELECT, NEW_SELECT -} sstyle_t; - /* ------------------------------------------------------------------------- */ /* screen_t flags */ -#define Screen_Relative (1<<0) /* relative origin mode flag */ -#define Screen_VisibleCursor (1<<1) /* cursor visible? */ -#define Screen_Autowrap (1<<2) /* auto-wrap flag */ -#define Screen_Insert (1<<3) /* insert mode (vs. overstrike) */ -#define Screen_WrapNext (1<<4) /* need to wrap for next char? */ -#define Screen_DefaultFlags (Screen_VisibleCursor|Screen_Autowrap) - -/* rxvt_vars.Options */ -#define Opt_console (1LU<<0) -#define Opt_loginShell (1LU<<1) -#define Opt_iconic (1LU<<2) -#define Opt_visualBell (1LU<<3) -#define Opt_mapAlert (1LU<<4) -#define Opt_reverseVideo (1LU<<5) -#define Opt_utmpInhibit (1LU<<6) -#define Opt_scrollBar (1LU<<7) -#define Opt_scrollBar_right (1LU<<8) -#define Opt_scrollBar_floating (1LU<<9) -#define Opt_meta8 (1LU<<10) -#define Opt_scrollTtyOutput (1LU<<11) -#define Opt_scrollTtyKeypress (1LU<<12) -#define Opt_transparent (1LU<<13) -#define Opt_transparent_all (1LU<<14) -#define Opt_mc_hack (1LU<<15) -#define Opt_tripleclickwords (1LU<<16) -#define Opt_scrollWithBuffer (1LU<<17) -#define Opt_jumpScroll (1LU<<18) -#define Opt_mouseWheelScrollPage (1LU<<19) -#define Opt_pointerBlank (1LU<<20) -#define Opt_cursorBlink (1LU<<21) -/* place holder used for parsing command-line options */ -#define Opt_Reverse (1LU<<30) -#define Opt_Boolean (1LU<<31) - -#define DEFAULT_OPTIONS (Opt_scrollBar | Opt_scrollTtyOutput \ - | Opt_jumpScroll) - -#define PROPFONT_NORMAL (1<<0) -#define PROPFONT_BOLD (1<<1) +#define Screen_Relative (1<<0) /* relative origin mode flag */ +#define Screen_VisibleCursor (1<<1) /* cursor visible? */ +#define Screen_Autowrap (1<<2) /* auto-wrap flag */ +#define Screen_Insert (1<<3) /* insert mode (vs. overstrike) */ +#define Screen_WrapNext (1<<4) /* need to wrap for next char? */ +#define Screen_DefaultFlags (Screen_VisibleCursor | Screen_Autowrap) + +/* rxvt_vars.options */ +enum { +# define def(name,idx) Opt_ ## name = idx, +# define nodef(name) Opt_ ## name = 0, +# include "optinc.h" +# undef nodef +# undef def +Opt_count +}; /* ------------------------------------------------------------------------- */ -typedef enum { - EUCJ, SJIS, /* Japanese KANJI methods */ - BIG5, CNS, /* Chinese BIG5 methods: CNS not implemented */ - GB, /* Chinese GB method */ - KR, /* Korean method */ - NOENC /* no encoding */ -} ENC_METHOD; - typedef struct { - short method; - void (*func)(unsigned char *, int); - char *name; -} KNOWN_ENCODINGS; - -typedef struct { - short state; - Window win; -} menuBar_t; - -typedef struct { - char state; /* scrollbar state */ - char init; /* scrollbar has been initialised */ - short beg; /* slider sub-window begin height */ - short end; /* slider sub-window end height */ - short top; /* slider top position */ - short bot; /* slider bottom position */ - short style; /* style: rxvt, xterm, next */ - short width; /* scrollbar width */ - Window win; - int (*update)(pR_ int, int, int, int); + char state; /* scrollbar state */ + char init; /* scrollbar has been initialised */ + unsigned int beg; /* slider sub-window begin height */ + unsigned int end; /* slider sub-window end height */ + unsigned int top; /* slider top position */ + unsigned int bot; /* slider bottom position */ + unsigned int style; /* style: rxvt, xterm, next */ + unsigned int width; /* scrollbar width */ + Window win; + int (rxvt_term::*update)(int, int, int, int); + + void setIdle() { state = 1 ; } + void setMotion() { state = 'm'; } + void setUp() { state = 'U'; } + void setDn() { state = 'D'; } } scrollBar_t; -typedef struct rxvt_vars { -/* - * These ``hidden'' items are not for public consumption and - * must not be accessed externally - */ - struct rxvt_hidden *h; +struct rxvt_vars : TermWin_t { + scrollBar_t scrollBar; + uint8_t options[(Opt_count + 7) >> 3]; + XSizeHints szHint; + rxvt_color *pix_colors; + rxvt_color *pix_colors_focused; +#ifdef OFF_FOCUS_FADING + rxvt_color *pix_colors_unfocused; +#endif + short numpix_colors; + Cursor TermWin_cursor; /* cursor for vt window */ + int sb_shadow; /* scrollbar shadow width */ + int numlock_state; + line_t *row_buf; // all lines, scrollback + terminal, circular, followed by temp_buf + line_t *drawn_buf; // text on screen + line_t *swap_buf; // lines for swap buffer + char *tabs; /* per location: 1 == tab-stop */ + screen_t screen; + screen_t swap; + selection_t selection; +}; -/* - * Exposed items - * Changes to structure here require library version number change - */ - TermWin_t TermWin; - scrollBar_t scrollBar; - menuBar_t menuBar; - Display *Xdisplay; - unsigned long Options; - XSizeHints szHint; - Colormap Xcmap; - rxvt_color *PixColors; - short numPixColors; - Cursor TermWin_cursor; /* cursor for vt window */ - int Xdepth; - int sb_shadow; /* scrollbar shadow width */ - int Xfd; /* file descriptor of X server connection */ - int cmd_fd; /* pty file descriptor; connected to command */ - int tty_fd; /* tty file descriptor; connected to child */ - int num_fds; /* number of file descriptors being used */ - int numlock_state; - text_t **drawn_text; /* text drawn on screen (characters) */ - rend_t **drawn_rend; /* text drawn on screen (rendition) */ - text_t **buf_text; - rend_t **buf_rend; - char *tabs; /* per location: 1 == tab-stop */ - screen_t screen; - screen_t swap; - selection_t selection; - sstyle_t selection_style; - ENC_METHOD encoding_method; -} rxvt_t; - -/***************************************************************************** - * PROTOTYPES * - *****************************************************************************/ -void rxvt_main_loop(pR); -rxvt_t *rxvt_init(int, const char *const *); +void rxvt_init (); + +#endif /* _RXVTLIB_H_ */ -#endif /* _RXVTLIB_H_ */