mirror of
				git://git.suckless.org/st
				synced 2025-10-31 19:37:33 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "master" and "0.9" have entirely different histories.
		
	
	
		
	
		
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
								
							| @ -7,7 +7,13 @@ include config.mk | ||||
| SRC = st.c x.c | ||||
| OBJ = $(SRC:.c=.o) | ||||
| 
 | ||||
| all: st | ||||
| all: options st | ||||
| 
 | ||||
| options: | ||||
| 	@echo st build options: | ||||
| 	@echo "CFLAGS  = $(STCFLAGS)" | ||||
| 	@echo "LDFLAGS = $(STLDFLAGS)" | ||||
| 	@echo "CC      = $(CC)" | ||||
| 
 | ||||
| config.h: | ||||
| 	cp config.def.h config.h | ||||
| @ -48,4 +54,4 @@ uninstall: | ||||
| 	rm -f $(DESTDIR)$(PREFIX)/bin/st | ||||
| 	rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1 | ||||
| 
 | ||||
| .PHONY: all clean dist install uninstall | ||||
| .PHONY: all options clean dist install uninstall | ||||
|  | ||||
| @ -53,7 +53,7 @@ int allowwindowops = 0; | ||||
|  * near minlatency, but it waits longer for slow updates to avoid partial draw. | ||||
|  * low minlatency will tear/flicker more, as it can "detect" idle too early. | ||||
|  */ | ||||
| static double minlatency = 2; | ||||
| static double minlatency = 8; | ||||
| static double maxlatency = 33; | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| # st version
 | ||||
| VERSION = 0.9.3 | ||||
| VERSION = 0.9 | ||||
| 
 | ||||
| # Customize below to fit your system
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										81
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								st.c
									
									
									
									
									
								
							| @ -1097,7 +1097,7 @@ tscrollup(int orig, int n) | ||||
| void | ||||
| selscroll(int orig, int n) | ||||
| { | ||||
| 	if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN)) | ||||
| 	if (sel.ob.x == -1) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) { | ||||
| @ -1132,7 +1132,6 @@ csiparse(void) | ||||
| { | ||||
| 	char *p = csiescseq.buf, *np; | ||||
| 	long int v; | ||||
| 	int sep = ';'; /* colon or semi-colon, but not both */ | ||||
| 
 | ||||
| 	csiescseq.narg = 0; | ||||
| 	if (*p == '?') { | ||||
| @ -1150,9 +1149,7 @@ csiparse(void) | ||||
| 			v = -1; | ||||
| 		csiescseq.arg[csiescseq.narg++] = v; | ||||
| 		p = np; | ||||
| 		if (sep == ';' && *p == ':') | ||||
| 			sep = ':'; /* allow override to colon once */ | ||||
| 		if (*p != sep || csiescseq.narg == ESC_ARG_SIZ) | ||||
| 		if (*p != ';' || csiescseq.narg == ESC_ARG_SIZ) | ||||
| 			break; | ||||
| 		p++; | ||||
| 	} | ||||
| @ -1420,22 +1417,16 @@ tsetattr(const int *attr, int l) | ||||
| 			if ((idx = tdefcolor(attr, &i, l)) >= 0) | ||||
| 				term.c.attr.fg = idx; | ||||
| 			break; | ||||
| 		case 39: /* set foreground color to default */ | ||||
| 		case 39: | ||||
| 			term.c.attr.fg = defaultfg; | ||||
| 			break; | ||||
| 		case 48: | ||||
| 			if ((idx = tdefcolor(attr, &i, l)) >= 0) | ||||
| 				term.c.attr.bg = idx; | ||||
| 			break; | ||||
| 		case 49: /* set background color to default */ | ||||
| 		case 49: | ||||
| 			term.c.attr.bg = defaultbg; | ||||
| 			break; | ||||
| 		case 58: | ||||
| 			/* This starts a sequence to change the color of
 | ||||
| 			 * "underline" pixels. We don't support that and | ||||
| 			 * instead eat up a following "5;n" or "2;r;g;b". */ | ||||
| 			tdefcolor(attr, &i, l); | ||||
| 			break; | ||||
| 		default: | ||||
| 			if (BETWEEN(attr[i], 30, 37)) { | ||||
| 				term.c.attr.fg = attr[i] - 30; | ||||
| @ -1532,7 +1523,7 @@ tsetmode(int priv, int set, const int *args, int narg) | ||||
| 			case 1006: /* 1006: extended reporting mode */ | ||||
| 				xsetmode(set, MODE_MOUSESGR); | ||||
| 				break; | ||||
| 			case 1034: /* 1034: enable 8-bit mode for keyboard input */ | ||||
| 			case 1034: | ||||
| 				xsetmode(set, MODE_8BIT); | ||||
| 				break; | ||||
| 			case 1049: /* swap screen & set/restore cursor as xterm */ | ||||
| @ -1540,8 +1531,8 @@ tsetmode(int priv, int set, const int *args, int narg) | ||||
| 					break; | ||||
| 				tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); | ||||
| 				/* FALLTHROUGH */ | ||||
| 			case 47: /* swap screen buffer */ | ||||
| 			case 1047: /* swap screen buffer */ | ||||
| 			case 47: /* swap screen */ | ||||
| 			case 1047: | ||||
| 				if (!allowaltscreen) | ||||
| 					break; | ||||
| 				alt = IS_SET(MODE_ALTSCREEN); | ||||
| @ -1554,7 +1545,7 @@ tsetmode(int priv, int set, const int *args, int narg) | ||||
| 				if (*args != 1049) | ||||
| 					break; | ||||
| 				/* FALLTHROUGH */ | ||||
| 			case 1048: /* save/restore cursor (like DECSC/DECRC) */ | ||||
| 			case 1048: | ||||
| 				tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); | ||||
| 				break; | ||||
| 			case 2004: /* 2004: bracketed paste mode */ | ||||
| @ -1652,7 +1643,7 @@ csihandle(void) | ||||
| 			ttywrite(vtiden, strlen(vtiden), 0); | ||||
| 		break; | ||||
| 	case 'b': /* REP -- if last char is printable print it <n> more times */ | ||||
| 		LIMIT(csiescseq.arg[0], 1, 65535); | ||||
| 		DEFAULT(csiescseq.arg[0], 1); | ||||
| 		if (term.lastc) | ||||
| 			while (csiescseq.arg[0]-- > 0) | ||||
| 				tputc(term.lastc); | ||||
| @ -1711,7 +1702,7 @@ csihandle(void) | ||||
| 			} | ||||
| 			break; | ||||
| 		case 1: /* above */ | ||||
| 			if (term.c.y > 0) | ||||
| 			if (term.c.y > 1) | ||||
| 				tclearregion(0, 0, term.col-1, term.c.y-1); | ||||
| 			tclearregion(0, term.c.y, term.c.x, term.c.y); | ||||
| 			break; | ||||
| @ -1737,7 +1728,6 @@ csihandle(void) | ||||
| 		} | ||||
| 		break; | ||||
| 	case 'S': /* SU -- Scroll <n> line up */ | ||||
| 		if (csiescseq.priv) break; | ||||
| 		DEFAULT(csiescseq.arg[0], 1); | ||||
| 		tscrollup(term.top, csiescseq.arg[0]); | ||||
| 		break; | ||||
| @ -1779,18 +1769,11 @@ csihandle(void) | ||||
| 	case 'm': /* SGR -- Terminal attribute (color) */ | ||||
| 		tsetattr(csiescseq.arg, csiescseq.narg); | ||||
| 		break; | ||||
| 	case 'n': /* DSR -- Device Status Report */ | ||||
| 		switch (csiescseq.arg[0]) { | ||||
| 		case 5: /* Status Report "OK" `0n` */ | ||||
| 			ttywrite("\033[0n", sizeof("\033[0n") - 1, 0); | ||||
| 			break; | ||||
| 		case 6: /* Report Cursor Position (CPR) "<row>;<column>R" */ | ||||
| 	case 'n': /* DSR – Device Status Report (cursor position) */ | ||||
| 		if (csiescseq.arg[0] == 6) { | ||||
| 			len = snprintf(buf, sizeof(buf), "\033[%i;%iR", | ||||
| 					term.c.y+1, term.c.x+1); | ||||
| 			ttywrite(buf, len, 0); | ||||
| 			break; | ||||
| 		default: | ||||
| 			goto unknown; | ||||
| 		} | ||||
| 		break; | ||||
| 	case 'r': /* DECSTBM -- Set Scrolling Region */ | ||||
| @ -1807,11 +1790,7 @@ csihandle(void) | ||||
| 		tcursor(CURSOR_SAVE); | ||||
| 		break; | ||||
| 	case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ | ||||
| 		if (csiescseq.priv) { | ||||
| 			goto unknown; | ||||
| 		} else { | ||||
| 		tcursor(CURSOR_LOAD); | ||||
| 		} | ||||
| 		break; | ||||
| 	case ' ': | ||||
| 		switch (csiescseq.mode[1]) { | ||||
| @ -1913,7 +1892,7 @@ strhandle(void) | ||||
| 			if (narg > 1) | ||||
| 				xsettitle(strescseq.args[1]); | ||||
| 			return; | ||||
| 		case 52: /* manipulate selection data */ | ||||
| 		case 52: | ||||
| 			if (narg > 2 && allowwindowops) { | ||||
| 				dec = base64dec(strescseq.args[2]); | ||||
| 				if (dec) { | ||||
| @ -1924,9 +1903,9 @@ strhandle(void) | ||||
| 				} | ||||
| 			} | ||||
| 			return; | ||||
| 		case 10: /* set dynamic VT100 text foreground color */ | ||||
| 		case 11: /* set dynamic VT100 text background color */ | ||||
| 		case 12: /* set dynamic text cursor color */ | ||||
| 		case 10: | ||||
| 		case 11: | ||||
| 		case 12: | ||||
| 			if (narg < 2) | ||||
| 				break; | ||||
| 			p = strescseq.args[1]; | ||||
| @ -1953,10 +1932,8 @@ strhandle(void) | ||||
| 			if (p && !strcmp(p, "?")) { | ||||
| 				osc_color_response(j, 0, 1); | ||||
| 			} else if (xsetcolorname(j, p)) { | ||||
| 				if (par == 104 && narg <= 1) { | ||||
| 					xloadcols(); | ||||
| 				if (par == 104 && narg <= 1) | ||||
| 					return; /* color reset without parameter */ | ||||
| 				} | ||||
| 				fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", | ||||
| 				        j, p ? p : "(null)"); | ||||
| 			} else { | ||||
| @ -1967,19 +1944,6 @@ strhandle(void) | ||||
| 				tfulldirt(); | ||||
| 			} | ||||
| 			return; | ||||
| 		case 110: /* reset dynamic VT100 text foreground color */ | ||||
| 		case 111: /* reset dynamic VT100 text background color */ | ||||
| 		case 112: /* reset dynamic text cursor color */ | ||||
| 			if (narg != 1) | ||||
| 				break; | ||||
| 			if ((j = par - 110) < 0 || j >= LEN(osc_table)) | ||||
| 				break; /* shouldn't be possible */ | ||||
| 			if (xsetcolorname(osc_table[j].idx, NULL)) { | ||||
| 				fprintf(stderr, "erresc: %s color not found\n", osc_table[j].str); | ||||
| 			} else { | ||||
| 				tfulldirt(); | ||||
| 			} | ||||
| 			return; | ||||
| 		} | ||||
| 		break; | ||||
| 	case 'k': /* old title set compatibility */ | ||||
| @ -2357,7 +2321,6 @@ eschandle(uchar ascii) | ||||
| 		treset(); | ||||
| 		resettitle(); | ||||
| 		xloadcols(); | ||||
| 		xsetmode(0, MODE_HIDE); | ||||
| 		break; | ||||
| 	case '=': /* DECPAM -- Application keypad */ | ||||
| 		xsetmode(1, MODE_APPKEYPAD); | ||||
| @ -2450,9 +2413,6 @@ check_control_code: | ||||
| 	 * they must not cause conflicts with sequences. | ||||
| 	 */ | ||||
| 	if (control) { | ||||
| 		/* in UTF-8 mode ignore handling C1 control characters */ | ||||
| 		if (IS_SET(MODE_UTF8) && ISCONTROLC1(u)) | ||||
| 			return; | ||||
| 		tcontrolcode(u); | ||||
| 		/*
 | ||||
| 		 * control codes are not shown ever | ||||
| @ -2499,16 +2459,11 @@ check_control_code: | ||||
| 		gp = &term.line[term.c.y][term.c.x]; | ||||
| 	} | ||||
| 
 | ||||
| 	if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) { | ||||
| 	if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) | ||||
| 		memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph)); | ||||
| 		gp->mode &= ~ATTR_WIDE; | ||||
| 	} | ||||
| 
 | ||||
| 	if (term.c.x+width > term.col) { | ||||
| 		if (IS_SET(MODE_WRAP)) | ||||
| 		tnewline(1); | ||||
| 		else | ||||
| 			tmoveto(term.col - width, term.c.y); | ||||
| 		gp = &term.line[term.c.y][term.c.x]; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										4
									
								
								st.info
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								st.info
									
									
									
									
									
								
							| @ -184,10 +184,6 @@ st-mono| simpleterm monocolor, | ||||
| # XTerm extensions | ||||
| 	rmxx=\E[29m, | ||||
| 	smxx=\E[9m, | ||||
| 	BE=\E[?2004h, | ||||
| 	BD=\E[?2004l, | ||||
| 	PS=\E[200~, | ||||
| 	PE=\E[201~, | ||||
| # disabled rep for now: causes some issues with older ncurses versions. | ||||
| #	rep=%p1%c\E[%p2%{1}%-%db, | ||||
| # tmux extensions, see TERMINFO EXTENSIONS in tmux(1) | ||||
|  | ||||
							
								
								
									
										30
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								x.c
									
									
									
									
									
								
							| @ -818,7 +818,7 @@ xloadcols(void) | ||||
| int | ||||
| xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) | ||||
| { | ||||
| 	if (!BETWEEN(x, 0, dc.collen - 1)) | ||||
| 	if (!BETWEEN(x, 0, dc.collen)) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	*r = dc.col[x].color.red >> 8; | ||||
| @ -833,7 +833,7 @@ xsetcolorname(int x, const char *name) | ||||
| { | ||||
| 	Color ncolor; | ||||
| 
 | ||||
| 	if (!BETWEEN(x, 0, dc.collen - 1)) | ||||
| 	if (!BETWEEN(x, 0, dc.collen)) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	if (!xloadcolor(x, name, &ncolor)) | ||||
| @ -1131,7 +1131,7 @@ xinit(int cols, int rows) | ||||
| { | ||||
| 	XGCValues gcvalues; | ||||
| 	Cursor cursor; | ||||
| 	Window parent, root; | ||||
| 	Window parent; | ||||
| 	pid_t thispid = getpid(); | ||||
| 	XColor xmousefg, xmousebg; | ||||
| 
 | ||||
| @ -1168,19 +1168,16 @@ xinit(int cols, int rows) | ||||
| 		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | ||||
| 	xw.attrs.colormap = xw.cmap; | ||||
| 
 | ||||
| 	root = XRootWindow(xw.dpy, xw.scr); | ||||
| 	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) | ||||
| 		parent = root; | ||||
| 	xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t, | ||||
| 		parent = XRootWindow(xw.dpy, xw.scr); | ||||
| 	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, | ||||
| 			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, | ||||
| 			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity | ||||
| 			| CWEventMask | CWColormap, &xw.attrs); | ||||
| 	if (parent != root) | ||||
| 		XReparentWindow(xw.dpy, xw.win, parent, xw.l, xw.t); | ||||
| 
 | ||||
| 	memset(&gcvalues, 0, sizeof(gcvalues)); | ||||
| 	gcvalues.graphics_exposures = False; | ||||
| 	dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures, | ||||
| 	dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, | ||||
| 			&gcvalues); | ||||
| 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | ||||
| 			DefaultDepth(xw.dpy, xw.scr)); | ||||
| @ -1620,9 +1617,6 @@ xseticontitle(char *p) | ||||
| 	XTextProperty prop; | ||||
| 	DEFAULT(p, opt_title); | ||||
| 
 | ||||
| 	if (p[0] == '\0') | ||||
| 		p = opt_title; | ||||
| 
 | ||||
| 	if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, | ||||
| 	                                &prop) != Success) | ||||
| 		return; | ||||
| @ -1637,9 +1631,6 @@ xsettitle(char *p) | ||||
| 	XTextProperty prop; | ||||
| 	DEFAULT(p, opt_title); | ||||
| 
 | ||||
| 	if (p[0] == '\0') | ||||
| 		p = opt_title; | ||||
| 
 | ||||
| 	if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, | ||||
| 	                                &prop) != Success) | ||||
| 		return; | ||||
| @ -1842,7 +1833,7 @@ void | ||||
| kpress(XEvent *ev) | ||||
| { | ||||
| 	XKeyEvent *e = &ev->xkey; | ||||
| 	KeySym ksym = NoSymbol; | ||||
| 	KeySym ksym; | ||||
| 	char buf[64], *customkey; | ||||
| 	int len; | ||||
| 	Rune c; | ||||
| @ -1852,13 +1843,10 @@ kpress(XEvent *ev) | ||||
| 	if (IS_SET(MODE_KBDLOCK)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (xw.ime.xic) { | ||||
| 	if (xw.ime.xic) | ||||
| 		len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); | ||||
| 		if (status == XBufferOverflow) | ||||
| 			return; | ||||
| 	} else { | ||||
| 	else | ||||
| 		len = XLookupString(e, buf, sizeof buf, &ksym, NULL); | ||||
| 	} | ||||
| 	/* 1. shortcuts */ | ||||
| 	for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { | ||||
| 		if (ksym == bp->keysym && match(bp->mod, e->state)) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user