From 51629e515633d3c9e6183406cfba7158b25cd89b Mon Sep 17 00:00:00 2001 From: Tovi Jaeschke-Rogers Date: Sun, 13 Jun 2021 09:41:42 +0930 Subject: [PATCH] Updated configs --- .gitignore | 1 + config.def.h | 54 ++-- config.h | 472 +++++++++++++++++++++++++++++ patches/st-gruvbox-dark-0.8.2.diff | 70 +++++ patches/st-scrollback-0.8.4.diff | 351 +++++++++++++++++++++ st.c | 125 ++++++-- st.h | 2 + st.o | Bin 0 -> 76952 bytes x.o | Bin 0 -> 72904 bytes 9 files changed, 1019 insertions(+), 56 deletions(-) create mode 100644 .gitignore create mode 100644 config.h create mode 100644 patches/st-gruvbox-dark-0.8.2.diff create mode 100644 patches/st-scrollback-0.8.4.diff create mode 100644 st.o create mode 100644 x.o diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25cee50 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +st diff --git a/config.def.h b/config.def.h index 6f05dce..9a6876a 100644 --- a/config.def.h +++ b/config.def.h @@ -95,41 +95,35 @@ unsigned int tabspaces = 8; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { - /* 8 normal colors */ - "black", - "red3", - "green3", - "yellow3", - "blue2", - "magenta3", - "cyan3", - "gray90", - - /* 8 bright colors */ - "gray50", - "red", - "green", - "yellow", - "#5c5cff", - "magenta", - "cyan", - "white", - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#cccccc", - "#555555", -}; + /* 8 normal colors */ + [0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */ + [1] = "#cc241d", /* red */ + [2] = "#98971a", /* green */ + [3] = "#d79921", /* yellow */ + [4] = "#458588", /* blue */ + [5] = "#b16286", /* magenta */ + [6] = "#689d6a", /* cyan */ + [7] = "#a89984", /* white */ + + /* 8 bright colors */ + [8] = "#928374", /* black */ + [9] = "#fb4934", /* red */ + [10] = "#b8bb26", /* green */ + [11] = "#fabd2f", /* yellow */ + [12] = "#83a598", /* blue */ + [13] = "#d3869b", /* magenta */ + [14] = "#8ec07c", /* cyan */ + [15] = "#ebdbb2", /* white */ +}; /* * Default colors (colorname index) - * foreground, background, cursor, reverse cursor + * foreground, background, cursor */ -unsigned int defaultfg = 7; +unsigned int defaultfg = 15; unsigned int defaultbg = 0; -static unsigned int defaultcs = 256; +static unsigned int defaultcs = 15; static unsigned int defaultrcs = 257; /* @@ -199,6 +193,8 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/config.h b/config.h new file mode 100644 index 0000000..8697381 --- /dev/null +++ b/config.h @@ -0,0 +1,472 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=14:antialias=true:autohint=true"; +static int borderpx = 2; + +/* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e + * 2: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = NULL; +char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; + +/* identification sequence returned in DA and DECID */ +char *vtiden = "\033[?6c"; + +/* Kerning / character bounding-box multipliers */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * 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 = 8; +static double maxlatency = 33; + +/* + * blinking timeout (set to 0 to disable blinking) for the terminal blinking + * attribute. + */ +static unsigned int blinktimeout = 800; + +/* + * thickness of underline and bar cursors + */ +static unsigned int cursorthickness = 2; + +/* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it + */ +static int bellvolume = 0; + +/* default TERM value */ +char *termname = "st-256color"; + +/* + * spaces per tab + * + * When you are changing this value, don't forget to adapt the »it« value in + * the st.info and appropriately install the st.info in the environment where + * you use this st version. + * + * it#$tabspaces, + * + * Secondly make sure your kernel is not expanding tabs. When running `stty + * -a` »tab0« should appear. You can tell the terminal to not expand tabs by + * running following command: + * + * stty tabs + */ +unsigned int tabspaces = 8; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + + /* 8 normal colors */ + [0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */ + [1] = "#cc241d", /* red */ + [2] = "#98971a", /* green */ + [3] = "#d79921", /* yellow */ + [4] = "#458588", /* blue */ + [5] = "#b16286", /* magenta */ + [6] = "#689d6a", /* cyan */ + [7] = "#a89984", /* white */ + + /* 8 bright colors */ + [8] = "#928374", /* black */ + [9] = "#fb4934", /* red */ + [10] = "#b8bb26", /* green */ + [11] = "#fabd2f", /* yellow */ + [12] = "#83a598", /* blue */ + [13] = "#d3869b", /* magenta */ + [14] = "#8ec07c", /* cyan */ + [15] = "#ebdbb2", /* white */ +}; + +/* + * Default colors (colorname index) + * foreground, background, cursor + */ +unsigned int defaultfg = 15; +unsigned int defaultbg = 0; +static unsigned int defaultcs = 15; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * Default columns and rows numbers + */ + +static unsigned int cols = 80; +static 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; + +/* + * Color used to display font attributes when fontconfig selected a font which + * doesn't match the ones requested. + */ +static unsigned int defaultattr = 11; + +/* + * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). + * 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 forcemousemod = ShiftMask; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +static 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} }, + { TERMMOD, XK_Prior, zoom, {.f = +1} }, + { TERMMOD, XK_Next, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + { MODKEY, XK_k, kscrollup, {.i = 1} }, + { MODKEY, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_Up, kscrollup, {.i = 1} }, + { MODKEY, XK_Down, kscrolldown, {.i = 1} }, +}; + +/* + * Special keys (change & recompile st.info accordingly) + * + * Mask value: + * * Use XK_ANY_MOD to match the key no matter modifiers state + * * Use XK_NO_MOD to match the key alone (no modifiers) + * appkey value: + * * 0: no value + * * > 0: keypad application mode enabled + * * = 2: term.numlock = 1 + * * < 0: keypad application mode disabled + * appcursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * + * Be careful with the order of the definitions because st searches in + * this table sequentially, so any XK_ANY_MOD must be in the last + * position for a key. + */ + +/* + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +static KeySym mappedkeys[] = { -1 }; + +/* + * State bits to ignore when matching key or button events. By default, + * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. + */ +static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; + +/* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ +static Key key[] = { + /* keysym mask string appkey appcursor */ + { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, + { XK_KP_End, ControlMask, "\033[J", -1, 0}, + { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_KP_End, ShiftMask, "\033[K", -1, 0}, + { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, + { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, + { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, + { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, + { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, + { XK_Up, ControlMask, "\033[1;5A", 0, 0}, + { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, + { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, + { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, + { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, + { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, + { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, + { XK_Down, ControlMask, "\033[1;5B", 0, 0}, + { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, + { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, + { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, + { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, + { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, + { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, + { XK_Left, ControlMask, "\033[1;5D", 0, 0}, + { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, + { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, + { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, + { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, + { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, + { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, + { XK_Right, ControlMask, "\033[1;5C", 0, 0}, + { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, + { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, + { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, + { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, + { XK_Return, Mod1Mask, "\033\r", 0, 0}, + { XK_Return, XK_ANY_MOD, "\r", 0, 0}, + { XK_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_Insert, ControlMask, "\033[L", -1, 0}, + { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_Delete, ControlMask, "\033[M", -1, 0}, + { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, + { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, + { XK_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_End, ControlMask, "\033[J", -1, 0}, + { XK_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_End, ShiftMask, "\033[K", -1, 0}, + { XK_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, + { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_Next, ControlMask, "\033[6;5~", 0, 0}, + { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, + { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, + { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, + { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, + { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, + { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, + { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, + { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, + { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, + { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, + { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, + { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, + { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, + { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, + { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, + { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, + { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, + { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, + { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, + { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, + { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, + { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, + { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, + { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, + { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, + { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, + { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, + { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, + { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, + { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, + { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, + { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, + { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, + { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, + { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, + { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, + { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, + { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, + { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, + { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, + { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, + { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, + { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, + { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, + { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, + { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, + { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, + { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, + { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, + { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, + { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, + { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, + { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, + { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, + { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, + { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, + { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, + { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, + { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, + { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, + { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, + { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, + { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, + { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, + { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, + { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, + { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, + { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, + { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, + { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, + { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, + { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, + { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, + { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, + { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, + { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, + { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, + { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, + { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, + { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, + { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, + { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, + { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, + { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, + { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, + { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, +}; + +/* + * Selection types' masks. + * Use the same masks as usual. + * Button1Mask is always unset, to make masks match between ButtonPress. + * ButtonRelease and MotionNotify. + * If no match is found, regular selection is used. + */ +static uint selmasks[] = { + [SEL_RECTANGULAR] = Mod1Mask, +}; + +/* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/patches/st-gruvbox-dark-0.8.2.diff b/patches/st-gruvbox-dark-0.8.2.diff new file mode 100644 index 0000000..c8390f0 --- /dev/null +++ b/patches/st-gruvbox-dark-0.8.2.diff @@ -0,0 +1,70 @@ +diff --git a/config.def.h b/config.def.h +index 877afab..6a1699f 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -84,41 +84,35 @@ static unsigned int tabspaces = 8; + + /* Terminal colors (16 first used in escape sequence) */ + static const char *colorname[] = { +- /* 8 normal colors */ +- "black", +- "red3", +- "green3", +- "yellow3", +- "blue2", +- "magenta3", +- "cyan3", +- "gray90", +- +- /* 8 bright colors */ +- "gray50", +- "red", +- "green", +- "yellow", +- "#5c5cff", +- "magenta", +- "cyan", +- "white", +- +- [255] = 0, +- +- /* more colors can be added after 255 to use with DefaultXX */ +- "#cccccc", +- "#555555", +-}; + ++ /* 8 normal colors */ ++ [0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */ ++ [1] = "#cc241d", /* red */ ++ [2] = "#98971a", /* green */ ++ [3] = "#d79921", /* yellow */ ++ [4] = "#458588", /* blue */ ++ [5] = "#b16286", /* magenta */ ++ [6] = "#689d6a", /* cyan */ ++ [7] = "#a89984", /* white */ ++ ++ /* 8 bright colors */ ++ [8] = "#928374", /* black */ ++ [9] = "#fb4934", /* red */ ++ [10] = "#b8bb26", /* green */ ++ [11] = "#fabd2f", /* yellow */ ++ [12] = "#83a598", /* blue */ ++ [13] = "#d3869b", /* magenta */ ++ [14] = "#8ec07c", /* cyan */ ++ [15] = "#ebdbb2", /* white */ ++}; + + /* + * Default colors (colorname index) +- * foreground, background, cursor, reverse cursor ++ * foreground, background, cursor + */ +-unsigned int defaultfg = 7; +-unsigned int defaultbg = 0; +-static unsigned int defaultcs = 256; ++unsigned int defaultfg = 15; ++unsigned int defaultbg = 0; ++static unsigned int defaultcs = 15; + static unsigned int defaultrcs = 257; + + /* diff --git a/patches/st-scrollback-0.8.4.diff b/patches/st-scrollback-0.8.4.diff new file mode 100644 index 0000000..88e0c79 --- /dev/null +++ b/patches/st-scrollback-0.8.4.diff @@ -0,0 +1,351 @@ +diff --git a/config.def.h b/config.def.h +index 6f05dce..93cbcc0 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -199,6 +199,8 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, ++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + }; + + /* +diff --git a/st.c b/st.c +index 76b7e0d..edec064 100644 +--- a/st.c ++++ b/st.c +@@ -35,6 +35,7 @@ + #define ESC_ARG_SIZ 16 + #define STR_BUF_SIZ ESC_BUF_SIZ + #define STR_ARG_SIZ ESC_ARG_SIZ ++#define HISTSIZE 2000 + + /* macros */ + #define IS_SET(flag) ((term.mode & (flag)) != 0) +@@ -42,6 +43,9 @@ + #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) + #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) + #define ISDELIM(u) (u && wcschr(worddelimiters, u)) ++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ ++ term.scr + HISTSIZE + 1) % HISTSIZE] : \ ++ term.line[(y) - term.scr]) + + enum term_mode { + MODE_WRAP = 1 << 0, +@@ -115,6 +119,9 @@ typedef struct { + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ ++ Line hist[HISTSIZE]; /* history buffer */ ++ int histi; /* history index */ ++ int scr; /* scroll back */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ +@@ -184,8 +191,8 @@ static void tnewline(int); + static void tputtab(int); + static void tputc(Rune); + static void treset(void); +-static void tscrollup(int, int); +-static void tscrolldown(int, int); ++static void tscrollup(int, int, int); ++static void tscrolldown(int, int, int); + static void tsetattr(int *, int); + static void tsetchar(Rune, Glyph *, int, int); + static void tsetdirt(int, int); +@@ -414,10 +421,10 @@ tlinelen(int y) + { + int i = term.col; + +- if (term.line[y][i - 1].mode & ATTR_WRAP) ++ if (TLINE(y)[i - 1].mode & ATTR_WRAP) + return i; + +- while (i > 0 && term.line[y][i - 1].u == ' ') ++ while (i > 0 && TLINE(y)[i - 1].u == ' ') + --i; + + return i; +@@ -526,7 +533,7 @@ selsnap(int *x, int *y, int direction) + * Snap around if the word wraps around at the end or + * beginning of a line. + */ +- prevgp = &term.line[*y][*x]; ++ prevgp = &TLINE(*y)[*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; +@@ -541,14 +548,14 @@ selsnap(int *x, int *y, int direction) + yt = *y, xt = *x; + else + yt = newy, xt = newx; +- if (!(term.line[yt][xt].mode & ATTR_WRAP)) ++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + +- gp = &term.line[newy][newx]; ++ gp = &TLINE(newy)[newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) +@@ -569,14 +576,14 @@ selsnap(int *x, int *y, int direction) + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { +- if (!(term.line[*y-1][term.col-1].mode ++ if (!(TLINE(*y-1)[term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { +- if (!(term.line[*y][term.col-1].mode ++ if (!(TLINE(*y)[term.col-1].mode + & ATTR_WRAP)) { + break; + } +@@ -607,13 +614,13 @@ getsel(void) + } + + if (sel.type == SEL_RECTANGULAR) { +- gp = &term.line[y][sel.nb.x]; ++ gp = &TLINE(y)[sel.nb.x]; + lastx = sel.ne.x; + } else { +- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; ++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } +- last = &term.line[y][MIN(lastx, linelen-1)]; ++ last = &TLINE(y)[MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + +@@ -848,6 +855,9 @@ void + ttywrite(const char *s, size_t n, int may_echo) + { + const char *next; ++ Arg arg = (Arg) { .i = term.scr }; ++ ++ kscrolldown(&arg); + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); +@@ -1059,13 +1069,53 @@ tswapscreen(void) + } + + void +-tscrolldown(int orig, int n) ++kscrolldown(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (n > term.scr) ++ n = term.scr; ++ ++ if (term.scr > 0) { ++ term.scr -= n; ++ selscroll(0, -n); ++ tfulldirt(); ++ } ++} ++ ++void ++kscrollup(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (term.scr <= HISTSIZE-n) { ++ term.scr += n; ++ selscroll(0, n); ++ tfulldirt(); ++ } ++} ++ ++void ++tscrolldown(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[term.bot]; ++ term.line[term.bot] = temp; ++ } ++ + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); + +@@ -1075,17 +1125,28 @@ tscrolldown(int orig, int n) + term.line[i-n] = temp; + } + +- selscroll(orig, n); ++ if (term.scr == 0) ++ selscroll(orig, n); + } + + void +-tscrollup(int orig, int n) ++tscrollup(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi + 1) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[orig]; ++ term.line[orig] = temp; ++ } ++ ++ if (term.scr > 0 && term.scr < HISTSIZE) ++ term.scr = MIN(term.scr + n, HISTSIZE-1); ++ + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + +@@ -1095,7 +1156,8 @@ tscrollup(int orig, int n) + term.line[i+n] = temp; + } + +- selscroll(orig, -n); ++ if (term.scr == 0) ++ selscroll(orig, -n); + } + + void +@@ -1124,7 +1186,7 @@ tnewline(int first_col) + int y = term.c.y; + + if (y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + y++; + } +@@ -1289,14 +1351,14 @@ void + tinsertblankline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrolldown(term.c.y, n); ++ tscrolldown(term.c.y, n, 0); + } + + void + tdeleteline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrollup(term.c.y, n); ++ tscrollup(term.c.y, n, 0); + } + + int32_t +@@ -1733,11 +1795,11 @@ csihandle(void) + break; + case 'S': /* SU -- Scroll line up */ + DEFAULT(csiescseq.arg[0], 1); +- tscrollup(term.top, csiescseq.arg[0]); ++ tscrollup(term.top, csiescseq.arg[0], 0); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); +- tscrolldown(term.top, csiescseq.arg[0]); ++ tscrolldown(term.top, csiescseq.arg[0], 0); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); +@@ -2241,7 +2303,7 @@ eschandle(uchar ascii) + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } +@@ -2254,7 +2316,7 @@ eschandle(uchar ascii) + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { +- tscrolldown(term.top, 1); ++ tscrolldown(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } +@@ -2464,7 +2526,7 @@ twrite(const char *buf, int buflen, int show_ctrl) + void + tresize(int col, int row) + { +- int i; ++ int i, j; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; +@@ -2501,6 +2563,14 @@ tresize(int col, int row) + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + ++ for (i = 0; i < HISTSIZE; i++) { ++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); ++ for (j = mincol; j < col; j++) { ++ term.hist[i][j] = term.c.attr; ++ term.hist[i][j].u = ' '; ++ } ++ } ++ + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); +@@ -2559,7 +2629,7 @@ drawregion(int x1, int y1, int x2, int y2) + continue; + + term.dirty[y] = 0; +- xdrawline(term.line[y], x1, y, x2); ++ xdrawline(TLINE(y), x1, y, x2); + } + } + +@@ -2580,8 +2650,9 @@ draw(void) + cx--; + + drawregion(0, 0, term.col, term.row); +- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++ if (term.scr == 0) ++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); +diff --git a/st.h b/st.h +index 3d351b6..f44e1d3 100644 +--- a/st.h ++++ b/st.h +@@ -81,6 +81,8 @@ void die(const char *, ...); + void redraw(void); + void draw(void); + ++void kscrolldown(const Arg *); ++void kscrollup(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); diff --git a/st.c b/st.c index abbbe4b..e2dd722 100644 --- a/st.c +++ b/st.c @@ -35,6 +35,7 @@ #define ESC_ARG_SIZ 16 #define STR_BUF_SIZ ESC_BUF_SIZ #define STR_ARG_SIZ ESC_ARG_SIZ +#define HISTSIZE 2000 /* macros */ #define IS_SET(flag) ((term.mode & (flag)) != 0) @@ -42,6 +43,9 @@ #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) #define ISDELIM(u) (u && wcschr(worddelimiters, u)) +#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ + term.scr + HISTSIZE + 1) % HISTSIZE] : \ + term.line[(y) - term.scr]) enum term_mode { MODE_WRAP = 1 << 0, @@ -115,6 +119,9 @@ typedef struct { int col; /* nb col */ Line *line; /* screen */ Line *alt; /* alternate screen */ + Line hist[HISTSIZE]; /* history buffer */ + int histi; /* history index */ + int scr; /* scroll back */ int *dirty; /* dirtyness of lines */ TCursor c; /* cursor */ int ocx; /* old cursor col */ @@ -184,8 +191,8 @@ static void tnewline(int); static void tputtab(int); static void tputc(Rune); static void treset(void); -static void tscrollup(int, int); -static void tscrolldown(int, int); +static void tscrollup(int, int, int); +static void tscrolldown(int, int, int); static void tsetattr(int *, int); static void tsetchar(Rune, Glyph *, int, int); static void tsetdirt(int, int); @@ -414,10 +421,10 @@ tlinelen(int y) { int i = term.col; - if (term.line[y][i - 1].mode & ATTR_WRAP) + if (TLINE(y)[i - 1].mode & ATTR_WRAP) return i; - while (i > 0 && term.line[y][i - 1].u == ' ') + while (i > 0 && TLINE(y)[i - 1].u == ' ') --i; return i; @@ -526,7 +533,7 @@ selsnap(int *x, int *y, int direction) * Snap around if the word wraps around at the end or * beginning of a line. */ - prevgp = &term.line[*y][*x]; + prevgp = &TLINE(*y)[*x]; prevdelim = ISDELIM(prevgp->u); for (;;) { newx = *x + direction; @@ -541,14 +548,14 @@ selsnap(int *x, int *y, int direction) yt = *y, xt = *x; else yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) + if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) break; } if (newx >= tlinelen(newy)) break; - gp = &term.line[newy][newx]; + gp = &TLINE(newy)[newx]; delim = ISDELIM(gp->u); if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->u != prevgp->u))) @@ -569,14 +576,14 @@ selsnap(int *x, int *y, int direction) *x = (direction < 0) ? 0 : term.col - 1; if (direction < 0) { for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode + if (!(TLINE(*y-1)[term.col-1].mode & ATTR_WRAP)) { break; } } } else if (direction > 0) { for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode + if (!(TLINE(*y)[term.col-1].mode & ATTR_WRAP)) { break; } @@ -607,13 +614,13 @@ getsel(void) } if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; + gp = &TLINE(y)[sel.nb.x]; lastx = sel.ne.x; } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; } - last = &term.line[y][MIN(lastx, linelen-1)]; + last = &TLINE(y)[MIN(lastx, linelen-1)]; while (last >= gp && last->u == ' ') --last; @@ -848,6 +855,9 @@ void ttywrite(const char *s, size_t n, int may_echo) { const char *next; + Arg arg = (Arg) { .i = term.scr }; + + kscrolldown(&arg); if (may_echo && IS_SET(MODE_ECHO)) twrite(s, n, 1); @@ -1059,13 +1069,53 @@ tswapscreen(void) } void -tscrolldown(int orig, int n) +kscrolldown(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (n > term.scr) + n = term.scr; + + if (term.scr > 0) { + term.scr -= n; + selscroll(0, -n); + tfulldirt(); + } +} + +void +kscrollup(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (term.scr <= HISTSIZE-n) { + term.scr += n; + selscroll(0, n); + tfulldirt(); + } +} + +void +tscrolldown(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[term.bot]; + term.line[term.bot] = temp; + } + tsetdirt(orig, term.bot-n); tclearregion(0, term.bot-n+1, term.col-1, term.bot); @@ -1075,17 +1125,28 @@ tscrolldown(int orig, int n) term.line[i-n] = temp; } - selscroll(orig, n); + if (term.scr == 0) + selscroll(orig, n); } void -tscrollup(int orig, int n) +tscrollup(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi + 1) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[orig]; + term.line[orig] = temp; + } + + if (term.scr > 0 && term.scr < HISTSIZE) + term.scr = MIN(term.scr + n, HISTSIZE-1); + tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); @@ -1095,7 +1156,8 @@ tscrollup(int orig, int n) term.line[i+n] = temp; } - selscroll(orig, -n); + if (term.scr == 0) + selscroll(orig, -n); } void @@ -1124,7 +1186,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { y++; } @@ -1289,14 +1351,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); + tscrolldown(term.c.y, n, 0); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); + tscrollup(term.c.y, n, 0); } int32_t @@ -1733,11 +1795,11 @@ csihandle(void) break; case 'S': /* SU -- Scroll line up */ DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); + tscrollup(term.top, csiescseq.arg[0], 0); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); + tscrolldown(term.top, csiescseq.arg[0], 0); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2249,7 +2311,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2262,7 +2324,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1); + tscrolldown(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2472,7 +2534,7 @@ twrite(const char *buf, int buflen, int show_ctrl) void tresize(int col, int row) { - int i; + int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int *bp; @@ -2509,6 +2571,14 @@ tresize(int col, int row) term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + for (i = 0; i < HISTSIZE; i++) { + term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); + for (j = mincol; j < col; j++) { + term.hist[i][j] = term.c.attr; + term.hist[i][j].u = ' '; + } + } + /* resize each row to new width, zero-pad if needed */ for (i = 0; i < minrow; i++) { term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); @@ -2567,7 +2637,7 @@ drawregion(int x1, int y1, int x2, int y2) continue; term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); + xdrawline(TLINE(y), x1, y, x2); } } @@ -2588,8 +2658,9 @@ draw(void) cx--; drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + if (term.scr == 0) + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); diff --git a/st.h b/st.h index 3d351b6..f44e1d3 100644 --- a/st.h +++ b/st.h @@ -81,6 +81,8 @@ void die(const char *, ...); void redraw(void); void draw(void); +void kscrolldown(const Arg *); +void kscrollup(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); diff --git a/st.o b/st.o new file mode 100644 index 0000000000000000000000000000000000000000..54877e3847fa6af7e4c8d5dbdc9f71d41820b09d GIT binary patch literal 76952 zcmeFa4|G)3_4s=y86aR}f<{HfI+jq0paOytLCwG*HyRLyDpiy}lLR7xAeoS0fdnT( z#xQ`DDk@gA)KaU~zlcgPA^cOZ21P_gjfi!|0YyXzAmr_R&fb%g4cC5u-}lyf>#f(j zn3;P&XWxDH+2{Yc=Z1uRgzim7GoxUhw0E1YeeZk=ZN!bg1J!}g}O z$X4T5Zln$V*paL7$LCp+9)ONws?NF`D4!5;KO>IhdEAe{Is&$7NhIm%J z@4uj-zNVcWIRo#@a=%!14xJBx^Nx|lR`=%SxksAYSytJ(o7x>~hWPO7s%H4|JXGsh zRSVja>qAWyWo=iZwe?pi;m=nm;f3!O-_5??`bPbBq#fGR-41`4XV6RPVC0J}Z4MaYKiHf+i~#Xl`!yg@;(V;qRjjD!!tO zl-Mw!|HPW-YB*-%*90703X>_D?kd0FFc>TE|w?6U)Pc3q>}b~PN#ZsRIFt@^Dw9Yg)S zrS0udG%XZ!mF^F3uGe?g=u%MQZo(Vm8>*YjZ_+F>qB*O{GyF*P!SbG2`zn$n)0(r6 z&+3l0)HNpAH7fr%xsxzKp-nExRCm^)Ip5T;#gxRi>EAci#XF#5pVq2C*2Y<@b;#2c z*R*DJ9i0shskhlE6@?w9A7yE%A8K?**Q20km0~NCf!3dmS>2H-nB707vtBu z>!L}aMpt!nX@7gE9ZBDS_uHB4I8!3-#XowAl@d=Ui~MGXN2F`h?*Il!^$383x@aC1Ybz6nRS0!bQcu5__I`t z(!#ScQtj|h;SYS_Ep|YeLUp!sP14S*!QRpy;igd37izky?1FGD1==+O*V)z0K@ZlQ z)Ysi07rp)G=H{HhfkYOiLt(4O!sdB3H_3f)LsD=8REh!Tp%Z4Gv&o;7=7lp(bxr#I zg1LD~>CHzI<>y5#KSnqtb%^EZ++Fxm2=RO7Z!LQat-y?KkbldY#o@>w^1bcwhKQM&YG)y?P^DTCHUm9cm#Tz3n7=L#Kf4xR@sDqNl!hH{bqQ0PjlbQiX

^)8 zy0U%xhR7|=S?fI4t_!Ois-GFFt_^-2xxr=Es9cVx!u5xtI#=khEBJ0G>I!aF+8#u0 zyY0}oZeXSR<1e;qLObV#k3;hpPS4QRhMHW#&Y`9xPgOr?Z^5OVji$1utuB;V4YQ{u zD=RV^+UORj!7hAXw?IcO4A<2iK0ovA!uM4R)PM!|49G>u#!>4!=LFhPg# z{tPTSR`tQ)RC0}K^X%$c&mXZr05NxbWG3p-(LZ$wQw3$B89E2|5r}k$XJHU7$@SlQ7XAt%3P=A}8Q@>n zIXCcCPTg*Ij%)ppnt>Ur_Z|YZxU)Ze{G{&p9rS0kaeJ!Qf(=>VHBa@wkE!HWJp;t9 znU#^^A8?JQ>Q8VLdk2C*Yjv|{z8^eJWh(0Oh1&vK_zVWOZ7I$To&{UMqp>Bx!}~Hf zV-{00mRe_rVrkqQK?`!w??TTMq6&A0Yn?CrTg$bv`hCyBn-QtovbN4z9o|Qt*-S-q zvt9U>E}Dlg3~#DyK0ott;ajR`Vtmx5*5uZ8#t7q)@Vd;m?ZEpjhHTY_=ptOV3k>Om zhBQJ`m+a2Ke%wq@WHWHC?{i)ZuS-@pX1+aloh}k@o91kEcMqz`ZI^OwjlW&0Kim-p zub?N}^U$Wbhv{r%cFLjBt9^5u@VcyD-LAB{FH_pT?Qg#>+<+P2ia#BG`xhgPhkr3R zHW4g~_>!REy*%7@5Ln{A3ghz38x8^3%AYd6?6oeug3xw1>o!l86dxJ!l> zEZwyl)y32BrZhV;7{c5TmaMve9d@84HB^<=2xYA<$}QH|x*S`cs*gb>#l9goq8yML z{%TnG>v&h{Vs$8v>ccy7GaGZVsx9awJ@X!iJ3Xrg*nyAinjzLf{|GR7OQ^X+@He66 zQ-j%|=5vF$hmSaAQvBIpG%&vK7lUI(;K*N=xK2r^67pt;L?T;q6{k`uFbH&Go<`tT zjbEad?{98aXE4ummkqMR8)1In3U-0vmOK1*XxBBNw=3tTC)dSbA_yakJz?N9s`adL z_d3+@Yv?Vg>+j(1Ge6l5?^9)|o(G<-=58syYn204>9A|MG(_9}h-I4_hS?MBz_)hY z*KRwsH_di^W@p8NW6HYbM)ES;x#54;44}N*m{Xwo^0wlT{+;!GmMY#A-{@b@V>pVcC-{DRlZoT&*phB1vsw==sUdIv0g{1v z7d{sL(HGvPJfrWzTGeuH9e$k#YS{cW$`I;C{4jk`9@E4A z=%1UQ+$jOS_GqccuYFe9HmfKjH8{+#M}q$Fcb;L&_x>!EK4=R)!eF z`rcKmy#VFR98N3$#lNL8QMxt0vYs--Q}q`xUG-?HI%GA?xfx>o!vag9YRD2r#L62GWNFiCJM*Bf~EbDF0vf8Y} zo@I6IH)kD(pOnp|?yUW@tF-lxwqB9xjB`m}_$Oa@J2VF=Ss%@57aoP=c+IGc6kpbd zb2|9LQ6JKOmf&E$g{4mlUQoYwR|0tFUbNZsjs{0D};m|qUkhzb_^imja!E8KOmtqG#q!|QEVxcR% z(hko88t%gyVd3vzxbSy|YsXdZ!O83R<+*_dr~XJr4__oVgAxY$8~*N1^jh>`9N_DE z25o!!UQT=Fj;sw8Lv5A8$+>}da_YWJ4#yHU^lg`0)AqVZdJ3#moMnfvrd~WZ>^>8w z$zXPht_GQ(WW7E6EnW4jU>nuO9Qri;Ib>Q9jI-n4sl~>W@Gq_(wdvb6L2o@s|+(NslZhX;1DVZa)SrsQU=D{Ww}wJf14Zs;~bM=tf;dm)a@?!5rM!woqB z_q<%!zUIccN48;!tL^|8s=LebQ^kzoYR6h!Gf$ANNW75B1nC3>8lfPJG*$HuZBEh) ziK^w$?uy4@b`}LaEYo-_{t4cc8dB+Z#omFyP&ahn@z|Si4uRR8C7ZH6tD4tV0#)rp z>@N_aHKOF&&b6&Bt!%@ryMIv>+pBT4b6bpbgRe*$nR;k5Vz8h;>aQ#iqcyQ+i?} zFtByEFw$-r_8F%wP`gpL_2#)9P>q6Jw@a^mn`=i}P7hd0eoZNb=|j!^(W{}mbgM;O zy-JhibC-QBW5Z5d)i5341JCNSWH?%c-+&^9)tIYBYP6Z26Wjx5znuRtZi>G24frkY zDqVA1y*+o&4$xzVgBkEpX;elp8-_3ab77c}oeO7nRc-JJPo_U(geNmMW1J^*RK_$< z=CX`RxW|*ZB4e@oeI{eM`h7X$dG)&{qZWQ!O>*!7m0OK3aM`mL1ly6Sj7I#$VT&E{ zXL#`p*6?@Ptrz65t)TfSOxIK^0ZXL8HrR01tIL}Hnu4cwqo^hhinVS_6Qj&$z=OJX z>Y;iIcu=F=21_WOe>By7lLU{CNGX`d!{&>@63dsh*RyCCD98z~r$#t-3E1chRk&gK zco3ZGe#4&yYnIra!N~7_yJ)F;%OP3CX`ZU-pviX8!xcT;bNj)Ts)E)r=KbG@v1naq zU*y_moay4qZZC|IADV4|iD%jAq1l$#Q~hfU!0BjKe8yfduX9B^e^xNVJ?pH4L)y54 z?UXM{JNP!bGdc`|iK+`neZHFF&S>z0Gn9qjM}M^&9|vxP2~G8zFh*#RjyEJcIA`Sl z4e#Xy#=@}oD|q5p@2eS_4&}=odmmx~m13PdzU@R7s{m0}5u1w^vXaP2l=NH|s|5^8 ztFUMr+k&Uyozr5U;hCC}$36GrQ_q8g+qg^jwoKh&MLPaDj&oDc1Msu}D@5zo%H|l^uqKsZEKp50mpgI1GbdET>Sp|Ih1-9;IbhHvcJD8a`SUfV0KH>G1v7 z>f1r5$G^jls9LZVSAfj64+b}{VaurMo*n-FNBi&mh>}_^xMBWzXqj&9VLb!a*Xlv} zqyTP#XWz!Naa>=42X$^WE~OzUD2F*o`Q>`uw)8G= zxjVcu^zVw&6wj({2iG^3`a+Er&=?GK&AIM`Mn$+_t@hLrdlCnW9!pi46uQC(Zw&92ebx2!;U?YZkQje40?ZA&0E%JTTT>L;%2Y0|c?h+Uk>!Rg-4ayqyFsf~br@%ix1v@OdSXH&9Q*~K{1_(Xi zsd^ty)+*uf_bt6fc$4mip=FvMK?(TiE(m>kE7V~Cfdw; zeAZg!gZs=<2f~Wq3Vc}gZco(&JgMoK(Mm`cF0I`-SFMa)bD1gY%o2I0_0*Jjwd{!s z)x_0Qs>gqce9@O+s7|83#Dd-8;5VUknwQXEn3o;-5_%@wpaYjy%h*d@CJO0EvUIiu z4^z+9={U(ij7)FIF}r4R_sZGOD0%#QV}FDym8)AcY@vGaqEL0M?eTBO4Hx0S(4Wy6 z`#~=nhO6IcvB}uA>VX>$2~Wulf13lD7jB4e$qDa`Q`dNs4nf~j5O&kk{{m2+RDh2H z3ScDM76zef)3J=H2BgJis5obcmiv;HmOJ4c$H!8%sE)mwxj=#m!p@M#c1^B1H~RIm z0dLpHK0Yimsy4+Jx$8JSEw@7((|xetVa_=@H86Pg!3gIE&#P(GM@oMM%R4YE+g!RY z2iAFpWi^z3r0mzr@b!9U8LVU<{U^q%2gI(5bD~{&MtV^k=rR9sQEXlaqZU|mGu3u;Qh6q zU@G8#{e9tPC@N`sp*;M9 zXSkZy!kj5xFPX#AFRan3YKuDna9U7((6jJL_*Je~BYS;!`Be$G4vgv=M1{JBt|Pa@ zvK{A3511xpMQ6VQtL%$Bpe}h#MjGuby4()L;Xw|pMyVbK*8jQ-efk=f@IW7L{n%;; zK!qLY`58J3I~2oVw(cYxXr%9B>YfvC7#8>*mdl>i8nNo)JoqZSq&7lXm{a$)o1Qu5 z1h(7Zt#;j)ZeL_*vp;j69Vtq3;bSSR|0y})cjLt{F-h|~KT(YR2rXW20GbBa=>bkq z(XmS+eJ{-o?;>~T5Cg?lL0bar*if6aVOi^gK3KCn$C><@Y63$I7hROZ7@M>|;!rgPEd zv)M62APXErLiMnI_*H2=C{Bm9{X@rR?6v>?M&fMf~=xJ`o(d?5` zC{!>vfd>@dRcywaQ*^=c!xqN{e*g`B{eTFPkfzH)WKv>v`niu`9Ha_3rKYx~&0$ z#Wrjl&^uT_Wcrt}AE9{oU?&>f*Hd+_{_vsb;jh61SmU8sR{T18+jbZ!K_*+#BX9;Q zEJ0ORK7(zs>DHX>@i$RHI0kM`*Ui;yaDRL=JtHje>t}C}^c3xDIP07^^Cr$R^qFTB zI7_d?LSscEPBny1jF(fwN5enS;ss^Q>rGeFc-CwHDQbRN`5ieix*ZnDu_dJ8EH

ff%zqdhr3*mB#tnYMXv?W)IG~%05~^8^+=b7` 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 literal 0 HcmV?d00001 diff --git a/x.o b/x.o new file mode 100644 index 0000000000000000000000000000000000000000..00723eef729565c7abc474c4b0a10202fe710f53 GIT binary patch literal 72904 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 EfACS<%K!iX literal 0 HcmV?d00001