19 Commits
0.7 ... split

Author SHA1 Message Date
20f713548d Change default keybindings
CTRL+SHIFT is an impossible combination in the terminal world
(0x20 | x & 0x1F), so it is perfect to be used for internals
shortcuts of terminals, and being a double combination
reduces the prossibility of having comflicts.
2017-01-25 19:17:38 +01:00
e2ee5ee611 Split X-specific code into x.c 2017-01-20 19:42:26 -08:00
c63a87cd93 Move column and row default numbers into config.h 2016-12-16 10:50:23 +01:00
e44832408b Revert "Initial font size issue."
This reverts commit 424202798b02554092ba84dd59fb7b79b59b7b75.
2016-11-24 20:21:19 +01:00
fa9a459972 Fixed 'missing glyph doesn't use fontconfig config substitutions' bug
XftFontMatch does display-specific font configuration (commit 528241a).
Nice. Unfortunately, when we switched from FcFontMatch, we also stopped
storing the post-Fc{Config,Default}Substitute FcPattern for future
lookups. The result is that if a glyph isn't found in the primary font,
secondary font lookups use the original FcPattern, not the configured
one. If you have custom fontconfig rules (like me), this can be
disappointing.

I basically just copied the guts out of XftFontMatch[1] and saved
the intermediate configured FcPattern. Could be related to the bug that
inspired commit 4242027.

[1]: https://cgit.freedesktop.org/xorg/lib/libXft/tree/src/xftfont.c
2016-11-24 20:20:45 +01:00
740ada1447 make the various combinations of arrow keys and shift/control/meta work
When using st with screen, I've bound next, prev, new screen to
combinations like Ctrl-Alt-Right,Left,Down; xterm and (u)rxvt work fine
when this combination of modifiers is pressed, st does not seem to
transport all of them; a single modifier key is fine (e.g. Ctrl-Up,
Alt-Down etc., but combinations are not). While I'm not terribly
familiar with this, I have tried to hack config.h in a more or less
systematic way to generate the expected sequences.
2016-11-14 19:58:02 +01:00
424202798b Initial font size issue.
Hi,

When I specify a font by point size (I'm using "Inconsolata:size=12"),
characters that are substituted from another font because they are not in the
main one appear too small.  Doing a zoom reset fixes it.  For example:

Before: http://i.imgur.com/G4Mfv4X.png
After:  http://i.imgur.com/PMDhfQA.png

I found that adding the pixel size (acquired from the initial font load) to the
pattern then reloading the font fixes the problem.  I'm not sure if this is a
proper fix, though.
2016-11-14 19:27:55 +01:00
3ca7249c86 tic -s -> tic -sx (Treat unknown capabilities as user-defined.) 2016-11-14 19:05:47 +01:00
06f8cf8ca8 Add tmux capabilities to st.info 2016-11-14 19:05:11 +01:00
902a392b90 Make strdump(), csidump(), print to stderr
The two functions strdump(), csidump() are called to show errors and
their output is introduced by a message printed to stderr. Thus, it it
more consistent to have them print to stderr.

Moreover stderr is unbuffered (at least on Linux), making problems
immediately visible.
2016-11-14 18:36:38 +01:00
8c99915608 Do not use color when font attributes are supported
If fontconfig gives us a font without the attributes we asked for,
display an alternative color instead.
2016-10-23 17:56:46 +02:00
7854fde1ff st.1: add an entry for ISO-14755 shortcut 2016-10-22 10:43:18 +02:00
68bae9c7b1 Add support for iso14755
We launch dmenu for getting a codepoint, then convert it and send it to
the terminal.
2016-10-18 13:32:36 +02:00
331033f1f6 Add missing device path to '-l' example
Also, it's ttyS0 not ttySO.
2016-10-13 17:25:17 +02:00
f7398434b8 Add parsing of DCS q sequences
These sequences are used to operate with sixels, but they are still
str sequences, so they are finished with \a, ST or with a C1 control
code. This patch also disables utf8 handling for the case of sixels.
2016-09-14 08:27:32 +02:00
f0e2d28732 Add support for enabling/disabling utf
There are some ocasions where we want to disable the enconding/decoding of utf8, mainly
because it adds an important overhead. This is partial patch for ESC % G and ESC % @,
where they modified the way that st reads and write from/to the serial line, but it does
not modifies how it interacts with the X window part.
2016-09-13 14:01:18 +02:00
078337d745 Delete ncv capability from terminfo
We do not need to disable the previous ncv definition, because
there is not previous definition.
2016-09-09 13:11:06 +02:00
5ce853a1c1 st.info: do not prevent st from displaying attributes
With ncv set to 3, we prevent st from displaying A_STANDOUT and
A_UNDERLINE with colors while our virtual terminal is capable of it.
2016-09-09 11:05:11 +02:00
023225ef40 Update the LICENSE.
This is for the next release.
2016-08-11 16:30:29 +02:00
11 changed files with 2361 additions and 2025 deletions

2
FAQ
View File

@ -6,7 +6,7 @@ Use the excellent tool of [utmp](http://git.suckless.org/utmp/) for this task.
It means that st doesnt have any terminfo entry on your system. Chances are It means that st doesnt have any terminfo entry on your system. Chances are
you did not `make install`. If you just want to test it without installing it, you did not `make install`. If you just want to test it without installing it,
you can manualy run `tic -s st.info`. you can manualy run `tic -sx st.info`.
## Nothing works, and nothing is said about an unknown terminal! ## Nothing works, and nothing is said about an unknown terminal!

View File

@ -2,8 +2,8 @@ MIT/X Consortium License
© 2009-2012 Aurélien APTEL <aurelien dot aptel at gmail dot com> © 2009-2012 Aurélien APTEL <aurelien dot aptel at gmail dot com>
© 2009 Anselm R Garbe <garbeam at gmail dot com> © 2009 Anselm R Garbe <garbeam at gmail dot com>
© 2012-2015 Roberto E. Vargas Caballero <k0ga at shike2 dot com> © 2012-2016 Roberto E. Vargas Caballero <k0ga at shike2 dot com>
© 2012-2015 Christoph Lohmann <20h at r-36 dot net> © 2012-2016 Christoph Lohmann <20h at r-36 dot net>
© 2013 Eon S. Jeon <esjeon at hyunmu dot am> © 2013 Eon S. Jeon <esjeon at hyunmu dot am>
© 2013 Alexander Sedov <alex0player at gmail dot com> © 2013 Alexander Sedov <alex0player at gmail dot com>
© 2013 Mark Edgar <medgar123 at gmail dot com> © 2013 Mark Edgar <medgar123 at gmail dot com>

View File

@ -3,7 +3,7 @@
include config.mk include config.mk
SRC = st.c SRC = st.c x.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options st all: options st
@ -21,6 +21,9 @@ config.h:
@echo CC $< @echo CC $<
@${CC} -c ${CFLAGS} $< @${CC} -c ${CFLAGS} $<
st.o: config.h st.h win.h
x.o: arg.h st.h win.h
${OBJ}: config.h config.mk ${OBJ}: config.h config.mk
st: ${OBJ} st: ${OBJ}
@ -49,7 +52,7 @@ install: all
@sed "s/VERSION/${VERSION}/g" < st.1 > ${DESTDIR}${MANPREFIX}/man1/st.1 @sed "s/VERSION/${VERSION}/g" < st.1 > ${DESTDIR}${MANPREFIX}/man1/st.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/st.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/st.1
@echo Please see the README file regarding the terminfo entry of st. @echo Please see the README file regarding the terminfo entry of st.
@tic -s st.info @tic -sx st.info
uninstall: uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin @echo removing executable file from ${DESTDIR}${PREFIX}/bin

2
README
View File

@ -24,7 +24,7 @@ Running st
If you did not install st with make clean install, you must compile If you did not install st with make clean install, you must compile
the st terminfo entry with the following command: the st terminfo entry with the following command:
tic -s st.info tic -sx st.info
See the man page for additional details. See the man page for additional details.

View File

@ -5,8 +5,8 @@
* *
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
*/ */
static char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
static int borderpx = 2; int borderpx = 2;
/* /*
* What program is execed by st depends of these precedence rules: * What program is execed by st depends of these precedence rules:
@ -24,8 +24,8 @@ static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400";
static char vtiden[] = "\033[?6c"; static char vtiden[] = "\033[?6c";
/* Kerning / character bounding-box multipliers */ /* Kerning / character bounding-box multipliers */
static float cwscale = 1.0; float cwscale = 1.0;
static float chscale = 1.0; float chscale = 1.0;
/* /*
* word delimiter string * word delimiter string
@ -35,26 +35,26 @@ static float chscale = 1.0;
static char worddelimiters[] = " "; static char worddelimiters[] = " ";
/* selection timeouts (in milliseconds) */ /* selection timeouts (in milliseconds) */
static unsigned int doubleclicktimeout = 300; unsigned int doubleclicktimeout = 300;
static unsigned int tripleclicktimeout = 600; unsigned int tripleclicktimeout = 600;
/* alt screens */ /* alt screens */
static int allowaltscreen = 1; int allowaltscreen = 1;
/* frames per second st should at maximum draw to the screen */ /* frames per second st should at maximum draw to the screen */
static unsigned int xfps = 120; unsigned int xfps = 120;
static unsigned int actionfps = 30; unsigned int actionfps = 30;
/* /*
* blinking timeout (set to 0 to disable blinking) for the terminal blinking * blinking timeout (set to 0 to disable blinking) for the terminal blinking
* attribute. * attribute.
*/ */
static unsigned int blinktimeout = 800; unsigned int blinktimeout = 800;
/* /*
* thickness of underline and bar cursors * thickness of underline and bar cursors
*/ */
static unsigned int cursorthickness = 2; unsigned int cursorthickness = 2;
/* /*
* bell volume. It must be a value between -100 and 100. Use 0 for disabling * bell volume. It must be a value between -100 and 100. Use 0 for disabling
@ -63,7 +63,7 @@ static unsigned int cursorthickness = 2;
static int bellvolume = 0; static int bellvolume = 0;
/* default TERM value */ /* default TERM value */
static char termname[] = "st-256color"; char termname[] = "st-256color";
/* /*
* spaces per tab * spaces per tab
@ -83,7 +83,7 @@ static char termname[] = "st-256color";
static unsigned int tabspaces = 8; static unsigned int tabspaces = 8;
/* Terminal colors (16 first used in escape sequence) */ /* Terminal colors (16 first used in escape sequence) */
static const char *colorname[] = { const char *colorname[] = {
/* 8 normal colors */ /* 8 normal colors */
"black", "black",
"red3", "red3",
@ -116,10 +116,10 @@ static const char *colorname[] = {
* Default colors (colorname index) * Default colors (colorname index)
* foreground, background, cursor, reverse cursor * foreground, background, cursor, reverse cursor
*/ */
static unsigned int defaultfg = 7; unsigned int defaultfg = 7;
static unsigned int defaultbg = 0; unsigned int defaultbg = 0;
static unsigned int defaultcs = 256; unsigned int defaultcs = 256;
static unsigned int defaultrcs = 257; unsigned int defaultrcs = 257;
/* /*
* Default shape of cursor * Default shape of cursor
@ -128,28 +128,33 @@ static unsigned int defaultrcs = 257;
* 6: Bar ("|") * 6: Bar ("|")
* 7: Snowman ("☃") * 7: Snowman ("☃")
*/ */
static unsigned int cursorshape = 2; unsigned int cursorshape = 2;
/*
* Default columns and rows numbers
*/
unsigned int cols = 80;
unsigned int rows = 24;
/* /*
* Default colour and shape of the mouse cursor * Default colour and shape of the mouse cursor
*/ */
static unsigned int mouseshape = XC_xterm; unsigned int mouseshape = XC_xterm;
static unsigned int mousefg = 7; unsigned int mousefg = 7;
static unsigned int mousebg = 0; unsigned int mousebg = 0;
/* /*
* Colors used, when the specific fg == defaultfg. So in reverse mode this * Color used to display font attributes when fontconfig selected a font which
* will reverse too. Another logic would only make the simple feature too * doesn't match the ones requested.
* complex.
*/ */
static unsigned int defaultitalic = 11; unsigned int defaultattr = 11;
static unsigned int defaultunderline = 7;
/* /*
* 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[] = { MouseShortcut mshortcuts[] = {
/* button mask string */ /* button mask string */
{ Button4, XK_ANY_MOD, "\031" }, { Button4, XK_ANY_MOD, "\031" },
{ Button5, XK_ANY_MOD, "\005" }, { Button5, XK_ANY_MOD, "\005" },
@ -157,21 +162,22 @@ static MouseShortcut mshortcuts[] = {
/* Internal keyboard shortcuts. */ /* Internal keyboard shortcuts. */
#define MODKEY Mod1Mask #define MODKEY Mod1Mask
#define TERMMOD (ControlMask|ShiftMask)
static Shortcut shortcuts[] = { Shortcut shortcuts[] = {
/* mask keysym function argument */ /* mask keysym function argument */
{ XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
{ 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} },
{ MODKEY|ShiftMask, XK_Prior, xzoom, {.f = +1} }, { TERMMOD, XK_Prior, zoom, {.f = +1} },
{ MODKEY|ShiftMask, XK_Next, xzoom, {.f = -1} }, { TERMMOD, XK_Next, zoom, {.f = -1} },
{ MODKEY|ShiftMask, XK_Home, xzoomreset, {.f = 0} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} },
{ ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} },
{ MODKEY|ShiftMask, XK_Insert, clippaste, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} },
{ MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_Y, selpaste, {.i = 0} },
{ MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
{ MODKEY, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_I, iso14755, {.i = 0} },
}; };
/* /*
@ -216,7 +222,7 @@ static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
* Note that if you want to use ShiftMask with selmasks, set this to an other * Note that if you want to use ShiftMask with selmasks, set this to an other
* modifier, set to 0 to not use it. * modifier, set to 0 to not use it.
*/ */
static uint forceselmod = ShiftMask; uint forceselmod = ShiftMask;
/* /*
* This is the huge key array which defines all compatibility to the Linux * This is the huge key array which defines all compatibility to the Linux
@ -281,23 +287,39 @@ static Key key[] = {
{ XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0}, { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0},
{ XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0}, { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0},
{ XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0}, { XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0},
{ XK_Up, ControlMask, "\033[1;5A", 0, 0, 0},
{ XK_Up, Mod1Mask, "\033[1;3A", 0, 0, 0}, { XK_Up, Mod1Mask, "\033[1;3A", 0, 0, 0},
{ XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0, 0},
{ XK_Up, ControlMask, "\033[1;5A", 0, 0, 0},
{ XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0, 0},
{ XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0, 0},
{ XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0, 0},
{ XK_Up, XK_ANY_MOD, "\033[A", 0, -1, 0}, { XK_Up, XK_ANY_MOD, "\033[A", 0, -1, 0},
{ XK_Up, XK_ANY_MOD, "\033OA", 0, +1, 0}, { XK_Up, XK_ANY_MOD, "\033OA", 0, +1, 0},
{ XK_Down, ShiftMask, "\033[1;2B", 0, 0, 0}, { XK_Down, ShiftMask, "\033[1;2B", 0, 0, 0},
{ XK_Down, ControlMask, "\033[1;5B", 0, 0, 0},
{ XK_Down, Mod1Mask, "\033[1;3B", 0, 0, 0}, { XK_Down, Mod1Mask, "\033[1;3B", 0, 0, 0},
{ XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0, 0},
{ XK_Down, ControlMask, "\033[1;5B", 0, 0, 0},
{ XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0, 0},
{ XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0, 0},
{ XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0, 0},
{ XK_Down, XK_ANY_MOD, "\033[B", 0, -1, 0}, { XK_Down, XK_ANY_MOD, "\033[B", 0, -1, 0},
{ XK_Down, XK_ANY_MOD, "\033OB", 0, +1, 0}, { XK_Down, XK_ANY_MOD, "\033OB", 0, +1, 0},
{ XK_Left, ShiftMask, "\033[1;2D", 0, 0, 0}, { XK_Left, ShiftMask, "\033[1;2D", 0, 0, 0},
{ XK_Left, ControlMask, "\033[1;5D", 0, 0, 0},
{ XK_Left, Mod1Mask, "\033[1;3D", 0, 0, 0}, { XK_Left, Mod1Mask, "\033[1;3D", 0, 0, 0},
{ XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0, 0},
{ XK_Left, ControlMask, "\033[1;5D", 0, 0, 0},
{ XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0, 0},
{ XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0, 0},
{ XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0, 0},
{ XK_Left, XK_ANY_MOD, "\033[D", 0, -1, 0}, { XK_Left, XK_ANY_MOD, "\033[D", 0, -1, 0},
{ XK_Left, XK_ANY_MOD, "\033OD", 0, +1, 0}, { XK_Left, XK_ANY_MOD, "\033OD", 0, +1, 0},
{ XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0}, { XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0},
{ XK_Right, ControlMask, "\033[1;5C", 0, 0, 0},
{ XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0}, { XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0},
{ XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0, 0},
{ XK_Right, ControlMask, "\033[1;5C", 0, 0, 0},
{ XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0, 0},
{ XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0, 0},
{ XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0, 0},
{ XK_Right, XK_ANY_MOD, "\033[C", 0, -1, 0}, { XK_Right, XK_ANY_MOD, "\033[C", 0, -1, 0},
{ XK_Right, XK_ANY_MOD, "\033OC", 0, +1, 0}, { XK_Right, XK_ANY_MOD, "\033OC", 0, +1, 0},
{ XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0, 0}, { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0, 0},
@ -429,7 +451,7 @@ static Key key[] = {
* ButtonRelease and MotionNotify. * ButtonRelease and MotionNotify.
* If no match is found, regular selection is used. * If no match is found, regular selection is used.
*/ */
static uint selmasks[] = { uint selmasks[] = {
[SEL_RECTANGULAR] = Mod1Mask, [SEL_RECTANGULAR] = Mod1Mask,
}; };
@ -437,7 +459,7 @@ static uint selmasks[] = {
* Printable characters in ASCII, used to estimate the advance width * Printable characters in ASCII, used to estimate the advance width
* of single wide characters. * of single wide characters.
*/ */
static char ascii_printable[] = char ascii_printable[] =
" !\"#$%&'()*+,-./0123456789:;<=>?" " !\"#$%&'()*+,-./0123456789:;<=>?"
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
"`abcdefghijklmnopqrstuvwxyz{|}~"; "`abcdefghijklmnopqrstuvwxyz{|}~";

12
st.1
View File

@ -96,18 +96,18 @@ use a tty
.I line .I line
instead of a pseudo terminal. instead of a pseudo terminal.
.I line .I line
should be a (pseudo-)serial device (e.g. /dev/ttySO on Linux for serial port should be a (pseudo-)serial device (e.g. /dev/ttyS0 on Linux for serial port
0). 0).
When this flag is given When this flag is given
remaining arguments are used as flags for remaining arguments are used as flags for
.BR stty(1). .BR stty(1).
By default st initializes the serial line to 8 bits, no parity, 1 stop bit By default st initializes the serial line to 8 bits, no parity, 1 stop bit
and a 38400 baud rate. The speed is set by appending it as last argument and a 38400 baud rate. The speed is set by appending it as last argument
(e.g. 'st -l 115200'). Arguments before the last one are (e.g. 'st -l /dev/ttyS0 115200'). Arguments before the last one are
.BR stty(1) .BR stty(1)
flags. If you want to set odd parity on 115200 baud use for example 'st -l flags. If you want to set odd parity on 115200 baud use for example 'st -l
parenb parodd 115200'. Set the number of bits by using for example 'st -l cs7 /dev/ttyS0 parenb parodd 115200'. Set the number of bits by using for
115200'. See example 'st -l /dev/ttyS0 cs7 115200'. See
.BR stty(1) .BR stty(1)
for more arguments and cases. for more arguments and cases.
.TP .TP
@ -162,6 +162,10 @@ Copy the selected text to the clipboard selection.
.TP .TP
.B Alt-Shift-v .B Alt-Shift-v
Paste from the clipboard selection. Paste from the clipboard selection.
.TP
.B Alt-Ctrl
Launch dmenu to enter a unicode codepoint and send the corresponding glyph
to st.
.SH CUSTOMIZATION .SH CUSTOMIZATION
.B st .B st
can be customized by creating a custom config.h and (re)compiling the source can be customized by creating a custom config.h and (re)compiling the source

2132
st.c

File diff suppressed because it is too large Load Diff

272
st.h Normal file
View File

@ -0,0 +1,272 @@
/* See LICENSE for license details. */
/* Arbitrary sizes */
#define UTF_SIZ 4
/* macros */
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) < (b) ? (b) : (a))
#define LEN(a) (sizeof(a) / sizeof(a)[0])
#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b))
#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d))
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \
(a).bg != (b).bg)
#define IS_SET(flag) ((term.mode & (flag)) != 0)
#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \
(t1.tv_nsec-t2.tv_nsec)/1E6)
#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))
#define IS_TRUECOL(x) (1 << 24 & (x))
enum glyph_attribute {
ATTR_NULL = 0,
ATTR_BOLD = 1 << 0,
ATTR_FAINT = 1 << 1,
ATTR_ITALIC = 1 << 2,
ATTR_UNDERLINE = 1 << 3,
ATTR_BLINK = 1 << 4,
ATTR_REVERSE = 1 << 5,
ATTR_INVISIBLE = 1 << 6,
ATTR_STRUCK = 1 << 7,
ATTR_WRAP = 1 << 8,
ATTR_WIDE = 1 << 9,
ATTR_WDUMMY = 1 << 10,
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
};
enum term_mode {
MODE_WRAP = 1 << 0,
MODE_INSERT = 1 << 1,
MODE_APPKEYPAD = 1 << 2,
MODE_ALTSCREEN = 1 << 3,
MODE_CRLF = 1 << 4,
MODE_MOUSEBTN = 1 << 5,
MODE_MOUSEMOTION = 1 << 6,
MODE_REVERSE = 1 << 7,
MODE_KBDLOCK = 1 << 8,
MODE_HIDE = 1 << 9,
MODE_ECHO = 1 << 10,
MODE_APPCURSOR = 1 << 11,
MODE_MOUSESGR = 1 << 12,
MODE_8BIT = 1 << 13,
MODE_BLINK = 1 << 14,
MODE_FBLINK = 1 << 15,
MODE_FOCUS = 1 << 16,
MODE_MOUSEX10 = 1 << 17,
MODE_MOUSEMANY = 1 << 18,
MODE_BRCKTPASTE = 1 << 19,
MODE_PRINT = 1 << 20,
MODE_UTF8 = 1 << 21,
MODE_SIXEL = 1 << 22,
MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
|MODE_MOUSEMANY,
};
enum selection_mode {
SEL_IDLE = 0,
SEL_EMPTY = 1,
SEL_READY = 2
};
enum selection_type {
SEL_REGULAR = 1,
SEL_RECTANGULAR = 2
};
enum selection_snap {
SNAP_WORD = 1,
SNAP_LINE = 2
};
enum window_state {
WIN_VISIBLE = 1,
WIN_FOCUSED = 2
};
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned short ushort;
typedef uint_least32_t Rune;
typedef struct {
Rune u; /* character code */
ushort mode; /* attribute flags */
uint32_t fg; /* foreground */
uint32_t bg; /* background */
} Glyph;
typedef Glyph *Line;
typedef struct {
Glyph attr; /* current char attributes */
int x;
int y;
char state;
} TCursor;
/* Internal representation of the screen */
typedef struct {
int row; /* nb row */
int col; /* nb col */
Line *line; /* screen */
Line *alt; /* alternate screen */
int *dirty; /* dirtyness of lines */
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
TCursor c; /* cursor */
int top; /* top scroll limit */
int bot; /* bottom scroll limit */
int mode; /* terminal mode flags */
int esc; /* escape state flags */
char trantbl[4]; /* charset table translation */
int charset; /* current charset */
int icharset; /* selected charset for sequence */
int numlock; /* lock numbers in keyboard */
int *tabs;
} Term;
/* Purely graphic info */
typedef struct {
int tw, th; /* tty width and height */
int w, h; /* window width and height */
int ch; /* char height */
int cw; /* char width */
char state; /* focus, redraw, visible */
int cursor; /* cursor style */
} TermWindow;
typedef struct {
uint b;
uint mask;
char *s;
} MouseShortcut;
typedef struct {
int mode;
int type;
int snap;
/*
* Selection variables:
* nb normalized coordinates of the beginning of the selection
* ne normalized coordinates of the end of the selection
* ob original coordinates of the beginning of the selection
* oe original coordinates of the end of the selection
*/
struct {
int x, y;
} nb, ne, ob, oe;
char *primary, *clipboard;
int alt;
struct timespec tclick1;
struct timespec tclick2;
//Atom xtarget;
} Selection;
typedef union {
int i;
uint ui;
float f;
const void *v;
} Arg;
typedef struct {
uint mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Shortcut;
void die(const char *, ...);
void redraw(void);
int tattrset(int);
void tnew(int, int);
void tsetdirt(int, int);
void tsetdirtattr(int);
int match(uint, uint);
void ttynew(void);
size_t ttyread(void);
void ttyresize(void);
void ttysend(char *, size_t);
void ttywrite(const char *, size_t);
void resettitle(void);
char *kmap(KeySym, uint);
void cresize(int, int);
void selclear(void);
void selinit(void);
void selnormalize(void);
int selected(int, int);
char *getsel(void);
int x2col(int);
int y2row(int);
size_t utf8decode(char *, Rune *, size_t);
size_t utf8encode(Rune, char *);
void *xmalloc(size_t);
char *xstrdup(char *);
void usage(void);
/* Globals */
extern TermWindow win;
extern Term term;
extern Selection sel;
extern int cmdfd;
extern pid_t pid;
extern char **opt_cmd;
extern char *opt_class;
extern char *opt_embed;
extern char *opt_font;
extern char *opt_io;
extern char *opt_line;
extern char *opt_name;
extern char *opt_title;
extern int oldbutton;
extern char *usedfont;
extern double usedfontsize;
extern double defaultfontsize;
/* config.h globals */
extern char font[];
extern int borderpx;
extern float cwscale;
extern float chscale;
extern unsigned int doubleclicktimeout;
extern unsigned int tripleclicktimeout;
extern int allowaltscreen;
extern unsigned int xfps;
extern unsigned int actionfps;
extern unsigned int cursorthickness;
extern unsigned int blinktimeout;
extern char termname[];
extern const char *colorname[];
extern size_t colornamelen;
extern unsigned int defaultfg;
extern unsigned int defaultbg;
extern unsigned int defaultcs;
extern unsigned int defaultrcs;
extern unsigned int cursorshape;
extern unsigned int cols;
extern unsigned int rows;
extern unsigned int mouseshape;
extern unsigned int mousefg;
extern unsigned int mousebg;
extern unsigned int defaultattr;
extern MouseShortcut mshortcuts[];
extern size_t mshortcutslen;
extern Shortcut shortcuts[];
extern size_t shortcutslen;
extern uint forceselmod;
extern uint selmasks[];
extern size_t selmaskslen;
extern char ascii_printable[];

View File

@ -149,7 +149,6 @@ st| simpleterm,
lines#24, lines#24,
mir, mir,
msgr, msgr,
ncv#3,
npc, npc,
op=\E[39;49m, op=\E[39;49m,
pairs#64, pairs#64,
@ -186,7 +185,10 @@ st| simpleterm,
tsl=\E]0;, tsl=\E]0;,
xenl, xenl,
vpa=\E[%i%p1%dd, vpa=\E[%i%p1%dd,
# Tmux unofficial extensions, see TERMINFO EXTENSIONS in tmux(1)
Se,
Ss,
Tc,
st-256color| simpleterm with 256 colors, st-256color| simpleterm with 256 colors,
use=st, use=st,

29
win.h Normal file
View File

@ -0,0 +1,29 @@
/* See LICENSE for license details. */
/* X modifiers */
#define XK_ANY_MOD UINT_MAX
#define XK_NO_MOD 0
#define XK_SWITCH_MOD (1<<13)
typedef XftGlyphFontSpec GlyphFontSpec;
void draw(void);
void drawregion(int, int, int, int);
void run(void);
void xbell(int);
void xclipcopy(void);
void xclippaste(void);
void xhints(void);
void xinit(void);
void xloadcols(void);
int xsetcolorname(int, const char *);
void xloadfonts(char *, double);
void xsetenv(void);
void xsettitle(char *);
void xsetpointermotion(int);
void xseturgency(int);
void xunloadfonts(void);
void xresize(int, int);
void xselpaste(void);
unsigned long xwinid(void);

1766
x.c Normal file

File diff suppressed because it is too large Load Diff