Compare commits

...

11 Commits

Author SHA1 Message Date
Ryan 459cbd25f7
cleanup config.def.h
Few small tweaks to variable naming and such.
2023-09-27 00:49:26 -04:00
Ryan 20798c3781
make the zoomrate configurable
This commit makes the rate that st zooms configurable.
2023-09-27 00:49:24 -04:00
Ryan 3f17cb0a1c
apply external-pipe-eternal patch
Makes it work with scrollback.
2023-09-27 00:49:08 -04:00
Ryan 9aa9764198
apply externalpipe patch 2023-09-27 00:49:08 -04:00
Ryan 66c365964b
apply blinking_cursor patch
Tweak the Xresources loading to use the new variable.
2023-09-27 00:49:08 -04:00
Ryan c471742acf
apply xclearwin patch 2023-09-27 00:49:07 -04:00
Ryan f3ee21bd5b
apply scrollback-mouse-increment patch
Tweak the config to be a bit better organized.
2023-09-27 00:49:05 -04:00
Ryan 2f938c89aa
apply scrollback-mouse-altscreen patch
This makes the mouse wheel work for both normal scrolling and
altscreens such as less or vim.
2023-09-27 00:48:30 -04:00
Ryan eb282748e3
apply scrollback-mouse patch
Just updates the config, kinda unnecessary.
2023-09-27 00:48:30 -04:00
Ryan 347f4a9c6d
apply scrollback-reflow patch
This patch makes text reflow like a real terminal.
2023-09-27 00:48:30 -04:00
Ryan 36268c9862
apply scrollback patch 2023-09-27 00:48:30 -04:00
5 changed files with 848 additions and 288 deletions

View File

@ -135,13 +135,20 @@ unsigned int defaultcs = 256;
static unsigned int defaultrcs = 257; static unsigned int defaultrcs = 257;
/* /*
* Default shape of cursor * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
* 2: Block ("") * Default style of cursor
* 4: Underline ("_") * 0: blinking block
* 6: Bar ("|") * 1: blinking block (default)
* 7: Snowman ("") * 2: steady block ("")
* 3: blinking underline
* 4: steady underline ("_")
* 5: blinking bar
* 6: steady bar ("|")
* 7: blinking st cursor
* 8: steady st cursor
*/ */
static unsigned int cursorshape = 2; static unsigned int cursorstyle = 1;
static Rune stcursor = 0x2603; /* snowman ("☃") */
/* /*
* Default columns and rows numbers * Default columns and rows numbers
@ -170,12 +177,24 @@ static unsigned int defaultattr = 11;
*/ */
static uint forcemousemod = ShiftMask; static uint forcemousemod = ShiftMask;
/*
* The number of lines to scroll by.
*/
const unsigned int scrollrate = 1;
/*
* The rate to zoom in (adjust the font size).
*/
const unsigned int zoomrate = 1;
/* /*
* Internal mouse shortcuts. * Internal mouse shortcuts.
* Beware that overloading Button1 will disable the selection. * Beware that overloading Button1 will disable the selection.
*/ */
static MouseShortcut mshortcuts[] = { static MouseShortcut mshortcuts[] = {
/* mask button function argument release */ /* mask button function argument release */
{ XK_ANY_MOD, Button4, kscrollup, {.i = scrollrate}, 0, /* !alt */ -1 },
{ XK_ANY_MOD, Button5, kscrolldown, {.i = scrollrate}, 0, /* !alt */ -1 },
{ XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
@ -193,14 +212,16 @@ static Shortcut shortcuts[] = {
{ ControlMask, XK_Print, toggleprinter, {.i = 0} }, { ControlMask, XK_Print, toggleprinter, {.i = 0} },
{ ShiftMask, XK_Print, printscreen, {.i = 0} }, { ShiftMask, XK_Print, printscreen, {.i = 0} },
{ XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, { XK_ANY_MOD, XK_Print, printsel, {.i = 0} },
{ TERMMOD, XK_Prior, zoom, {.f = +1} }, { TERMMOD, XK_Prior, zoom, {.f = +1 * zoomrate} },
{ TERMMOD, XK_Next, zoom, {.f = -1} }, { TERMMOD, XK_Next, zoom, {.f = -1 * zoomrate} },
{ TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} },
{ TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} },
{ TERMMOD, XK_V, clippaste, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} },
{ TERMMOD, XK_Y, selpaste, {.i = 0} }, { TERMMOD, XK_Y, selpaste, {.i = 0} },
{ ShiftMask, XK_Insert, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} },
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1 * scrollrate} },
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1 * scrollrate} },
}; };
/* /*

1014
st.c

File diff suppressed because it is too large Load Diff

29
st.h
View File

@ -22,17 +22,19 @@
enum glyph_attribute { enum glyph_attribute {
ATTR_NULL = 0, ATTR_NULL = 0,
ATTR_BOLD = 1 << 0, ATTR_SET = 1 << 0,
ATTR_FAINT = 1 << 1, ATTR_BOLD = 1 << 1,
ATTR_ITALIC = 1 << 2, ATTR_FAINT = 1 << 2,
ATTR_UNDERLINE = 1 << 3, ATTR_ITALIC = 1 << 3,
ATTR_BLINK = 1 << 4, ATTR_UNDERLINE = 1 << 4,
ATTR_REVERSE = 1 << 5, ATTR_BLINK = 1 << 5,
ATTR_INVISIBLE = 1 << 6, ATTR_REVERSE = 1 << 6,
ATTR_STRUCK = 1 << 7, ATTR_INVISIBLE = 1 << 7,
ATTR_WRAP = 1 << 8, ATTR_STRUCK = 1 << 8,
ATTR_WIDE = 1 << 9, ATTR_WRAP = 1 << 9,
ATTR_WDUMMY = 1 << 10, ATTR_WIDE = 1 << 10,
ATTR_WDUMMY = 1 << 11,
ATTR_SELECTED = 1 << 12,
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
}; };
@ -81,13 +83,18 @@ void die(const char *, ...);
void redraw(void); void redraw(void);
void draw(void); void draw(void);
void kscrolldown(const Arg *);
void kscrollup(const Arg *);
void externalpipe(const Arg *);
void printscreen(const Arg *); void printscreen(const Arg *);
void printsel(const Arg *); void printsel(const Arg *);
void sendbreak(const Arg *); void sendbreak(const Arg *);
void toggleprinter(const Arg *); void toggleprinter(const Arg *);
int tattrset(int); int tattrset(int);
int tisaltscr(void);
void tnew(int, int); void tnew(int, int);
int tisaltscreen(void);
void tresize(int, int); void tresize(int, int);
void tsetdirtattr(int); void tsetdirtattr(int);
void ttyhangup(void); void ttyhangup(void);

1
win.h
View File

@ -39,3 +39,4 @@ void xsetpointermotion(int);
void xsetsel(char *); void xsetsel(char *);
int xstartdraw(void); int xstartdraw(void);
void xximspot(int, int); void xximspot(int, int);
void xclearwin(void);

55
x.c
View File

@ -34,6 +34,7 @@ typedef struct {
void (*func)(const Arg *); void (*func)(const Arg *);
const Arg arg; const Arg arg;
uint release; uint release;
int altscrn; /* 0: don't care, -1: not alt screen, 1: alt screen */
} MouseShortcut; } MouseShortcut;
typedef struct { typedef struct {
@ -254,6 +255,7 @@ static char *opt_name = NULL;
static char *opt_title = NULL; static char *opt_title = NULL;
static uint buttons; /* bit field of pressed buttons */ static uint buttons; /* bit field of pressed buttons */
static int cursorblinks = 0;
void void
clipcopy(const Arg *dummy) clipcopy(const Arg *dummy)
@ -456,6 +458,7 @@ mouseaction(XEvent *e, uint release)
for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
if (ms->release == release && if (ms->release == release &&
ms->button == e->xbutton.button && ms->button == e->xbutton.button &&
(!ms->altscrn || (ms->altscrn == (tisaltscr() ? 1 : -1))) &&
(match(ms->mod, state) || /* exact or forced */ (match(ms->mod, state) || /* exact or forced */
match(ms->mod, state & ~forcemousemod))) { match(ms->mod, state & ~forcemousemod))) {
ms->func(&(ms->arg)); ms->func(&(ms->arg));
@ -860,6 +863,12 @@ xclear(int x1, int y1, int x2, int y2)
x1, y1, x2-x1, y2-y1); x1, y1, x2-x1, y2-y1);
} }
void
xclearwin(void)
{
xclear(0, 0, win.w, win.h);
}
void void
xhints(void) xhints(void)
{ {
@ -1573,29 +1582,44 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
/* draw the new one */ /* draw the new one */
if (IS_SET(MODE_FOCUSED)) { if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) { switch (win.cursor) {
case 7: /* st extension */ default:
g.u = 0x2603; /* snowman (U+2603) */ case 0: /* blinking block */
case 1: /* blinking block (default) */
if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */ /* FALLTHROUGH */
case 0: /* Blinking Block */ case 2: /* steady block */
case 1: /* Blinking Block (Default) */
case 2: /* Steady Block */
xdrawglyph(g, cx, cy); xdrawglyph(g, cx, cy);
break; break;
case 3: /* Blinking Underline */ case 3: /* blinking underline */
case 4: /* Steady Underline */ if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
case 4: /* steady underline */
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
win.hborderpx + cx * win.cw, win.hborderpx + cx * win.cw,
win.vborderpx + (cy + 1) * win.ch - \ win.vborderpx + (cy + 1) * win.ch - \
cursorthickness, cursorthickness,
win.cw, cursorthickness); win.cw, cursorthickness);
break; break;
case 5: /* Blinking bar */ case 5: /* blinking bar */
case 6: /* Steady bar */ if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
case 6: /* steady bar */
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
win.hborderpx + cx * win.cw, win.hborderpx + cx * win.cw,
win.vborderpx + cy * win.ch, win.vborderpx + cy * win.ch,
cursorthickness, win.ch); cursorthickness, win.ch);
break; break;
case 7: /* blinking st cursor */
if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
case 8: /* steady st cursor */
g.u = stcursor;
xdrawglyph(g, cx, cy);
break;
} }
} else { } else {
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
@ -1752,9 +1776,12 @@ xsetmode(int set, unsigned int flags)
int int
xsetcursor(int cursor) xsetcursor(int cursor)
{ {
if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
return 1; return 1;
win.cursor = cursor; win.cursor = cursor;
cursorblinks = win.cursor == 0 || win.cursor == 1 ||
win.cursor == 3 || win.cursor == 5 ||
win.cursor == 7;
return 0; return 0;
} }
@ -2001,6 +2028,10 @@ run(void)
if (FD_ISSET(ttyfd, &rfd) || xev) { if (FD_ISSET(ttyfd, &rfd) || xev) {
if (!drawing) { if (!drawing) {
trigger = now; trigger = now;
if (IS_SET(MODE_BLINK)) {
win.mode ^= MODE_BLINK;
}
lastblink = now;
drawing = 1; drawing = 1;
} }
timeout = (maxlatency - TIMEDIFF(now, trigger)) \ timeout = (maxlatency - TIMEDIFF(now, trigger)) \
@ -2011,7 +2042,7 @@ run(void)
/* idle detected or maxlatency exhausted -> draw */ /* idle detected or maxlatency exhausted -> draw */
timeout = -1; timeout = -1;
if (blinktimeout && tattrset(ATTR_BLINK)) { if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK))) {
timeout = blinktimeout - TIMEDIFF(now, lastblink); timeout = blinktimeout - TIMEDIFF(now, lastblink);
if (timeout <= 0) { if (timeout <= 0) {
if (-timeout > blinktimeout) /* start visible */ if (-timeout > blinktimeout) /* start visible */
@ -2047,7 +2078,7 @@ main(int argc, char *argv[])
{ {
xw.l = xw.t = 0; xw.l = xw.t = 0;
xw.isfixed = False; xw.isfixed = False;
xsetcursor(cursorshape); xsetcursor(cursorstyle);
ARGBEGIN { ARGBEGIN {
case 'a': case 'a':