Age | Commit message (Collapse) | Author | Files | Lines |
|
This patch addresses two issues with selections in st.
First, the SelectionClear signal from X is no longer ignored. So, if
another selection is made in another window, st's selection will
disappear.
Second (and this one is more of a personal preference), new selections
that begin after the end of a line are now considered to begin at the
start of the following line. This makes selecting a group of lines
easier for either copy/paste or readability in the terminal. Previously,
the newline character from the preceeding line would be included in the
clipboard and the dead-space at the end of that line would be
highlighted.
|
|
|
|
Apply the following patch on top of the first two to allow changing how
fast the mouse scrolls.
I had to manually reimplement this patch myself, since the version from
suckless.org doesn't apply cleanly on top of the first three when
starting from commit bda9c9ffa645.
In addition to fixing-up this patch so it applies to the previous HEAD,
a comment is added stating that the codes sent while scrolling in
alt-screen mode (the btn 4/5 fallbacks) need to be maintained along with
the preferred mousescrollincrement setting so the two modes scroll the
same, which they currently do.
|
|
Apply the following patch on top of the previous two to allow scrollback
using mouse wheel only when not in MODE_ALTSCREEN. For example the
content is being scrolled instead of the scrollback buffer in less.
Consequently the Shift modifier for scrolling is not needed anymore.
The mouse and altscreen patches 20191024-a2c479c (and later, including
this one) are simpler and more robust because st gained better support
for customized mouse shortcuts. As a result, the altscreen patch doesn't
really need the mouse patch. However to keep it simple the instructions
stay the same: the alrscreen patch still applies on top of the (now very
minimal) mouse patch.
|
|
Apply the following patch on top of the previous to allow scrolling
using Shift+MouseWheel.
|
|
Scroll back through terminal output using Shift+{PageUp, PageDown}.
|
|
Ctrl-Shift-Return now creates a new st terminal, whose CWD is the same
as the parent st's CWD.
This version of the patch does a double fork, a technique commonly used
by daemons to spawn orphan processes.
This solution is specific to the swallow patch for dwm which traverses
the process tree to determine if the new window is a decendant of a
terminal window, in which case the new window should take the place of
the terminal window.
The way the original newterm patch worked the new st terminal would be a
direct decendant of the parent st terminal process, which could lead to
the wrong terminal window being swallowed.
The double fork method avoids this by leaving all new st terminals as
orphans, i.e. they will have no parent process.
|
|
Hide the X cursor whenever a key is pressed and show it back when the
mouse is moved in the terminal window.
An alternative to this patch might be xbanish or unclutter.
|
|
Return BS on pressing backspace and DEL on pressing the delete key.
|
|
Support COLORTERM env variable
Several programs and terminal emulators (see links further down), are
using this variable to indicate truecolor support.
https://github.com/termstandard/colors
https://gitlab.com/gnachman/iterm2/-/issues/5294
https://codeberg.org/dnkl/foot/wiki#24-bit-color-support-in-emacs
https://neovim.io/doc/user/term.html#true-color
This patch is taken manually from the suckless mailing list, as it was
never applied to mainline st.
https://lists.suckless.org/hackers/2205/18350.html
|
|
By default, st's window size always snaps to the nearest multiple of the
character size plus a fixed inner border (set with borderpx in
config.h). When the size of st does not perfectly match the space
allocated to it (when using a tiling WM, for example), unsightly gaps
will appear between st and other apps, or between instances of st.
This patch allows st to resize to any pixel size, makes the inner border
size dynamic, and centers the content of the terminal so that the
left/right and top/bottom borders are balanced. With this patch, st on a
tiling WM will always fill the entire space allocated to it.
|
|
This patch allows users to change the opacity of the background. Note
that you need an X composite manager (e.g. compton, xcompmgr) to make
this patch effective.
Notes:
* The alpha value affects the default background only.
* The color designated by 'defaultbg' should not be used
elsewhere.
* Embedding might fail after applying this patch.
Changes in 0.8.2:
* The internal method for querying X visual is changed. St will
respect the visual of its parent window, allowing it to be
embedded easily.
* Opacity value is now typed in float.
* -A option is added to allow changing the opacity value without
compiling.
|
|
|
|
|
|
|
|
Patch by Mikhail Kot <to@myrrc.dev>
With some modifications to behave more like xterm (see note below).
Example:
printf '\033[48;2;255:0:0mtest\n'
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
Some notes:
"CSI Pm m Character Attributes (SGR).
[...]
o xterm allows either colons (standard) or semicolons
(legacy) to separate the subparameters (but after the
first colon, colons must be used).
|
|
|
|
With this patch, st will reset its window title when an empty string is
given as the terminal title. For example:
printf "\033]0;\007"
Some applications, like termdown, expect this functionality. xterm
implements it, but it seems that most other terminal emulators don't.
In any case, I don't see why there should ever be a case where the st
window doesn't have a title property.
|
|
This reverts commit 7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5.
This patch needs some more work. It caused regressions with programs that use
GNU readline, etc.
Original test-case example from Tim Culverhouse <tim@timculverhouse.com>:
printf " 😀" && sleep 2 && printf "\e[D" && sleep 2 && printf "\e[D" && sleep 2
After the patch it caused regressions, example test-case:
printf "A字\bB\n"
|
|
|
|
|
|
Previously, printf 'L\033[2147483647b' would call tputc('L') 2^31 times,
making st unresponsive. This commit allows repeating the last character
at most 65535 times in order to prevent freezing and DoS attacks.
|
|
st would always move back 1 column,
even with wide glyhps (using more than a single column).
The glyph rune is set on its first column,
and the other ones are to 0,
so loop until we detect the start of the previous glyph.
|
|
The handler for 'S' final character does not check for a private
marker. This can cause a conflict with a sequence called 'XTSMGRAPHICS'
which also has an 'S' final character, but uses the private marker '?'.
Without checking for a private marker, st will perform a scroll up
operation when XTSMGRAPHICS is seen, which can cause unexpected display
artifacts.
|
|
Helps Vim (and hopefully others) to discover that this feature exists
without further user configuration.
|
|
It is unclear if it's "required" to do this on RIS, but it's useful when
calling reset(1) after interactive programs have crashed and garbled up
the screen.
FWIW, other terminals do it as well (tested with XTerm, VTE, Kitty,
Alacritty, Linux VT).
|
|
Consider the following example:
printf '\e[?7l';\
for i in $(seq $(($(tput cols) - 1))); do printf a; done;\
printf '🙈\n';\
printf '\e[?7h'
Even though MODE_WRAP has been disabled, the emoji appeared on the next
line. This patch keeps wide glyphs on the same line and moves them to
the right-most possible position.
|
|
Fixes garbage selections when switching to/from the alternate screen.
How to reproduce:
- Be in primary screen.
- Select something.
- Run this (switches to alternate screen, positions the cursor at the
bottom, triggers selscroll(), and then goes back to primary screen):
tput smcup; tput cup $(tput lines) 0; echo foo; tput rmcup
- Notice how the (visual) selection now covers a different line.
The reason is that selscroll() calls selnormalize() and that cannot find
the original range anymore. It's all empty lines now, so it snaps to
"select the whole line".
|
|
dc.collen is the length of dc.col, not the maximum index, hence if x is
equal to dc.collen, then it's an error.
With config.def.h, the last valid index is 259, so this correctly
reports "black":
$ printf '\033]4;259;?\e\\'
260 is an invalid index and this reports garbage instead of printing an
error:
$ printf '\033]4;260;?\e\\'
|
|
The Makefile used to suppress output (by using @), so this target made sense at
the time.
But the Makefile should be simple and make debugging with less abstractions or
fancy printing. The Makefile was made verbose and doesn't hide the build
output, so remove this target.
Prompted by a question on the mailing list about the options target.
|
|
Under insert mode, when inserting a normal character in front of
a wide character, the affected region is shifted to the right by
one cell. However, the empty cell is reset as if being a part of a
wide character, causing the following cell being mishandled as a
dummy cell.
To reproduce the bug:
printf '\033[4h' # set MODE_INSERT
printf 妳好
printf '\033[4D'
printf 'x'
printf '\033[4l\n'
|
|
Ignore processing and printing C1 control characters in UTF-8 mode.
These are in the range: 0x80 - 0x9f.
By default in st the mode is set to UTF-8.
This matches more the behaviour of xterm with the options -u8 or +u8 also.
Also see the xterm resource "allowC1Printable".
Let me know if this breaks something, in most cases I don't think so.
As usual a very good reference is:
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
|
|
"VT100 defines an escape sequence [1] called Device Status Report (DSR). When
the DSR sequence received is `csi 5n`, an "OK" response `csi 0n` is returned.
This patch adds that "OK" response.
I encountered this missing sequence when I noticed that fzf [2] would clobber
my prompt whenever completing a find.
To test that ST doesn't currently respond to `csi 5n`, use fzf's shell
extension in ST's repo to complete the path for a file.
my-fancy-prompt $ vim **<tab>
<select a file>
st.c
Select a file with <enter>, and notice that fzf clobbers some or all of your
prompt.
After applying this patch, do the same test as above and notice that fzf has no
longer clobbered your prompt by placing the file name in the correct position
in your command.
my-fancy-prompt $ vim **<tab>
<select a file>
my-fancy prompt $ vim st.c
Thank you for considering my first patch submission.
[1] https://www.xfree86.org/current/ctlseqs.html#VT100%20Mode
[2] https://github.com/junegunn/fzf
"
Patch slightly adapted with input from the mailinglist,
|
|
Adapted from (garbled) patch by wim <wim@thinkerwim.org>
Additional notes: it should reset all the colors using xloadcols().
To reproduce: set a different (theme) color using some escape code, then reset
it:
printf '\x1b]104\x07'
|
|
To reproduce the issue:
"
If you already have the multi-key enabled on your system, then add this line
to your ~/.XCompose file:
[...]
<question> <T> <E> <S> <T> <question> :
"1234567890123456789012345678901234567890123456789012345678901234567890"
"
Reported by and an initial patch by Andy Gozas <andy@gozas.me>, thanks!
Adapted the patch, for now st (like dmenu) handles a fixed amount of composed
characters, or otherwise ignores it. This is done for simplicity sake.
|
|
|
|
It is fixed in libXft 2.3.6:
https://gitlab.freedesktop.org/xorg/lib/libxft/-/blob/libXft-2.3.5/NEWS
|
|
|
|
|
|
* adds missing function prototype
* move xgetcolor() prototype to win.h (that's where all the other x.c
func prototype seems to be declared at)
* check for snprintf error/truncation
* reduces code duplication for osc 10/11/12
* unify osc_color_response() and osc4_color_response() into a single function
the latter two was suggested by Quentin Rameau in his patch review on
the hackers list.
|
|
the array is not accessed outside of base64dec() so it makes sense to
limit it's scope to the related function. the static-storage duration of
the array is kept intact.
this also removes unnecessary explicit zeroing from the start and end of
the array. anything that wasn't explicitly zero-ed will now be
implicitly zero-ed instead.
the validity of the new array can be easily confirmed via running this
trivial loop:
for (int i = 0; i < 255; ++i)
assert(base64_digits[i] == base64_digits_old[i]);
lastly, as pointed out by Roberto, the array needs to have 256 elements
in order to able access it as any unsigned char as an index; the
previous array had 255.
however, this array will only be accessed at indexes which are
isprint() || '=' (see `base64dec_getc()`), so reducing the size of the
array to the highest printable ascii char (127 AFAIK) + 1 might also be
a valid strategy.
|
|
all the ctype.h functions' argument must be representable as an unsigned
char or as EOF, otherwise the behavior is undefined.
|
|
|
|
Build on auto-sync and only mark window dirty on palette changes and let
the event handler do the actual draw.
|
|
|
|
|
|
This patch replaces the previous one I sent.
The following changes are made in this patch:
- Fix tracking of pressed buttons. Previously, pressing two buttons and
then releasing one would make st think no buttons are pressed, which
in particular broke MODE_MOUSEMOTION.
- Always send the lowest-numbered pressed button on motion events; when
no button is pressed for a motion event in MODE_MOUSEMANY, then send
a release. This matches the behaviour of xterm. (Previously, st sent
the most recently pressed button in the motion report.)
- Remove UB (?) access to potentially inactive struct member
e->xbutton.button of XEvent union.
- Fix (unlikely) possibility of overflow for large button numbers.
The one discrepancy I found between st and xterm is that xterm sometimes
encodes buttons with large numbers (>5) strangely. E.g., xterm reports
presses of buttons 8 and 9 as releases, whereas st properly (?) encodes
them as presses.
|
|
|
|
|
|
Overtyping the first half of a wide character with the
second half of a wide character results in display garbage.
This is because the trailing dummy is not cleaned up.
i.e. ATTR_WIDE, ATTR_WDUMMY, ATTR_WDUMMY
Here is a short script for demonstrating the behavior:
#!/bin/sh
alias printf=/usr/bin/printf
printf こんにちは!; sleep 2
printf '\x1b[5D'; sleep 2
printf へ; sleep 2
printf ' '; sleep 2
echo
|