/*--------------------------------*-C-*---------------------------------* * File: screen.h * * This module is all new by Robert Nation * * * Additional modifications by mj olesen * No additional restrictions are applied. * * As usual, the author accepts no responsibility for anything, nor does * he guarantee anything whatsoever. *----------------------------------------------------------------------*/ #ifndef _SCREEN_H #define _SCREEN_H #include #include "main.h" /************ Macros and Definitions ************/ #define WRAP_CHAR (MAX_COLS + 1) #define PROP_SIZE 4096 #define TABSIZE 8 /* default tab size */ #define ZERO_SCROLLBACK do { \ D_SCREEN(("ZERO_SCROLLBACK()\n")); \ if (Options & Opt_homeOnEcho) TermWin.view_start = 0; \ } while (0) #define REFRESH_ZERO_SCROLLBACK do { \ D_SCREEN(("REFRESH_ZERO_SCROLLBACK()\n")); \ if (Options & Opt_homeOnRefresh) TermWin.view_start = 0; \ } while (0) #define CHECK_SELECTION do { \ if (selection.op) selection_check(); \ } while (0) #define scr_touch() scr_expose(0, 0, TermWin.width, TermWin.height) /* * CLEAR_ROWS : clear rows starting from row * CLEAR_CHARS: clear chars starting from pixel position * ERASE_ROWS : set rows starting from row to the foreground color */ #define drawBuffer (TermWin.vt) #define CLEAR_ROWS(row, num) do { \ XClearArea(Xdisplay, drawBuffer, Col2Pixel(0), Row2Pixel(row), \ TermWin.width, Height2Pixel(num), 0); \ } while (0) #define CLEAR_CHARS(x, y, num) do { \ D_SCREEN(("CLEAR_CHARS(%d, %d, %d)\n", x, y, num)); \ XClearArea(Xdisplay, drawBuffer, x, y, Width2Pixel(num), Height2Pixel(1), 0); \ } while (0) #define FAST_CLEAR_CHARS(x, y, num) do { \ clear_area(Xdisplay, drawBuffer, x, y, Width2Pixel(num), Height2Pixel(1), 0); \ } while (0) #define ERASE_ROWS(row, num) do { \ XFillRectangle(Xdisplay, drawBuffer, TermWin.gc, Col2Pixel(0), Row2Pixel(row), \ TermWin.width, Height2Pixel(num)); \ } while (0) /* Screen refresh methods */ #define NO_REFRESH 0 /* Window not visible at all! */ #define FAST_REFRESH (1<<1) /* Fully exposed window */ #define SLOW_REFRESH (1<<2) /* Partially exposed window */ #define SMOOTH_REFRESH (1<<3) /* Do sync'ing to make it smooth */ #define IGNORE 0 #define SAVE 's' #define RESTORE 'r' #define REVERT IGNORE #define INVOKE RESTORE /* flags for scr_gotorc() */ #define C_RELATIVE 1 /* col movement is relative */ #define R_RELATIVE 2 /* row movement is relative */ #define RELATIVE (R_RELATIVE|C_RELATIVE) /* modes for scr_insdel_chars(), scr_insdel_lines() */ #define INSERT -1 /* don't change these values */ #define DELETE +1 #define ERASE +2 /* modes for scr_page() - scroll page. used by scrollbar window */ enum { UP, DN, NO_DIR }; /* arguments for scr_change_screen() */ enum { PRIMARY, SECONDARY }; #define RS_None 0 /* Normal */ #define RS_Cursor 0x01000000u /* cursor location */ #define RS_Select 0x02000000u /* selected text */ #define RS_RVid 0x04000000u /* reverse video */ #define RS_Uline 0x08000000u /* underline */ #define RS_acsFont 0x10000000u /* ACS graphics character set */ #define RS_ukFont 0x20000000u /* UK character set */ #define RS_fontMask (RS_acsFont|RS_ukFont) #ifdef MULTI_CHARSET #define RS_multi0 0x40000000u /* only multibyte characters */ #define RS_multi1 0x80000000u /* multibyte 1st byte */ #define RS_multi2 (RS_multi0|RS_multi1) /* multibyte 2nd byte */ #define RS_multiMask (RS_multi0|RS_multi1) /* multibyte mask */ #endif #define RS_fgMask 0x00001F00u /* 32 colors */ #define RS_Bold 0x00008000u /* bold */ #define RS_bgMask 0x001F0000u /* 32 colors */ #define RS_Blink 0x00800000u /* blink */ #define RS_Dirty 0x00400000u /* forced update of char */ #define RS_attrMask (0xFF000000u|RS_Bold|RS_Blink) /* how to build & extract colors and attributes */ #define GET_FGCOLOR(r) (((r) & RS_fgMask)>>8) #define GET_BGCOLOR(r) (((r) & RS_bgMask)>>16) #define GET_ATTR(r) (((r) & RS_attrMask)) #define GET_BGATTR(r) (((r) & (RS_attrMask | RS_bgMask))) #define SET_FGCOLOR(r,fg) (((r) & ~RS_fgMask) | ((fg)<<8)) #define SET_BGCOLOR(r,bg) (((r) & ~RS_bgMask) | ((bg)<<16)) #define SET_ATTR(r,a) (((r) & ~RS_attrMask)| (a)) #define DEFAULT_RSTYLE (RS_None | (fgColor<<8) | (bgColor<<16)) /* 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) /************ Structures ************/ typedef unsigned char text_t; typedef unsigned int rend_t; typedef struct { int row, col; } row_col_t; /* * screen accounting: * screen_t elements * text: Contains all the text information including the scrollback * buffer. Each line is length (TermWin.ncol + 1) * The final character is either the _length_ of the line or * for wrapped lines: (MAX_COLS + 1) * rend: Contains rendition information: font, bold, color, 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 * * 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 end of selection * * Note: -TermWin.nscrolled <= beg.row <= mark.row <= end.row < TermWin.nrow * * Note: col == -1 ==> we're left of screen * * TermWin.saveLines: * Maximum number of lines in the scrollback buffer. * This is fixed for each rxvt instance. * TermWin.nscrolled: * Actual number of lines we've used of the scrollback buffer * 0 <= TermWin.nscrolled <= TermWin.saveLines * TermWin.view_start: * Offset back into the scrollback buffer for out current view * 0 <= TermWin.view_start <= TermWin.nscrolled * * 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 */ rend_t **rend; /* rendition, uses RS_ flags */ short row, /* cursor row on the screen */ col; /* cursor column on the screen */ short tscroll, /* top of settable scroll region */ bscroll; /* bottom of settable scroll region */ short charset; /* character set number [0..3] */ unsigned int flags; } screen_t; typedef struct { short row, /* cursor row */ col, /* cursor column */ charset; /* character set number [0..3] */ char charset_char; rend_t rstyle; /* rendition style */ } save_t; typedef struct { unsigned char *text; /* selected text */ int len; /* length of selected text */ enum { 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 */ } op; /* current operation */ short screen; /* screen being used */ short clicks; /* number of clicks */ row_col_t beg, mark, end; } selection_t; /************ Variables ************/ #ifndef NO_BRIGHTCOLOR extern unsigned int colorfgbg; #endif /************ Function Prototypes ************/ _XFUNCPROTOBEGIN extern void blank_line(text_t *, rend_t *, int, rend_t); extern void blank_dline(text_t *, rend_t *, int, rend_t); extern void blank_sline(text_t *, rend_t *, int); extern void make_screen_mem(text_t **, rend_t **, int); extern void scr_reset(void); extern void scr_release(void); extern void scr_poweron(void); extern void scr_cursor(int); extern int scr_change_screen(int); extern void scr_color(unsigned int, unsigned int); extern void scr_rendition(int, int); extern int scroll_text(int, int, int, int); extern void scr_add_lines(const unsigned char *, int, int); extern void scr_backspace(void); extern void scr_tab(int); extern void scr_gotorc(int, int, int); extern void scr_index(int); extern void scr_erase_line(int); extern void scr_erase_screen(int); extern void scr_E(void); extern void scr_insdel_lines(int, int); extern void scr_insdel_chars(int, int); extern void scr_scroll_region(int, int); extern void scr_cursor_visible(int); extern void scr_autowrap(int); extern void scr_relative_origin(int); extern void scr_insert_mode(int); extern void scr_set_tab(int); extern void scr_rvideo_mode(int); extern void scr_report_position(void); extern void set_font_style(void); extern void scr_charset_choose(int); extern void scr_charset_set(int, unsigned int); extern void set_multichar_encoding(const char *); extern int scr_get_fgcolor(void); extern int scr_get_bgcolor(void); extern void scr_expose(int, int, int, int); extern int scr_move_to(int, int); extern int scr_page(int, int); extern void scr_bell(void); extern void scr_printscreen(int); extern void scr_refresh(int); extern void selection_check(void); extern void PasteIt(unsigned char *, unsigned int); extern void selection_paste(Window, unsigned, int); extern void selection_request(Time, int, int); extern void selection_reset(void); extern void selection_clear(void); extern void selection_setclr(int, int, int, int, int); extern void selection_start(int, int); extern void selection_start_colrow(int, int); extern void selection_make(Time); extern void selection_click(int, int, int); extern void selection_delimit_word(int, int, row_col_t *, row_col_t *); extern void selection_extend(int, int, int); extern void selection_extend_colrow(int, int, int, int); extern void selection_rotate(int, int); extern void selection_send(XSelectionRequestEvent *); extern void mouse_report(XButtonEvent *); extern void mouse_tracking(int, int, int, int, int); extern void debug_PasteIt(unsigned char *, int); extern int debug_selection(void); extern void debug_colors(void); _XFUNCPROTOEND #endif