* SYSTEM HACKS
*****************************************************************************
*/
-/* Consistent defines - please report on the necessity
- * @ Unixware: defines (__svr4__)
- */
-#if defined (SVR4) && !defined (__svr4__)
-# define __svr4__ 1
-#endif
-#if defined (sun) && !defined (__sun__)
-# define __sun__ 1
-#endif
#ifndef HAVE_XPOINTER
typedef char *XPointer;
# define STDERR_FILENO 2
#endif
-#if !defined (EACCESS) && defined(EAGAIN)
-# define EACCESS EAGAIN
-#endif
-
#ifndef EXIT_SUCCESS /* missing from <stdlib.h> */
# define EXIT_SUCCESS 0 /* exit function success */
# define EXIT_FAILURE 1 /* exit function failure */
char * rxvt_wcstoutf8 (const wchar_t *str, int len = -1);
wchar_t * rxvt_utf8towcs (const char *str, int len = -1);
-char * rxvt_basename (const char *str) NOTHROW;
+const char * rxvt_basename (const char *str) NOTHROW;
void rxvt_vlog (const char *fmt, va_list arg_ptr) NOTHROW;
void rxvt_log (const char *fmt,...) NOTHROW;
void rxvt_warn (const char *fmt,...) NOTHROW;
*****************************************************************************
*/
-/* If we're using either the rxvt scrollbar, keep the
- * scrollColor resource.
- */
-#if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(PLAIN_SCROLLBAR)
-# define KEEP_SCROLLCOLOR 1
-#else
-# undef KEEP_SCROLLCOLOR
-#endif
-
/*
* the 'essential' information for reporting Mouse Events
* pared down from XButtonEvent
*/
-struct mouse_event {
+struct mouse_event
+{
int clicks;
Time time; /* milliseconds */
unsigned int state; /* key or button mask */
#define scrollBar_esc 30
-#if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR) || defined(PLAIN_SCROLLBAR)
-# define HAVE_SCROLLBARS 1
+#if !defined (RXVT_SCROLLBAR) && !defined (NEXT_SCROLLBAR)
+# define NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1
#endif
enum {
SECONDARY,
};
+// define various rendition bits and masks. the rendition word
+// is 32 bits in size, and we should use it as efficiently as possible
+
#define RS_None 0
-#define RS_fgMask 0x0000007fUL // 128 colors
-#define RS_bgMask 0x00003f80UL // 128 colors
+// GET_BGATTR depends on RS_fgShift > RS_bgShift
+#define RS_colorMask ((1UL << Color_Bits) - 1UL)
+#define RS_bgShift 0
+#define RS_fgShift (RS_bgShift + Color_Bits)
+#define RS_bgMask (RS_colorMask << RS_bgShift)
+#define RS_fgMask (RS_colorMask << RS_fgShift)
-// font styles
-#define RS_Bold 0x00004000UL // value 1
-#define RS_Italic 0x00008000UL // value 2
-
-// fake styles
-#define RS_Blink 0x00010000UL // blink
-#define RS_RVid 0x00020000UL // reverse video
-#define RS_Uline 0x00040000UL // underline
+// must have space for rxvt_fontset::fontCount * 2 + 2 values
+#define RS_fontShift (RS_fgShift + Color_Bits)
+#define RS_Careful (1UL << RS_fontShift) /* be careful when drawing these */
+#define RS_fontMask ((rxvt_fontset::fontCount << (RS_fontShift + 1)) | RS_Careful) // includes RS_Careful
-// toggle this to force redraw, must be != RS_Careful
-#define RS_redraw 0x01000000UL
+// toggle this to force redraw, must be != RS_Careful and otherwise "pretty neutral"
+#define RS_redraw (2UL << RS_fontShift)
// 5 custom bits for extensions
-#define RS_customCount 32
-#define RS_customMask 0x00f80000UL
-#define RS_customShift 19
+#define RS_customCount 16UL
+#define RS_customShift 23
+#define RS_customMask ((RS_customCount - 1UL) << RS_customShift)
-// other flags
-#define RS_Careful 0x80000000UL /* be careful when drawing these */
+// font styles
+#define RS_Bold (1UL << RS_styleShift)
+#define RS_Italic (2UL << RS_styleShift)
#define RS_styleCount 4
+#define RS_styleShift 27
#define RS_styleMask (RS_Bold | RS_Italic)
-#define RS_styleShift 14
+
+// fake styles
+#define RS_Blink (1UL << 29)
+#define RS_RVid (1UL << 30) // reverse video
+#define RS_Uline (1UL << 31) // underline
#define RS_baseattrMask (RS_Italic | RS_Bold | RS_Blink | RS_RVid | RS_Uline)
#define RS_attrMask (RS_baseattrMask | RS_fontMask)
-#define RS_fontCount 127 // not 127 or 256, see rxvtfont.h
-#define RS_fontMask 0xff000000UL // plenty(?) of fonts, includes RS_Careful
-#define RS_fontShift 24
-
-#define DEFAULT_RSTYLE (RS_None | Color_fg | (Color_bg << Color_Bits))
-#define OVERLAY_RSTYLE (RS_None | Color_Black | (Color_Yellow << Color_Bits))
+#define DEFAULT_RSTYLE (RS_None | (Color_fg << RS_fgShift) | (Color_bg << RS_bgShift))
+#define OVERLAY_RSTYLE (RS_None | (Color_Black << RS_fgShift) | (Color_Yellow << RS_bgShift))
#define Sel_none 0 /* Not waiting */
#define Sel_normal 0x01 /* normal selection */
URxvt_Color_tint = 705, // change actual tint colour
URxvt_Color_BD = 706, // change actual 'Bold' color
URxvt_Color_UL = 707, // change actual 'Underline' color
+ URxvt_Color_border = 708,
URxvt_font = 710,
URxvt_boldFont = 711,
URxvt_view_up = 720,
URxvt_view_down = 721,
- URxvt_perl = 777,
+ URxvt_perl = 777, // for use by perl extensions, starts with "extension-name;"
};
/* Words starting with `Color_' are colours. Others are counts */
Color_White = maxCOLOR,
#endif
minTermCOLOR = Color_White + 1,
+#ifndef USE_256_COLORS
maxTermCOLOR = Color_White + 72,
+#else
+ maxTermCOLOR = Color_White + 240,
+#endif
#ifndef NO_CURSORCOLOR
Color_cursor,
Color_cursor2,
#ifdef OPTION_HC
Color_HC,
#endif
-#ifdef KEEP_SCROLLCOLOR
Color_scroll,
+#ifdef RXVT_SCROLLBAR
Color_trough,
#endif
#if ENABLE_TRANSPARENCY
Color_fade,
#endif
NRS_COLORS, /* */
-#ifdef KEEP_SCROLLCOLOR
+#ifdef RXVT_SCROLLBAR
Color_topShadow = NRS_COLORS,
Color_bottomShadow,
TOTAL_COLORS
#endif
};
+#ifndef USE_256_COLORS
#define Color_Bits 7 // 0 .. maxTermCOLOR
+#else
+#define Color_Bits 9 // 0 .. maxTermCOLOR
+#endif
/*
* Resource list
#define PrivMode_LFNL (1UL<<19)
#define PrivMode_MouseBtnEvent (1UL<<20)
#define PrivMode_MouseAnyEvent (1UL<<21)
+#define PrivMode_BracketPaste (1UL<<22)
#define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent)
#define IMBUFSIZ 128 // input modifier buffer sizes
#define KBUFSZ 512 // size of keyboard mapping buffer
#define CBUFSIZ 2048 // size of command buffer
+#define CBUFCNT 8 // never call pty_fill/cmd_parse more than this often in a row
#define UBUFSIZ 2048 // character buffer
#if ENABLE_FRILLS
# include <X11/Xmd.h>
-typedef struct _mwmhints {
+typedef struct _mwmhints
+{
CARD32 flags;
CARD32 functions;
CARD32 decorations;
#define Width2Pixel(n) ((int32_t)(n) * (int32_t)fwidth)
#define Height2Pixel(n) ((int32_t)(n) * (int32_t)fheight)
-#define LINENO(n) MOD (term_start + int(n), total_rows)
-#define ROW(n) row_buf [LINENO (n)]
+#define LINENO_of(t,n) MOD ((t)->term_start + int(n), (t)->total_rows)
+#define ROW_of(t,n) (t)->row_buf [LINENO_of ((t), n)]
+
+#define LINENO(n) LINENO_of (this, n)
+#define ROW(n) ROW_of (this, n)
/* how to build & extract colors and attributes */
-#define GET_BASEFG(x) (((x) & RS_fgMask))
-#define GET_BASEBG(x) (((x) & RS_bgMask)>>Color_Bits)
+#define GET_BASEFG(x) (((x) & RS_fgMask) >> RS_fgShift)
+#define GET_BASEBG(x) (((x) & RS_bgMask) >> RS_bgShift)
#define GET_FONT(x) (((x) & RS_fontMask) >> RS_fontShift)
#define SET_FONT(x,fid) (((x) & ~RS_fontMask) | ((fid) << RS_fontShift))
#define SET_STYLE(x,style) (((x) & ~RS_styleMask) | ((style) << RS_styleShift))
#define GET_ATTR(x) (((x) & RS_attrMask))
-#define GET_BGATTR(x) \
- (((x) & RS_RVid) ? (((x) & (RS_attrMask & ~RS_RVid)) \
- | (((x) & RS_fgMask)<<Color_Bits)) \
- : ((x) & (RS_attrMask | RS_bgMask)))
-#define SET_FGCOLOR(x,fg) (((x) & ~RS_fgMask) | (fg))
-#define SET_BGCOLOR(x,bg) (((x) & ~RS_bgMask) | ((bg)<<Color_Bits))
+// return attributes defining the background, encoding doesn't matter
+// depends on RS_fgShift > RS_bgShift
+#define GET_BGATTR(x) \
+ (expect_false ((x) & RS_RVid) \
+ ? (((x) & (RS_attrMask & ~RS_RVid)) \
+ | (((x) & RS_fgMask) >> (RS_fgShift - RS_bgShift))) \
+ : ((x) & (RS_attrMask | RS_bgMask)))
+#define SET_FGCOLOR(x,fg) (((x) & ~RS_fgMask) | ((fg) << RS_fgShift))
+#define SET_BGCOLOR(x,bg) (((x) & ~RS_bgMask) | ((bg) << RS_bgShift))
#define SET_ATTR(x,a) (((x) & ~RS_attrMask) | (a))
#define RS_SAME(a,b) (!(((a) ^ (b)) & ~RS_Careful))
#define ISSET_PIXCOLOR(idx) (!!rs[Rs_color + (idx)])
#if ENABLE_STYLES
-# define FONTSET(style) fontset[GET_STYLE (style)]
+# define FONTSET_of(t,style) (t)->fontset[GET_STYLE (style)]
#else
-# define FONTSET(style) fontset[0]
+# define FONTSET_of(t,style) (t)->fontset[0]
#endif
+#define FONTSET(style) FONTSET_of (this, style)
+
typedef callback<void (const char *)> log_callback;
typedef callback<int (int)> getfd_callback;
#define LINE_FILTER 0x0008 // line needs to be filtered before display (NYI)
#define LINE_BIDI 0x0010 // line needs bidi (NYI)
-struct line_t {
+struct line_t
+{
text_t *t; // terminal the text
rend_t *r; // rendition, uses RS_ flags
tlen_t_ l; // length of each text line
/****************************************************************************/
// primitive wrapper around mbstate_t to ensure initialisation
-struct mbstate {
+struct mbstate
+{
mbstate_t mbs;
operator mbstate_t *() { return &mbs; }
// compose chars are used to represent composite characters
// that are not representable in unicode, as well as characters
// not fitting in the BMP.
-struct compose_char {
+struct compose_char
+{
unicode_t c1, c2; // any chars != NOCHAR are valid
compose_char (unicode_t c1, unicode_t c2)
: c1(c1), c2(c2)
{ }
};
-class rxvt_composite_vec {
+class rxvt_composite_vec
+{
vector<compose_char> v;
public:
text_t compose (unicode_t c1, unicode_t c2 = NOCHAR);
#define SET_R(r) rxvt_current_term = const_cast<rxvt_term *>(r)
#define GET_R rxvt_current_term
-typedef struct {
+/* ------------------------------------------------------------------------- */
+struct overlay_base
+{
+ int x, y, w, h; // overlay dimensions
+ text_t **text;
+ rend_t **rend;
+
+ // while tempting to add swap() etc. here, it effetcively only increases code size
+};
+
+/* ------------------------------------------------------------------------- */
+
+typedef struct
+{
int row;
int col;
} row_col_t;
* | terminal +---------+
* | terminal |
* | terminal |
- * +------------+···········= term_stat + nrow - 1
+ * +------------+···········= term_start + nrow - 1
* |
* |
* END······················= total_rows
*/
-struct TermWin_t {
+struct TermWin_t
+{
int width; /* window width [pixels] */
int height; /* window height [pixels] */
int fwidth; /* font width [pixels] */
int int_bwidth; /* internal border width */
int ext_bwidth; /* external border width */
int lineSpace; /* number of extra pixels between rows */
+ int letterSpace; /* number of extra pixels between columns */
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 */
* 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: top_row <= beg.row <= mark.row <= end.row < nrow
* * Note: col == -1 ==> we're left of screen
*
*/
-typedef struct {
+struct screen_t
+{
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 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 {
+enum selection_op_t
+{
SELECTION_CLEAR = 0, /* nothing selected */
SELECTION_INIT, /* marked a point */
SELECTION_BEGIN, /* started a selection */
SELECTION_DONE /* selection put in CUT_BUFFER0 */
};
-typedef struct {
+struct selection_t
+{
wchar_t *text; /* selected text */
unsigned int len; /* length of selected text */
unsigned int screen; /* screen being used */
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;
+ wchar_t *clip_text; /* text copied to the clipboard */
+ unsigned int clip_len; /* length of clipboard text */
+};
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
-struct rxvt_vars : TermWin_t {
+struct rxvt_vars : TermWin_t
+{
scrollBar_t scrollBar;
uint8_t options[(Opt_count + 7) >> 3];
XSizeHints szHint;
#endif
};
-struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen {
+struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
+{
// special markers with magic addresses
static const char resval_undef []; // options specifically unset
current_screen:1, /* primary or secondary */
num_scr_allow:1,
bypass_keystate:1,
-#ifdef CURSOR_BLINK
+#if ENABLE_FRILLS
+ urgency_hint:1,
+#endif
+#if CURSOR_BLINK
hidden_cursor:1,
#endif
-#ifdef TEXT_BLINK
+#if TEXT_BLINK
hidden_text:1,
#endif
-#ifdef POINTER_BLANK
+#if POINTER_BLANK
hidden_pointer:1,
#endif
- enc_utf8:1, /* wether locale uses utf-8 */
- seen_input:1, /* wether we have seen some program output yet */
- seen_resize:1, /* wether we had a resize event */
+ enc_utf8:1, /* whether locale uses utf-8 */
+ seen_input:1, /* whether we have seen some program output yet */
+ seen_resize:1, /* whether we had a resize event */
parsed_geometry:1;
unsigned char refresh_type,
#ifndef NO_BELL
bool rvideo_bell;
#endif
- int num_scr; /* screen: number lines scrolled */
+ int num_scr; /* screen: number of lines scrolled */
int prev_ncol, /* screen: previous number of columns */
prev_nrow; /* screen: previous number of rows */
/* ---------- */
refresh_count,
window_vt_x,
window_vt_y,
- window_sb_x,
mouse_row,
mouse_col,
# ifdef POINTER_BLANK
/* ---------- */
Atom *xa;
/* ---------- */
-#ifdef RXVT_SCROLLBAR
- GC scrollbarGC,
- topShadowGC,
- botShadowGC;
-#endif
-#ifdef XTERM_SCROLLBAR
- GC xscrollbarGC,
- ShadowGC;
-#endif
-#ifdef PLAIN_SCROLLBAR
- GC pscrollbarGC;
-#endif
-#ifdef NEXT_SCROLLBAR
- GC blackGC,
- whiteGC,
- grayGC,
- darkGC,
- stippleGC;
- Pixmap dimple,
- upArrow,
- downArrow,
- upArrowHi,
- downArrowHi;
-#endif
-/* ---------- */
Time selection_time,
- selection_request_time;
+ selection_request_time,
+ clipboard_time;
pid_t cmd_pid; /* process id of child */
char * incr_buf;
size_t incr_buf_size, incr_buf_fill;
#ifdef HAVE_AFTERIMAGE
ASVisual *asv;
ASImageManager *asimman;
+
+ void init_asv ()
+ {
+ if (!asv)
+ asv = create_asvisual_for_id (dpy, display->screen, depth, XVisualIDFromVisual (visual), cmap, NULL);
+ }
#endif
#if ENABLE_OVERLAY
- int ov_x, ov_y, ov_w, ov_h; // overlay dimensions
- text_t **ov_text;
- rend_t **ov_rend;
+ overlay_base ov;
void scr_swap_overlay () NOTHROW;
void scr_overlay_new (int x, int y, int w, int h) NOTHROW;
// ISO 14755 entry support
unicode_t iso14755buf;
void commit_iso14755 ();
- int hex_keyval (XKeyEvent &ev);
# if ISO_14755
void iso14755_51 (unicode_t ch, rend_t r = DEFAULT_RSTYLE, int x = 0, int y = -1);
void iso14755_54 (int x, int y);
void x_cb (XEvent &xev);
xevent_watcher termwin_ev;
xevent_watcher vt_ev;
-#ifdef HAVE_SCROLLBARS
xevent_watcher scrollbar_ev;
-#endif
void child_cb (ev::child &w, int revents); ev::child child_ev;
void destroy_cb (ev::idle &w, int revents); ev::idle destroy_ev;
uint32_t next_octet () NOTHROW;
uint32_t cmd_get8 () THROW ((class out_of_input));
- bool cmd_parse ();
+ void cmd_parse ();
void mouse_report (XButtonEvent &ev);
void button_press (XButtonEvent &ev);
void button_release (XButtonEvent &ev);
void focus_in ();
void focus_out ();
+#if ENABLE_FRILLS
+ void set_urgency (bool enable);
+#else
+ void set_urgency (bool enable) { }
+#endif
void update_fade_color (unsigned int idx);
#ifdef PRINTPIPE
FILE *popen_printer ();
void process_dcs_seq ();
void process_osc_seq ();
void process_color_seq (int report, int color, const char *str, char resp);
- void process_xterm_seq (int op, const char *str, char resp);
+ void process_xterm_seq (int op, char *str, char resp);
int privcases (int mode, unsigned long bit);
void process_terminal_mode (int mode, int priv, unsigned int nargs, const int *arg);
void process_sgr_mode (unsigned int nargs, const int *arg);
int run_child (const char *const *argv);
void color_aliases (int idx);
void create_windows (int argc, const char *const *argv);
- void Get_Colours ();
+ void get_colours ();
void get_ourmods ();
// main.C
void tt_winch ();
options[opt >> 3] &= ~(1 << (opt & 7));
}
- void PrivMode (int set, unsigned bit) NOTHROW
+ void set_privmode (unsigned bit, int set) NOTHROW
{
if (set)
priv_modes |= bit;
void paste (char *data, unsigned int len) NOTHROW;
void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW;
void scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW;
+ void scr_kill_char (line_t &l, int col) const NOTHROW;
int scr_scroll_text (int row1, int row2, int count) NOTHROW;
void scr_reset ();
void scr_release () NOTHROW;
enum cursor_mode { SAVE, RESTORE };
void scr_poweron ();
+ void scr_soft_reset () NOTHROW;
void scr_cursor (cursor_mode mode) NOTHROW;
void scr_do_wrap () NOTHROW;
void scr_swap_screen () NOTHROW;
void selection_property (Window win, Atom prop) NOTHROW;
void selection_request (Time tm, int selnum = Sel_Primary) NOTHROW;
int selection_request_other (Atom target, int selnum) NOTHROW;
- void selection_clear () NOTHROW;
+ void selection_clear (bool clipboard = false) NOTHROW;
+ void clipboard_copy (Time tm);
void selection_make (Time tm);
- bool selection_grab (Time tm) NOTHROW;
+ bool selection_grab (Time tm, bool clipboard = false) NOTHROW;
void selection_start_colrow (int col, int row) NOTHROW;
void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) NOTHROW;
void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) NOTHROW;
void selection_extend (int x, int y, int flag) NOTHROW;
void selection_rotate (int x, int y) NOTHROW;
-#if defined(NEXT_SCROLLBAR)
- // scrollbar-next.C
- Pixmap renderPixmap (const char *const *data, int width, int height);
- void init_scrollbar_stuff ();
- void drawBevel (Drawable d, int x1, int y1, int w, int h);
- int scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len);
-#endif
-
-#if defined(RXVT_SCROLLBAR)
- // scrollbar-rxvt.C
- int scrollbar_show_rxvt (int update, int last_top, int last_bot, int scrollbar_len);
-#endif
-
-#if defined(XTERM_SCROLLBAR)
- // scrollbar-xterm.C
- int scrollbar_show_xterm (int update, int last_top, int last_bot, int scrollbar_len);
-#endif
-
-#if defined(PLAIN_SCROLLBAR)
- // scrollbar-plain.C
- int scrollbar_show_plain (int update, int last_top, int last_bot, int scrollbar_len);
-#endif
-
- // scrollbar.C
- void resize_scrollbar ();
- int scrollbar_mapping (int map);
- int scrollbar_show (int update);
- void setup_scrollbar (const char *scrollalign, const char *scrollstyle, const char *thickness);
-
// xdefaults.C
void get_options (int argc, const char *const *argv);
int parse_keysym (const char *str, const char *arg);