--- rxvt-unicode/src/rxvt.h 2007/11/11 04:08:00 1.318 +++ rxvt-unicode/src/rxvt.h 2007/12/28 14:00:47 1.340 @@ -1,7 +1,49 @@ #ifndef RXVT_H_ /* include once only */ #define RXVT_H_ -#include "rxvtlib.h" +#include +#include +#include +#include +#include +#ifdef HAVE_STDINT_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_SYS_STRREDIR_H +#include +#endif + +#if HAVE_CWCHAR +# include +#elif HAVE_WCHAR_H +# include +#else +// stdlib.h might provide it +#endif + +using namespace std; + +extern "C" { +#include +#include +#include +} + +#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 #include "feature.h" @@ -20,6 +62,7 @@ # define ENABLE_XIM_ONTHESPOT 1 # define CURSOR_BLINK 1 # define OPTION_HC 1 +# define BUILTIN_GLYPHS 1 #else # define ENABLE_MINIMAL 1 #endif @@ -30,9 +73,6 @@ #include #include #include -#if ENABLE_FRILLS -# include -#endif #include "encoding.h" #include "rxvtutil.h" @@ -83,6 +123,19 @@ # define STDERR_FILENO 2 #endif +#if !defined (EACCESS) && defined(EAGAIN) +# define EACCESS EAGAIN +#endif + +#ifndef EXIT_SUCCESS /* missing from */ +# define EXIT_SUCCESS 0 /* exit function success */ +# define EXIT_FAILURE 1 /* exit function failure */ +#endif + +#ifndef PATH_MAX +# define PATH_MAX 16384 +#endif + /****************************************************************************/ // exception thrown on fatal (per-instance) errors @@ -97,9 +150,11 @@ ***************************************************************************** */ // main.C -void * rxvt_malloc (size_t size); -void * rxvt_calloc (size_t number, size_t size); -void * rxvt_realloc (void *ptr, size_t size); +#define SET_LOCALE(locale) rxvt_set_locale (locale) +extern bool rxvt_set_locale (const char *locale) NOTHROW; +extern void rxvt_push_locale (const char *locale) NOTHROW; +extern void rxvt_pop_locale () NOTHROW; +void rxvt_init (); // misc.C char * rxvt_wcstombs (const wchar_t *str, int len = -1); @@ -118,13 +173,18 @@ char ** rxvt_splitcommastring (const char *cs) NOTHROW; void rxvt_freecommastring (char **cs) NOTHROW; +void * rxvt_malloc (size_t size); +void * rxvt_calloc (size_t number, size_t size); +void * rxvt_realloc (void *ptr, size_t size); + ///////////////////////////////////////////////////////////////////////////// // temporarily replace the process environment extern char **environ; extern char **rxvt_environ; // the original environ pointer -static inline void set_environ (stringvec *envv) +static inline void +set_environ (stringvec *envv) { #if ENABLE_PERL assert (envv); @@ -134,7 +194,8 @@ environ = (char **)envv->begin (); } -static inline void set_environ (char **envv) +static inline void +set_environ (char **envv) { #if ENABLE_PERL assert (envv); @@ -149,7 +210,6 @@ * STRUCTURES AND TYPEDEFS ***************************************************************************** */ -struct grwin_t; /* If we're using either the rxvt scrollbar, keep the * scrollColor resource. @@ -171,16 +231,6 @@ unsigned int button; /* detail */ }; -#if ENABLE_FRILLS -typedef struct _mwmhints { - CARD32 flags; - CARD32 functions; - CARD32 decorations; - INT32 input_mode; - CARD32 status; -} MWMHints; -#endif - #if ENABLE_XEMBED // XEMBED messages # define XEMBED_EMBEDDED_NOTIFY 0 @@ -227,17 +277,6 @@ # define NO_MOUSE_REPORT_SCROLLBAR 1 #endif -/* now look for other badly set stuff */ - -#if !defined (EACCESS) && defined(EAGAIN) -# define EACCESS EAGAIN -#endif - -#ifndef EXIT_SUCCESS /* missing from */ -# define EXIT_SUCCESS 0 /* exit function success */ -# define EXIT_FAILURE 1 /* exit function failure */ -#endif - #define scrollBar_esc 30 #if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR) || defined(PLAIN_SCROLLBAR) @@ -594,8 +633,6 @@ #define PrivMode_LFNL (1UL<<19) #define PrivMode_MouseBtnEvent (1UL<<20) #define PrivMode_MouseAnyEvent (1UL<<21) -/* too annoying to implement X11 highlight tracking */ -/* #define PrivMode_MouseX11Track (1LU<<20) */ #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent) @@ -611,8 +648,15 @@ #define CBUFSIZ 2048 // size of command buffer #define UBUFSIZ 2048 // character buffer -#ifndef PATH_MAX -# define PATH_MAX 16384 +#if ENABLE_FRILLS +# include +typedef struct _mwmhints { + CARD32 flags; + CARD32 functions; + CARD32 decorations; + INT32 input_mode; + CARD32 status; +} MWMHints; #endif /* Motif window hints */ @@ -663,9 +707,6 @@ #define Width2Pixel(n) ((int32_t)(n) * (int32_t)fwidth) #define Height2Pixel(n) ((int32_t)(n) * (int32_t)fheight) -// for m >= -n, ensure remainder lies between 0..n-1 -#define MOD(m,n) (((m) + (n)) % (n)) - #define LINENO(n) MOD (term_start + int(n), total_rows) #define ROW(n) row_buf [LINENO (n)] @@ -732,11 +773,6 @@ typedef callback log_callback; typedef callback getfd_callback; -#define SET_LOCALE(locale) rxvt_set_locale (locale) -extern bool rxvt_set_locale (const char *locale) NOTHROW; -extern void rxvt_push_locale (const char *locale) NOTHROW; -extern void rxvt_pop_locale () NOTHROW; - /****************************************************************************/ #define LINE_LONGER 0x0001 // line is continued on the next row @@ -748,7 +784,7 @@ struct line_t { text_t *t; // terminal the text rend_t *r; // rendition, uses RS_ flags - tlen_t_ l; // length of each text line, LINE_CONT == continued on next line + tlen_t_ l; // length of each text line uint32_t f; // flags bool is_longer () @@ -801,7 +837,7 @@ #define UNICODE_MASK 0x1fffffUL -#if UNICODE3 +#if UNICODE_3 # define COMPOSE_LO 0x40000000UL # define COMPOSE_HI 0x400fffffUL # define IS_COMPOSE(n) ((int32_t)(n) >= COMPOSE_LO) @@ -849,6 +885,191 @@ class keyboard_manager; #endif +typedef struct rxvt_term *rxvt_t; + +extern rxvt_t rxvt_current_term; + +#define SET_R(r) rxvt_current_term = const_cast(r) +#define GET_R rxvt_current_term + +typedef struct { + int row; + int col; +} row_col_t; + +/* + * 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 + */ + +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 + * 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 + * nothing is selected + * 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: -nsaved <= beg.row <= mark.row <= end.row < nrow + * * Note: col == -1 ==> we're left of screen + * + */ +typedef struct { + 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 */ +}; + +typedef struct { + 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; + +/* ------------------------------------------------------------------------- */ + +/* 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 */ +enum { +# define def(name,idx) Opt_ ## name = idx, +# define nodef(name) Opt_ ## name = 0, +# include "optinc.h" +# undef nodef +# undef def +Opt_count +}; + +/* ------------------------------------------------------------------------- */ + +typedef struct { + 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; + +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 + 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; +}; + struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen { // special markers with magic addresses @@ -1013,6 +1234,9 @@ #ifdef KEYSYM_RESOURCE keyboard_manager *keyboard; #endif +#ifndef NO_RESOURCES + XrmDatabase option_db; +#endif const char *rs[NUM_RESOURCES]; /* command input buffering */ @@ -1049,7 +1273,11 @@ xevent_watcher rootwin_ev; #endif #ifdef HAVE_BG_PIXMAP - int update_background (); + void update_background (); +#if TRACE_PIXMAPS + void trace_update_background (const char *file, int line); +# define update_background() trace_update_background (__FILE__, __LINE__) +#endif void update_background_cb (ev::timer &w, int revents); ev::timer update_background_ev; #endif @@ -1062,8 +1290,8 @@ #endif void child_cb (ev::child &w, int revents); ev::child child_ev; - void prepare_cb (ev::prepare &w, int revents); ev::prepare prepare_ev; - void destroy_cb (ev::check &w, int revents); ev::check destroy_ev; + void destroy_cb (ev::idle &w, int revents); ev::idle destroy_ev; + void refresh_check (); void flush (); void flush_cb (ev::timer &w, int revents); ev::timer flush_ev; bool pty_fill (); @@ -1100,10 +1328,10 @@ void tt_write (const char *data, unsigned int len); void pty_write (); - bool init (stringvec *argv, stringvec *envv) + void init (stringvec *argv, stringvec *envv) { this->argv = argv; - return init (argv->size (), argv->begin (), envv); + init (argv->size (), argv->begin (), envv); } void make_current () const // make this the "currently active" urxvt instance @@ -1169,7 +1397,7 @@ void process_sgr_mode (unsigned int nargs, const int *arg); void process_graphics (); // init.C - bool init_vars (); + void init_vars (); void init_secondary (); const char **init_resources (int argc, const char *const *argv); void init_env (); @@ -1188,7 +1416,7 @@ ~rxvt_term (); void destroy (); void emergency_cleanup (); - bool init (int argc, const char *const *argv, stringvec *envv); + void init (int argc, const char *const *argv, stringvec *envv); void recolour_cursor (); void resize_all_windows (unsigned int newwidth, unsigned int newheight, int ignoreparent); void window_calc (unsigned int newwidth, unsigned int newheight); @@ -1265,11 +1493,19 @@ bool option (uint8_t opt) const NOTHROW { + if (!opt) + return 0; + + --opt; return options[opt >> 3] & (1 << (opt & 7)); } void set_option (uint8_t opt, bool set = true) NOTHROW { + if (!opt) + return; + + --opt; if (set) options[opt >> 3] |= (1 << (opt & 7)); else @@ -1398,5 +1634,5 @@ void extract_resources (); }; -#endif /* _RXVT_H_ */ +#endif /* _RXVT_H_ */