Split X-specific code into x.c
This commit is contained in:
		
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | ||||
|  | ||||
| include config.mk | ||||
|  | ||||
| SRC = st.c | ||||
| SRC = st.c x.c | ||||
| OBJ = ${SRC:.c=.o} | ||||
|  | ||||
| all: options st | ||||
| @ -21,6 +21,9 @@ config.h: | ||||
| 	@echo CC $< | ||||
| 	@${CC} -c ${CFLAGS} $< | ||||
|  | ||||
| st.o: config.h st.h win.h | ||||
| x.o: arg.h st.h win.h | ||||
|  | ||||
| ${OBJ}: config.h config.mk | ||||
|  | ||||
| st: ${OBJ} | ||||
|  | ||||
							
								
								
									
										64
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								config.def.h
									
									
									
									
									
								
							| @ -5,8 +5,8 @@ | ||||
|  * | ||||
|  * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html | ||||
|  */ | ||||
| static char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; | ||||
| static int borderpx = 2; | ||||
| char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; | ||||
| int borderpx = 2; | ||||
|  | ||||
| /* | ||||
|  * What program is execed by st depends of these precedence rules: | ||||
| @ -24,8 +24,8 @@ static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400"; | ||||
| static char vtiden[] = "\033[?6c"; | ||||
|  | ||||
| /* Kerning / character bounding-box multipliers */ | ||||
| static float cwscale = 1.0; | ||||
| static float chscale = 1.0; | ||||
| float cwscale = 1.0; | ||||
| float chscale = 1.0; | ||||
|  | ||||
| /* | ||||
|  * word delimiter string | ||||
| @ -35,26 +35,26 @@ static float chscale = 1.0; | ||||
| static char worddelimiters[] = " "; | ||||
|  | ||||
| /* selection timeouts (in milliseconds) */ | ||||
| static unsigned int doubleclicktimeout = 300; | ||||
| static unsigned int tripleclicktimeout = 600; | ||||
| unsigned int doubleclicktimeout = 300; | ||||
| unsigned int tripleclicktimeout = 600; | ||||
|  | ||||
| /* alt screens */ | ||||
| static int allowaltscreen = 1; | ||||
| int allowaltscreen = 1; | ||||
|  | ||||
| /* frames per second st should at maximum draw to the screen */ | ||||
| static unsigned int xfps = 120; | ||||
| static unsigned int actionfps = 30; | ||||
| unsigned int xfps = 120; | ||||
| unsigned int actionfps = 30; | ||||
|  | ||||
| /* | ||||
|  * blinking timeout (set to 0 to disable blinking) for the terminal blinking | ||||
|  * attribute. | ||||
|  */ | ||||
| static unsigned int blinktimeout = 800; | ||||
| unsigned int blinktimeout = 800; | ||||
|  | ||||
| /* | ||||
|  * thickness of underline and bar cursors | ||||
|  */ | ||||
| static unsigned int cursorthickness = 2; | ||||
| unsigned int cursorthickness = 2; | ||||
|  | ||||
| /* | ||||
|  * bell volume. It must be a value between -100 and 100. Use 0 for disabling | ||||
| @ -63,7 +63,7 @@ static unsigned int cursorthickness = 2; | ||||
| static int bellvolume = 0; | ||||
|  | ||||
| /* default TERM value */ | ||||
| static char termname[] = "st-256color"; | ||||
| char termname[] = "st-256color"; | ||||
|  | ||||
| /* | ||||
|  * spaces per tab | ||||
| @ -83,7 +83,7 @@ static char termname[] = "st-256color"; | ||||
| static unsigned int tabspaces = 8; | ||||
|  | ||||
| /* Terminal colors (16 first used in escape sequence) */ | ||||
| static const char *colorname[] = { | ||||
| const char *colorname[] = { | ||||
| 	/* 8 normal colors */ | ||||
| 	"black", | ||||
| 	"red3", | ||||
| @ -116,10 +116,10 @@ static const char *colorname[] = { | ||||
|  * Default colors (colorname index) | ||||
|  * foreground, background, cursor, reverse cursor | ||||
|  */ | ||||
| static unsigned int defaultfg = 7; | ||||
| static unsigned int defaultbg = 0; | ||||
| static unsigned int defaultcs = 256; | ||||
| static unsigned int defaultrcs = 257; | ||||
| unsigned int defaultfg = 7; | ||||
| unsigned int defaultbg = 0; | ||||
| unsigned int defaultcs = 256; | ||||
| unsigned int defaultrcs = 257; | ||||
|  | ||||
| /* | ||||
|  * Default shape of cursor | ||||
| @ -128,33 +128,33 @@ static unsigned int defaultrcs = 257; | ||||
|  * 6: Bar ("|") | ||||
|  * 7: Snowman ("☃") | ||||
|  */ | ||||
| static unsigned int cursorshape = 2; | ||||
| unsigned int cursorshape = 2; | ||||
|  | ||||
| /* | ||||
|  * Default columns and rows numbers | ||||
|  */ | ||||
|  | ||||
| static unsigned int cols = 80; | ||||
| static unsigned int rows = 24; | ||||
| unsigned int cols = 80; | ||||
| unsigned int rows = 24; | ||||
|  | ||||
| /* | ||||
|  * Default colour and shape of the mouse cursor | ||||
|  */ | ||||
| static unsigned int mouseshape = XC_xterm; | ||||
| static unsigned int mousefg = 7; | ||||
| static unsigned int mousebg = 0; | ||||
| unsigned int mouseshape = XC_xterm; | ||||
| unsigned int mousefg = 7; | ||||
| unsigned int mousebg = 0; | ||||
|  | ||||
| /* | ||||
|  * Color used to display font attributes when fontconfig selected a font which | ||||
|  * doesn't match the ones requested. | ||||
|  */ | ||||
| static unsigned int defaultattr = 11; | ||||
| unsigned int defaultattr = 11; | ||||
|  | ||||
| /* | ||||
|  * Internal mouse shortcuts. | ||||
|  * Beware that overloading Button1 will disable the selection. | ||||
|  */ | ||||
| static MouseShortcut mshortcuts[] = { | ||||
| MouseShortcut mshortcuts[] = { | ||||
| 	/* button               mask            string */ | ||||
| 	{ Button4,              XK_ANY_MOD,     "\031" }, | ||||
| 	{ Button5,              XK_ANY_MOD,     "\005" }, | ||||
| @ -163,15 +163,15 @@ static MouseShortcut mshortcuts[] = { | ||||
| /* Internal keyboard shortcuts. */ | ||||
| #define MODKEY Mod1Mask | ||||
|  | ||||
| static Shortcut shortcuts[] = { | ||||
| Shortcut shortcuts[] = { | ||||
| 	/* mask                 keysym          function        argument */ | ||||
| 	{ XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} }, | ||||
| 	{ ControlMask,          XK_Print,       toggleprinter,  {.i =  0} }, | ||||
| 	{ ShiftMask,            XK_Print,       printscreen,    {.i =  0} }, | ||||
| 	{ XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Prior,       xzoom,          {.f = +1} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Next,        xzoom,          {.f = -1} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Home,        xzoomreset,     {.f =  0} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Prior,       zoom,           {.f = +1} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Next,        zoom,           {.f = -1} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Home,        zoomreset,      {.f =  0} }, | ||||
| 	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_Insert,      clippaste,      {.i =  0} }, | ||||
| 	{ MODKEY|ShiftMask,     XK_C,           clipcopy,       {.i =  0} }, | ||||
| @ -222,7 +222,7 @@ static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; | ||||
|  * Note that if you want to use ShiftMask with selmasks, set this to an other | ||||
|  * modifier, set to 0 to not use it. | ||||
|  */ | ||||
| static uint forceselmod = ShiftMask; | ||||
| uint forceselmod = ShiftMask; | ||||
|  | ||||
| /* | ||||
|  * This is the huge key array which defines all compatibility to the Linux | ||||
| @ -451,7 +451,7 @@ static Key key[] = { | ||||
|  * ButtonRelease and MotionNotify. | ||||
|  * If no match is found, regular selection is used. | ||||
|  */ | ||||
| static uint selmasks[] = { | ||||
| uint selmasks[] = { | ||||
| 	[SEL_RECTANGULAR] = Mod1Mask, | ||||
| }; | ||||
|  | ||||
| @ -459,7 +459,7 @@ static uint selmasks[] = { | ||||
|  * Printable characters in ASCII, used to estimate the advance width | ||||
|  * of single wide characters. | ||||
|  */ | ||||
| static char ascii_printable[] = | ||||
| char ascii_printable[] = | ||||
| 	" !\"#$%&'()*+,-./0123456789:;<=>?" | ||||
| 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" | ||||
| 	"`abcdefghijklmnopqrstuvwxyz{|}~"; | ||||
|  | ||||
							
								
								
									
										272
									
								
								st.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								st.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,272 @@ | ||||
| /* See LICENSE for license details. */ | ||||
|  | ||||
| /* Arbitrary sizes */ | ||||
| #define UTF_SIZ       4 | ||||
|  | ||||
| /* macros */ | ||||
| #define MIN(a, b)		((a) < (b) ? (a) : (b)) | ||||
| #define MAX(a, b)		((a) < (b) ? (b) : (a)) | ||||
| #define LEN(a)			(sizeof(a) / sizeof(a)[0]) | ||||
| #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b)) | ||||
| #define DIVCEIL(n, d)		(((n) + ((d) - 1)) / (d)) | ||||
| #define LIMIT(x, a, b)		(x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) | ||||
| #define ATTRCMP(a, b)		((a).mode != (b).mode || (a).fg != (b).fg || \ | ||||
| 				(a).bg != (b).bg) | ||||
| #define IS_SET(flag)		((term.mode & (flag)) != 0) | ||||
| #define TIMEDIFF(t1, t2)	((t1.tv_sec-t2.tv_sec)*1000 + \ | ||||
| 				(t1.tv_nsec-t2.tv_nsec)/1E6) | ||||
| #define MODBIT(x, set, bit)	((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) | ||||
|  | ||||
| #define TRUECOLOR(r,g,b)	(1 << 24 | (r) << 16 | (g) << 8 | (b)) | ||||
| #define IS_TRUECOL(x)		(1 << 24 & (x)) | ||||
|  | ||||
| enum glyph_attribute { | ||||
| 	ATTR_NULL       = 0, | ||||
| 	ATTR_BOLD       = 1 << 0, | ||||
| 	ATTR_FAINT      = 1 << 1, | ||||
| 	ATTR_ITALIC     = 1 << 2, | ||||
| 	ATTR_UNDERLINE  = 1 << 3, | ||||
| 	ATTR_BLINK      = 1 << 4, | ||||
| 	ATTR_REVERSE    = 1 << 5, | ||||
| 	ATTR_INVISIBLE  = 1 << 6, | ||||
| 	ATTR_STRUCK     = 1 << 7, | ||||
| 	ATTR_WRAP       = 1 << 8, | ||||
| 	ATTR_WIDE       = 1 << 9, | ||||
| 	ATTR_WDUMMY     = 1 << 10, | ||||
| 	ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, | ||||
| }; | ||||
|  | ||||
| enum term_mode { | ||||
| 	MODE_WRAP        = 1 << 0, | ||||
| 	MODE_INSERT      = 1 << 1, | ||||
| 	MODE_APPKEYPAD   = 1 << 2, | ||||
| 	MODE_ALTSCREEN   = 1 << 3, | ||||
| 	MODE_CRLF        = 1 << 4, | ||||
| 	MODE_MOUSEBTN    = 1 << 5, | ||||
| 	MODE_MOUSEMOTION = 1 << 6, | ||||
| 	MODE_REVERSE     = 1 << 7, | ||||
| 	MODE_KBDLOCK     = 1 << 8, | ||||
| 	MODE_HIDE        = 1 << 9, | ||||
| 	MODE_ECHO        = 1 << 10, | ||||
| 	MODE_APPCURSOR   = 1 << 11, | ||||
| 	MODE_MOUSESGR    = 1 << 12, | ||||
| 	MODE_8BIT        = 1 << 13, | ||||
| 	MODE_BLINK       = 1 << 14, | ||||
| 	MODE_FBLINK      = 1 << 15, | ||||
| 	MODE_FOCUS       = 1 << 16, | ||||
| 	MODE_MOUSEX10    = 1 << 17, | ||||
| 	MODE_MOUSEMANY   = 1 << 18, | ||||
| 	MODE_BRCKTPASTE  = 1 << 19, | ||||
| 	MODE_PRINT       = 1 << 20, | ||||
| 	MODE_UTF8        = 1 << 21, | ||||
| 	MODE_SIXEL       = 1 << 22, | ||||
| 	MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ | ||||
| 	                  |MODE_MOUSEMANY, | ||||
| }; | ||||
|  | ||||
| enum selection_mode { | ||||
| 	SEL_IDLE = 0, | ||||
| 	SEL_EMPTY = 1, | ||||
| 	SEL_READY = 2 | ||||
| }; | ||||
|  | ||||
| enum selection_type { | ||||
| 	SEL_REGULAR = 1, | ||||
| 	SEL_RECTANGULAR = 2 | ||||
| }; | ||||
|  | ||||
| enum selection_snap { | ||||
| 	SNAP_WORD = 1, | ||||
| 	SNAP_LINE = 2 | ||||
| }; | ||||
|  | ||||
| enum window_state { | ||||
| 	WIN_VISIBLE = 1, | ||||
| 	WIN_FOCUSED = 2 | ||||
| }; | ||||
|  | ||||
| typedef unsigned char uchar; | ||||
| typedef unsigned int uint; | ||||
| typedef unsigned long ulong; | ||||
| typedef unsigned short ushort; | ||||
|  | ||||
| typedef uint_least32_t Rune; | ||||
|  | ||||
| typedef struct { | ||||
| 	Rune u;           /* character code */ | ||||
| 	ushort mode;      /* attribute flags */ | ||||
| 	uint32_t fg;      /* foreground  */ | ||||
| 	uint32_t bg;      /* background  */ | ||||
| } Glyph; | ||||
|  | ||||
| typedef Glyph *Line; | ||||
|  | ||||
| typedef struct { | ||||
| 	Glyph attr; /* current char attributes */ | ||||
| 	int x; | ||||
| 	int y; | ||||
| 	char state; | ||||
| } TCursor; | ||||
|  | ||||
| /* Internal representation of the screen */ | ||||
| typedef struct { | ||||
| 	int row;      /* nb row */ | ||||
| 	int col;      /* nb col */ | ||||
| 	Line *line;   /* screen */ | ||||
| 	Line *alt;    /* alternate screen */ | ||||
| 	int *dirty;  /* dirtyness of lines */ | ||||
| 	GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ | ||||
| 	TCursor c;    /* cursor */ | ||||
| 	int top;      /* top    scroll limit */ | ||||
| 	int bot;      /* bottom scroll limit */ | ||||
| 	int mode;     /* terminal mode flags */ | ||||
| 	int esc;      /* escape state flags */ | ||||
| 	char trantbl[4]; /* charset table translation */ | ||||
| 	int charset;  /* current charset */ | ||||
| 	int icharset; /* selected charset for sequence */ | ||||
| 	int numlock; /* lock numbers in keyboard */ | ||||
| 	int *tabs; | ||||
| } Term; | ||||
|  | ||||
| /* Purely graphic info */ | ||||
| typedef struct { | ||||
| 	int tw, th; /* tty width and height */ | ||||
| 	int w, h; /* window width and height */ | ||||
| 	int ch; /* char height */ | ||||
| 	int cw; /* char width  */ | ||||
| 	char state; /* focus, redraw, visible */ | ||||
| 	int cursor; /* cursor style */ | ||||
| } TermWindow; | ||||
|  | ||||
| typedef struct { | ||||
| 	uint b; | ||||
| 	uint mask; | ||||
| 	char *s; | ||||
| } MouseShortcut; | ||||
|  | ||||
| typedef struct { | ||||
| 	int mode; | ||||
| 	int type; | ||||
| 	int snap; | ||||
| 	/* | ||||
| 	 * Selection variables: | ||||
| 	 * nb – normalized coordinates of the beginning of the selection | ||||
| 	 * ne – normalized coordinates of the end of the selection | ||||
| 	 * ob – original coordinates of the beginning of the selection | ||||
| 	 * oe – original coordinates of the end of the selection | ||||
| 	 */ | ||||
| 	struct { | ||||
| 		int x, y; | ||||
| 	} nb, ne, ob, oe; | ||||
|  | ||||
| 	char *primary, *clipboard; | ||||
| 	int alt; | ||||
| 	struct timespec tclick1; | ||||
| 	struct timespec tclick2; | ||||
|  | ||||
| 	//Atom xtarget; | ||||
| } Selection; | ||||
|  | ||||
| typedef union { | ||||
| 	int i; | ||||
| 	uint ui; | ||||
| 	float f; | ||||
| 	const void *v; | ||||
| } Arg; | ||||
|  | ||||
| typedef struct { | ||||
| 	uint mod; | ||||
| 	KeySym keysym; | ||||
| 	void (*func)(const Arg *); | ||||
| 	const Arg arg; | ||||
| } Shortcut; | ||||
|  | ||||
| void die(const char *, ...); | ||||
| void redraw(void); | ||||
|  | ||||
| int tattrset(int); | ||||
| void tnew(int, int); | ||||
| void tsetdirt(int, int); | ||||
| void tsetdirtattr(int); | ||||
| int match(uint, uint); | ||||
| void ttynew(void); | ||||
| size_t ttyread(void); | ||||
| void ttyresize(void); | ||||
| void ttysend(char *, size_t); | ||||
| void ttywrite(const char *, size_t); | ||||
|  | ||||
| void resettitle(void); | ||||
|  | ||||
| char *kmap(KeySym, uint); | ||||
| void cresize(int, int); | ||||
| void selclear(void); | ||||
|  | ||||
| void selinit(void); | ||||
| void selnormalize(void); | ||||
| int selected(int, int); | ||||
| char *getsel(void); | ||||
| int x2col(int); | ||||
| int y2row(int); | ||||
|  | ||||
| size_t utf8decode(char *, Rune *, size_t); | ||||
| size_t utf8encode(Rune, char *); | ||||
|  | ||||
| void *xmalloc(size_t); | ||||
| char *xstrdup(char *); | ||||
|  | ||||
| void usage(void); | ||||
|  | ||||
| /* Globals */ | ||||
| extern TermWindow win; | ||||
| extern Term term; | ||||
| extern Selection sel; | ||||
| extern int cmdfd; | ||||
| extern pid_t pid; | ||||
| extern char **opt_cmd; | ||||
| extern char *opt_class; | ||||
| extern char *opt_embed; | ||||
| extern char *opt_font; | ||||
| extern char *opt_io; | ||||
| extern char *opt_line; | ||||
| extern char *opt_name; | ||||
| extern char *opt_title; | ||||
| extern int oldbutton; | ||||
|  | ||||
| extern char *usedfont; | ||||
| extern double usedfontsize; | ||||
| extern double defaultfontsize; | ||||
|  | ||||
| /* config.h globals */ | ||||
| extern char font[]; | ||||
| extern int borderpx; | ||||
| extern float cwscale; | ||||
| extern float chscale; | ||||
| extern unsigned int doubleclicktimeout; | ||||
| extern unsigned int tripleclicktimeout; | ||||
| extern int allowaltscreen; | ||||
| extern unsigned int xfps; | ||||
| extern unsigned int actionfps; | ||||
| extern unsigned int cursorthickness; | ||||
| extern unsigned int blinktimeout; | ||||
| extern char termname[]; | ||||
| extern const char *colorname[]; | ||||
| extern size_t colornamelen; | ||||
| extern unsigned int defaultfg; | ||||
| extern unsigned int defaultbg; | ||||
| extern unsigned int defaultcs; | ||||
| extern unsigned int defaultrcs; | ||||
| extern unsigned int cursorshape; | ||||
| extern unsigned int cols; | ||||
| extern unsigned int rows; | ||||
| extern unsigned int mouseshape; | ||||
| extern unsigned int mousefg; | ||||
| extern unsigned int mousebg; | ||||
| extern unsigned int defaultattr; | ||||
| extern MouseShortcut mshortcuts[]; | ||||
| extern size_t mshortcutslen; | ||||
| extern Shortcut shortcuts[]; | ||||
| extern size_t shortcutslen; | ||||
| extern uint forceselmod; | ||||
| extern uint selmasks[]; | ||||
| extern size_t selmaskslen; | ||||
| extern char ascii_printable[]; | ||||
							
								
								
									
										29
									
								
								win.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								win.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| /* See LICENSE for license details. */ | ||||
|  | ||||
| /* X modifiers */ | ||||
| #define XK_ANY_MOD    UINT_MAX | ||||
| #define XK_NO_MOD     0 | ||||
| #define XK_SWITCH_MOD (1<<13) | ||||
|  | ||||
| typedef XftGlyphFontSpec GlyphFontSpec; | ||||
|  | ||||
| void draw(void); | ||||
| void drawregion(int, int, int, int); | ||||
| void run(void); | ||||
|  | ||||
| void xbell(int); | ||||
| void xclipcopy(void); | ||||
| void xclippaste(void); | ||||
| void xhints(void); | ||||
| void xinit(void); | ||||
| void xloadcols(void); | ||||
| int xsetcolorname(int, const char *); | ||||
| void xloadfonts(char *, double); | ||||
| void xsetenv(void); | ||||
| void xsettitle(char *); | ||||
| void xsetpointermotion(int); | ||||
| void xseturgency(int); | ||||
| void xunloadfonts(void); | ||||
| void xresize(int, int); | ||||
| void xselpaste(void); | ||||
| unsigned long xwinid(void); | ||||
		Reference in New Issue
	
	Block a user