Commit Graph

133 Commits

Author SHA1 Message Date
bakkeby eb56c17d51 support REP (repeat) escape sequence
The sequence \e[Nb prints the last printed char N (more) times if it's
printable, and it's ignored after newline or other control chars.

This is Ecma-048/ANSI-X3.6 sequence and not DEC VT. It's supported by
xterm, and ncurses uses it when possible, e.g. when TERM is xterm* (and
with this commit also st*).

xterm supports only codepoints<=255, possibly due to internal limits.
We support any value/codepoint which was placed in a cell.

To test:
- tput rep 65 4 -> prints 'AAAA'
- printf "\342\225\246\033[4b" -> prints U+2566 1+4 times.
2020-05-20 14:59:43 +02:00
bakkeby ee4f3ae97b Add rin terminfo capability
Tianlin Qu discovered that st is missing rin (scroll back #1 lines).
2020-05-20 14:40:38 +02:00
bakkeby bda4877b5f Make shift+wheel behaves as shift+Prev/Next
St uses a very good hack where mouse wheel genereates ^Y and ^E,
that are the same keys that less and vi uses for backward and
fordward scrolling. Scroll, as many terminal emulators, use
shift+Prev/Next for scrolling, but it is also using ^E and ^Y
for scroling, characters that are reserved in the POSIX shell
in emacs mode for end of line and yanking, making scroll unsable
in st.

This patch adds a new hack, making shift+wheel returning the
same sequences than shift+Prev/Next, meaning that scroll or
any other similar program will not be able to differentiate
between them.
2020-05-20 14:39:35 +02:00
bakkeby 0ade2e6268 Fix selection: selscroll 2020-05-20 14:30:44 +02:00
bakkeby e3a567ed79 Fix selection: ignore ATTR_WRAP when rectangular selection in getsel 2020-05-20 14:29:02 +02:00
bakkeby 18b2af6546 Fix selection: selclear in tputc 2020-05-20 14:26:56 +02:00
bakkeby 7a1259e112 code-style: add fallthrough comment
Patch by Steve Ward, thanks.
2020-05-20 14:26:04 +02:00
bakkeby 0c41364e3d optimize column width calculation and utf-8 encode for ASCII
In particular on OpenBSD and on glibc wcwidth() is quite expensive.
On musl there is little difference.
2020-05-20 14:24:44 +02:00
bakkeby 6bf5eb8a38 fix for incorrect (partial) written sequences when libc wcwidth() == -1
Fix an issue with incorrect (partial) written sequences when libc wcwidth() ==
-1. The sequence is updated to on wcwidth(u) == -1:

	c = "\357\277\275"

but len isn't.

A way to reproduce in practise:

* st -o dump.txt
* In the terminal: printf '\xcd\xb8'
- This is codepoint 888, on OpenBSD it reports wcwidth() == -1.
- Quit the terminal.
- Look in dump.txt (partial written sequence of "UTF_INVALID").

This was introduced in:

"	commit 11625c7166
	Author: czarkoff@gmail.com <czarkoff@gmail.com>
	Date:   Tue Oct 28 12:55:28 2014 +0100

	    Replace character with U+FFFD if wcwidth() is -1

	    Helpful when new Unicode codepoints are not recognized by libc."

Change:

Remove setting the sequence. If this happens to break something, another
solution could be setting len = 3 for the sequence.
2020-05-20 14:23:46 +02:00
bakkeby 338818b2b3 tiny code-style and typo-fix in comment (df79f2) 2020-05-20 14:22:04 +02:00
bakkeby 5c7d8ab1ad auto-sync: draw on idle to avoid flicker/tearing
st could easily tear/flicker with animation or other unattended
output. This commit eliminates most of the tear/flicker.

Before this commit, the display timing had two "modes":

- Interactively, st was waiting fixed `1000/xfps` ms after forwarding
  the kb/mouse event to the application and before drawing.

- Unattended, and specifically with animations, the draw frequency was
  throttled to `actionfps`. Animation at a higher rate would throttle
  and likely tear, and at lower rates it was tearing big frames
  (specifically, when one `read` didn't get a full "frame").

The interactive behavior was decent, but it was impossible to get good
unattended-draw behavior even with carefully chosen configuration.

This commit changes the behavior such that it draws on idle instead of
using fixed latency/frequency. This means that it tries to draw only
when it's very likely that the application has completed its output
(or after some duration without idle), so it mostly succeeds to avoid
tear, flicker, and partial drawing.

The config values minlatency/maxlatency replace xfps/actionfps and
define the range which the algorithm is allowed to wait from the
initial draw-trigger until the actual draw. The range enables the
flexibility to choose when to draw - when least likely to flicker.

It also unifies the interactive and unattended behavior and config
values, which makes the code simpler as well - without sacrificing
latency during interactive use, because typically interactively idle
arrives very quickly, so the wait is typically minlatency.

While it only slighly improves interactive behavior, for animations
and other unattended-drawing it improves greatly, as it effectively
adapts to any [animation] output rate without tearing, throttling,
redundant drawing, or unnecessary delays (sounds impossible, but it
works).
2020-05-20 14:15:57 +02:00
bakkeby 87fe11cfcc Library dependencies must be enabled / uncommented on a need basis (alpha patch and themed cursor patch), ref. #5 2020-05-09 14:02:24 +02:00
bakkeby f34aef7e07 [PATCH] replace exit(3) by _exit(2) in signal handler sigchld() 2020-04-30 09:06:54 +02:00
bakkeby 17afd4c38b bump version to 0.8.3 2020-04-27 14:05:28 +02:00
bakkeby b71d9f6669 [st][PATCH] externalpipe and externalpipein
This patch must be applied on the externalpipe patch. It adds the
function externalpipein to redirect the standard output of the external
command to the slave size of the pty, that is, as if the external
program had been manually executed on the terminal. It can be used to
send desired escape sequences to the terminal with a shortcut.

I created the patch to make use of the dynamic-colors program
(https://github.com/sos4nt/dynamic-colors) that uses the OSC escape
sequences to change the colors of the terminal. The program keeps the
last colorscheme selected in a file, so you can use it to select the
colorscheme for all newly opened terminals from that moment on. If you
want to change the color of the background and foreground independently
from the palette, you have to merge in the patch for the OSC escape
sequences 10, 11, and 12.

This patch includes the changes of the externalpipe sigaction patch to
prevent reseting the signal handler for SIGCHLD when the proces of the
external command exits.
2020-04-20 13:06:39 +02:00
bakkeby 5ad2174cf9 [st][PATCH] externalpipe sigaction
This patch should be applied on top of the externalpipe patch. It
prevents the reset of the signal handler set on SIGCHILD, when the
forked process that executes the external process exits. I opted for
switching from signal to sigaction instead of rearming the signal in the
sigchld function, just because it is the recommended function (although I
tried both ways and both worked).
2020-04-20 12:46:50 +02:00
bakkeby bda5b50b99 [st][PATCH] OSC 10/11/12 fg, bg and cursor colors
Support for OSC escape sequences 10, 11 and 12 to modify the bg, fg and
cursor colors. I selected entries in the colorname table after the 255
position for defaultfg, defaultbg and defaultcs
2020-04-20 12:35:11 +02:00
bakkeby 24c9ea1e51 [st][PATCH] xclearwin clears the window
When an OCS sequence was used to change the bg color, the borders where
dirty. This simple patch just clears the window before the redraw of the
terminal when the bg color has been changed. This is apparently enough
and seams to be very smooth. There was a TODO comment for it on the st.c
file, which I removed.
2020-04-20 12:19:05 +02:00
bakkeby a4d8ea1853 Added the force redraw on keypress patch 2020-04-20 12:14:49 +02:00
bakkeby ae97f681fc Update XIM cursor position only if changed
Updating XIM cursor position is expensive, so only update it when cursor
position changed.
2020-04-20 10:55:37 +02:00
bakkeby 60d1827504 just remove the EOF message 2020-04-20 10:53:23 +02:00
bakkeby e4fa8079a0 Add st-mono terminfo entry
This entry is intended for monocolor display and it is very
helpful for color haters.
2020-04-20 10:52:40 +02:00
bakkeby f91a10d0e6 config.def.h: add a comment for the scroll variable 2020-04-20 10:49:54 +02:00
bakkeby 429ad84669 Fix small typos 2020-04-20 10:48:37 +02:00
bakkeby 18acc55f12 Launch scroll program with the default shell 2020-04-20 10:47:21 +02:00
bakkeby a1d06b7b98 Update FAQ with the last modifications 2020-04-20 10:39:06 +02:00
bakkeby ef971e1f67 Add terminfo entries for backspace mode
St used to use backspace as BS until the commit 230d0c8, but due
to general lack of knowledge of lusers, we moved to the most common
configuration in linux to avoid answering the same question 3 times
per month. With the most common configuration we have a backspace
that returns a DEL, and we have a Delete key that doesn't return a
DEL character neither a BS.

When dealing with devices connected using a serial line (or even
with Plan9) it is more common Backspace as BS and Delete as DEL. For
this reason, st is not always the best tool when you talk with a
serial device.

This patch adds new terminfo entries for Backspace as BS and Delete
as DEL. A patch for confg.h is also added, to make easier switch
between both configurations.
2020-04-20 10:32:04 +02:00
bakkeby 2797bd3144 Fix style issue 2020-04-20 10:30:19 +02:00
bakkeby fe6e6324d7 ttyread: test for EOF while reading tty
When a read operation returns 0 then it means that we arrived to the end of the
file, and new reads will return 0 unless you do some other operation such as
lseek(). This case happens with USB-232 adapters when they are unplugged.
2020-04-20 10:29:26 +02:00
bakkeby 2090981be3 Add support for scroll(1)
Scroll is a program that stores all the lines of its child and be used in st as
a way of implementing scrollback.

This solution is much better than implementing the scrollback in st itself
because having a different program allows to use it in any other program
without doing modifications to those programs.
2020-04-20 10:24:34 +02:00
bakkeby 2465559051 [st][PATCH] Update XIM cursor position only if changed
Updating XIM cursor position is expensive, so only update it when cursor
position changed.
2020-04-16 11:19:33 +02:00
bakkeby f7b0d77a03 make argv0 not static, fixes a warning with tcc (fcd339) 2020-04-10 13:57:14 +02:00
bakkeby 56ff8cd7c7 [st][scrollback] Update for latest git 2020-04-05 18:09:50 +02:00
bakkeby 914cee019d [st] mouseshortcuts: fix custom modifier on release (4c84ac4) 2020-04-02 16:30:40 +02:00
bakkeby d230df0802 Correcting link to patches.h following move to patches.def.h 2020-04-02 12:43:58 +02:00
bakkeby 7dee587ceb Adding workingdir patch 2020-03-29 16:46:38 +02:00
bakkeby d26b46ffa7 Adding invert patch 2020-03-29 15:38:16 +02:00
bakkeby 4966f31256 Custom changes to make the altscreen mouse scollback patch working with latest version of st 2020-03-24 20:05:07 +01:00
bakkeby 87b8b9cf48 Remove explicit XNFocusWindow (f618b1) 2020-03-24 15:42:47 +01:00
bakkeby baf5955e45 x: fix XIM handling (8888e3) 2020-03-24 15:41:43 +01:00
bakkeby 2e2d10eca6 x: check we still have an XIC context before accessing it (ce060a) 2020-03-24 15:37:28 +01:00
bakkeby e22dab0391 x: do not instantiate a new nested list on each cursor move (b67c9b) 2020-03-24 15:36:22 +01:00
bakkeby 7c7d16b843 x: move IME variables into XWindow ime embedded struct (2f6ef4) 2020-03-24 15:34:12 +01:00
bakkeby fac82e981c Increase XmbLookupString buffer (f5fd0c) 2020-03-24 14:28:43 +01:00
bakkeby 94ade62f52 update FAQ (7c405f) 2020-03-24 14:27:45 +01:00
bakkeby 2de79ac677 OSC 52 - copy to clipboard: don't limit to 382 bytes (7a018b) 2020-03-24 14:25:10 +01:00
bakkeby 0d5ea3a3f2 CSIEscape, STREscape: use size_t for buffer length (b3ccac) 2020-03-24 14:23:28 +01:00
bakkeby 2da5aca965 STREscape: don't trim prematurely (d98c43) 2020-03-24 14:22:09 +01:00
bakkeby 5f311ddc78 base64dec: don't read out of bounds (0b2eb9) 2020-03-24 14:21:08 +01:00
bakkeby 63b2d856cf Fix tmux terminfo extensions Se and Ss (1d4f60) 2020-03-24 14:18:19 +01:00