copy st from dotfiles repo
This commit is contained in:
commit
7c78207bb9
40 changed files with 11071 additions and 0 deletions
253
FAQ
Normal file
253
FAQ
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
## Why does st not handle utmp entries?
|
||||||
|
|
||||||
|
Use the excellent tool of [utmp](https://git.suckless.org/utmp/) for this task.
|
||||||
|
|
||||||
|
|
||||||
|
## Some _random program_ complains that st is unknown/not recognised/unsupported/whatever!
|
||||||
|
|
||||||
|
It means that st doesn’t 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 can manually run `tic -sx st.info`.
|
||||||
|
|
||||||
|
|
||||||
|
## Nothing works, and nothing is said about an unknown terminal!
|
||||||
|
|
||||||
|
* Some programs just assume they’re running in xterm i.e. they don’t rely on
|
||||||
|
terminfo. What you see is the current state of the “xterm compliance”.
|
||||||
|
* Some programs don’t complain about the lacking st description and default to
|
||||||
|
another terminal. In that case see the question about terminfo.
|
||||||
|
|
||||||
|
|
||||||
|
## How do I scroll back up?
|
||||||
|
|
||||||
|
* Using a terminal multiplexer.
|
||||||
|
* `st -e tmux` using C-b [
|
||||||
|
* `st -e screen` using C-a ESC
|
||||||
|
* Using the excellent tool of [scroll](https://git.suckless.org/scroll/).
|
||||||
|
* Using the scrollback [patch](https://st.suckless.org/patches/scrollback/).
|
||||||
|
|
||||||
|
|
||||||
|
## I would like to have utmp and/or scroll functionality by default
|
||||||
|
|
||||||
|
You can add the absolute path of both programs in your config.h file. You only
|
||||||
|
have to modify the value of utmp and scroll variables.
|
||||||
|
|
||||||
|
|
||||||
|
## Why doesn't the Del key work in some programs?
|
||||||
|
|
||||||
|
Taken from the terminfo manpage:
|
||||||
|
|
||||||
|
If the terminal has a keypad that transmits codes when the keys
|
||||||
|
are pressed, this information can be given. Note that it is not
|
||||||
|
possible to handle terminals where the keypad only works in
|
||||||
|
local (this applies, for example, to the unshifted HP 2621 keys).
|
||||||
|
If the keypad can be set to transmit or not transmit, give these
|
||||||
|
codes as smkx and rmkx. Otherwise the keypad is assumed to
|
||||||
|
always transmit.
|
||||||
|
|
||||||
|
In the st case smkx=E[?1hE= and rmkx=E[?1lE>, so it is mandatory that
|
||||||
|
applications which want to test against keypad keys send these
|
||||||
|
sequences.
|
||||||
|
|
||||||
|
But buggy applications (like bash and irssi, for example) don't do this. A fast
|
||||||
|
solution for them is to use the following command:
|
||||||
|
|
||||||
|
$ printf '\033[?1h\033=' >/dev/tty
|
||||||
|
|
||||||
|
or
|
||||||
|
$ tput smkx
|
||||||
|
|
||||||
|
In the case of bash, readline is used. Readline has a different note in its
|
||||||
|
manpage about this issue:
|
||||||
|
|
||||||
|
enable-keypad (Off)
|
||||||
|
When set to On, readline will try to enable the
|
||||||
|
application keypad when it is called. Some systems
|
||||||
|
need this to enable arrow keys.
|
||||||
|
|
||||||
|
Adding this option to your .inputrc will fix the keypad problem for all
|
||||||
|
applications using readline.
|
||||||
|
|
||||||
|
If you are using zsh, then read the zsh FAQ
|
||||||
|
<http://zsh.sourceforge.net/FAQ/zshfaq03.html#l25>:
|
||||||
|
|
||||||
|
It should be noted that the O / [ confusion can occur with other keys
|
||||||
|
such as Home and End. Some systems let you query the key sequences
|
||||||
|
sent by these keys from the system's terminal database, terminfo.
|
||||||
|
Unfortunately, the key sequences given there typically apply to the
|
||||||
|
mode that is not the one zsh uses by default (it's the "application"
|
||||||
|
mode rather than the "raw" mode). Explaining the use of terminfo is
|
||||||
|
outside of the scope of this FAQ, but if you wish to use the key
|
||||||
|
sequences given there you can tell the line editor to turn on
|
||||||
|
"application" mode when it starts and turn it off when it stops:
|
||||||
|
|
||||||
|
function zle-line-init () { echoti smkx }
|
||||||
|
function zle-line-finish () { echoti rmkx }
|
||||||
|
zle -N zle-line-init
|
||||||
|
zle -N zle-line-finish
|
||||||
|
|
||||||
|
Putting these lines into your .zshrc will fix the problems.
|
||||||
|
|
||||||
|
|
||||||
|
## How can I use meta in 8bit mode?
|
||||||
|
|
||||||
|
St supports meta in 8bit mode, but the default terminfo entry doesn't
|
||||||
|
use this capability. If you want it, you have to use the 'st-meta' value
|
||||||
|
in TERM.
|
||||||
|
|
||||||
|
|
||||||
|
## I cannot compile st in OpenBSD
|
||||||
|
|
||||||
|
OpenBSD lacks librt, despite it being mandatory in POSIX
|
||||||
|
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html#tag_20_11_13>.
|
||||||
|
If you want to compile st for OpenBSD you have to remove -lrt from config.mk, and
|
||||||
|
st will compile without any loss of functionality, because all the functions are
|
||||||
|
included in libc on this platform.
|
||||||
|
|
||||||
|
|
||||||
|
## The Backspace Case
|
||||||
|
|
||||||
|
St is emulating the Linux way of handling backspace being delete and delete being
|
||||||
|
backspace.
|
||||||
|
|
||||||
|
This is an issue that was discussed in suckless mailing list
|
||||||
|
<https://lists.suckless.org/dev/1404/20697.html>. Here is why some old grumpy
|
||||||
|
terminal users wants its backspace to be how he feels it:
|
||||||
|
|
||||||
|
Well, I am going to comment why I want to change the behaviour
|
||||||
|
of this key. When ASCII was defined in 1968, communication
|
||||||
|
with computers was done using punched cards, or hardcopy
|
||||||
|
terminals (basically a typewriter machine connected with the
|
||||||
|
computer using a serial port). ASCII defines DELETE as 7F,
|
||||||
|
because, in punched-card terms, it means all the holes of the
|
||||||
|
card punched; it is thus a kind of 'physical delete'. In the
|
||||||
|
same way, the BACKSPACE key was a non-destructive backspace,
|
||||||
|
as on a typewriter. So, if you wanted to delete a character,
|
||||||
|
you had to BACKSPACE and then DELETE. Another use of BACKSPACE
|
||||||
|
was to type accented characters, for example 'a BACKSPACE `'.
|
||||||
|
The VT100 had no BACKSPACE key; it was generated using the
|
||||||
|
CONTROL key as another control character (CONTROL key sets to
|
||||||
|
0 b7 b6 b5, so it converts H (code 0x48) into BACKSPACE (code
|
||||||
|
0x08)), but it had a DELETE key in a similar position where
|
||||||
|
the BACKSPACE key is located today on common PC keyboards.
|
||||||
|
All the terminal emulators emulated the difference between
|
||||||
|
these keys correctly: the backspace key generated a BACKSPACE
|
||||||
|
(^H) and delete key generated a DELETE (^?).
|
||||||
|
|
||||||
|
But a problem arose when Linus Torvalds wrote Linux. Unlike
|
||||||
|
earlier terminals, the Linux virtual terminal (the terminal
|
||||||
|
emulator integrated in the kernel) returned a DELETE when
|
||||||
|
backspace was pressed, due to the VT100 having a DELETE key in
|
||||||
|
the same position. This created a lot of problems (see [1]
|
||||||
|
and [2]). Since Linux has become the king, a lot of terminal
|
||||||
|
emulators today generate a DELETE when the backspace key is
|
||||||
|
pressed in order to avoid problems with Linux. The result is
|
||||||
|
that the only way of generating a BACKSPACE on these systems
|
||||||
|
is by using CONTROL + H. (I also think that emacs had an
|
||||||
|
important point here because the CONTROL + H prefix is used
|
||||||
|
in emacs in some commands (help commands).)
|
||||||
|
|
||||||
|
From point of view of the kernel, you can change the key
|
||||||
|
for deleting a previous character with stty erase. When you
|
||||||
|
connect a real terminal into a machine you describe the type
|
||||||
|
of terminal, so getty configures the correct value of stty
|
||||||
|
erase for this terminal. In the case of terminal emulators,
|
||||||
|
however, you don't have any getty that can set the correct
|
||||||
|
value of stty erase, so you always get the default value.
|
||||||
|
For this reason, it is necessary to add 'stty erase ^H' to your
|
||||||
|
profile if you have changed the value of the backspace key.
|
||||||
|
Of course, another solution is for st itself to modify the
|
||||||
|
value of stty erase. I usually have the inverse problem:
|
||||||
|
when I connect to non-Unix machines, I have to press CONTROL +
|
||||||
|
h to get a BACKSPACE. The inverse problem occurs when a user
|
||||||
|
connects to my Unix machines from a different system with a
|
||||||
|
correct backspace key.
|
||||||
|
|
||||||
|
[1] http://www.ibb.net/~anne/keyboard.html
|
||||||
|
[2] http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html
|
||||||
|
|
||||||
|
|
||||||
|
## But I really want the old grumpy behaviour of my terminal
|
||||||
|
|
||||||
|
Apply [1].
|
||||||
|
|
||||||
|
[1] https://st.suckless.org/patches/delkey
|
||||||
|
|
||||||
|
|
||||||
|
## Why do images not work in st using the w3m image hack?
|
||||||
|
|
||||||
|
w3mimg uses a hack that draws an image on top of the terminal emulator Drawable
|
||||||
|
window. The hack relies on the terminal to use a single buffer to draw its
|
||||||
|
contents directly.
|
||||||
|
|
||||||
|
st uses double-buffered drawing so the image is quickly replaced and may show a
|
||||||
|
short flicker effect.
|
||||||
|
|
||||||
|
Below is a patch example to change st double-buffering to a single Drawable
|
||||||
|
buffer.
|
||||||
|
|
||||||
|
diff --git a/x.c b/x.c
|
||||||
|
--- a/x.c
|
||||||
|
+++ b/x.c
|
||||||
|
@@ -732,10 +732,6 @@ xresize(int col, int row)
|
||||||
|
win.tw = col * win.cw;
|
||||||
|
win.th = row * win.ch;
|
||||||
|
|
||||||
|
- XFreePixmap(xw.dpy, xw.buf);
|
||||||
|
- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
|
||||||
|
- DefaultDepth(xw.dpy, xw.scr));
|
||||||
|
- XftDrawChange(xw.draw, xw.buf);
|
||||||
|
xclear(0, 0, win.w, win.h);
|
||||||
|
|
||||||
|
/* resize to new width */
|
||||||
|
@@ -1148,8 +1144,7 @@ xinit(int cols, int rows)
|
||||||
|
gcvalues.graphics_exposures = False;
|
||||||
|
dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
|
||||||
|
&gcvalues);
|
||||||
|
- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
|
||||||
|
- DefaultDepth(xw.dpy, xw.scr));
|
||||||
|
+ xw.buf = xw.win;
|
||||||
|
XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
|
||||||
|
XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
|
||||||
|
|
||||||
|
@@ -1632,8 +1627,6 @@ xdrawline(Line line, int x1, int y1, int x2)
|
||||||
|
void
|
||||||
|
xfinishdraw(void)
|
||||||
|
{
|
||||||
|
- XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w,
|
||||||
|
- win.h, 0, 0);
|
||||||
|
XSetForeground(xw.dpy, dc.gc,
|
||||||
|
dc.col[IS_SET(MODE_REVERSE)?
|
||||||
|
defaultfg : defaultbg].pixel);
|
||||||
|
|
||||||
|
|
||||||
|
## BadLength X error in Xft when trying to render emoji
|
||||||
|
|
||||||
|
Xft makes st crash when rendering color emojis with the following error:
|
||||||
|
|
||||||
|
"X Error of failed request: BadLength (poly request too large or internal Xlib length error)"
|
||||||
|
Major opcode of failed request: 139 (RENDER)
|
||||||
|
Minor opcode of failed request: 20 (RenderAddGlyphs)
|
||||||
|
Serial number of failed request: 1595
|
||||||
|
Current serial number in output stream: 1818"
|
||||||
|
|
||||||
|
This is a known bug in Xft (not st) which happens on some platforms and
|
||||||
|
combination of particular fonts and fontconfig settings.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
https://gitlab.freedesktop.org/xorg/lib/libxft/issues/6
|
||||||
|
https://bugs.freedesktop.org/show_bug.cgi?id=107534
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1498269
|
||||||
|
|
||||||
|
The solution is to remove color emoji fonts or disable this in the fontconfig
|
||||||
|
XML configuration. As an ugly workaround (which may work only on newer
|
||||||
|
fontconfig versions (FC_COLOR)), the following code can be used to mask color
|
||||||
|
fonts:
|
||||||
|
|
||||||
|
FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
|
||||||
|
|
||||||
|
Please don't bother reporting this bug to st, but notify the upstream Xft
|
||||||
|
developers about fixing this bug.
|
||||||
|
|
||||||
|
As of 2022-09-05 this now seems to be finally fixed in libXft 2.3.5:
|
||||||
|
https://gitlab.freedesktop.org/xorg/lib/libxft/-/blob/libXft-2.3.5/NEWS
|
17
LEGACY
Normal file
17
LEGACY
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
A STATEMENT ON LEGACY SUPPORT
|
||||||
|
|
||||||
|
In the terminal world there is much cruft that comes from old and unsup‐
|
||||||
|
ported terminals that inherit incompatible modes and escape sequences
|
||||||
|
which noone is able to know, except when he/she comes from that time and
|
||||||
|
developed a graphical vt100 emulator at that time.
|
||||||
|
|
||||||
|
One goal of st is to only support what is really needed. When you en‐
|
||||||
|
counter a sequence which you really need, implement it. But while you
|
||||||
|
are at it, do not add the other cruft you might encounter while sneek‐
|
||||||
|
ing at other terminal emulators. History has bloated them and there is
|
||||||
|
no real evidence that most of the sequences are used today.
|
||||||
|
|
||||||
|
|
||||||
|
Christoph Lohmann <20h@r-36.net>
|
||||||
|
2012-09-13T07:00:36.081271045+02:00
|
||||||
|
|
34
LICENSE
Normal file
34
LICENSE
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
MIT/X Consortium License
|
||||||
|
|
||||||
|
© 2014-2022 Hiltjo Posthuma <hiltjo at codemadness dot org>
|
||||||
|
© 2018 Devin J. Pohly <djpohly at gmail dot com>
|
||||||
|
© 2014-2017 Quentin Rameau <quinq at fifth dot space>
|
||||||
|
© 2009-2012 Aurélien APTEL <aurelien dot aptel at gmail dot com>
|
||||||
|
© 2008-2017 Anselm R Garbe <garbeam at gmail dot com>
|
||||||
|
© 2012-2017 Roberto E. Vargas Caballero <k0ga at shike2 dot com>
|
||||||
|
© 2012-2016 Christoph Lohmann <20h at r-36 dot net>
|
||||||
|
© 2013 Eon S. Jeon <esjeon at hyunmu dot am>
|
||||||
|
© 2013 Alexander Sedov <alex0player at gmail dot com>
|
||||||
|
© 2013 Mark Edgar <medgar123 at gmail dot com>
|
||||||
|
© 2013-2014 Eric Pruitt <eric.pruitt at gmail dot com>
|
||||||
|
© 2013 Michael Forney <mforney at mforney dot org>
|
||||||
|
© 2013-2014 Markus Teich <markus dot teich at stusta dot mhn dot de>
|
||||||
|
© 2014-2015 Laslo Hunhold <dev at frign dot de>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
60
Makefile
Normal file
60
Makefile
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# st - simple terminal
|
||||||
|
# See LICENSE file for copyright and license details.
|
||||||
|
.POSIX:
|
||||||
|
|
||||||
|
include config.mk
|
||||||
|
|
||||||
|
SRC = st.c x.c $(LIGATURES_C) $(SIXEL_C)
|
||||||
|
OBJ = $(SRC:.c=.o)
|
||||||
|
|
||||||
|
all: options st
|
||||||
|
|
||||||
|
options:
|
||||||
|
@echo st build options:
|
||||||
|
@echo "CFLAGS = $(STCFLAGS)"
|
||||||
|
@echo "LDFLAGS = $(STLDFLAGS)"
|
||||||
|
@echo "CC = $(CC)"
|
||||||
|
|
||||||
|
config.h:
|
||||||
|
cp config.def.h config.h
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(STCFLAGS) -c $<
|
||||||
|
|
||||||
|
st.o: config.h st.h win.h
|
||||||
|
x.o: arg.h config.h st.h win.h $(LIGATURES_H)
|
||||||
|
|
||||||
|
$(OBJ): config.h config.mk
|
||||||
|
|
||||||
|
st: $(OBJ)
|
||||||
|
$(CC) -o $@ $(OBJ) $(STLDFLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f st $(OBJ) st-$(VERSION).tar.gz
|
||||||
|
|
||||||
|
dist: clean
|
||||||
|
mkdir -p st-$(VERSION)
|
||||||
|
cp -R FAQ LEGACY TODO LICENSE Makefile README config.mk\
|
||||||
|
config.def.h st.info st.1 arg.h st.h win.h $(LIGATURES_H) $(SRC)\
|
||||||
|
st-$(VERSION)
|
||||||
|
tar -cf - st-$(VERSION) | gzip > st-$(VERSION).tar.gz
|
||||||
|
rm -rf st-$(VERSION)
|
||||||
|
|
||||||
|
install: st
|
||||||
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
|
cp -f st $(DESTDIR)$(PREFIX)/bin
|
||||||
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/st
|
||||||
|
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1
|
||||||
|
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1
|
||||||
|
tic -sx st.info
|
||||||
|
mkdir -p $(DESTDIR)$(PREFIX)/share/applications # desktop-entry patch
|
||||||
|
cp -n st.desktop $(DESTDIR)$(PREFIX)/share/applications # desktop-entry patch
|
||||||
|
@echo Please see the README file regarding the terminfo entry of st.
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -f $(DESTDIR)$(PREFIX)/bin/st
|
||||||
|
rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1
|
||||||
|
rm -f $(DESTDIR)$(PREFIX)/share/applications/st.desktop # desktop-entry patch
|
||||||
|
|
||||||
|
.PHONY: all options clean dist install uninstall
|
34
README
Normal file
34
README
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
st - simple terminal
|
||||||
|
--------------------
|
||||||
|
st is a simple terminal emulator for X which sucks less.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
In order to build st you need the Xlib header files.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
Edit config.mk to match your local setup (st is installed into
|
||||||
|
the /usr/local namespace by default).
|
||||||
|
|
||||||
|
Afterwards enter the following command to build and install st (if
|
||||||
|
necessary as root):
|
||||||
|
|
||||||
|
make clean install
|
||||||
|
|
||||||
|
|
||||||
|
Running st
|
||||||
|
----------
|
||||||
|
If you did not install st with make clean install, you must compile
|
||||||
|
the st terminfo entry with the following command:
|
||||||
|
|
||||||
|
tic -sx st.info
|
||||||
|
|
||||||
|
See the man page for additional details.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
-------
|
||||||
|
Based on Aurélien APTEL <aurelien dot aptel at gmail dot com> bt source code.
|
||||||
|
|
28
TODO
Normal file
28
TODO
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
vt emulation
|
||||||
|
------------
|
||||||
|
|
||||||
|
* double-height support
|
||||||
|
|
||||||
|
code & interface
|
||||||
|
----------------
|
||||||
|
|
||||||
|
* add a simple way to do multiplexing
|
||||||
|
|
||||||
|
drawing
|
||||||
|
-------
|
||||||
|
* add diacritics support to xdraws()
|
||||||
|
* switch to a suckless font drawing library
|
||||||
|
* make the font cache simpler
|
||||||
|
* add better support for brightening of the upper colors
|
||||||
|
|
||||||
|
bugs
|
||||||
|
----
|
||||||
|
|
||||||
|
* fix shift up/down (shift selection in emacs)
|
||||||
|
* remove DEC test sequence when appropriate
|
||||||
|
|
||||||
|
misc
|
||||||
|
----
|
||||||
|
|
||||||
|
$ grep -nE 'XXX|TODO' st.c
|
||||||
|
|
50
arg.h
Normal file
50
arg.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copy me if you can.
|
||||||
|
* by 20h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARG_H__
|
||||||
|
#define ARG_H__
|
||||||
|
|
||||||
|
extern char *argv0;
|
||||||
|
|
||||||
|
/* use main(int argc, char *argv[]) */
|
||||||
|
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
||||||
|
argv[0] && argv[0][0] == '-'\
|
||||||
|
&& argv[0][1];\
|
||||||
|
argc--, argv++) {\
|
||||||
|
char argc_;\
|
||||||
|
char **argv_;\
|
||||||
|
int brk_;\
|
||||||
|
if (argv[0][1] == '-' && argv[0][2] == '\0') {\
|
||||||
|
argv++;\
|
||||||
|
argc--;\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
int i_;\
|
||||||
|
for (i_ = 1, brk_ = 0, argv_ = argv;\
|
||||||
|
argv[0][i_] && !brk_;\
|
||||||
|
i_++) {\
|
||||||
|
if (argv_ != argv)\
|
||||||
|
break;\
|
||||||
|
argc_ = argv[0][i_];\
|
||||||
|
switch (argc_)
|
||||||
|
|
||||||
|
#define ARGEND }\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ARGC() argc_
|
||||||
|
|
||||||
|
#define EARGF(x) ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
|
||||||
|
((x), abort(), (char *)0) :\
|
||||||
|
(brk_ = 1, (argv[0][i_+1] != '\0')?\
|
||||||
|
(&argv[0][i_+1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#define ARGF() ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
|
||||||
|
(char *)0 :\
|
||||||
|
(brk_ = 1, (argv[0][i_+1] != '\0')?\
|
||||||
|
(&argv[0][i_+1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#endif
|
354
config.def.h
Normal file
354
config.def.h
Normal file
|
@ -0,0 +1,354 @@
|
||||||
|
/* 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=12:antialias=true:autohint=true";
|
||||||
|
|
||||||
|
|
||||||
|
/* borderperc: percentage of cell width to use as a border
|
||||||
|
* 0 = no border, 100 = border width is same as cell width */
|
||||||
|
int borderperc = 20;
|
||||||
|
|
||||||
|
/* modkey options: ControlMask, ShiftMask or XK_ANY_MOD */
|
||||||
|
static uint url_opener_modkey = XK_ANY_MOD;
|
||||||
|
static char *url_opener = "xdg-open";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1: render most of the lines/blocks characters without using the font for
|
||||||
|
* perfect alignment between cells (U2500 - U259F except dashes/diagonals).
|
||||||
|
* Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
|
||||||
|
* 0: disable (render all U25XX glyphs normally from the font).
|
||||||
|
*/
|
||||||
|
const int boxdraw = 0;
|
||||||
|
const int boxdraw_bold = 0;
|
||||||
|
|
||||||
|
/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */
|
||||||
|
const int boxdraw_braille = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */
|
||||||
|
"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 */
|
||||||
|
"#add8e6", /* 256 -> cursor */
|
||||||
|
"#555555", /* 257 -> rev cursor*/
|
||||||
|
"#000000", /* 258 -> bg */
|
||||||
|
"#e5e5e5", /* 259 -> fg */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default colors (colorname index)
|
||||||
|
* foreground, background, cursor, reverse cursor
|
||||||
|
*/
|
||||||
|
unsigned int defaultbg = 258;
|
||||||
|
unsigned int defaultfg = 259;
|
||||||
|
unsigned int defaultcs = 256;
|
||||||
|
unsigned int defaultrcs = 257;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
|
||||||
|
* Default style of cursor
|
||||||
|
* 0: Blinking block
|
||||||
|
* 1: Blinking block (default)
|
||||||
|
* 2: Steady block ("â–ˆ")
|
||||||
|
* 3: Blinking underline
|
||||||
|
* 4: Steady underline ("_")
|
||||||
|
* 5: Blinking bar
|
||||||
|
* 6: Steady bar ("|")
|
||||||
|
* 7: Blinking st cursor
|
||||||
|
* 8: Steady st cursor
|
||||||
|
*/
|
||||||
|
static unsigned int cursorstyle = 1;
|
||||||
|
static Rune stcursor = 0x2603; /* snowman (U+2603) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default columns and rows numbers
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned int cols = 80;
|
||||||
|
static unsigned int rows = 24;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default shape of the mouse cursor
|
||||||
|
*/
|
||||||
|
static char* mouseshape = "xterm";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Color used to display font attributes when fontconfig selected a font which
|
||||||
|
* doesn't match the ones requested.
|
||||||
|
*/
|
||||||
|
static unsigned int defaultattr = 11;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Xresources preferences to load at startup
|
||||||
|
*/
|
||||||
|
ResourcePref resources[] = {
|
||||||
|
{ "font", STRING, &font },
|
||||||
|
{ "color0", STRING, &colorname[0] },
|
||||||
|
{ "color1", STRING, &colorname[1] },
|
||||||
|
{ "color2", STRING, &colorname[2] },
|
||||||
|
{ "color3", STRING, &colorname[3] },
|
||||||
|
{ "color4", STRING, &colorname[4] },
|
||||||
|
{ "color5", STRING, &colorname[5] },
|
||||||
|
{ "color6", STRING, &colorname[6] },
|
||||||
|
{ "color7", STRING, &colorname[7] },
|
||||||
|
{ "color8", STRING, &colorname[8] },
|
||||||
|
{ "color9", STRING, &colorname[9] },
|
||||||
|
{ "color10", STRING, &colorname[10] },
|
||||||
|
{ "color11", STRING, &colorname[11] },
|
||||||
|
{ "color12", STRING, &colorname[12] },
|
||||||
|
{ "color13", STRING, &colorname[13] },
|
||||||
|
{ "color14", STRING, &colorname[14] },
|
||||||
|
{ "color15", STRING, &colorname[15] },
|
||||||
|
{ "background", STRING, &colorname[258] },
|
||||||
|
{ "foreground", STRING, &colorname[259] },
|
||||||
|
{ "cursorColor", STRING, &colorname[256] },
|
||||||
|
{ "termname", STRING, &termname },
|
||||||
|
{ "shell", STRING, &shell },
|
||||||
|
{ "minlatency", INTEGER, &minlatency },
|
||||||
|
{ "maxlatency", INTEGER, &maxlatency },
|
||||||
|
{ "blinktimeout", INTEGER, &blinktimeout },
|
||||||
|
{ "bellvolume", INTEGER, &bellvolume },
|
||||||
|
{ "tabspaces", INTEGER, &tabspaces },
|
||||||
|
{ "borderperc", INTEGER, &borderperc },
|
||||||
|
{ "cwscale", FLOAT, &cwscale },
|
||||||
|
{ "chscale", FLOAT, &chscale },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 screen */
|
||||||
|
{ XK_ANY_MOD, Button2, clippaste, {.i = 0}, 1 },
|
||||||
|
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
|
||||||
|
{ ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} },
|
||||||
|
{ XK_NO_MOD, Button4, kscrollup, {.i = 1}, 0, S_PRI },
|
||||||
|
{ XK_NO_MOD, Button5, kscrolldown, {.i = 1}, 0, S_PRI },
|
||||||
|
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"}, 0, S_ALT },
|
||||||
|
{ XK_ANY_MOD, Button5, ttysend, {.s = "\005"}, 0, S_ALT },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Internal keyboard shortcuts. */
|
||||||
|
#define MODKEY Mod1Mask
|
||||||
|
#define TERMMOD (ControlMask|ShiftMask)
|
||||||
|
|
||||||
|
static char *openurlcmd[] = { "/bin/sh", "-c",
|
||||||
|
"xurls | dmenu -l 10 -w $WINDOWID | xargs -r open",
|
||||||
|
"externalpipe", NULL };
|
||||||
|
|
||||||
|
static char *setbgcolorcmd[] = { "/bin/sh", "-c",
|
||||||
|
"printf '\033]11;#008000\007'",
|
||||||
|
"externalpipein", NULL };
|
||||||
|
|
||||||
|
static Shortcut shortcuts[] = {
|
||||||
|
/* mask keysym function argument screen */
|
||||||
|
{ 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} },
|
||||||
|
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1}, S_PRI },
|
||||||
|
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1}, S_PRI },
|
||||||
|
{ TERMMOD, XK_Y, clippaste, {.i = 0} },
|
||||||
|
{ ShiftMask, XK_Insert, clippaste, {.i = 0} },
|
||||||
|
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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{|}~";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undercurl style. Set UNDERCURL_STYLE to one of the available styles.
|
||||||
|
*
|
||||||
|
* Curly: Dunno how to draw it *shrug*
|
||||||
|
* _ _ _ _
|
||||||
|
* ( ) ( ) ( ) ( )
|
||||||
|
* (_) (_) (_) (_)
|
||||||
|
*
|
||||||
|
* Spiky:
|
||||||
|
* /\ /\ /\ /\
|
||||||
|
* \/ \/ \/
|
||||||
|
*
|
||||||
|
* Capped:
|
||||||
|
* _ _ _
|
||||||
|
* / \ / \ / \
|
||||||
|
* \_/ \_/
|
||||||
|
*/
|
||||||
|
// Available styles
|
||||||
|
#define UNDERCURL_CURLY 0
|
||||||
|
#define UNDERCURL_SPIKY 1
|
||||||
|
#define UNDERCURL_CAPPED 2
|
||||||
|
// Active style
|
||||||
|
#define UNDERCURL_STYLE UNDERCURL_SPIKY
|
359
config.h
Normal file
359
config.h
Normal file
|
@ -0,0 +1,359 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* appearance
|
||||||
|
*
|
||||||
|
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
|
||||||
|
*/
|
||||||
|
static char *font = "FiraCode Nerd Font Mono:pixelsize=12:antialias=true:autohint=true";
|
||||||
|
|
||||||
|
|
||||||
|
/* borderperc: percentage of cell width to use as a border
|
||||||
|
* 0 = no border, 100 = border width is same as cell width */
|
||||||
|
int borderperc = 100;
|
||||||
|
|
||||||
|
/* modkey options: ControlMask, ShiftMask or XK_ANY_MOD */
|
||||||
|
static uint url_opener_modkey = XK_ANY_MOD;
|
||||||
|
static char *url_opener = "xdg-open";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1: render most of the lines/blocks characters without using the font for
|
||||||
|
* perfect alignment between cells (U2500 - U259F except dashes/diagonals).
|
||||||
|
* Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
|
||||||
|
* 0: disable (render all U25XX glyphs normally from the font).
|
||||||
|
*/
|
||||||
|
const int boxdraw = 1;
|
||||||
|
const int boxdraw_bold = 1;
|
||||||
|
|
||||||
|
/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */
|
||||||
|
const int boxdraw_braille = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 = 2;
|
||||||
|
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
"#add8e6", /* 256 -> cursor */
|
||||||
|
"#555555", /* 257 -> rev cursor*/
|
||||||
|
"#000000", /* 258 -> bg */
|
||||||
|
"#e5e5e5", /* 259 -> fg */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default colors (colorname index)
|
||||||
|
* foreground, background, cursor, reverse cursor
|
||||||
|
*/
|
||||||
|
unsigned int defaultbg = 258;
|
||||||
|
unsigned int defaultfg = 259;
|
||||||
|
unsigned int defaultcs = 256;
|
||||||
|
unsigned int defaultrcs = 257;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
|
||||||
|
* Default style of cursor
|
||||||
|
* 0: Blinking block
|
||||||
|
* 1: Blinking block (default)
|
||||||
|
* 2: Steady block ("â–ˆ")
|
||||||
|
* 3: Blinking underline
|
||||||
|
* 4: Steady underline ("_")
|
||||||
|
* 5: Blinking bar
|
||||||
|
* 6: Steady bar ("|")
|
||||||
|
* 7: Blinking st cursor
|
||||||
|
* 8: Steady st cursor
|
||||||
|
*/
|
||||||
|
static unsigned int cursorstyle = 3;
|
||||||
|
static Rune stcursor = 0x2603; /* snowman (U+2603) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default columns and rows numbers
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned int cols = 90;
|
||||||
|
static unsigned int rows = 34;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default shape of the mouse cursor
|
||||||
|
*/
|
||||||
|
static char* mouseshape = "xterm";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Color used to display font attributes when fontconfig selected a font which
|
||||||
|
* doesn't match the ones requested.
|
||||||
|
*/
|
||||||
|
static unsigned int defaultattr = 11;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Xresources preferences to load at startup
|
||||||
|
*/
|
||||||
|
ResourcePref resources[] = {
|
||||||
|
{ "font", STRING, &font },
|
||||||
|
{ "color0", STRING, &colorname[0] },
|
||||||
|
{ "color1", STRING, &colorname[1] },
|
||||||
|
{ "color2", STRING, &colorname[2] },
|
||||||
|
{ "color3", STRING, &colorname[3] },
|
||||||
|
{ "color4", STRING, &colorname[4] },
|
||||||
|
{ "color5", STRING, &colorname[5] },
|
||||||
|
{ "color6", STRING, &colorname[6] },
|
||||||
|
{ "color7", STRING, &colorname[7] },
|
||||||
|
{ "color8", STRING, &colorname[8] },
|
||||||
|
{ "color9", STRING, &colorname[9] },
|
||||||
|
{ "color10", STRING, &colorname[10] },
|
||||||
|
{ "color11", STRING, &colorname[11] },
|
||||||
|
{ "color12", STRING, &colorname[12] },
|
||||||
|
{ "color13", STRING, &colorname[13] },
|
||||||
|
{ "color14", STRING, &colorname[14] },
|
||||||
|
{ "color15", STRING, &colorname[15] },
|
||||||
|
{ "background", STRING, &colorname[258] },
|
||||||
|
{ "foreground", STRING, &colorname[259] },
|
||||||
|
{ "cursorColor", STRING, &colorname[256] },
|
||||||
|
{ "termname", STRING, &termname },
|
||||||
|
{ "shell", STRING, &shell },
|
||||||
|
{ "minlatency", INTEGER, &minlatency },
|
||||||
|
{ "maxlatency", INTEGER, &maxlatency },
|
||||||
|
{ "blinktimeout", INTEGER, &blinktimeout },
|
||||||
|
{ "bellvolume", INTEGER, &bellvolume },
|
||||||
|
{ "tabspaces", INTEGER, &tabspaces },
|
||||||
|
{ "borderperc", INTEGER, &borderperc },
|
||||||
|
{ "cwscale", FLOAT, &cwscale },
|
||||||
|
{ "chscale", FLOAT, &chscale },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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, clippaste, {.i = 0}, 1 },
|
||||||
|
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
|
||||||
|
{ ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} },
|
||||||
|
{ XK_NO_MOD, Button4, kscrollup, {.i = 1} },
|
||||||
|
{ XK_NO_MOD, Button5, kscrolldown, {.i = 1} },
|
||||||
|
};
|
||||||
|
|
||||||
|
static MouseShortcut maltshortcuts[] = {
|
||||||
|
/* mask button function argument release */
|
||||||
|
{ XK_ANY_MOD, Button2, clippaste, {.i = 0}, 1 },
|
||||||
|
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
|
||||||
|
{ XK_ANY_MOD, Button5, ttysend, {.s = "\005"} },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Internal keyboard shortcuts. */
|
||||||
|
#define MODKEY Mod1Mask
|
||||||
|
#define TERMMOD (ControlMask|ShiftMask)
|
||||||
|
|
||||||
|
static char *openurlcmd[] = { "/bin/sh", "-c",
|
||||||
|
"xurls | dmenu -l 10 -w $WINDOWID | xargs -r open",
|
||||||
|
"externalpipe", NULL };
|
||||||
|
|
||||||
|
static char *setbgcolorcmd[] = { "/bin/sh", "-c",
|
||||||
|
"printf '\033]11;#008000\007'",
|
||||||
|
"externalpipein", NULL };
|
||||||
|
|
||||||
|
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} },
|
||||||
|
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
|
||||||
|
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
|
||||||
|
{ TERMMOD, XK_Y, clippaste, {.i = 0} },
|
||||||
|
{ ShiftMask, XK_Insert, clippaste, {.i = 0} },
|
||||||
|
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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{|}~";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undercurl style. Set UNDERCURL_STYLE to one of the available styles.
|
||||||
|
*
|
||||||
|
* Curly: Dunno how to draw it *shrug*
|
||||||
|
* _ _ _ _
|
||||||
|
* ( ) ( ) ( ) ( )
|
||||||
|
* (_) (_) (_) (_)
|
||||||
|
*
|
||||||
|
* Spiky:
|
||||||
|
* /\ /\ /\ /\
|
||||||
|
* \/ \/ \/
|
||||||
|
*
|
||||||
|
* Capped:
|
||||||
|
* _ _ _
|
||||||
|
* / \ / \ / \
|
||||||
|
* \_/ \_/
|
||||||
|
*/
|
||||||
|
// Available styles
|
||||||
|
#define UNDERCURL_CURLY 0
|
||||||
|
#define UNDERCURL_SPIKY 1
|
||||||
|
#define UNDERCURL_CAPPED 2
|
||||||
|
// Active style
|
||||||
|
#define UNDERCURL_STYLE UNDERCURL_SPIKY
|
53
config.mk
Normal file
53
config.mk
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# st version
|
||||||
|
VERSION = 0.9
|
||||||
|
|
||||||
|
# Customize below to fit your system
|
||||||
|
|
||||||
|
# paths
|
||||||
|
PREFIX = /usr/local
|
||||||
|
MANPREFIX = $(PREFIX)/share/man
|
||||||
|
|
||||||
|
X11INC = /usr/X11R6/include
|
||||||
|
X11LIB = /usr/X11R6/lib
|
||||||
|
|
||||||
|
PKG_CONFIG = pkg-config
|
||||||
|
|
||||||
|
# Uncomment this for the alpha patch / ALPHA_PATCH
|
||||||
|
#XRENDER = -lXrender
|
||||||
|
|
||||||
|
# Uncomment this for the themed cursor patch / THEMED_CURSOR_PATCH
|
||||||
|
XCURSOR = -lXcursor
|
||||||
|
|
||||||
|
# Uncomment the lines below for the ligatures patch / LIGATURES_PATCH
|
||||||
|
LIGATURES_C = hb.c
|
||||||
|
LIGATURES_H = hb.h
|
||||||
|
LIGATURES_INC = `$(PKG_CONFIG) --cflags harfbuzz`
|
||||||
|
LIGATURES_LIBS = `$(PKG_CONFIG) --libs harfbuzz`
|
||||||
|
|
||||||
|
# Uncomment this for the SIXEL patch / SIXEL_PATCH
|
||||||
|
#SIXEL_C = sixel.c sixel_hls.c
|
||||||
|
|
||||||
|
# includes and libs, uncomment harfbuzz for the ligatures patch
|
||||||
|
INCS = -I$(X11INC) \
|
||||||
|
`$(PKG_CONFIG) --cflags fontconfig` \
|
||||||
|
`$(PKG_CONFIG) --cflags freetype2` \
|
||||||
|
$(LIGATURES_INC)
|
||||||
|
LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft ${XRENDER} ${XCURSOR}\
|
||||||
|
`$(PKG_CONFIG) --libs fontconfig` \
|
||||||
|
`$(PKG_CONFIG) --libs freetype2` \
|
||||||
|
$(LIGATURES_LIBS)
|
||||||
|
|
||||||
|
# flags
|
||||||
|
STCPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600
|
||||||
|
STCFLAGS = $(INCS) $(STCPPFLAGS) $(CPPFLAGS) $(CFLAGS)
|
||||||
|
STLDFLAGS = $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
|
# OpenBSD:
|
||||||
|
#CPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -D_BSD_SOURCE
|
||||||
|
#LIBS = -L$(X11LIB) -lm -lX11 -lutil -lXft \
|
||||||
|
# `pkg-config --libs fontconfig` \
|
||||||
|
# `pkg-config --libs freetype2`
|
||||||
|
#MANPREFIX = ${PREFIX}/man
|
||||||
|
|
||||||
|
# compiler and linker
|
||||||
|
# CC = c99
|
152
hb.c
Normal file
152
hb.c
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
#include <X11/cursorfont.h>
|
||||||
|
#include <hb.h>
|
||||||
|
#include <hb-ft.h>
|
||||||
|
|
||||||
|
#include "st.h"
|
||||||
|
|
||||||
|
#define FEATURE(c1,c2,c3,c4) { .tag = HB_TAG(c1,c2,c3,c4), .value = 1, .start = HB_FEATURE_GLOBAL_START, .end = HB_FEATURE_GLOBAL_END }
|
||||||
|
|
||||||
|
void hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoints, int start, int length);
|
||||||
|
hb_font_t *hbfindfont(XftFont *match);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
XftFont *match;
|
||||||
|
hb_font_t *font;
|
||||||
|
} HbFontMatch;
|
||||||
|
|
||||||
|
static int hbfontslen = 0;
|
||||||
|
static HbFontMatch *hbfontcache = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Poplulate the array with a list of font features, wrapped in FEATURE macro,
|
||||||
|
* e. g.
|
||||||
|
* FEATURE('c', 'a', 'l', 't'), FEATURE('d', 'l', 'i', 'g')
|
||||||
|
*/
|
||||||
|
hb_feature_t features[] = { };
|
||||||
|
|
||||||
|
void
|
||||||
|
hbunloadfonts()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < hbfontslen; i++) {
|
||||||
|
hb_font_destroy(hbfontcache[i].font);
|
||||||
|
XftUnlockFace(hbfontcache[i].match);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hbfontcache != NULL) {
|
||||||
|
free(hbfontcache);
|
||||||
|
hbfontcache = NULL;
|
||||||
|
}
|
||||||
|
hbfontslen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hb_font_t *
|
||||||
|
hbfindfont(XftFont *match)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < hbfontslen; i++) {
|
||||||
|
if (hbfontcache[i].match == match)
|
||||||
|
return hbfontcache[i].font;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Font not found in cache, caching it now. */
|
||||||
|
hbfontcache = realloc(hbfontcache, sizeof(HbFontMatch) * (hbfontslen + 1));
|
||||||
|
FT_Face face = XftLockFace(match);
|
||||||
|
hb_font_t *font = hb_ft_font_create(face, NULL);
|
||||||
|
if (font == NULL)
|
||||||
|
die("Failed to load Harfbuzz font.");
|
||||||
|
|
||||||
|
hbfontcache[hbfontslen].match = match;
|
||||||
|
hbfontcache[hbfontslen].font = font;
|
||||||
|
hbfontslen += 1;
|
||||||
|
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hbtransform(XftGlyphFontSpec *specs, const Glyph *glyphs, size_t len, int x, int y)
|
||||||
|
{
|
||||||
|
int start = 0, length = 1, gstart = 0;
|
||||||
|
hb_codepoint_t *codepoints = calloc((unsigned int)len, sizeof(hb_codepoint_t));
|
||||||
|
|
||||||
|
for (int idx = 1, specidx = 1; idx < len; idx++) {
|
||||||
|
if (glyphs[idx].mode & ATTR_WDUMMY) {
|
||||||
|
length += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (specs[specidx].font != specs[start].font || ATTRCMP(glyphs[gstart], glyphs[idx]) || selected(x + idx, y) != selected(x + gstart, y)) {
|
||||||
|
hbtransformsegment(specs[start].font, glyphs, codepoints, gstart, length);
|
||||||
|
|
||||||
|
/* Reset the sequence. */
|
||||||
|
length = 1;
|
||||||
|
start = specidx;
|
||||||
|
gstart = idx;
|
||||||
|
} else {
|
||||||
|
length += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
specidx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOL. */
|
||||||
|
hbtransformsegment(specs[start].font, glyphs, codepoints, gstart, length);
|
||||||
|
|
||||||
|
/* Apply the transformation to glyph specs. */
|
||||||
|
for (int i = 0, specidx = 0; i < len; i++) {
|
||||||
|
if (glyphs[i].mode & ATTR_WDUMMY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (glyphs[i].mode & ATTR_BOXDRAW) {
|
||||||
|
specidx++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (codepoints[i] != specs[specidx].glyph)
|
||||||
|
((Glyph *)glyphs)[i].mode |= ATTR_LIGA;
|
||||||
|
|
||||||
|
specs[specidx++].glyph = codepoints[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
free(codepoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoints, int start, int length)
|
||||||
|
{
|
||||||
|
hb_font_t *font = hbfindfont(xfont);
|
||||||
|
if (font == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Rune rune;
|
||||||
|
ushort mode = USHRT_MAX;
|
||||||
|
hb_buffer_t *buffer = hb_buffer_create();
|
||||||
|
hb_buffer_set_direction(buffer, HB_DIRECTION_LTR);
|
||||||
|
|
||||||
|
/* Fill buffer with codepoints. */
|
||||||
|
for (int i = start; i < (start+length); i++) {
|
||||||
|
rune = string[i].u;
|
||||||
|
mode = string[i].mode;
|
||||||
|
if (mode & ATTR_WDUMMY)
|
||||||
|
rune = 0x0020;
|
||||||
|
hb_buffer_add_codepoints(buffer, &rune, 1, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shape the segment. */
|
||||||
|
hb_shape(font, buffer, features, sizeof(features)/sizeof(hb_feature_t));
|
||||||
|
|
||||||
|
/* Get new glyph info. */
|
||||||
|
hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, NULL);
|
||||||
|
|
||||||
|
/* Write new codepoints. */
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
hb_codepoint_t gid = info[i].codepoint;
|
||||||
|
codepoints[start+i] = gid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup. */
|
||||||
|
hb_buffer_destroy(buffer);
|
||||||
|
}
|
6
hb.h
Normal file
6
hb.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
#include <hb.h>
|
||||||
|
#include <hb-ft.h>
|
||||||
|
|
||||||
|
void hbunloadfonts();
|
||||||
|
void hbtransform(XftGlyphFontSpec *, const Glyph *, size_t, int, int);
|
192
patch/boxdraw.c
Normal file
192
patch/boxdraw.c
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
|
||||||
|
* MIT/X Consortium License
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
|
||||||
|
/* Rounded non-negative integers division of n / d */
|
||||||
|
#define DIV(n, d) (((n) + (d) / 2) / (d))
|
||||||
|
|
||||||
|
static Display *xdpy;
|
||||||
|
static Colormap xcmap;
|
||||||
|
static XftDraw *xd;
|
||||||
|
static Visual *xvis;
|
||||||
|
|
||||||
|
static void drawbox(int, int, int, int, XftColor *, XftColor *, ushort);
|
||||||
|
static void drawboxlines(int, int, int, int, XftColor *, ushort);
|
||||||
|
|
||||||
|
/* public API */
|
||||||
|
|
||||||
|
void
|
||||||
|
boxdraw_xinit(Display *dpy, Colormap cmap, XftDraw *draw, Visual *vis)
|
||||||
|
{
|
||||||
|
xdpy = dpy; xcmap = cmap; xd = draw, xvis = vis;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
isboxdraw(Rune u)
|
||||||
|
{
|
||||||
|
Rune block = u & ~0xff;
|
||||||
|
return (boxdraw && block == 0x2500 && boxdata[(uint8_t)u]) ||
|
||||||
|
(boxdraw_braille && block == 0x2800);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the "index" is actually the entire shape data encoded as ushort */
|
||||||
|
ushort
|
||||||
|
boxdrawindex(const Glyph *g)
|
||||||
|
{
|
||||||
|
if (boxdraw_braille && (g->u & ~0xff) == 0x2800)
|
||||||
|
return BRL | (uint8_t)g->u;
|
||||||
|
if (boxdraw_bold && (g->mode & ATTR_BOLD))
|
||||||
|
return BDB | boxdata[(uint8_t)g->u];
|
||||||
|
return boxdata[(uint8_t)g->u];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawboxes(int x, int y, int cw, int ch, XftColor *fg, XftColor *bg,
|
||||||
|
const XftGlyphFontSpec *specs, int len)
|
||||||
|
{
|
||||||
|
for ( ; len-- > 0; x += cw, specs++)
|
||||||
|
drawbox(x, y, cw, ch, fg, bg, (ushort)specs->glyph);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* implementation */
|
||||||
|
|
||||||
|
void
|
||||||
|
drawbox(int x, int y, int w, int h, XftColor *fg, XftColor *bg, ushort bd)
|
||||||
|
{
|
||||||
|
ushort cat = bd & ~(BDB | 0xff); /* mask out bold and data */
|
||||||
|
if (bd & (BDL | BDA)) {
|
||||||
|
/* lines (light/double/heavy/arcs) */
|
||||||
|
drawboxlines(x, y, w, h, fg, bd);
|
||||||
|
|
||||||
|
} else if (cat == BBD) {
|
||||||
|
/* lower (8-X)/8 block */
|
||||||
|
int d = DIV((uint8_t)bd * h, 8);
|
||||||
|
XftDrawRect(xd, fg, x, y + d, w, h - d);
|
||||||
|
|
||||||
|
} else if (cat == BBU) {
|
||||||
|
/* upper X/8 block */
|
||||||
|
XftDrawRect(xd, fg, x, y, w, DIV((uint8_t)bd * h, 8));
|
||||||
|
|
||||||
|
} else if (cat == BBL) {
|
||||||
|
/* left X/8 block */
|
||||||
|
XftDrawRect(xd, fg, x, y, DIV((uint8_t)bd * w, 8), h);
|
||||||
|
|
||||||
|
} else if (cat == BBR) {
|
||||||
|
/* right (8-X)/8 block */
|
||||||
|
int d = DIV((uint8_t)bd * w, 8);
|
||||||
|
XftDrawRect(xd, fg, x + d, y, w - d, h);
|
||||||
|
|
||||||
|
} else if (cat == BBQ) {
|
||||||
|
/* Quadrants */
|
||||||
|
int w2 = DIV(w, 2), h2 = DIV(h, 2);
|
||||||
|
if (bd & TL)
|
||||||
|
XftDrawRect(xd, fg, x, y, w2, h2);
|
||||||
|
if (bd & TR)
|
||||||
|
XftDrawRect(xd, fg, x + w2, y, w - w2, h2);
|
||||||
|
if (bd & BL)
|
||||||
|
XftDrawRect(xd, fg, x, y + h2, w2, h - h2);
|
||||||
|
if (bd & BR)
|
||||||
|
XftDrawRect(xd, fg, x + w2, y + h2, w - w2, h - h2);
|
||||||
|
|
||||||
|
} else if (bd & BBS) {
|
||||||
|
/* Shades - data is 1/2/3 for 25%/50%/75% alpha, respectively */
|
||||||
|
int d = (uint8_t)bd;
|
||||||
|
XftColor xfc;
|
||||||
|
XRenderColor xrc = { .alpha = 0xffff };
|
||||||
|
|
||||||
|
xrc.red = DIV(fg->color.red * d + bg->color.red * (4 - d), 4);
|
||||||
|
xrc.green = DIV(fg->color.green * d + bg->color.green * (4 - d), 4);
|
||||||
|
xrc.blue = DIV(fg->color.blue * d + bg->color.blue * (4 - d), 4);
|
||||||
|
|
||||||
|
XftColorAllocValue(xdpy, xvis, xcmap, &xrc, &xfc);
|
||||||
|
XftDrawRect(xd, &xfc, x, y, w, h);
|
||||||
|
XftColorFree(xdpy, xvis, xcmap, &xfc);
|
||||||
|
|
||||||
|
} else if (cat == BRL) {
|
||||||
|
/* braille, each data bit corresponds to one dot at 2x4 grid */
|
||||||
|
int w1 = DIV(w, 2);
|
||||||
|
int h1 = DIV(h, 4), h2 = DIV(h, 2), h3 = DIV(3 * h, 4);
|
||||||
|
|
||||||
|
if (bd & 1) XftDrawRect(xd, fg, x, y, w1, h1);
|
||||||
|
if (bd & 2) XftDrawRect(xd, fg, x, y + h1, w1, h2 - h1);
|
||||||
|
if (bd & 4) XftDrawRect(xd, fg, x, y + h2, w1, h3 - h2);
|
||||||
|
if (bd & 8) XftDrawRect(xd, fg, x + w1, y, w - w1, h1);
|
||||||
|
if (bd & 16) XftDrawRect(xd, fg, x + w1, y + h1, w - w1, h2 - h1);
|
||||||
|
if (bd & 32) XftDrawRect(xd, fg, x + w1, y + h2, w - w1, h3 - h2);
|
||||||
|
if (bd & 64) XftDrawRect(xd, fg, x, y + h3, w1, h - h3);
|
||||||
|
if (bd & 128) XftDrawRect(xd, fg, x + w1, y + h3, w - w1, h - h3);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawboxlines(int x, int y, int w, int h, XftColor *fg, ushort bd)
|
||||||
|
{
|
||||||
|
/* s: stem thickness. width/8 roughly matches underscore thickness. */
|
||||||
|
/* We draw bold as 1.5 * normal-stem and at least 1px thicker. */
|
||||||
|
/* doubles draw at least 3px, even when w or h < 3. bold needs 6px. */
|
||||||
|
int mwh = MIN(w, h);
|
||||||
|
int base_s = MAX(1, DIV(mwh, 8));
|
||||||
|
int bold = (bd & BDB) && mwh >= 6; /* possibly ignore boldness */
|
||||||
|
int s = bold ? MAX(base_s + 1, DIV(3 * base_s, 2)) : base_s;
|
||||||
|
int w2 = DIV(w - s, 2), h2 = DIV(h - s, 2);
|
||||||
|
/* the s-by-s square (x + w2, y + h2, s, s) is the center texel. */
|
||||||
|
/* The base length (per direction till edge) includes this square. */
|
||||||
|
|
||||||
|
int light = bd & (LL | LU | LR | LD);
|
||||||
|
int double_ = bd & (DL | DU | DR | DD);
|
||||||
|
|
||||||
|
if (light) {
|
||||||
|
/* d: additional (negative) length to not-draw the center */
|
||||||
|
/* texel - at arcs and avoid drawing inside (some) doubles */
|
||||||
|
int arc = bd & BDA;
|
||||||
|
int multi_light = light & (light - 1);
|
||||||
|
int multi_double = double_ & (double_ - 1);
|
||||||
|
/* light crosses double only at DH+LV, DV+LH (ref. shapes) */
|
||||||
|
int d = arc || (multi_double && !multi_light) ? -s : 0;
|
||||||
|
|
||||||
|
if (bd & LL)
|
||||||
|
XftDrawRect(xd, fg, x, y + h2, w2 + s + d, s);
|
||||||
|
if (bd & LU)
|
||||||
|
XftDrawRect(xd, fg, x + w2, y, s, h2 + s + d);
|
||||||
|
if (bd & LR)
|
||||||
|
XftDrawRect(xd, fg, x + w2 - d, y + h2, w - w2 + d, s);
|
||||||
|
if (bd & LD)
|
||||||
|
XftDrawRect(xd, fg, x + w2, y + h2 - d, s, h - h2 + d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* double lines - also align with light to form heavy when combined */
|
||||||
|
if (double_) {
|
||||||
|
/*
|
||||||
|
* going clockwise, for each double-ray: p is additional length
|
||||||
|
* to the single-ray nearer to the previous direction, and n to
|
||||||
|
* the next. p and n adjust from the base length to lengths
|
||||||
|
* which consider other doubles - shorter to avoid intersections
|
||||||
|
* (p, n), or longer to draw the far-corner texel (n).
|
||||||
|
*/
|
||||||
|
int dl = bd & DL, du = bd & DU, dr = bd & DR, dd = bd & DD;
|
||||||
|
if (dl) {
|
||||||
|
int p = dd ? -s : 0, n = du ? -s : dd ? s : 0;
|
||||||
|
XftDrawRect(xd, fg, x, y + h2 + s, w2 + s + p, s);
|
||||||
|
XftDrawRect(xd, fg, x, y + h2 - s, w2 + s + n, s);
|
||||||
|
}
|
||||||
|
if (du) {
|
||||||
|
int p = dl ? -s : 0, n = dr ? -s : dl ? s : 0;
|
||||||
|
XftDrawRect(xd, fg, x + w2 - s, y, s, h2 + s + p);
|
||||||
|
XftDrawRect(xd, fg, x + w2 + s, y, s, h2 + s + n);
|
||||||
|
}
|
||||||
|
if (dr) {
|
||||||
|
int p = du ? -s : 0, n = dd ? -s : du ? s : 0;
|
||||||
|
XftDrawRect(xd, fg, x + w2 - p, y + h2 - s, w - w2 + p, s);
|
||||||
|
XftDrawRect(xd, fg, x + w2 - n, y + h2 + s, w - w2 + n, s);
|
||||||
|
}
|
||||||
|
if (dd) {
|
||||||
|
int p = dr ? -s : 0, n = dl ? -s : dr ? s : 0;
|
||||||
|
XftDrawRect(xd, fg, x + w2 + s, y + h2 - p, s, h - h2 + p);
|
||||||
|
XftDrawRect(xd, fg, x + w2 - s, y + h2 - n, s, h - h2 + n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
214
patch/boxdraw.h
Normal file
214
patch/boxdraw.h
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
|
||||||
|
* MIT/X Consortium License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* U+25XX codepoints data
|
||||||
|
*
|
||||||
|
* References:
|
||||||
|
* http://www.unicode.org/charts/PDF/U2500.pdf
|
||||||
|
* http://www.unicode.org/charts/PDF/U2580.pdf
|
||||||
|
*
|
||||||
|
* Test page:
|
||||||
|
* https://github.com/GNOME/vte/blob/master/doc/boxes.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Each shape is encoded as 16-bits. Higher bits are category, lower are data */
|
||||||
|
/* Categories (mutually exclusive except BDB): */
|
||||||
|
/* For convenience, BDL/BDA/BBS/BDB are 1 bit each, the rest are enums */
|
||||||
|
#define BDL (1<<8) /* Box Draw Lines (light/double/heavy) */
|
||||||
|
#define BDA (1<<9) /* Box Draw Arc (light) */
|
||||||
|
|
||||||
|
#define BBD (1<<10) /* Box Block Down (lower) X/8 */
|
||||||
|
#define BBL (2<<10) /* Box Block Left X/8 */
|
||||||
|
#define BBU (3<<10) /* Box Block Upper X/8 */
|
||||||
|
#define BBR (4<<10) /* Box Block Right X/8 */
|
||||||
|
#define BBQ (5<<10) /* Box Block Quadrants */
|
||||||
|
#define BRL (6<<10) /* Box Braille (data is lower byte of U28XX) */
|
||||||
|
|
||||||
|
#define BBS (1<<14) /* Box Block Shades */
|
||||||
|
#define BDB (1<<15) /* Box Draw is Bold */
|
||||||
|
|
||||||
|
/* (BDL/BDA) Light/Double/Heavy x Left/Up/Right/Down/Horizontal/Vertical */
|
||||||
|
/* Heavy is light+double (literally drawing light+double align to form heavy) */
|
||||||
|
#define LL (1<<0)
|
||||||
|
#define LU (1<<1)
|
||||||
|
#define LR (1<<2)
|
||||||
|
#define LD (1<<3)
|
||||||
|
#define LH (LL+LR)
|
||||||
|
#define LV (LU+LD)
|
||||||
|
|
||||||
|
#define DL (1<<4)
|
||||||
|
#define DU (1<<5)
|
||||||
|
#define DR (1<<6)
|
||||||
|
#define DD (1<<7)
|
||||||
|
#define DH (DL+DR)
|
||||||
|
#define DV (DU+DD)
|
||||||
|
|
||||||
|
#define HL (LL+DL)
|
||||||
|
#define HU (LU+DU)
|
||||||
|
#define HR (LR+DR)
|
||||||
|
#define HD (LD+DD)
|
||||||
|
#define HH (HL+HR)
|
||||||
|
#define HV (HU+HD)
|
||||||
|
|
||||||
|
/* (BBQ) Quadrants Top/Bottom x Left/Right */
|
||||||
|
#define TL (1<<0)
|
||||||
|
#define TR (1<<1)
|
||||||
|
#define BL (1<<2)
|
||||||
|
#define BR (1<<3)
|
||||||
|
|
||||||
|
/* Data for U+2500 - U+259F except dashes/diagonals */
|
||||||
|
static const unsigned short boxdata[256] = {
|
||||||
|
/* light lines */
|
||||||
|
[0x00] = BDL + LH, /* light horizontal */
|
||||||
|
[0x02] = BDL + LV, /* light vertical */
|
||||||
|
[0x0c] = BDL + LD + LR, /* light down and right */
|
||||||
|
[0x10] = BDL + LD + LL, /* light down and left */
|
||||||
|
[0x14] = BDL + LU + LR, /* light up and right */
|
||||||
|
[0x18] = BDL + LU + LL, /* light up and left */
|
||||||
|
[0x1c] = BDL + LV + LR, /* light vertical and right */
|
||||||
|
[0x24] = BDL + LV + LL, /* light vertical and left */
|
||||||
|
[0x2c] = BDL + LH + LD, /* light horizontal and down */
|
||||||
|
[0x34] = BDL + LH + LU, /* light horizontal and up */
|
||||||
|
[0x3c] = BDL + LV + LH, /* light vertical and horizontal */
|
||||||
|
[0x74] = BDL + LL, /* light left */
|
||||||
|
[0x75] = BDL + LU, /* light up */
|
||||||
|
[0x76] = BDL + LR, /* light right */
|
||||||
|
[0x77] = BDL + LD, /* light down */
|
||||||
|
|
||||||
|
/* heavy [+light] lines */
|
||||||
|
[0x01] = BDL + HH,
|
||||||
|
[0x03] = BDL + HV,
|
||||||
|
[0x0d] = BDL + HR + LD,
|
||||||
|
[0x0e] = BDL + HD + LR,
|
||||||
|
[0x0f] = BDL + HD + HR,
|
||||||
|
[0x11] = BDL + HL + LD,
|
||||||
|
[0x12] = BDL + HD + LL,
|
||||||
|
[0x13] = BDL + HD + HL,
|
||||||
|
[0x15] = BDL + HR + LU,
|
||||||
|
[0x16] = BDL + HU + LR,
|
||||||
|
[0x17] = BDL + HU + HR,
|
||||||
|
[0x19] = BDL + HL + LU,
|
||||||
|
[0x1a] = BDL + HU + LL,
|
||||||
|
[0x1b] = BDL + HU + HL,
|
||||||
|
[0x1d] = BDL + HR + LV,
|
||||||
|
[0x1e] = BDL + HU + LD + LR,
|
||||||
|
[0x1f] = BDL + HD + LR + LU,
|
||||||
|
[0x20] = BDL + HV + LR,
|
||||||
|
[0x21] = BDL + HU + HR + LD,
|
||||||
|
[0x22] = BDL + HD + HR + LU,
|
||||||
|
[0x23] = BDL + HV + HR,
|
||||||
|
[0x25] = BDL + HL + LV,
|
||||||
|
[0x26] = BDL + HU + LD + LL,
|
||||||
|
[0x27] = BDL + HD + LU + LL,
|
||||||
|
[0x28] = BDL + HV + LL,
|
||||||
|
[0x29] = BDL + HU + HL + LD,
|
||||||
|
[0x2a] = BDL + HD + HL + LU,
|
||||||
|
[0x2b] = BDL + HV + HL,
|
||||||
|
[0x2d] = BDL + HL + LD + LR,
|
||||||
|
[0x2e] = BDL + HR + LL + LD,
|
||||||
|
[0x2f] = BDL + HH + LD,
|
||||||
|
[0x30] = BDL + HD + LH,
|
||||||
|
[0x31] = BDL + HD + HL + LR,
|
||||||
|
[0x32] = BDL + HR + HD + LL,
|
||||||
|
[0x33] = BDL + HH + HD,
|
||||||
|
[0x35] = BDL + HL + LU + LR,
|
||||||
|
[0x36] = BDL + HR + LU + LL,
|
||||||
|
[0x37] = BDL + HH + LU,
|
||||||
|
[0x38] = BDL + HU + LH,
|
||||||
|
[0x39] = BDL + HU + HL + LR,
|
||||||
|
[0x3a] = BDL + HU + HR + LL,
|
||||||
|
[0x3b] = BDL + HH + HU,
|
||||||
|
[0x3d] = BDL + HL + LV + LR,
|
||||||
|
[0x3e] = BDL + HR + LV + LL,
|
||||||
|
[0x3f] = BDL + HH + LV,
|
||||||
|
[0x40] = BDL + HU + LH + LD,
|
||||||
|
[0x41] = BDL + HD + LH + LU,
|
||||||
|
[0x42] = BDL + HV + LH,
|
||||||
|
[0x43] = BDL + HU + HL + LD + LR,
|
||||||
|
[0x44] = BDL + HU + HR + LD + LL,
|
||||||
|
[0x45] = BDL + HD + HL + LU + LR,
|
||||||
|
[0x46] = BDL + HD + HR + LU + LL,
|
||||||
|
[0x47] = BDL + HH + HU + LD,
|
||||||
|
[0x48] = BDL + HH + HD + LU,
|
||||||
|
[0x49] = BDL + HV + HL + LR,
|
||||||
|
[0x4a] = BDL + HV + HR + LL,
|
||||||
|
[0x4b] = BDL + HV + HH,
|
||||||
|
[0x78] = BDL + HL,
|
||||||
|
[0x79] = BDL + HU,
|
||||||
|
[0x7a] = BDL + HR,
|
||||||
|
[0x7b] = BDL + HD,
|
||||||
|
[0x7c] = BDL + HR + LL,
|
||||||
|
[0x7d] = BDL + HD + LU,
|
||||||
|
[0x7e] = BDL + HL + LR,
|
||||||
|
[0x7f] = BDL + HU + LD,
|
||||||
|
|
||||||
|
/* double [+light] lines */
|
||||||
|
[0x50] = BDL + DH,
|
||||||
|
[0x51] = BDL + DV,
|
||||||
|
[0x52] = BDL + DR + LD,
|
||||||
|
[0x53] = BDL + DD + LR,
|
||||||
|
[0x54] = BDL + DR + DD,
|
||||||
|
[0x55] = BDL + DL + LD,
|
||||||
|
[0x56] = BDL + DD + LL,
|
||||||
|
[0x57] = BDL + DL + DD,
|
||||||
|
[0x58] = BDL + DR + LU,
|
||||||
|
[0x59] = BDL + DU + LR,
|
||||||
|
[0x5a] = BDL + DU + DR,
|
||||||
|
[0x5b] = BDL + DL + LU,
|
||||||
|
[0x5c] = BDL + DU + LL,
|
||||||
|
[0x5d] = BDL + DL + DU,
|
||||||
|
[0x5e] = BDL + DR + LV,
|
||||||
|
[0x5f] = BDL + DV + LR,
|
||||||
|
[0x60] = BDL + DV + DR,
|
||||||
|
[0x61] = BDL + DL + LV,
|
||||||
|
[0x62] = BDL + DV + LL,
|
||||||
|
[0x63] = BDL + DV + DL,
|
||||||
|
[0x64] = BDL + DH + LD,
|
||||||
|
[0x65] = BDL + DD + LH,
|
||||||
|
[0x66] = BDL + DD + DH,
|
||||||
|
[0x67] = BDL + DH + LU,
|
||||||
|
[0x68] = BDL + DU + LH,
|
||||||
|
[0x69] = BDL + DH + DU,
|
||||||
|
[0x6a] = BDL + DH + LV,
|
||||||
|
[0x6b] = BDL + DV + LH,
|
||||||
|
[0x6c] = BDL + DH + DV,
|
||||||
|
|
||||||
|
/* (light) arcs */
|
||||||
|
[0x6d] = BDA + LD + LR,
|
||||||
|
[0x6e] = BDA + LD + LL,
|
||||||
|
[0x6f] = BDA + LU + LL,
|
||||||
|
[0x70] = BDA + LU + LR,
|
||||||
|
|
||||||
|
/* Lower (Down) X/8 block (data is 8 - X) */
|
||||||
|
[0x81] = BBD + 7, [0x82] = BBD + 6, [0x83] = BBD + 5, [0x84] = BBD + 4,
|
||||||
|
[0x85] = BBD + 3, [0x86] = BBD + 2, [0x87] = BBD + 1, [0x88] = BBD + 0,
|
||||||
|
|
||||||
|
/* Left X/8 block (data is X) */
|
||||||
|
[0x89] = BBL + 7, [0x8a] = BBL + 6, [0x8b] = BBL + 5, [0x8c] = BBL + 4,
|
||||||
|
[0x8d] = BBL + 3, [0x8e] = BBL + 2, [0x8f] = BBL + 1,
|
||||||
|
|
||||||
|
/* upper 1/2 (4/8), 1/8 block (X), right 1/2, 1/8 block (8-X) */
|
||||||
|
[0x80] = BBU + 4, [0x94] = BBU + 1,
|
||||||
|
[0x90] = BBR + 4, [0x95] = BBR + 7,
|
||||||
|
|
||||||
|
/* Quadrants */
|
||||||
|
[0x96] = BBQ + BL,
|
||||||
|
[0x97] = BBQ + BR,
|
||||||
|
[0x98] = BBQ + TL,
|
||||||
|
[0x99] = BBQ + TL + BL + BR,
|
||||||
|
[0x9a] = BBQ + TL + BR,
|
||||||
|
[0x9b] = BBQ + TL + TR + BL,
|
||||||
|
[0x9c] = BBQ + TL + TR + BR,
|
||||||
|
[0x9d] = BBQ + TR,
|
||||||
|
[0x9e] = BBQ + BL + TR,
|
||||||
|
[0x9f] = BBQ + BL + TR + BR,
|
||||||
|
|
||||||
|
/* Shades, data is an alpha value in 25% units (1/4, 1/2, 3/4) */
|
||||||
|
[0x91] = BBS + 1, [0x92] = BBS + 2, [0x93] = BBS + 3,
|
||||||
|
|
||||||
|
/* U+2504 - U+250B, U+254C - U+254F: unsupported (dashes) */
|
||||||
|
/* U+2571 - U+2573: unsupported (diagonals) */
|
||||||
|
};
|
813
patch/fixkeyboardinput.c
Normal file
813
patch/fixkeyboardinput.c
Normal file
|
@ -0,0 +1,813 @@
|
||||||
|
/*
|
||||||
|
* If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
|
||||||
|
* to be mapped below, add them to this array.
|
||||||
|
*/
|
||||||
|
static KeySym mappedkeys[] = {
|
||||||
|
XK_space,
|
||||||
|
XK_m,
|
||||||
|
XK_i,
|
||||||
|
XK_A,
|
||||||
|
XK_B,
|
||||||
|
XK_C,
|
||||||
|
XK_D,
|
||||||
|
XK_E,
|
||||||
|
XK_F,
|
||||||
|
XK_G,
|
||||||
|
XK_H,
|
||||||
|
XK_I,
|
||||||
|
XK_K,
|
||||||
|
XK_J,
|
||||||
|
XK_L,
|
||||||
|
XK_M,
|
||||||
|
XK_N,
|
||||||
|
XK_O,
|
||||||
|
XK_P,
|
||||||
|
XK_Q,
|
||||||
|
XK_R,
|
||||||
|
XK_S,
|
||||||
|
XK_T,
|
||||||
|
XK_U,
|
||||||
|
XK_V,
|
||||||
|
XK_W,
|
||||||
|
XK_X,
|
||||||
|
XK_Y,
|
||||||
|
XK_Z,
|
||||||
|
XK_Z,
|
||||||
|
XK_0,
|
||||||
|
XK_1,
|
||||||
|
XK_2,
|
||||||
|
XK_3,
|
||||||
|
XK_4,
|
||||||
|
XK_5,
|
||||||
|
XK_6,
|
||||||
|
XK_7,
|
||||||
|
XK_8,
|
||||||
|
XK_9,
|
||||||
|
XK_exclam,
|
||||||
|
XK_quotedbl,
|
||||||
|
XK_numbersign,
|
||||||
|
XK_dollar,
|
||||||
|
XK_percent,
|
||||||
|
XK_ampersand,
|
||||||
|
XK_apostrophe,
|
||||||
|
XK_parenleft,
|
||||||
|
XK_parenright,
|
||||||
|
XK_asterisk,
|
||||||
|
XK_plus,
|
||||||
|
XK_comma,
|
||||||
|
XK_minus,
|
||||||
|
XK_period,
|
||||||
|
XK_slash,
|
||||||
|
XK_colon,
|
||||||
|
XK_semicolon,
|
||||||
|
XK_less,
|
||||||
|
XK_equal,
|
||||||
|
XK_greater,
|
||||||
|
XK_question,
|
||||||
|
XK_at,
|
||||||
|
XK_bracketleft,
|
||||||
|
XK_backslash,
|
||||||
|
XK_bracketright,
|
||||||
|
XK_asciicircum,
|
||||||
|
XK_underscore,
|
||||||
|
XK_grave,
|
||||||
|
XK_braceleft,
|
||||||
|
XK_bar,
|
||||||
|
XK_braceright,
|
||||||
|
XK_asciitilde,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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_Prior, ShiftMask, "\033[5;2~", 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_Next, ShiftMask, "\033[6;2~", 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_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_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_NO_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_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_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_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_Prior, ControlMask, "\033[5;5~", 0, 0},
|
||||||
|
{ XK_Prior, ShiftMask, "\033[5;2~", 0, 0},
|
||||||
|
{ XK_Next, ControlMask, "\033[6;5~", 0, 0},
|
||||||
|
{ XK_Next, ShiftMask, "\033[6;2~", 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},
|
||||||
|
|
||||||
|
// libtermkey compatible keyboard input
|
||||||
|
{ XK_KP_Home, XK_NO_MOD, "\033[H", 0, -1},
|
||||||
|
{ XK_KP_Home, XK_NO_MOD, "\033[1~", 0, +1},
|
||||||
|
{ XK_KP_Home, ControlMask, "\033[149;5u", 0, 0},
|
||||||
|
{ XK_KP_Home, ControlMask|ShiftMask, "\033[149;6u", 0, 0},
|
||||||
|
{ XK_KP_Home, Mod1Mask, "\033[149;3u", 0, 0},
|
||||||
|
{ XK_KP_Home, Mod1Mask|ControlMask, "\033[149;7u", 0, 0},
|
||||||
|
{ XK_KP_Home, Mod1Mask|ControlMask|ShiftMask, "\033[149;8u", 0, 0},
|
||||||
|
{ XK_KP_Home, Mod1Mask|ShiftMask, "\033[149;4u", 0, 0},
|
||||||
|
{ XK_KP_Home, ShiftMask, "\033[149;2u", 0, 0},
|
||||||
|
{ XK_KP_Up, XK_NO_MOD, "\033Ox", +1, 0},
|
||||||
|
{ XK_KP_Up, XK_NO_MOD, "\033[A", 0, -1},
|
||||||
|
{ XK_KP_Up, XK_NO_MOD, "\033OA", 0, +1},
|
||||||
|
{ XK_KP_Up, ControlMask, "\033[151;5u", 0, 0},
|
||||||
|
{ XK_KP_Up, ControlMask|ShiftMask, "\033[151;6u", 0, 0},
|
||||||
|
{ XK_KP_Up, Mod1Mask, "\033[151;3u", 0, 0},
|
||||||
|
{ XK_KP_Up, Mod1Mask|ControlMask, "\033[151;7u", 0, 0},
|
||||||
|
{ XK_KP_Up, Mod1Mask|ControlMask|ShiftMask, "\033[151;8u", 0, 0},
|
||||||
|
{ XK_KP_Up, Mod1Mask|ShiftMask, "\033[151;4u", 0, 0},
|
||||||
|
{ XK_KP_Up, ShiftMask, "\033[151;2u", 0, 0},
|
||||||
|
{ XK_KP_Down, XK_NO_MOD, "\033Or", +1, 0},
|
||||||
|
{ XK_KP_Down, XK_NO_MOD, "\033[B", 0, -1},
|
||||||
|
{ XK_KP_Down, XK_NO_MOD, "\033OB", 0, +1},
|
||||||
|
{ XK_KP_Down, ControlMask, "\033[153;5u", 0, 0},
|
||||||
|
{ XK_KP_Down, ControlMask|ShiftMask, "\033[153;6u", 0, 0},
|
||||||
|
{ XK_KP_Down, Mod1Mask, "\033[153;3u", 0, 0},
|
||||||
|
{ XK_KP_Down, Mod1Mask|ControlMask, "\033[153;7u", 0, 0},
|
||||||
|
{ XK_KP_Down, Mod1Mask|ControlMask|ShiftMask, "\033[153;8u", 0, 0},
|
||||||
|
{ XK_KP_Down, Mod1Mask|ShiftMask, "\033[153;4u", 0, 0},
|
||||||
|
{ XK_KP_Down, ShiftMask, "\033[153;2u", 0, 0},
|
||||||
|
{ XK_KP_Left, XK_NO_MOD, "\033Ot", +1, 0},
|
||||||
|
{ XK_KP_Left, XK_NO_MOD, "\033[D", 0, -1},
|
||||||
|
{ XK_KP_Left, XK_NO_MOD, "\033OD", 0, +1},
|
||||||
|
{ XK_KP_Left, ControlMask, "\033[150;5u", 0, 0},
|
||||||
|
{ XK_KP_Left, ControlMask|ShiftMask, "\033[150;6u", 0, 0},
|
||||||
|
{ XK_KP_Left, Mod1Mask, "\033[150;3u", 0, 0},
|
||||||
|
{ XK_KP_Left, Mod1Mask|ControlMask, "\033[150;7u", 0, 0},
|
||||||
|
{ XK_KP_Left, Mod1Mask|ControlMask|ShiftMask, "\033[150;8u", 0, 0},
|
||||||
|
{ XK_KP_Left, Mod1Mask|ShiftMask, "\033[150;4u", 0, 0},
|
||||||
|
{ XK_KP_Left, ShiftMask, "\033[150;2u", 0, 0},
|
||||||
|
{ XK_KP_Right, XK_NO_MOD, "\033Ov", +1, 0},
|
||||||
|
{ XK_KP_Right, XK_NO_MOD, "\033[C", 0, -1},
|
||||||
|
{ XK_KP_Right, XK_NO_MOD, "\033OC", 0, +1},
|
||||||
|
{ XK_KP_Right, ControlMask, "\033[152;5u", 0, 0},
|
||||||
|
{ XK_KP_Right, ControlMask|ShiftMask, "\033[152;6u", 0, 0},
|
||||||
|
{ XK_KP_Right, Mod1Mask, "\033[152;3u", 0, 0},
|
||||||
|
{ XK_KP_Right, Mod1Mask|ControlMask, "\033[152;7u", 0, 0},
|
||||||
|
{ XK_KP_Right, Mod1Mask|ControlMask|ShiftMask, "\033[152;8u", 0, 0},
|
||||||
|
{ XK_KP_Right, Mod1Mask|ShiftMask, "\033[152;4u", 0, 0},
|
||||||
|
{ XK_KP_Right, ShiftMask, "\033[152;2u", 0, 0},
|
||||||
|
{ XK_KP_Prior, XK_NO_MOD, "\033[5~", 0, 0},
|
||||||
|
{ XK_KP_Prior, ControlMask, "\033[154;5u", 0, 0},
|
||||||
|
{ XK_KP_Prior, ControlMask|ShiftMask, "\033[154;6u", 0, 0},
|
||||||
|
{ XK_KP_Prior, Mod1Mask, "\033[154;3u", 0, 0},
|
||||||
|
{ XK_KP_Prior, Mod1Mask|ControlMask, "\033[154;7u", 0, 0},
|
||||||
|
{ XK_KP_Prior, Mod1Mask|ControlMask|ShiftMask, "\033[154;8u", 0, 0},
|
||||||
|
{ XK_KP_Prior, Mod1Mask|ShiftMask, "\033[154;4u", 0, 0},
|
||||||
|
{ XK_KP_Begin, XK_NO_MOD, "\033[E", 0, 0},
|
||||||
|
{ XK_KP_Begin, ControlMask, "\033[157;5u", 0, 0},
|
||||||
|
{ XK_KP_Begin, ControlMask|ShiftMask, "\033[157;6u", 0, 0},
|
||||||
|
{ XK_KP_Begin, Mod1Mask, "\033[157;3u", 0, 0},
|
||||||
|
{ XK_KP_Begin, Mod1Mask|ControlMask, "\033[157;7u", 0, 0},
|
||||||
|
{ XK_KP_Begin, Mod1Mask|ControlMask|ShiftMask, "\033[157;8u", 0, 0},
|
||||||
|
{ XK_KP_Begin, Mod1Mask|ShiftMask, "\033[157;4u", 0, 0},
|
||||||
|
{ XK_KP_Begin, ShiftMask, "\033[157;2u", 0, 0},
|
||||||
|
{ XK_KP_End, XK_NO_MOD, "\033[4~", 0, 0},
|
||||||
|
{ XK_KP_End, ControlMask|ShiftMask, "\033[156;6u", 0, 0},
|
||||||
|
{ XK_KP_End, Mod1Mask, "\033[156;3u", 0, 0},
|
||||||
|
{ XK_KP_End, Mod1Mask|ControlMask, "\033[156;7u", 0, 0},
|
||||||
|
{ XK_KP_End, Mod1Mask|ControlMask|ShiftMask, "\033[156;8u", 0, 0},
|
||||||
|
{ XK_KP_End, Mod1Mask|ShiftMask, "\033[156;4u", 0, 0},
|
||||||
|
{ XK_KP_Next, XK_NO_MOD, "\033[6~", 0, 0},
|
||||||
|
{ XK_KP_Next, ControlMask, "\033[155;5u", 0, 0},
|
||||||
|
{ XK_KP_Next, ControlMask|ShiftMask, "\033[155;6u", 0, 0},
|
||||||
|
{ XK_KP_Next, Mod1Mask, "\033[155;3u", 0, 0},
|
||||||
|
{ XK_KP_Next, Mod1Mask|ControlMask, "\033[155;7u", 0, 0},
|
||||||
|
{ XK_KP_Next, Mod1Mask|ControlMask|ShiftMask, "\033[155;8u", 0, 0},
|
||||||
|
{ XK_KP_Next, Mod1Mask|ShiftMask, "\033[155;4u", 0, 0},
|
||||||
|
{ XK_KP_Insert, XK_NO_MOD, "\033[4h", -1, 0},
|
||||||
|
{ XK_KP_Insert, XK_NO_MOD, "\033[2~", +1, 0},
|
||||||
|
{ XK_KP_Insert, ControlMask|ShiftMask, "\033[158;6u", 0, 0},
|
||||||
|
{ XK_KP_Insert, Mod1Mask, "\033[158;3u", 0, 0},
|
||||||
|
{ XK_KP_Insert, Mod1Mask|ControlMask, "\033[158;7u", 0, 0},
|
||||||
|
{ XK_KP_Insert, Mod1Mask|ControlMask|ShiftMask, "\033[158;8u", 0, 0},
|
||||||
|
{ XK_KP_Insert, Mod1Mask|ShiftMask, "\033[158;4u", 0, 0},
|
||||||
|
{ XK_KP_Delete, XK_NO_MOD, "\033[P", -1, 0},
|
||||||
|
{ XK_KP_Delete, XK_NO_MOD, "\033[3~", +1, 0},
|
||||||
|
{ XK_KP_Delete, ControlMask|ShiftMask, "\033[159;6u", 0, 0},
|
||||||
|
{ XK_KP_Delete, Mod1Mask, "\033[159;3u", 0, 0},
|
||||||
|
{ XK_KP_Delete, Mod1Mask|ControlMask, "\033[159;7u", 0, 0},
|
||||||
|
{ XK_KP_Delete, Mod1Mask|ControlMask|ShiftMask, "\033[159;8u", 0, 0},
|
||||||
|
{ XK_KP_Delete, Mod1Mask|ShiftMask, "\033[159;4u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, XK_NO_MOD, "\033Oj", +2, 0},
|
||||||
|
{ XK_KP_Multiply, ControlMask, "\033[170;5u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, ControlMask|ShiftMask, "\033[170;6u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, Mod1Mask, "\033[170;3u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, Mod1Mask|ControlMask, "\033[170;7u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, Mod1Mask|ControlMask|ShiftMask, "\033[170;8u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, Mod1Mask|ShiftMask, "\033[170;4u", 0, 0},
|
||||||
|
{ XK_KP_Multiply, ShiftMask, "\033[170;2u", 0, 0},
|
||||||
|
{ XK_KP_Add, XK_NO_MOD, "\033Ok", +2, 0},
|
||||||
|
{ XK_KP_Add, ControlMask, "\033[171;5u", 0, 0},
|
||||||
|
{ XK_KP_Add, ControlMask|ShiftMask, "\033[171;6u", 0, 0},
|
||||||
|
{ XK_KP_Add, Mod1Mask, "\033[171;3u", 0, 0},
|
||||||
|
{ XK_KP_Add, Mod1Mask|ControlMask, "\033[171;7u", 0, 0},
|
||||||
|
{ XK_KP_Add, Mod1Mask|ControlMask|ShiftMask, "\033[171;8u", 0, 0},
|
||||||
|
{ XK_KP_Add, Mod1Mask|ShiftMask, "\033[171;4u", 0, 0},
|
||||||
|
{ XK_KP_Add, ShiftMask, "\033[171;2u", 0, 0},
|
||||||
|
{ XK_KP_Enter, XK_NO_MOD, "\033OM", +2, 0},
|
||||||
|
{ XK_KP_Enter, XK_NO_MOD, "\r", -1, 0},
|
||||||
|
{ XK_KP_Enter, XK_NO_MOD, "\r\n", -1, 0},
|
||||||
|
{ XK_KP_Enter, ControlMask, "\033[141;5u", 0, 0},
|
||||||
|
{ XK_KP_Enter, ControlMask|ShiftMask, "\033[141;6u", 0, 0},
|
||||||
|
{ XK_KP_Enter, Mod1Mask, "\033[141;3u", 0, 0},
|
||||||
|
{ XK_KP_Enter, Mod1Mask|ControlMask, "\033[141;7u", 0, 0},
|
||||||
|
{ XK_KP_Enter, Mod1Mask|ControlMask|ShiftMask, "\033[141;8u", 0, 0},
|
||||||
|
{ XK_KP_Enter, Mod1Mask|ShiftMask, "\033[141;4u", 0, 0},
|
||||||
|
{ XK_KP_Enter, ShiftMask, "\033[141;2u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, XK_NO_MOD, "\033Om", +2, 0},
|
||||||
|
{ XK_KP_Subtract, ControlMask, "\033[173;5u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, ControlMask|ShiftMask, "\033[173;6u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, Mod1Mask, "\033[173;3u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, Mod1Mask|ControlMask, "\033[173;7u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, Mod1Mask|ControlMask|ShiftMask, "\033[173;8u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, Mod1Mask|ShiftMask, "\033[173;4u", 0, 0},
|
||||||
|
{ XK_KP_Subtract, ShiftMask, "\033[173;2u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, XK_NO_MOD, "\033On", +2, 0},
|
||||||
|
{ XK_KP_Decimal, ControlMask, "\033[174;5u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, ControlMask|ShiftMask, "\033[174;6u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, Mod1Mask, "\033[174;3u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, Mod1Mask|ControlMask, "\033[174;7u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, Mod1Mask|ControlMask|ShiftMask, "\033[174;8u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, Mod1Mask|ShiftMask, "\033[174;4u", 0, 0},
|
||||||
|
{ XK_KP_Decimal, ShiftMask, "\033[174;2u", 0, 0},
|
||||||
|
{ XK_KP_Divide, XK_NO_MOD, "\033Oo", +2, 0},
|
||||||
|
{ XK_KP_Divide, ControlMask, "\033[175;5u", 0, 0},
|
||||||
|
{ XK_KP_Divide, ControlMask|ShiftMask, "\033[175;6u", 0, 0},
|
||||||
|
{ XK_KP_Divide, Mod1Mask, "\033[175;3u", 0, 0},
|
||||||
|
{ XK_KP_Divide, Mod1Mask|ControlMask, "\033[175;7u", 0, 0},
|
||||||
|
{ XK_KP_Divide, Mod1Mask|ControlMask|ShiftMask, "\033[175;8u", 0, 0},
|
||||||
|
{ XK_KP_Divide, Mod1Mask|ShiftMask, "\033[175;4u", 0, 0},
|
||||||
|
{ XK_KP_Divide, ShiftMask, "\033[175;2u", 0, 0},
|
||||||
|
{ XK_KP_0, XK_NO_MOD, "\033Op", +2, 0},
|
||||||
|
{ XK_KP_0, ControlMask, "\033[176;5u", 0, 0},
|
||||||
|
{ XK_KP_0, ControlMask|ShiftMask, "\033[176;6u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask, "\033[176;3u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ControlMask, "\033[176;7u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ControlMask|ShiftMask, "\033[176;8u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ShiftMask, "\033[176;4u", 0, 0},
|
||||||
|
{ XK_KP_0, ShiftMask, "\033[176;2u", 0, 0},
|
||||||
|
{ XK_KP_1, XK_NO_MOD, "\033Oq", +2, 0},
|
||||||
|
{ XK_KP_0, ControlMask, "\033[177;5u", 0, 0},
|
||||||
|
{ XK_KP_0, ControlMask|ShiftMask, "\033[177;6u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask, "\033[177;3u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ControlMask, "\033[177;7u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ControlMask|ShiftMask, "\033[177;8u", 0, 0},
|
||||||
|
{ XK_KP_0, Mod1Mask|ShiftMask, "\033[177;4u", 0, 0},
|
||||||
|
{ XK_KP_0, ShiftMask, "\033[177;2u", 0, 0},
|
||||||
|
{ XK_KP_2, XK_NO_MOD, "\033Or", +2, 0},
|
||||||
|
{ XK_KP_2, ControlMask, "\033[178;5u", 0, 0},
|
||||||
|
{ XK_KP_2, ControlMask|ShiftMask, "\033[178;6u", 0, 0},
|
||||||
|
{ XK_KP_2, Mod1Mask, "\033[178;3u", 0, 0},
|
||||||
|
{ XK_KP_2, Mod1Mask|ControlMask, "\033[178;7u", 0, 0},
|
||||||
|
{ XK_KP_2, Mod1Mask|ControlMask|ShiftMask, "\033[178;8u", 0, 0},
|
||||||
|
{ XK_KP_2, Mod1Mask|ShiftMask, "\033[178;4u", 0, 0},
|
||||||
|
{ XK_KP_2, ShiftMask, "\033[178;2u", 0, 0},
|
||||||
|
{ XK_KP_3, XK_NO_MOD, "\033Os", +2, 0},
|
||||||
|
{ XK_KP_3, ControlMask, "\033[179;5u", 0, 0},
|
||||||
|
{ XK_KP_3, ControlMask|ShiftMask, "\033[179;6u", 0, 0},
|
||||||
|
{ XK_KP_3, Mod1Mask, "\033[179;3u", 0, 0},
|
||||||
|
{ XK_KP_3, Mod1Mask|ControlMask, "\033[179;7u", 0, 0},
|
||||||
|
{ XK_KP_3, Mod1Mask|ControlMask|ShiftMask, "\033[179;8u", 0, 0},
|
||||||
|
{ XK_KP_3, Mod1Mask|ShiftMask, "\033[179;4u", 0, 0},
|
||||||
|
{ XK_KP_3, ShiftMask, "\033[179;2u", 0, 0},
|
||||||
|
{ XK_KP_4, XK_NO_MOD, "\033Ot", +2, 0},
|
||||||
|
{ XK_KP_4, ControlMask, "\033[180;5u", 0, 0},
|
||||||
|
{ XK_KP_4, ControlMask|ShiftMask, "\033[180;6u", 0, 0},
|
||||||
|
{ XK_KP_4, Mod1Mask, "\033[180;3u", 0, 0},
|
||||||
|
{ XK_KP_4, Mod1Mask|ControlMask, "\033[180;7u", 0, 0},
|
||||||
|
{ XK_KP_4, Mod1Mask|ControlMask|ShiftMask, "\033[180;8u", 0, 0},
|
||||||
|
{ XK_KP_4, Mod1Mask|ShiftMask, "\033[180;4u", 0, 0},
|
||||||
|
{ XK_KP_4, ShiftMask, "\033[180;2u", 0, 0},
|
||||||
|
{ XK_KP_5, XK_NO_MOD, "\033Ou", +2, 0},
|
||||||
|
{ XK_KP_5, ControlMask, "\033[181;5u", 0, 0},
|
||||||
|
{ XK_KP_5, ControlMask|ShiftMask, "\033[181;6u", 0, 0},
|
||||||
|
{ XK_KP_5, Mod1Mask, "\033[181;3u", 0, 0},
|
||||||
|
{ XK_KP_5, Mod1Mask|ControlMask, "\033[181;7u", 0, 0},
|
||||||
|
{ XK_KP_5, Mod1Mask|ControlMask|ShiftMask, "\033[181;8u", 0, 0},
|
||||||
|
{ XK_KP_5, Mod1Mask|ShiftMask, "\033[181;4u", 0, 0},
|
||||||
|
{ XK_KP_5, ShiftMask, "\033[181;2u", 0, 0},
|
||||||
|
{ XK_KP_6, XK_NO_MOD, "\033Ov", +2, 0},
|
||||||
|
{ XK_KP_6, ControlMask, "\033[182;5u", 0, 0},
|
||||||
|
{ XK_KP_6, ControlMask|ShiftMask, "\033[182;6u", 0, 0},
|
||||||
|
{ XK_KP_6, Mod1Mask, "\033[182;3u", 0, 0},
|
||||||
|
{ XK_KP_6, Mod1Mask|ControlMask, "\033[182;7u", 0, 0},
|
||||||
|
{ XK_KP_6, Mod1Mask|ControlMask|ShiftMask, "\033[182;8u", 0, 0},
|
||||||
|
{ XK_KP_6, Mod1Mask|ShiftMask, "\033[182;4u", 0, 0},
|
||||||
|
{ XK_KP_6, ShiftMask, "\033[182;2u", 0, 0},
|
||||||
|
{ XK_KP_7, XK_NO_MOD, "\033Ow", +2, 0},
|
||||||
|
{ XK_KP_7, ControlMask, "\033[183;5u", 0, 0},
|
||||||
|
{ XK_KP_7, ControlMask|ShiftMask, "\033[183;6u", 0, 0},
|
||||||
|
{ XK_KP_7, Mod1Mask, "\033[183;3u", 0, 0},
|
||||||
|
{ XK_KP_7, Mod1Mask|ControlMask, "\033[183;7u", 0, 0},
|
||||||
|
{ XK_KP_7, Mod1Mask|ControlMask|ShiftMask, "\033[183;8u", 0, 0},
|
||||||
|
{ XK_KP_7, Mod1Mask|ShiftMask, "\033[183;4u", 0, 0},
|
||||||
|
{ XK_KP_7, ShiftMask, "\033[183;2u", 0, 0},
|
||||||
|
{ XK_KP_8, XK_NO_MOD, "\033Ox", +2, 0},
|
||||||
|
{ XK_KP_8, ControlMask, "\033[184;5u", 0, 0},
|
||||||
|
{ XK_KP_8, ControlMask|ShiftMask, "\033[184;6u", 0, 0},
|
||||||
|
{ XK_KP_8, Mod1Mask, "\033[184;3u", 0, 0},
|
||||||
|
{ XK_KP_8, Mod1Mask|ControlMask, "\033[184;7u", 0, 0},
|
||||||
|
{ XK_KP_8, Mod1Mask|ControlMask|ShiftMask, "\033[184;8u", 0, 0},
|
||||||
|
{ XK_KP_8, Mod1Mask|ShiftMask, "\033[184;4u", 0, 0},
|
||||||
|
{ XK_KP_8, ShiftMask, "\033[184;2u", 0, 0},
|
||||||
|
{ XK_KP_9, XK_NO_MOD, "\033Oy", +2, 0},
|
||||||
|
{ XK_KP_9, ControlMask, "\033[185;5u", 0, 0},
|
||||||
|
{ XK_KP_9, ControlMask|ShiftMask, "\033[185;6u", 0, 0},
|
||||||
|
{ XK_KP_9, Mod1Mask, "\033[185;3u", 0, 0},
|
||||||
|
{ XK_KP_9, Mod1Mask|ControlMask, "\033[185;7u", 0, 0},
|
||||||
|
{ XK_KP_9, Mod1Mask|ControlMask|ShiftMask, "\033[185;8u", 0, 0},
|
||||||
|
{ XK_KP_9, Mod1Mask|ShiftMask, "\033[185;4u", 0, 0},
|
||||||
|
{ XK_KP_9, ShiftMask, "\033[185;2u", 0, 0},
|
||||||
|
{ XK_BackSpace, ControlMask, "\033[127;5u", 0, 0},
|
||||||
|
{ XK_BackSpace, ControlMask|ShiftMask, "\033[127;6u", 0, 0},
|
||||||
|
{ XK_BackSpace, Mod1Mask, "\033[127;3u", 0, 0},
|
||||||
|
{ XK_BackSpace, Mod1Mask|ControlMask, "\033[127;7u", 0, 0},
|
||||||
|
{ XK_BackSpace, Mod1Mask|ControlMask|ShiftMask, "\033[127;8u", 0, 0},
|
||||||
|
{ XK_BackSpace, Mod1Mask|ShiftMask, "\033[127;4u", 0, 0},
|
||||||
|
{ XK_BackSpace, ShiftMask, "\033[127;2u", 0, 0},
|
||||||
|
{ XK_Tab, ControlMask, "\033[9;5u", 0, 0},
|
||||||
|
{ XK_Tab, ControlMask|ShiftMask, "\033[1;5Z", 0, 0},
|
||||||
|
{ XK_Tab, Mod1Mask, "\033[1;3Z", 0, 0},
|
||||||
|
{ XK_Tab, Mod1Mask|ControlMask, "\033[1;7Z", 0, 0},
|
||||||
|
{ XK_Tab, Mod1Mask|ControlMask|ShiftMask, "\033[1;8Z", 0, 0},
|
||||||
|
{ XK_Tab, Mod1Mask|ShiftMask, "\033[1;4Z", 0, 0},
|
||||||
|
{ XK_Return, ControlMask, "\033[13;5u", 0, 0},
|
||||||
|
{ XK_Return, ControlMask|ShiftMask, "\033[13;6u", 0, 0},
|
||||||
|
{ XK_Return, Mod1Mask, "\033[13;3u", 0, 0},
|
||||||
|
{ XK_Return, Mod1Mask|ControlMask, "\033[13;7u", 0, 0},
|
||||||
|
{ XK_Return, Mod1Mask|ControlMask|ShiftMask, "\033[13;8u", 0, 0},
|
||||||
|
{ XK_Return, Mod1Mask|ShiftMask, "\033[13;4u", 0, 0},
|
||||||
|
{ XK_Return, ShiftMask, "\033[13;2u", 0, 0},
|
||||||
|
{ XK_Pause, ControlMask, "\033[18;5u", 0, 0},
|
||||||
|
{ XK_Pause, ControlMask|ShiftMask, "\033[18;6u", 0, 0},
|
||||||
|
{ XK_Pause, Mod1Mask, "\033[18;3u", 0, 0},
|
||||||
|
{ XK_Pause, Mod1Mask|ControlMask, "\033[18;7u", 0, 0},
|
||||||
|
{ XK_Pause, Mod1Mask|ControlMask|ShiftMask, "\033[18;8u", 0, 0},
|
||||||
|
{ XK_Pause, Mod1Mask|ShiftMask, "\033[18;4u", 0, 0},
|
||||||
|
{ XK_Pause, ShiftMask, "\033[18;2u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, ControlMask, "\033[20;5u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, ControlMask|ShiftMask, "\033[20;6u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, Mod1Mask, "\033[20;3u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, Mod1Mask|ControlMask, "\033[20;7u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, Mod1Mask|ControlMask|ShiftMask, "\033[20;8u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, Mod1Mask|ShiftMask, "\033[20;4u", 0, 0},
|
||||||
|
{ XK_Scroll_Lock, ShiftMask, "\033[20;2u", 0, 0},
|
||||||
|
{ XK_Escape, ControlMask, "\033[27;5u", 0, 0},
|
||||||
|
{ XK_Escape, ControlMask|ShiftMask, "\033[27;6u", 0, 0},
|
||||||
|
{ XK_Escape, Mod1Mask, "\033[27;3u", 0, 0},
|
||||||
|
{ XK_Escape, Mod1Mask|ControlMask, "\033[27;7u", 0, 0},
|
||||||
|
{ XK_Escape, Mod1Mask|ControlMask|ShiftMask, "\033[27;8u", 0, 0},
|
||||||
|
{ XK_Escape, Mod1Mask|ShiftMask, "\033[27;4u", 0, 0},
|
||||||
|
{ XK_Escape, ShiftMask, "\033[27;2u", 0, 0},
|
||||||
|
{ XK_Home, XK_NO_MOD, "\033[H", 0, -1},
|
||||||
|
{ XK_Home, XK_NO_MOD, "\033[1~", 0, +1},
|
||||||
|
{ XK_Home, ControlMask|ShiftMask, "\033[80;6u", 0, 0},
|
||||||
|
{ XK_Home, Mod1Mask, "\033[80;3u", 0, 0},
|
||||||
|
{ XK_Home, Mod1Mask|ControlMask, "\033[80;7u", 0, 0},
|
||||||
|
{ XK_Home, Mod1Mask|ControlMask|ShiftMask, "\033[80;8u", 0, 0},
|
||||||
|
{ XK_Home, Mod1Mask|ShiftMask, "\033[80;4u", 0, 0},
|
||||||
|
{ XK_End, XK_NO_MOD, "\033[4~", 0, 0},
|
||||||
|
{ XK_End, ControlMask|ShiftMask, "\033[87;6u", 0, 0},
|
||||||
|
{ XK_End, Mod1Mask, "\033[87;3u", 0, 0},
|
||||||
|
{ XK_End, Mod1Mask|ControlMask, "\033[87;7u", 0, 0},
|
||||||
|
{ XK_End, Mod1Mask|ControlMask|ShiftMask, "\033[87;8u", 0, 0},
|
||||||
|
{ XK_End, Mod1Mask|ShiftMask, "\033[87;4u", 0, 0},
|
||||||
|
{ XK_Prior, XK_NO_MOD, "\033[5~", 0, 0},
|
||||||
|
{ XK_Prior, ControlMask|ShiftMask, "\033[85;6u", 0, 0},
|
||||||
|
{ XK_Prior, Mod1Mask, "\033[85;3u", 0, 0},
|
||||||
|
{ XK_Prior, Mod1Mask|ControlMask, "\033[85;7u", 0, 0},
|
||||||
|
{ XK_Prior, Mod1Mask|ControlMask|ShiftMask, "\033[85;8u", 0, 0},
|
||||||
|
{ XK_Prior, Mod1Mask|ShiftMask, "\033[85;4u", 0, 0},
|
||||||
|
{ XK_Next, XK_NO_MOD, "\033[6~", 0, 0},
|
||||||
|
{ XK_Next, ControlMask|ShiftMask, "\033[86;6u", 0, 0},
|
||||||
|
{ XK_Next, Mod1Mask, "\033[86;3u", 0, 0},
|
||||||
|
{ XK_Next, Mod1Mask|ControlMask, "\033[86;7u", 0, 0},
|
||||||
|
{ XK_Next, Mod1Mask|ControlMask|ShiftMask, "\033[86;8u", 0, 0},
|
||||||
|
{ XK_Next, Mod1Mask|ShiftMask, "\033[86;4u", 0, 0},
|
||||||
|
{ XK_Print, ControlMask, "\033[97;5u", 0, 0},
|
||||||
|
{ XK_Print, ControlMask|ShiftMask, "\033[97;6u", 0, 0},
|
||||||
|
{ XK_Print, Mod1Mask, "\033[97;3u", 0, 0},
|
||||||
|
{ XK_Print, Mod1Mask|ControlMask, "\033[97;7u", 0, 0},
|
||||||
|
{ XK_Print, Mod1Mask|ControlMask|ShiftMask, "\033[97;8u", 0, 0},
|
||||||
|
{ XK_Print, Mod1Mask|ShiftMask, "\033[97;4u", 0, 0},
|
||||||
|
{ XK_Print, ShiftMask, "\033[97;2u", 0, 0},
|
||||||
|
{ XK_Insert, XK_NO_MOD, "\033[4h", -1, 0},
|
||||||
|
{ XK_Insert, XK_NO_MOD, "\033[2~", +1, 0},
|
||||||
|
{ XK_Insert, ControlMask|ShiftMask, "\033[99;6u", 0, 0},
|
||||||
|
{ XK_Insert, Mod1Mask, "\033[99;3u", 0, 0},
|
||||||
|
{ XK_Insert, Mod1Mask|ControlMask, "\033[99;7u", 0, 0},
|
||||||
|
{ XK_Insert, Mod1Mask|ControlMask|ShiftMask, "\033[99;8u", 0, 0},
|
||||||
|
{ XK_Insert, Mod1Mask|ShiftMask, "\033[99;4u", 0, 0},
|
||||||
|
{ XK_Menu, ControlMask, "\033[103;5u", 0, 0},
|
||||||
|
{ XK_Menu, ControlMask|ShiftMask, "\033[103;6u", 0, 0},
|
||||||
|
{ XK_Menu, Mod1Mask, "\033[103;3u", 0, 0},
|
||||||
|
{ XK_Menu, Mod1Mask|ControlMask, "\033[103;7u", 0, 0},
|
||||||
|
{ XK_Menu, Mod1Mask|ControlMask|ShiftMask, "\033[103;8u", 0, 0},
|
||||||
|
{ XK_Menu, Mod1Mask|ShiftMask, "\033[103;4u", 0, 0},
|
||||||
|
{ XK_Menu, ShiftMask, "\033[103;2u", 0, 0},
|
||||||
|
{ XK_Delete, XK_NO_MOD, "\033[P", -1, 0},
|
||||||
|
{ XK_Delete, XK_NO_MOD, "\033[3~", +1, 0},
|
||||||
|
{ XK_Delete, ControlMask|ShiftMask, "\033[255;6u", 0, 0},
|
||||||
|
{ XK_Delete, Mod1Mask, "\033[255;3u", 0, 0},
|
||||||
|
{ XK_Delete, Mod1Mask|ControlMask, "\033[255;7u", 0, 0},
|
||||||
|
{ XK_Delete, Mod1Mask|ControlMask|ShiftMask, "\033[255;8u", 0, 0},
|
||||||
|
{ XK_Delete, Mod1Mask|ShiftMask, "\033[255;4u", 0, 0},
|
||||||
|
{ XK_i, ControlMask, "\033[105;5u", 0, 0},
|
||||||
|
{ XK_i, Mod1Mask|ControlMask, "\033[105;7u", 0, 0},
|
||||||
|
{ XK_m, ControlMask, "\033[109;5u", 0, 0},
|
||||||
|
{ XK_m, Mod1Mask|ControlMask, "\033[109;7u", 0, 0},
|
||||||
|
{ XK_space, ControlMask|ShiftMask, "\033[32;6u", 0, 0},
|
||||||
|
{ XK_space, Mod1Mask, "\033[32;3u", 0, 0},
|
||||||
|
{ XK_space, Mod1Mask|ControlMask, "\033[32;7u", 0, 0},
|
||||||
|
{ XK_space, Mod1Mask|ControlMask|ShiftMask, "\033[32;8u", 0, 0},
|
||||||
|
{ XK_space, Mod1Mask|ShiftMask, "\033[32;4u", 0, 0},
|
||||||
|
{ XK_space, ShiftMask, "\033[32;2u", 0, 0},
|
||||||
|
{ XK_0, ControlMask, "\033[48;5u", 0, 0},
|
||||||
|
{ XK_A, ControlMask|ShiftMask, "\033[65;6u", 0, 0},
|
||||||
|
{ XK_B, ControlMask|ShiftMask, "\033[66;6u", 0, 0},
|
||||||
|
{ XK_C, ControlMask|ShiftMask, "\033[67;6u", 0, 0},
|
||||||
|
{ XK_D, ControlMask|ShiftMask, "\033[68;6u", 0, 0},
|
||||||
|
{ XK_E, ControlMask|ShiftMask, "\033[69;6u", 0, 0},
|
||||||
|
{ XK_F, ControlMask|ShiftMask, "\033[70;6u", 0, 0},
|
||||||
|
{ XK_G, ControlMask|ShiftMask, "\033[71;6u", 0, 0},
|
||||||
|
{ XK_H, ControlMask|ShiftMask, "\033[72;6u", 0, 0},
|
||||||
|
{ XK_I, ControlMask|ShiftMask, "\033[73;6u", 0, 0},
|
||||||
|
{ XK_I, Mod1Mask|ControlMask|ShiftMask, "\033[73;8u", 0, 0},
|
||||||
|
{ XK_J, ControlMask|ShiftMask, "\033[75;6u", 0, 0},
|
||||||
|
{ XK_K, ControlMask|ShiftMask, "\033[74;6u", 0, 0},
|
||||||
|
{ XK_L, ControlMask|ShiftMask, "\033[76;6u", 0, 0},
|
||||||
|
{ XK_M, ControlMask|ShiftMask, "\033[77;6u", 0, 0},
|
||||||
|
{ XK_M, Mod1Mask|ControlMask|ShiftMask, "\033[77;8u", 0, 0},
|
||||||
|
{ XK_N, ControlMask|ShiftMask, "\033[78;6u", 0, 0},
|
||||||
|
{ XK_O, ControlMask|ShiftMask, "\033[79;6u", 0, 0},
|
||||||
|
{ XK_P, ControlMask|ShiftMask, "\033[80;6u", 0, 0},
|
||||||
|
{ XK_Q, ControlMask|ShiftMask, "\033[81;6u", 0, 0},
|
||||||
|
{ XK_R, ControlMask|ShiftMask, "\033[82;6u", 0, 0},
|
||||||
|
{ XK_S, ControlMask|ShiftMask, "\033[83;6u", 0, 0},
|
||||||
|
{ XK_T, ControlMask|ShiftMask, "\033[84;6u", 0, 0},
|
||||||
|
{ XK_U, ControlMask|ShiftMask, "\033[85;6u", 0, 0},
|
||||||
|
{ XK_V, ControlMask|ShiftMask, "\033[86;6u", 0, 0},
|
||||||
|
{ XK_W, ControlMask|ShiftMask, "\033[87;6u", 0, 0},
|
||||||
|
{ XK_X, ControlMask|ShiftMask, "\033[88;6u", 0, 0},
|
||||||
|
{ XK_Y, ControlMask|ShiftMask, "\033[89;6u", 0, 0},
|
||||||
|
{ XK_Z, ControlMask|ShiftMask, "\033[90;6u", 0, 0},
|
||||||
|
{ XK_Z, ControlMask|ShiftMask, "\033[90;6u", 0, 0},
|
||||||
|
{ XK_0, Mod1Mask|ControlMask, "\033[48;7u", 0, 0},
|
||||||
|
{ XK_1, ControlMask, "\033[49;5u", 0, 0},
|
||||||
|
{ XK_1, Mod1Mask|ControlMask, "\033[49;7u", 0, 0},
|
||||||
|
{ XK_2, ControlMask, "\033[50;5u", 0, 0},
|
||||||
|
{ XK_2, Mod1Mask|ControlMask, "\033[50;7u", 0, 0},
|
||||||
|
{ XK_3, ControlMask, "\033[51;5u", 0, 0},
|
||||||
|
{ XK_3, Mod1Mask|ControlMask, "\033[51;7u", 0, 0},
|
||||||
|
{ XK_4, ControlMask, "\033[52;5u", 0, 0},
|
||||||
|
{ XK_4, Mod1Mask|ControlMask, "\033[52;7u", 0, 0},
|
||||||
|
{ XK_5, ControlMask, "\033[53;5u", 0, 0},
|
||||||
|
{ XK_5, Mod1Mask|ControlMask, "\033[53;7u", 0, 0},
|
||||||
|
{ XK_6, ControlMask, "\033[54;5u", 0, 0},
|
||||||
|
{ XK_6, Mod1Mask|ControlMask, "\033[54;7u", 0, 0},
|
||||||
|
{ XK_7, ControlMask, "\033[55;5u", 0, 0},
|
||||||
|
{ XK_7, Mod1Mask|ControlMask, "\033[55;7u", 0, 0},
|
||||||
|
{ XK_8, ControlMask, "\033[56;5u", 0, 0},
|
||||||
|
{ XK_8, Mod1Mask|ControlMask, "\033[56;7u", 0, 0},
|
||||||
|
{ XK_9, ControlMask, "\033[57;5u", 0, 0},
|
||||||
|
{ XK_9, Mod1Mask|ControlMask, "\033[57;7u", 0, 0},
|
||||||
|
{ XK_ampersand, ControlMask, "\033[38;5u", 0, 0},
|
||||||
|
{ XK_ampersand, ControlMask|ShiftMask, "\033[38;6u", 0, 0},
|
||||||
|
{ XK_ampersand, Mod1Mask, "\033[38;3u", 0, 0},
|
||||||
|
{ XK_ampersand, Mod1Mask|ControlMask, "\033[38;7u", 0, 0},
|
||||||
|
{ XK_ampersand, Mod1Mask|ControlMask|ShiftMask, "\033[38;8u", 0, 0},
|
||||||
|
{ XK_ampersand, Mod1Mask|ShiftMask, "\033[38;4u", 0, 0},
|
||||||
|
{ XK_apostrophe, ControlMask, "\033[39;5u", 0, 0},
|
||||||
|
{ XK_apostrophe, ControlMask|ShiftMask, "\033[39;6u", 0, 0},
|
||||||
|
{ XK_apostrophe, Mod1Mask, "\033[39;3u", 0, 0},
|
||||||
|
{ XK_apostrophe, Mod1Mask|ControlMask, "\033[39;7u", 0, 0},
|
||||||
|
{ XK_apostrophe, Mod1Mask|ControlMask|ShiftMask, "\033[39;8u", 0, 0},
|
||||||
|
{ XK_apostrophe, Mod1Mask|ShiftMask, "\033[39;4u", 0, 0},
|
||||||
|
{ XK_asciicircum, ControlMask, "\033[94;5u", 0, 0},
|
||||||
|
{ XK_asciicircum, ControlMask|ShiftMask, "\033[94;6u", 0, 0},
|
||||||
|
{ XK_asciicircum, Mod1Mask, "\033[94;3u", 0, 0},
|
||||||
|
{ XK_asciicircum, Mod1Mask|ControlMask, "\033[94;7u", 0, 0},
|
||||||
|
{ XK_asciicircum, Mod1Mask|ControlMask|ShiftMask, "\033[94;8u", 0, 0},
|
||||||
|
{ XK_asciicircum, Mod1Mask|ShiftMask, "\033[94;4u", 0, 0},
|
||||||
|
{ XK_asciitilde, ControlMask, "\033[126;5u", 0, 0},
|
||||||
|
{ XK_asciitilde, ControlMask|ShiftMask, "\033[126;6u", 0, 0},
|
||||||
|
{ XK_asciitilde, Mod1Mask, "\033[126;3u", 0, 0},
|
||||||
|
{ XK_asciitilde, Mod1Mask|ControlMask, "\033[126;7u", 0, 0},
|
||||||
|
{ XK_asciitilde, Mod1Mask|ControlMask|ShiftMask, "\033[126;8u", 0, 0},
|
||||||
|
{ XK_asciitilde, Mod1Mask|ShiftMask, "\033[126;4u", 0, 0},
|
||||||
|
{ XK_asterisk, ControlMask, "\033[42;5u", 0, 0},
|
||||||
|
{ XK_asterisk, ControlMask|ShiftMask, "\033[42;6u", 0, 0},
|
||||||
|
{ XK_asterisk, Mod1Mask, "\033[42;3u", 0, 0},
|
||||||
|
{ XK_asterisk, Mod1Mask|ControlMask, "\033[42;7u", 0, 0},
|
||||||
|
{ XK_asterisk, Mod1Mask|ControlMask|ShiftMask, "\033[42;8u", 0, 0},
|
||||||
|
{ XK_asterisk, Mod1Mask|ShiftMask, "\033[42;4u", 0, 0},
|
||||||
|
{ XK_at, ControlMask, "\033[64;5u", 0, 0},
|
||||||
|
{ XK_at, ControlMask|ShiftMask, "\033[64;6u", 0, 0},
|
||||||
|
{ XK_at, Mod1Mask, "\033[64;3u", 0, 0},
|
||||||
|
{ XK_at, Mod1Mask|ControlMask, "\033[64;7u", 0, 0},
|
||||||
|
{ XK_at, Mod1Mask|ControlMask|ShiftMask, "\033[64;8u", 0, 0},
|
||||||
|
{ XK_at, Mod1Mask|ShiftMask, "\033[64;4u", 0, 0},
|
||||||
|
{ XK_backslash, ControlMask, "\033[92;5u", 0, 0},
|
||||||
|
{ XK_backslash, ControlMask|ShiftMask, "\033[92;6u", 0, 0},
|
||||||
|
{ XK_backslash, Mod1Mask, "\033[92;3u", 0, 0},
|
||||||
|
{ XK_backslash, Mod1Mask|ControlMask, "\033[92;7u", 0, 0},
|
||||||
|
{ XK_backslash, Mod1Mask|ControlMask|ShiftMask, "\033[92;8u", 0, 0},
|
||||||
|
{ XK_backslash, Mod1Mask|ShiftMask, "\033[92;4u", 0, 0},
|
||||||
|
{ XK_bar, ControlMask, "\033[124;5u", 0, 0},
|
||||||
|
{ XK_bar, ControlMask|ShiftMask, "\033[124;6u", 0, 0},
|
||||||
|
{ XK_bar, Mod1Mask, "\033[124;3u", 0, 0},
|
||||||
|
{ XK_bar, Mod1Mask|ControlMask, "\033[124;7u", 0, 0},
|
||||||
|
{ XK_bar, Mod1Mask|ControlMask|ShiftMask, "\033[124;8u", 0, 0},
|
||||||
|
{ XK_bar, Mod1Mask|ShiftMask, "\033[124;4u", 0, 0},
|
||||||
|
{ XK_braceleft, ControlMask, "\033[123;5u", 0, 0},
|
||||||
|
{ XK_braceleft, ControlMask|ShiftMask, "\033[123;6u", 0, 0},
|
||||||
|
{ XK_braceleft, Mod1Mask, "\033[123;3u", 0, 0},
|
||||||
|
{ XK_braceleft, Mod1Mask|ControlMask, "\033[123;7u", 0, 0},
|
||||||
|
{ XK_braceleft, Mod1Mask|ControlMask|ShiftMask, "\033[123;8u", 0, 0},
|
||||||
|
{ XK_braceleft, Mod1Mask|ShiftMask, "\033[123;4u", 0, 0},
|
||||||
|
{ XK_braceright, ControlMask, "\033[125;5u", 0, 0},
|
||||||
|
{ XK_braceright, ControlMask|ShiftMask, "\033[125;6u", 0, 0},
|
||||||
|
{ XK_braceright, Mod1Mask, "\033[125;3u", 0, 0},
|
||||||
|
{ XK_braceright, Mod1Mask|ControlMask, "\033[125;7u", 0, 0},
|
||||||
|
{ XK_braceright, Mod1Mask|ControlMask|ShiftMask, "\033[125;8u", 0, 0},
|
||||||
|
{ XK_braceright, Mod1Mask|ShiftMask, "\033[125;4u", 0, 0},
|
||||||
|
{ XK_bracketleft, ControlMask, "\033[91;5u", 0, 0},
|
||||||
|
{ XK_bracketleft, ControlMask|ShiftMask, "\033[91;6u", 0, 0},
|
||||||
|
{ XK_bracketleft, Mod1Mask, "\033[91;3u", 0, 0},
|
||||||
|
{ XK_bracketleft, Mod1Mask|ControlMask, "\033[91;7u", 0, 0},
|
||||||
|
{ XK_bracketleft, Mod1Mask|ControlMask|ShiftMask, "\033[91;8u", 0, 0},
|
||||||
|
{ XK_bracketleft, Mod1Mask|ShiftMask, "\033[91;4u", 0, 0},
|
||||||
|
{ XK_bracketright, ControlMask, "\033[93;5u", 0, 0},
|
||||||
|
{ XK_bracketright, ControlMask|ShiftMask, "\033[93;6u", 0, 0},
|
||||||
|
{ XK_bracketright, Mod1Mask, "\033[93;3u", 0, 0},
|
||||||
|
{ XK_bracketright, Mod1Mask|ControlMask, "\033[93;7u", 0, 0},
|
||||||
|
{ XK_bracketright, Mod1Mask|ControlMask|ShiftMask, "\033[93;8u", 0, 0},
|
||||||
|
{ XK_bracketright, Mod1Mask|ShiftMask, "\033[93;4u", 0, 0},
|
||||||
|
{ XK_colon, ControlMask, "\033[58;5u", 0, 0},
|
||||||
|
{ XK_colon, ControlMask|ShiftMask, "\033[58;6u", 0, 0},
|
||||||
|
{ XK_colon, Mod1Mask, "\033[58;3u", 0, 0},
|
||||||
|
{ XK_colon, Mod1Mask|ControlMask, "\033[58;7u", 0, 0},
|
||||||
|
{ XK_colon, Mod1Mask|ControlMask|ShiftMask, "\033[58;8u", 0, 0},
|
||||||
|
{ XK_colon, Mod1Mask|ShiftMask, "\033[58;4u", 0, 0},
|
||||||
|
{ XK_comma, ControlMask, "\033[44;5u", 0, 0},
|
||||||
|
{ XK_comma, ControlMask|ShiftMask, "\033[44;6u", 0, 0},
|
||||||
|
{ XK_comma, Mod1Mask, "\033[44;3u", 0, 0},
|
||||||
|
{ XK_comma, Mod1Mask|ControlMask, "\033[44;7u", 0, 0},
|
||||||
|
{ XK_comma, Mod1Mask|ControlMask|ShiftMask, "\033[44;8u", 0, 0},
|
||||||
|
{ XK_comma, Mod1Mask|ShiftMask, "\033[44;4u", 0, 0},
|
||||||
|
{ XK_dollar, ControlMask, "\033[36;5u", 0, 0},
|
||||||
|
{ XK_dollar, ControlMask|ShiftMask, "\033[36;6u", 0, 0},
|
||||||
|
{ XK_dollar, Mod1Mask, "\033[36;3u", 0, 0},
|
||||||
|
{ XK_dollar, Mod1Mask|ControlMask, "\033[36;7u", 0, 0},
|
||||||
|
{ XK_dollar, Mod1Mask|ControlMask|ShiftMask, "\033[36;8u", 0, 0},
|
||||||
|
{ XK_dollar, Mod1Mask|ShiftMask, "\033[36;4u", 0, 0},
|
||||||
|
{ XK_equal, ControlMask, "\033[61;5u", 0, 0},
|
||||||
|
{ XK_equal, ControlMask|ShiftMask, "\033[61;6u", 0, 0},
|
||||||
|
{ XK_equal, Mod1Mask, "\033[61;3u", 0, 0},
|
||||||
|
{ XK_equal, Mod1Mask|ControlMask, "\033[61;7u", 0, 0},
|
||||||
|
{ XK_equal, Mod1Mask|ControlMask|ShiftMask, "\033[61;8u", 0, 0},
|
||||||
|
{ XK_equal, Mod1Mask|ShiftMask, "\033[61;4u", 0, 0},
|
||||||
|
{ XK_exclam, ControlMask, "\033[33;5u", 0, 0},
|
||||||
|
{ XK_exclam, ControlMask|ShiftMask, "\033[33;6u", 0, 0},
|
||||||
|
{ XK_exclam, Mod1Mask, "\033[33;3u", 0, 0},
|
||||||
|
{ XK_exclam, Mod1Mask|ControlMask, "\033[33;7u", 0, 0},
|
||||||
|
{ XK_exclam, Mod1Mask|ControlMask|ShiftMask, "\033[33;8u", 0, 0},
|
||||||
|
{ XK_exclam, Mod1Mask|ShiftMask, "\033[33;4u", 0, 0},
|
||||||
|
{ XK_grave, ControlMask, "\033[96;5u", 0, 0},
|
||||||
|
{ XK_grave, ControlMask|ShiftMask, "\033[96;6u", 0, 0},
|
||||||
|
{ XK_grave, Mod1Mask, "\033[96;3u", 0, 0},
|
||||||
|
{ XK_grave, Mod1Mask|ControlMask, "\033[96;7u", 0, 0},
|
||||||
|
{ XK_grave, Mod1Mask|ControlMask|ShiftMask, "\033[96;8u", 0, 0},
|
||||||
|
{ XK_grave, Mod1Mask|ShiftMask, "\033[96;4u", 0, 0},
|
||||||
|
{ XK_greater, ControlMask, "\033[62;5u", 0, 0},
|
||||||
|
{ XK_greater, ControlMask|ShiftMask, "\033[62;6u", 0, 0},
|
||||||
|
{ XK_greater, Mod1Mask, "\033[62;3u", 0, 0},
|
||||||
|
{ XK_greater, Mod1Mask|ControlMask, "\033[62;7u", 0, 0},
|
||||||
|
{ XK_greater, Mod1Mask|ControlMask|ShiftMask, "\033[62;8u", 0, 0},
|
||||||
|
{ XK_greater, Mod1Mask|ShiftMask, "\033[62;4u", 0, 0},
|
||||||
|
{ XK_less, ControlMask, "\033[60;5u", 0, 0},
|
||||||
|
{ XK_less, ControlMask|ShiftMask, "\033[60;6u", 0, 0},
|
||||||
|
{ XK_less, Mod1Mask, "\033[60;3u", 0, 0},
|
||||||
|
{ XK_less, Mod1Mask|ControlMask, "\033[60;7u", 0, 0},
|
||||||
|
{ XK_less, Mod1Mask|ControlMask|ShiftMask, "\033[60;8u", 0, 0},
|
||||||
|
{ XK_less, Mod1Mask|ShiftMask, "\033[60;4u", 0, 0},
|
||||||
|
{ XK_minus, ControlMask, "\033[45;5u", 0, 0},
|
||||||
|
{ XK_minus, ControlMask|ShiftMask, "\033[45;6u", 0, 0},
|
||||||
|
{ XK_minus, Mod1Mask, "\033[45;3u", 0, 0},
|
||||||
|
{ XK_minus, Mod1Mask|ControlMask, "\033[45;7u", 0, 0},
|
||||||
|
{ XK_minus, Mod1Mask|ControlMask|ShiftMask, "\033[45;8u", 0, 0},
|
||||||
|
{ XK_minus, Mod1Mask|ShiftMask, "\033[45;4u", 0, 0},
|
||||||
|
{ XK_numbersign, ControlMask, "\033[35;5u", 0, 0},
|
||||||
|
{ XK_numbersign, ControlMask|ShiftMask, "\033[35;6u", 0, 0},
|
||||||
|
{ XK_numbersign, Mod1Mask, "\033[35;3u", 0, 0},
|
||||||
|
{ XK_numbersign, Mod1Mask|ControlMask, "\033[35;7u", 0, 0},
|
||||||
|
{ XK_numbersign, Mod1Mask|ControlMask|ShiftMask, "\033[35;8u", 0, 0},
|
||||||
|
{ XK_numbersign, Mod1Mask|ShiftMask, "\033[35;4u", 0, 0},
|
||||||
|
{ XK_parenleft, ControlMask, "\033[40;5u", 0, 0},
|
||||||
|
{ XK_parenleft, ControlMask|ShiftMask, "\033[40;6u", 0, 0},
|
||||||
|
{ XK_parenleft, Mod1Mask, "\033[40;3u", 0, 0},
|
||||||
|
{ XK_parenleft, Mod1Mask|ControlMask, "\033[40;7u", 0, 0},
|
||||||
|
{ XK_parenleft, Mod1Mask|ControlMask|ShiftMask, "\033[40;8u", 0, 0},
|
||||||
|
{ XK_parenleft, Mod1Mask|ShiftMask, "\033[40;4u", 0, 0},
|
||||||
|
{ XK_parenright, ControlMask, "\033[41;5u", 0, 0},
|
||||||
|
{ XK_parenright, ControlMask|ShiftMask, "\033[41;6u", 0, 0},
|
||||||
|
{ XK_parenright, Mod1Mask, "\033[41;3u", 0, 0},
|
||||||
|
{ XK_parenright, Mod1Mask|ControlMask, "\033[41;7u", 0, 0},
|
||||||
|
{ XK_parenright, Mod1Mask|ControlMask|ShiftMask, "\033[41;8u", 0, 0},
|
||||||
|
{ XK_parenright, Mod1Mask|ShiftMask, "\033[41;4u", 0, 0},
|
||||||
|
{ XK_percent, ControlMask, "\033[37;5u", 0, 0},
|
||||||
|
{ XK_percent, ControlMask|ShiftMask, "\033[37;6u", 0, 0},
|
||||||
|
{ XK_percent, Mod1Mask, "\033[37;3u", 0, 0},
|
||||||
|
{ XK_percent, Mod1Mask|ControlMask, "\033[37;7u", 0, 0},
|
||||||
|
{ XK_percent, Mod1Mask|ControlMask|ShiftMask, "\033[37;8u", 0, 0},
|
||||||
|
{ XK_percent, Mod1Mask|ShiftMask, "\033[37;4u", 0, 0},
|
||||||
|
{ XK_period, ControlMask, "\033[46;5u", 0, 0},
|
||||||
|
{ XK_period, ControlMask|ShiftMask, "\033[46;6u", 0, 0},
|
||||||
|
{ XK_period, Mod1Mask|ControlMask, "\033[46;7u", 0, 0},
|
||||||
|
{ XK_period, Mod1Mask|ControlMask|ShiftMask, "\033[46;8u", 0, 0},
|
||||||
|
{ XK_period, Mod1Mask|ShiftMask, "\033[46;4u", 0, 0},
|
||||||
|
{ XK_plus, ControlMask, "\033[43;5u", 0, 0},
|
||||||
|
{ XK_plus, ControlMask|ShiftMask, "\033[43;6u", 0, 0},
|
||||||
|
{ XK_plus, Mod1Mask, "\033[43;3u", 0, 0},
|
||||||
|
{ XK_plus, Mod1Mask|ControlMask, "\033[43;7u", 0, 0},
|
||||||
|
{ XK_plus, Mod1Mask|ControlMask|ShiftMask, "\033[43;8u", 0, 0},
|
||||||
|
{ XK_plus, Mod1Mask|ShiftMask, "\033[43;4u", 0, 0},
|
||||||
|
{ XK_question, ControlMask, "\033[63;5u", 0, 0},
|
||||||
|
{ XK_question, ControlMask|ShiftMask, "\033[63;6u", 0, 0},
|
||||||
|
{ XK_question, Mod1Mask, "\033[63;3u", 0, 0},
|
||||||
|
{ XK_question, Mod1Mask|ControlMask, "\033[63;7u", 0, 0},
|
||||||
|
{ XK_question, Mod1Mask|ControlMask|ShiftMask, "\033[63;8u", 0, 0},
|
||||||
|
{ XK_question, Mod1Mask|ShiftMask, "\033[63;4u", 0, 0},
|
||||||
|
{ XK_quotedbl, ControlMask, "\033[34;5u", 0, 0},
|
||||||
|
{ XK_quotedbl, ControlMask|ShiftMask, "\033[34;6u", 0, 0},
|
||||||
|
{ XK_quotedbl, Mod1Mask, "\033[34;3u", 0, 0},
|
||||||
|
{ XK_quotedbl, Mod1Mask|ControlMask, "\033[34;7u", 0, 0},
|
||||||
|
{ XK_quotedbl, Mod1Mask|ControlMask|ShiftMask, "\033[34;8u", 0, 0},
|
||||||
|
{ XK_quotedbl, Mod1Mask|ShiftMask, "\033[34;4u", 0, 0},
|
||||||
|
{ XK_semicolon, ControlMask, "\033[59;5u", 0, 0},
|
||||||
|
{ XK_semicolon, ControlMask|ShiftMask, "\033[59;6u", 0, 0},
|
||||||
|
{ XK_semicolon, Mod1Mask, "\033[59;3u", 0, 0},
|
||||||
|
{ XK_semicolon, Mod1Mask|ControlMask, "\033[59;7u", 0, 0},
|
||||||
|
{ XK_semicolon, Mod1Mask|ControlMask|ShiftMask, "\033[59;8u", 0, 0},
|
||||||
|
{ XK_semicolon, Mod1Mask|ShiftMask, "\033[59;4u", 0, 0},
|
||||||
|
{ XK_slash, ControlMask|ShiftMask, "\033[47;6u", 0, 0},
|
||||||
|
{ XK_slash, Mod1Mask, "\033[47;3u", 0, 0},
|
||||||
|
{ XK_slash, Mod1Mask|ControlMask, "\033[47;7u", 0, 0},
|
||||||
|
{ XK_slash, Mod1Mask|ControlMask|ShiftMask, "\033[47;8u", 0, 0},
|
||||||
|
{ XK_slash, Mod1Mask|ShiftMask, "\033[47;4u", 0, 0},
|
||||||
|
{ XK_underscore, ControlMask, "\033[95;5u", 0, 0},
|
||||||
|
{ XK_underscore, ControlMask|ShiftMask, "\033[95;6u", 0, 0},
|
||||||
|
{ XK_underscore, Mod1Mask, "\033[95;3u", 0, 0},
|
||||||
|
{ XK_underscore, Mod1Mask|ControlMask, "\033[95;7u", 0, 0},
|
||||||
|
{ XK_underscore, Mod1Mask|ControlMask|ShiftMask, "\033[95;8u", 0, 0},
|
||||||
|
{ XK_underscore, Mod1Mask|ShiftMask, "\033[95;4u", 0, 0},
|
||||||
|
};
|
686
patch/netwmicon.h
Normal file
686
patch/netwmicon.h
Normal file
|
@ -0,0 +1,686 @@
|
||||||
|
unsigned long icon[] = {
|
||||||
|
64, 64,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000, 0x03000000,
|
||||||
|
0x03000000, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x03000000,
|
||||||
|
0x20181818, 0x4e868686, 0x74b2b2b2, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6,
|
||||||
|
0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x77b6b6b6, 0x74b2b2b2,
|
||||||
|
0x4e868686, 0x20181818, 0x03000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x03000000, 0x46717171, 0xcef3f3f3, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xcdf3f3f3,
|
||||||
|
0x456f6f6f, 0x03000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x211f1f1f, 0xd1f4f4f4, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd0f3f3f3, 0x20181818,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x59959595, 0xffffffff,
|
||||||
|
0xffffffff, 0xff8b8b8b, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff8c8c8c, 0xffffffff, 0xffffffff, 0x58919191, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x83b3b3b3, 0xffffffff, 0xffffffff, 0xff262626,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff262626, 0xffffffff,
|
||||||
|
0xffffffff, 0x83b3b3b3, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff2c2c2c, 0xffe0e0e0, 0xff1c1c1c, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff202020,
|
||||||
|
0xff6c6c6c, 0xffffffff, 0xff6d6d6d, 0xff3c3c3c, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff2d2d2d, 0xffe1e1e1, 0xffc3c3c3, 0xffffffff,
|
||||||
|
0xffa1a1a1, 0xffdddddd, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff7f7f7f, 0xffbfbfbf, 0xff303030, 0xffffffff, 0xff1c1c1c, 0xff181818,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff717171, 0xffe1e1e1,
|
||||||
|
0xff545454, 0xffffffff, 0xff1c1c1c, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff1c1c1c, 0xffa1a1a1, 0xfff6f6f6, 0xffffffff,
|
||||||
|
0xffaeaeae, 0xff515151, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff343434, 0xffffffff, 0xff979797, 0xfff9f9f9,
|
||||||
|
0xff515151, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff303030, 0xffffffff, 0xff1c1c1c, 0xffb3b3b3, 0xff8d8d8d, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff686868, 0xff616161, 0xff3c3c3c, 0xffffffff,
|
||||||
|
0xff545454, 0xffe8e8e8, 0xff5b5b5b, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff4b4b4b, 0xffb3b3b3, 0xffe1e1e1, 0xffffffff, 0xffcccccc, 0xff717171,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff303030, 0xffffffff, 0xff1c1c1c, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff2b2b2b, 0xffd1d1d1,
|
||||||
|
0xff1c1c1c, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff7f7f7f, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
|
||||||
|
0xffe9e9e9, 0xffe9e9e9, 0xff444444, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff222222, 0xffffffff,
|
||||||
|
0xffffffff, 0x8eacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x8eacacac, 0xffffffff, 0xffffffff, 0xff222222, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8eacacac, 0xffffffff,
|
||||||
|
0xffffffff, 0xff222222, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff222222, 0xffffffff, 0xffffffff, 0x8eacacac, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x8aacacac, 0xffffffff, 0xffffffff, 0xff262626,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff171717,
|
||||||
|
0xff171717, 0xff171717, 0xff171717, 0xff171717, 0xff262626, 0xffffffff,
|
||||||
|
0xffffffff, 0x8aacacac, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x62858585, 0xffffffff, 0xffffffff, 0xff8c8c8c, 0xff373737, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636, 0xff363636,
|
||||||
|
0xff363636, 0xff373737, 0xff8d8d8d, 0xffffffff, 0xffffffff, 0x62828282,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x21171717, 0xdee2e2e2,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xdee1e1e1, 0x1f101010, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x03000000, 0x5f4e4e4e, 0xdbe1e1e1, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||||
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xdae1e1e1,
|
||||||
|
0x5f4b4b4b, 0x03000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x12000000, 0x48040404, 0x6d595959, 0x8d929292, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797, 0x90979797,
|
||||||
|
0x90979797, 0x8d929292, 0x6d595959, 0x48040404, 0x12000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x06000000, 0x22000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000, 0x29000000,
|
||||||
|
0x22000000, 0x06000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
};
|
118
patch/openurlonclick.c
Normal file
118
patch/openurlonclick.c
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#define TLINEURL(y) TLINE(y)
|
||||||
|
|
||||||
|
|
||||||
|
int url_x1, url_y1, url_x2, url_y2 = -1;
|
||||||
|
int url_draw, url_click, url_maxcol;
|
||||||
|
|
||||||
|
static int
|
||||||
|
isvalidurlchar(Rune u)
|
||||||
|
{
|
||||||
|
/* () and [] can appear in urls, but excluding them here will reduce false
|
||||||
|
* positives when figuring out where a given url ends. See copyurl patch.
|
||||||
|
*/
|
||||||
|
static char urlchars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789-._~:/?#@!$&'*+,;=%";
|
||||||
|
return u < 128 && strchr(urlchars, (int)u) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* find the end of the wrapped line */
|
||||||
|
static int
|
||||||
|
findeowl(int row)
|
||||||
|
{
|
||||||
|
int col = term.maxcol - 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (TLINEURL(row)[col].mode & ATTR_WRAP)
|
||||||
|
return col;
|
||||||
|
} while (TLINEURL(row)[col].u == ' ' && --col >= 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clearurl(void)
|
||||||
|
{
|
||||||
|
while (url_y1 <= url_y2 && url_y1 < term.row)
|
||||||
|
term.dirty[url_y1++] = 1;
|
||||||
|
url_y2 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
detecturl(int col, int row, int draw)
|
||||||
|
{
|
||||||
|
static char url[2048];
|
||||||
|
int x1, y1, x2, y2, wrapped;
|
||||||
|
int row_start = row;
|
||||||
|
int col_start = col;
|
||||||
|
int i = sizeof(url)/2+1, j = sizeof(url)/2;
|
||||||
|
int minrow = term.scr - term.histn, maxrow = term.scr + term.row - 1;
|
||||||
|
/* Fixme: MODE_ALTSCREEN is not defined here, I had to use the magic number 1<<2 */
|
||||||
|
if ((term.mode & (1 << 2)) != 0)
|
||||||
|
minrow = 0, maxrow = term.row - 1;
|
||||||
|
url_maxcol = 0;
|
||||||
|
|
||||||
|
/* clear previously underlined url */
|
||||||
|
if (draw)
|
||||||
|
clearurl();
|
||||||
|
|
||||||
|
if (!isvalidurlchar(TLINEURL(row)[col].u))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* find the first character of url */
|
||||||
|
do {
|
||||||
|
x1 = col_start, y1 = row_start;
|
||||||
|
url_maxcol = MAX(url_maxcol, x1);
|
||||||
|
url[--i] = TLINEURL(row_start)[col_start].u;
|
||||||
|
if (--col_start < 0) {
|
||||||
|
if (--row_start < minrow || (col_start = findeowl(row_start)) < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (i > 0 && isvalidurlchar(TLINEURL(row_start)[col_start].u));
|
||||||
|
|
||||||
|
/* early detection */
|
||||||
|
if (url[i] != 'h')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* find the last character of url */
|
||||||
|
do {
|
||||||
|
x2 = col, y2 = row;
|
||||||
|
url_maxcol = MAX(url_maxcol, x2);
|
||||||
|
url[j++] = TLINEURL(row)[col].u;
|
||||||
|
wrapped = TLINEURL(row)[col].mode & ATTR_WRAP;
|
||||||
|
if (++col >= term.maxcol || wrapped) {
|
||||||
|
col = 0;
|
||||||
|
if (++row > maxrow || !wrapped)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (j < sizeof(url)-1 && isvalidurlchar(TLINEURL(row)[col].u));
|
||||||
|
|
||||||
|
url[j] = 0;
|
||||||
|
|
||||||
|
if (strncmp("https://", &url[i], 8) && strncmp("http://", &url[i], 7))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* underline url (see xdrawglyphfontspecs() in x.c) */
|
||||||
|
if (draw) {
|
||||||
|
url_x1 = (y1 >= 0) ? x1 : 0;
|
||||||
|
url_x2 = (y2 < term.row) ? x2 : url_maxcol;
|
||||||
|
url_y1 = MAX(y1, 0);
|
||||||
|
url_y2 = MIN(y2, term.row-1);
|
||||||
|
url_draw = 1;
|
||||||
|
for (y1 = url_y1; y1 <= url_y2; y1++)
|
||||||
|
term.dirty[y1] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &url[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
openUrlOnClick(int col, int row, char* url_opener)
|
||||||
|
{
|
||||||
|
char *url = detecturl(col, row, 1);
|
||||||
|
if (url) {
|
||||||
|
extern char **environ;
|
||||||
|
pid_t junk;
|
||||||
|
char *argv[] = { url_opener, url, NULL };
|
||||||
|
posix_spawnp(&junk, argv[0], NULL, NULL, argv, environ);
|
||||||
|
}
|
||||||
|
}
|
8
patch/openurlonclick.h
Normal file
8
patch/openurlonclick.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#include <spawn.h>
|
||||||
|
|
||||||
|
static inline void restoremousecursor(void) {
|
||||||
|
if (!(win.mode & MODE_MOUSE) && xw.pointerisvisible)
|
||||||
|
XDefineCursor(xw.dpy, xw.win, xw.vpointer);
|
||||||
|
}
|
||||||
|
static void clearurl(void);
|
||||||
|
static void openUrlOnClick(int col, int row, char* url_opener);
|
45
patch/scrollback.c
Normal file
45
patch/scrollback.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
void
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
restoremousecursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kscrollup(const Arg* a)
|
||||||
|
{
|
||||||
|
int n = a->i;
|
||||||
|
if (n < 0)
|
||||||
|
n = term.row + n;
|
||||||
|
|
||||||
|
if (term.scr + n > term.histn)
|
||||||
|
n = term.histn - term.scr;
|
||||||
|
|
||||||
|
if (!n)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (term.scr <= HISTSIZE-n) {
|
||||||
|
term.scr += n;
|
||||||
|
selscroll(0, n);
|
||||||
|
tfulldirt();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
restoremousecursor();
|
||||||
|
}
|
15
patch/scrollback.h
Normal file
15
patch/scrollback.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \
|
||||||
|
term.scr + HISTSIZE + 1) % HISTSIZE] : \
|
||||||
|
term.line[(y) - term.scr])
|
||||||
|
|
||||||
|
void kscrolldown(const Arg *);
|
||||||
|
void kscrollup(const Arg *);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint b;
|
||||||
|
uint mask;
|
||||||
|
void (*func)(const Arg *);
|
||||||
|
const Arg arg;
|
||||||
|
} MouseKey;
|
||||||
|
|
||||||
|
extern MouseKey mkeys[];
|
2
patch/st_include.c
Normal file
2
patch/st_include.c
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/* Patches */
|
||||||
|
#include "scrollback.c"
|
6
patch/st_include.h
Normal file
6
patch/st_include.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/* Patches */
|
||||||
|
#include "openurlonclick.h"
|
||||||
|
#include "scrollback.h"
|
||||||
|
// #if VIM_BROWSE_PATCH
|
||||||
|
// #include "normalMode.h"
|
||||||
|
// #endif
|
5
patch/universcroll.c
Normal file
5
patch/universcroll.c
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
int
|
||||||
|
tisaltscr(void)
|
||||||
|
{
|
||||||
|
return IS_SET(MODE_ALTSCREEN);
|
||||||
|
}
|
1
patch/universcroll.h
Normal file
1
patch/universcroll.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
int tisaltscr(void);
|
23
patch/utils.h
Normal file
23
patch/utils.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/// Dynamic memory-chunk, with (1) datatype size, (2/3) initialized / allocated chunk, (4) content
|
||||||
|
typedef struct { uint8_t const elSize; uint32_t init, alloc; char* content; } DynamicArray;
|
||||||
|
#define UTF8_ARRAY {4, 0, 0, NULL}
|
||||||
|
|
||||||
|
static inline int p_alloc(DynamicArray *s, uint32_t amount) {
|
||||||
|
uint32_t const diff=s->init+s->elSize*amount-s->alloc, nas=s->alloc+max(diff,15)*s->elSize;
|
||||||
|
if (s->alloc < s->init + s->elSize * amount) {
|
||||||
|
char* tmp = realloc(s->content, nas);
|
||||||
|
if (!tmp) return 0;
|
||||||
|
s->alloc = nas, s->content = tmp;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
static inline char *view(DynamicArray * s, uint32_t i) { return s->content + i*s->elSize; }
|
||||||
|
static inline char *end(DynamicArray *s, uint32_t i) { return s->content +s->init-(i+1)*s->elSize; }
|
||||||
|
static inline uint32_t getU32(DynamicArray* s, uint32_t i, int b) { return *((uint32_t*) (b ?view(s,i) :end(s,i))); }
|
||||||
|
static char *expand(DynamicArray *s) { if (!p_alloc(s, 1)) return NULL; s->init += s->elSize; return end(s, 0); }
|
||||||
|
static inline void pop(DynamicArray* s) { s->init -= s->elSize; }
|
||||||
|
static inline void empty(DynamicArray* s) { s->init = 0; }
|
||||||
|
static inline int size(DynamicArray const * s) { return s->init / s->elSize; }
|
||||||
|
static inline void assign(DynamicArray* s, DynamicArray const *o) {
|
||||||
|
if (p_alloc(s, size(o))) memcpy(s->content, o->content, (s->init=o->init));
|
||||||
|
}
|
5
patch/x_include.c
Normal file
5
patch/x_include.c
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/* Patches */
|
||||||
|
#include "boxdraw.c"
|
||||||
|
#include "fixkeyboardinput.c"
|
||||||
|
#include "openurlonclick.c"
|
||||||
|
#include "xresources.c"
|
4
patch/x_include.h
Normal file
4
patch/x_include.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* Patches */
|
||||||
|
#include "boxdraw.h"
|
||||||
|
#include "netwmicon.h"
|
||||||
|
#include "xresources.h"
|
77
patch/xresources.c
Normal file
77
patch/xresources.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
int
|
||||||
|
resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
|
||||||
|
{
|
||||||
|
char **sdst = dst;
|
||||||
|
int *idst = dst;
|
||||||
|
float *fdst = dst;
|
||||||
|
|
||||||
|
char fullname[256];
|
||||||
|
char fullclass[256];
|
||||||
|
char *type;
|
||||||
|
XrmValue ret;
|
||||||
|
|
||||||
|
snprintf(fullname, sizeof(fullname), "%s.%s",
|
||||||
|
opt_name ? opt_name : "st", name);
|
||||||
|
snprintf(fullclass, sizeof(fullclass), "%s.%s",
|
||||||
|
opt_class ? opt_class : "St", name);
|
||||||
|
fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
|
||||||
|
|
||||||
|
XrmGetResource(db, fullname, fullclass, &type, &ret);
|
||||||
|
if (ret.addr == NULL || strncmp("String", type, 64))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
switch (rtype) {
|
||||||
|
case STRING:
|
||||||
|
*sdst = ret.addr;
|
||||||
|
break;
|
||||||
|
case INTEGER:
|
||||||
|
*idst = strtoul(ret.addr, NULL, 10);
|
||||||
|
break;
|
||||||
|
case FLOAT:
|
||||||
|
*fdst = strtof(ret.addr, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
config_init(Display *dpy)
|
||||||
|
{
|
||||||
|
char *resm;
|
||||||
|
XrmDatabase db;
|
||||||
|
ResourcePref *p;
|
||||||
|
|
||||||
|
XrmInitialize();
|
||||||
|
resm = XResourceManagerString(dpy);
|
||||||
|
if (!resm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
db = XrmGetStringDatabase(resm);
|
||||||
|
for (p = resources; p < resources + LEN(resources); p++)
|
||||||
|
resource_load(db, p->name, p->type, p->dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
reload_config(int sig)
|
||||||
|
{
|
||||||
|
/* Recreate a Display object to have up to date Xresources entries */
|
||||||
|
Display *dpy;
|
||||||
|
if (!(dpy = XOpenDisplay(NULL)))
|
||||||
|
die("Can't open display\n");
|
||||||
|
|
||||||
|
config_init(dpy);
|
||||||
|
xloadcols();
|
||||||
|
|
||||||
|
/* nearly like zoomabs() */
|
||||||
|
xunloadfonts();
|
||||||
|
xloadfonts(font, 0); /* font <- config_init() */
|
||||||
|
cresize(0, 0);
|
||||||
|
redraw();
|
||||||
|
xhints();
|
||||||
|
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
|
||||||
|
/* from https://st.suckless.org/patches/xresources-with-reload-signal */
|
||||||
|
/* triggers re-render if we're visible */
|
||||||
|
ttywrite("\033[O", 3, 1);
|
||||||
|
}
|
17
patch/xresources.h
Normal file
17
patch/xresources.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include <X11/Xresource.h>
|
||||||
|
|
||||||
|
/* Xresources preferences */
|
||||||
|
enum resource_type {
|
||||||
|
STRING = 0,
|
||||||
|
INTEGER = 1,
|
||||||
|
FLOAT = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *name;
|
||||||
|
enum resource_type type;
|
||||||
|
void *dst;
|
||||||
|
} ResourcePref;
|
||||||
|
|
||||||
|
int resource_load(XrmDatabase, char *, enum resource_type, void *);
|
||||||
|
void config_init(Display *dpy);
|
447
patches.h
Normal file
447
patches.h
Normal file
|
@ -0,0 +1,447 @@
|
||||||
|
/*
|
||||||
|
* This file contains patch control flags.
|
||||||
|
*
|
||||||
|
* In principle you should be able to mix and match any patches
|
||||||
|
* you may want. In cases where patches are logically incompatible
|
||||||
|
* one patch may take precedence over the other as noted in the
|
||||||
|
* relevant descriptions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Patches */
|
||||||
|
|
||||||
|
/* The alpha patch adds transparency for the terminal.
|
||||||
|
* You need to uncomment the corresponding line in config.mk to use the -lXrender library
|
||||||
|
* when including this patch.
|
||||||
|
* https://st.suckless.org/patches/alpha/
|
||||||
|
*/
|
||||||
|
#define ALPHA_PATCH 0
|
||||||
|
|
||||||
|
/* The alpha focus highlight patch allows the user to specify two distinct opacity values or
|
||||||
|
* background colors in order to easily differentiate between focused and unfocused terminal
|
||||||
|
* windows. This depends on the alpha patch.
|
||||||
|
* https://github.com/juliusHuelsmann/st-focus/
|
||||||
|
* https://st.suckless.org/patches/alpha_focus_highlight/
|
||||||
|
*/
|
||||||
|
#define ALPHA_FOCUS_HIGHLIGHT_PATCH 0
|
||||||
|
|
||||||
|
/* Adds gradient transparency to st, depends on the alpha patch.
|
||||||
|
* https://st.suckless.org/patches/gradient/
|
||||||
|
*/
|
||||||
|
#define ALPHA_GRADIENT_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows st to resize to any pixel size rather than snapping to character width/height.
|
||||||
|
* https://st.suckless.org/patches/anysize/
|
||||||
|
*/
|
||||||
|
#define ANYSIZE_PATCH 1
|
||||||
|
|
||||||
|
/* A simple variant of the anysize patch that only changes the resize hints to allow the window to
|
||||||
|
* be resized to any size.
|
||||||
|
*/
|
||||||
|
#define ANYSIZE_SIMPLE_PATCH 0
|
||||||
|
|
||||||
|
/* Draws a background image in farbfeld format in place of the defaultbg color allowing for pseudo
|
||||||
|
* transparency.
|
||||||
|
* https://st.suckless.org/patches/background_image/
|
||||||
|
*/
|
||||||
|
#define BACKGROUND_IMAGE_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds the ability to reload the background image config when a SIGUSR1 signal is
|
||||||
|
* received, e.g.: killall -USR1 st
|
||||||
|
* Depends on the BACKGROUND_IMAGE_PATCH.
|
||||||
|
*/
|
||||||
|
#define BACKGROUND_IMAGE_RELOAD_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows the use of a blinking cursor.
|
||||||
|
* Only cursor styles 0, 1, 3, 5, and 7 blink. Set cursorstyle accordingly.
|
||||||
|
* Cursor styles are defined here:
|
||||||
|
* https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
|
||||||
|
* https://st.suckless.org/patches/blinking_cursor/
|
||||||
|
*/
|
||||||
|
#define BLINKING_CURSOR_PATCH 1
|
||||||
|
|
||||||
|
/* By default bold text is rendered with a bold font in the bright variant of the current color.
|
||||||
|
* This patch makes bold text rendered simply as bold, leaving the color unaffected.
|
||||||
|
* https://st.suckless.org/patches/bold-is-not-bright/
|
||||||
|
*/
|
||||||
|
#define BOLD_IS_NOT_BRIGHT_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds custom rendering of lines/blocks/braille characters for gapless alignment.
|
||||||
|
* https://st.suckless.org/patches/boxdraw/
|
||||||
|
*/
|
||||||
|
#define BOXDRAW_PATCH 1
|
||||||
|
|
||||||
|
/* By default st only sets PRIMARY on selection.
|
||||||
|
* This patch makes st set CLIPBOARD on selection.
|
||||||
|
* https://st.suckless.org/patches/clipboard/
|
||||||
|
*/
|
||||||
|
#define CLIPBOARD_PATCH 1
|
||||||
|
|
||||||
|
/* This patch allows st to be resized without cutting off text when the terminal window is
|
||||||
|
* made larger again. Text does not wrap when the terminal window is made smaller.
|
||||||
|
*
|
||||||
|
* The vim browse patch takes precedence over this patch.
|
||||||
|
*
|
||||||
|
* https://github.com/bakkeby/st-flexipatch/issues/34
|
||||||
|
*/
|
||||||
|
#define COLUMNS_PATCH 1
|
||||||
|
|
||||||
|
/* Select and copy the last URL displayed with Mod+l. Multiple invocations cycle through the
|
||||||
|
* available URLs.
|
||||||
|
* https://st.suckless.org/patches/copyurl/
|
||||||
|
*/
|
||||||
|
#define COPYURL_PATCH 0
|
||||||
|
|
||||||
|
/* Select and copy the last URL displayed with Mod+l. Multiple invocations cycle through the
|
||||||
|
* available URLs. This variant also highlights the selected URLs.
|
||||||
|
* https://st.suckless.org/patches/copyurl/
|
||||||
|
*/
|
||||||
|
#define COPYURL_HIGHLIGHT_SELECTED_URLS_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds support for CSI escape sequences 22 and 23, which save and
|
||||||
|
* restores the window title (for instance nvim does this when opening and closing).
|
||||||
|
* https://st.suckless.org/patches/csi_22_23/
|
||||||
|
*/
|
||||||
|
#define CSI_22_23_PATCH 1
|
||||||
|
|
||||||
|
/* According to the specification (see link in BLINKING_CURSOR_PATCH) the "Set cursor style
|
||||||
|
* (DECSCUSR), VT520." escape sequences define both values of 0 and 1 as a blinking block,
|
||||||
|
* with 1 being the default.
|
||||||
|
*
|
||||||
|
* This patch allows the default cursor to be set when value 0 is used, as opposed to
|
||||||
|
* setting the cursor to a blinking block.
|
||||||
|
*
|
||||||
|
* This allows a command like this to restore the cursor to what st is configured with:
|
||||||
|
* $ echo -ne "\e[ q"
|
||||||
|
*
|
||||||
|
* While many terminal emulators do this it is not adhering to specification. xterm is an
|
||||||
|
* example terminal that sets a blinking block instead of the configured one, same as st.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_CURSOR_PATCH 1
|
||||||
|
|
||||||
|
/* Return BS on pressing backspace and DEL on pressing the delete key.
|
||||||
|
* https://st.suckless.org/patches/delkey/
|
||||||
|
*/
|
||||||
|
#define DELKEY_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds the option of disabling bold fonts globally.
|
||||||
|
* https://st.suckless.org/patches/disable_bold_italic_fonts/
|
||||||
|
*/
|
||||||
|
#define DISABLE_BOLD_FONTS_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds the option of disabling italic fonts globally.
|
||||||
|
* https://st.suckless.org/patches/disable_bold_italic_fonts/
|
||||||
|
*/
|
||||||
|
#define DISABLE_ITALIC_FONTS_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds the option of disabling roman fonts globally.
|
||||||
|
* https://st.suckless.org/patches/disable_bold_italic_fonts/
|
||||||
|
*/
|
||||||
|
#define DISABLE_ROMAN_FONTS_PATCH 0
|
||||||
|
|
||||||
|
/* This patch makes the cursor color the inverse of the current cell color.
|
||||||
|
* https://st.suckless.org/patches/dynamic-cursor-color/
|
||||||
|
*/
|
||||||
|
#define DYNAMIC_CURSOR_COLOR_PATCH 1
|
||||||
|
|
||||||
|
/* Reading and writing st's screen through a pipe, e.g. pass info to dmenu.
|
||||||
|
* https://st.suckless.org/patches/externalpipe/
|
||||||
|
*/
|
||||||
|
#define EXTERNALPIPE_PATCH 0
|
||||||
|
|
||||||
|
/* This patch improves and extends the externalpipe patch in two ways:
|
||||||
|
* - it prevents the reset of the signal handler set on SIGCHILD, when
|
||||||
|
* the forked process that executes the external process exits and
|
||||||
|
* - it adds the externalpipein function 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
|
||||||
|
* keyboard shortcut. The patch was created to make use of the dynamic-colors
|
||||||
|
* tool that uses the OSC escape sequences to change the colors of the terminal.
|
||||||
|
*
|
||||||
|
* This patch depends on EXTERNALPIPE_PATCH being enabled.
|
||||||
|
*
|
||||||
|
* https://github.com/sos4nt/dynamic-colors
|
||||||
|
* https://lists.suckless.org/hackers/2004/17218.html
|
||||||
|
*/
|
||||||
|
#define EXTERNALPIPEIN_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows command line applications to use all the fancy key combinations
|
||||||
|
* that are available to GUI applications.
|
||||||
|
* https://st.suckless.org/patches/fix_keyboard_input/
|
||||||
|
*/
|
||||||
|
#define FIXKEYBOARDINPUT_PATCH 1
|
||||||
|
|
||||||
|
/* This patch allows you to add spare font besides the default. Some glyphs can be not present in
|
||||||
|
* the default font. For this glyphs st uses font-config and try to find them in font cache first.
|
||||||
|
* This patch append fonts defined in font2 variable to the beginning of the font cache.
|
||||||
|
* So they will be used first for glyphs that are absent in the default font.
|
||||||
|
* https://st.suckless.org/patches/font2/
|
||||||
|
*/
|
||||||
|
#define FONT2_PATCH 0
|
||||||
|
|
||||||
|
/* Hide the X cursor whenever a key is pressed and show it back when the mouse is moved in
|
||||||
|
* the terminal window.
|
||||||
|
* https://st.suckless.org/patches/hidecursor/
|
||||||
|
*/
|
||||||
|
#define HIDECURSOR_PATCH 1
|
||||||
|
|
||||||
|
/* This patch hides the terminal cursor when the window loses focus (as opposed to showing a hollow
|
||||||
|
* cursor).
|
||||||
|
* https://www.reddit.com/r/suckless/comments/nvee8h/how_to_hide_cursor_in_st_is_there_a_patch_for_it/
|
||||||
|
*/
|
||||||
|
#define HIDE_TERMINAL_CURSOR_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds a keybinding that lets you invert the current colorscheme of st.
|
||||||
|
* This provides a simple way to temporarily switch to a light colorscheme if you use a dark
|
||||||
|
* colorscheme or visa-versa.
|
||||||
|
* https://st.suckless.org/patches/invert/
|
||||||
|
*/
|
||||||
|
#define INVERT_PATCH 0
|
||||||
|
|
||||||
|
/* Pressing the default binding Ctrl+Shift-i will popup dmenu, asking you to enter a unicode
|
||||||
|
* codepoint that will be converted to a glyph and then pushed to st.
|
||||||
|
* https://st.suckless.org/patches/iso14755/
|
||||||
|
*/
|
||||||
|
#define ISO14755_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows you to select text on the terminal using keyboard shortcuts.
|
||||||
|
* https://st.suckless.org/patches/keyboard_select/
|
||||||
|
*/
|
||||||
|
#define KEYBOARDSELECT_PATCH 0
|
||||||
|
|
||||||
|
/* This patch adds support for drawing ligatures using the Harfbuzz library to transform
|
||||||
|
* original text of a single line to a list of glyphs with ligatures included.
|
||||||
|
* This patch depends on the Harfbuzz library and headers to compile.
|
||||||
|
* You need to uncomment the corresponding lines in config.mk to use the harfbuzz library
|
||||||
|
* when including this patch.
|
||||||
|
* https://github.com/cog1to/st-ligatures
|
||||||
|
* https://st.suckless.org/patches/ligatures/
|
||||||
|
*/
|
||||||
|
#define LIGATURES_PATCH 1
|
||||||
|
|
||||||
|
/* This patch makes st ignore terminal color attributes by forcing display of the default
|
||||||
|
* foreground and background colors only - making for a monochrome look. Idea ref.
|
||||||
|
* https://www.reddit.com/r/suckless/comments/ixbx6z/how_to_use_black_and_white_only_for_st/
|
||||||
|
*/
|
||||||
|
#define MONOCHROME_PATCH 0
|
||||||
|
|
||||||
|
/* This patch sets the _NET_WM_ICON X property with a hardcoded icon for st.
|
||||||
|
* https://st.suckless.org/patches/netwmicon/
|
||||||
|
*/
|
||||||
|
#define NETWMICON_PATCH 1
|
||||||
|
|
||||||
|
/* This patch allows you to spawn a new st terminal using Ctrl-Shift-Return. It will have the
|
||||||
|
* same CWD (current working directory) as the original st instance.
|
||||||
|
* https://st.suckless.org/patches/newterm/
|
||||||
|
*/
|
||||||
|
#define NEWTERM_PATCH 0
|
||||||
|
|
||||||
|
/* This patch will set the _MOTIF_WM_HINTS property for the st window which, if the window manager
|
||||||
|
* respects it, will show the st window without window decorations.
|
||||||
|
*
|
||||||
|
* In dwm, if the decoration hints patch is applied, then the st window will start out without a
|
||||||
|
* border. In GNOME and KDE the window should start without a window title.
|
||||||
|
*/
|
||||||
|
#define NO_WINDOW_DECORATIONS_PATCH 0
|
||||||
|
|
||||||
|
/* Open contents of the clipboard in a user-defined browser.
|
||||||
|
* https://st.suckless.org/patches/open_copied_url/
|
||||||
|
*/
|
||||||
|
#define OPENCOPIED_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows for URLs to be opened directly when you click on them. This may not work with
|
||||||
|
* all terminal applications.
|
||||||
|
*
|
||||||
|
* https://www.reddit.com/r/suckless/comments/cc83om/st_open_url/
|
||||||
|
*/
|
||||||
|
#define OPENURLONCLICK_PATCH 1
|
||||||
|
|
||||||
|
/* This patch allows you to specify a border that is relative in size to the width of a cell
|
||||||
|
* in the terminal.
|
||||||
|
* https://st.suckless.org/patches/relativeborder/
|
||||||
|
*/
|
||||||
|
#define RELATIVEBORDER_PATCH 1
|
||||||
|
|
||||||
|
/* This patch allows you to right-click on some selected text to send it to the plumbing
|
||||||
|
* program of choice, e.g. open a file, view an image, open a URL.
|
||||||
|
* https://st.suckless.org/patches/right_click_to_plumb/
|
||||||
|
*/
|
||||||
|
#define RIGHTCLICKTOPLUMB_PATCH 0
|
||||||
|
|
||||||
|
/* Scroll back through terminal output using Shift+{PageUp, PageDown}.
|
||||||
|
* https://st.suckless.org/patches/scrollback/
|
||||||
|
*/
|
||||||
|
#define SCROLLBACK_PATCH 1
|
||||||
|
|
||||||
|
/* Scroll back through terminal output using Shift+MouseWheel.
|
||||||
|
* This variant depends on SCROLLBACK_PATCH being enabled.
|
||||||
|
* https://st.suckless.org/patches/scrollback/
|
||||||
|
*/
|
||||||
|
#define SCROLLBACK_MOUSE_PATCH 0
|
||||||
|
|
||||||
|
/* Scroll back through terminal output using mouse wheel (when not in MODE_ALTSCREEN).
|
||||||
|
* This variant depends on SCROLLBACK_PATCH being enabled.
|
||||||
|
* https://st.suckless.org/patches/scrollback/
|
||||||
|
*/
|
||||||
|
#define SCROLLBACK_MOUSE_ALTSCREEN_PATCH 1
|
||||||
|
|
||||||
|
/* This is the single drawable buffer patch as outlined in the FAQ to get images
|
||||||
|
* in w3m to display. While this patch does not break the alpha patch it images
|
||||||
|
* are not shown in w3m if the alpha patch is applied.
|
||||||
|
*/
|
||||||
|
#define SINGLE_DRAWABLE_BUFFER_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds SIXEL graphics support for st.
|
||||||
|
* Note that patch/sixel.c/sixel_hls.c come from mintty, licensed under GPL.
|
||||||
|
* Known issues:
|
||||||
|
* - Rendering sixel graphics may cause unusual cursor placement, this is
|
||||||
|
* not specific to this variant of st - the same issue is present in
|
||||||
|
* the xterm implementation. This is likely an issue of sixel height
|
||||||
|
* not being detected correctly.
|
||||||
|
*
|
||||||
|
* Note that you need to uncomment the corresponding lines in config.mk when including this patch.
|
||||||
|
* This patch is incompatible with the W3M patch.
|
||||||
|
*
|
||||||
|
* https://gist.github.com/saitoha/70e0fdf22e3e8f63ce937c7f7da71809
|
||||||
|
*/
|
||||||
|
#define SIXEL_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows clients to embed into the st window and is useful if you tend to
|
||||||
|
* start X applications from the terminal. For example:
|
||||||
|
*
|
||||||
|
* $ surf -e $WINDOWID
|
||||||
|
*
|
||||||
|
* The behavior is similar to Plan 9 where applications can take over windows.
|
||||||
|
* URL TBC
|
||||||
|
*/
|
||||||
|
#define ST_EMBEDDER_PATCH 0
|
||||||
|
|
||||||
|
/* Use inverted defaultbg/fg for selection when bg/fg are the same.
|
||||||
|
* https://st.suckless.org/patches/spoiler/
|
||||||
|
*/
|
||||||
|
#define SPOILER_PATCH 1
|
||||||
|
|
||||||
|
/* This patch changes the mouse shape to the global default when the running program subscribes
|
||||||
|
* for mouse events, for instance, in programs like ranger and fzf. It emulates the behaviour
|
||||||
|
* shown by vte terminals like termite.
|
||||||
|
* https://st.suckless.org/patches/swapmouse/
|
||||||
|
*/
|
||||||
|
#define SWAPMOUSE_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds synchronized-updates/application-sync support in st.
|
||||||
|
* This will have no effect except when an application uses the synchronized-update escape
|
||||||
|
* sequences. With this patch nearly all cursor flicker is eliminated in tmux, and tmux detects
|
||||||
|
* it automatically via terminfo.
|
||||||
|
*
|
||||||
|
* Note: this patch alters st.info to promote support for extra escape sequences, which can
|
||||||
|
* potentially cause application misbehaviour if you do not use this patch. Try removing or
|
||||||
|
* commenting out the corresponding line in st.info if this is causing issues.
|
||||||
|
*
|
||||||
|
* https://st.suckless.org/patches/sync/
|
||||||
|
*/
|
||||||
|
#define SYNC_PATCH 0
|
||||||
|
|
||||||
|
/* Instead of a default X cursor, use the xterm cursor from your cursor theme.
|
||||||
|
* You need to uncomment the corresponding line in config.mk to use the -lXcursor library
|
||||||
|
* when including this patch.
|
||||||
|
* https://st.suckless.org/patches/themed_cursor/
|
||||||
|
*/
|
||||||
|
#define THEMED_CURSOR_PATCH 1
|
||||||
|
|
||||||
|
/* Adds support for special underlines.
|
||||||
|
*
|
||||||
|
* Example test command:
|
||||||
|
* $ echo -e "\e[4:3m\e[58:5:10munderline\e[0m"
|
||||||
|
* ^ ^ ^ ^ ^- sets terminal color 10
|
||||||
|
* | | | \- indicates that terminal colors should be used
|
||||||
|
* | | \- indicates that underline color is being set
|
||||||
|
* | \- sets underline style to curvy
|
||||||
|
* \- set underline
|
||||||
|
*
|
||||||
|
* Note: this patch alters st.info to promote support for extra escape sequences, which can
|
||||||
|
* potentially cause application misbehaviour if you do not use this patch. Try removing or
|
||||||
|
* commenting out the corresponding line in st.info if this is causing issues.
|
||||||
|
*
|
||||||
|
* https://st.suckless.org/patches/undercurl/
|
||||||
|
*/
|
||||||
|
#define UNDERCURL_PATCH 1
|
||||||
|
|
||||||
|
/* Allows mouse scroll without modifier keys for regardless of alt screen using the external
|
||||||
|
* scroll program.
|
||||||
|
* https://st.suckless.org/patches/universcroll/
|
||||||
|
*/
|
||||||
|
#define UNIVERSCROLL_PATCH 0
|
||||||
|
|
||||||
|
/* Use XftFontMatch in place of FcFontMatch.
|
||||||
|
*
|
||||||
|
* XftFontMatch calls XftDefaultSubstitute which configures various match properties according
|
||||||
|
* to the user's configured Xft defaults (xrdb) as well as according to the current display and
|
||||||
|
* screen. Most importantly, the screen DPI is computed [1]. Without this, st uses a "default"
|
||||||
|
* DPI of 75 [2].
|
||||||
|
*
|
||||||
|
* [1]: https://cgit.freedesktop.org/xorg/lib/libXft/tree/src/xftdpy.c?id=libXft-2.3.2#n535
|
||||||
|
* [2]: https://cgit.freedesktop.org/fontconfig/tree/src/fcdefault.c?id=2.11.1#n255
|
||||||
|
*
|
||||||
|
* https://git.suckless.org/st/commit/528241aa3835e2f1f052abeeaf891737712955a0.html
|
||||||
|
*/
|
||||||
|
#define USE_XFTFONTMATCH_PATCH 1
|
||||||
|
|
||||||
|
/* Vertically center lines in the space available if you have set a larger chscale in config.h
|
||||||
|
* https://st.suckless.org/patches/vertcenter/
|
||||||
|
*/
|
||||||
|
#define VERTCENTER_PATCH 1
|
||||||
|
|
||||||
|
/* The vim-browse patch offers the possibility to move through the terminal history-buffer,
|
||||||
|
* search for strings using VIM-like motions, operations and quantifiers. It overlays the
|
||||||
|
* screen with highlighted search results and displays the current operation / motions / search
|
||||||
|
* string in the bottom right corner.
|
||||||
|
*
|
||||||
|
* https://github.com/juliusHuelsmann/st-history-vim
|
||||||
|
* https://st.suckless.org/patches/vim_browse/git restore -s@ -SW -- aDirectory
|
||||||
|
*/
|
||||||
|
#define VIM_BROWSE_PATCH 0
|
||||||
|
|
||||||
|
/* Briefly inverts window content on terminal bell event.
|
||||||
|
* https://st.suckless.org/patches/visualbell/
|
||||||
|
*/
|
||||||
|
#define VISUALBELL_1_PATCH 0
|
||||||
|
|
||||||
|
/* Adds support for w3m images.
|
||||||
|
* https://st.suckless.org/patches/w3m/
|
||||||
|
*/
|
||||||
|
#define W3M_PATCH 1
|
||||||
|
|
||||||
|
/* Adds proper glyphs rendering in st allowing wide glyphs to be drawn as-is as opposed to
|
||||||
|
* smaller or cut glyphs being rendered.
|
||||||
|
* https://github.com/Dreomite/st/commit/e3b821dcb3511d60341dec35ee05a4a0abfef7f2
|
||||||
|
* https://www.reddit.com/r/suckless/comments/jt90ai/update_support_for_proper_glyph_rendering_in_st/
|
||||||
|
*/
|
||||||
|
#define WIDE_GLYPHS_PATCH 1
|
||||||
|
|
||||||
|
/* There is a known issue that Google's Variable Fonts (VF) can end up with letter spacing
|
||||||
|
* that is too wide in programs that use Xft, for example Inconsolata v3.000.
|
||||||
|
*
|
||||||
|
* This is intended as a temporary patch / hack until (if) this is fixed in the Xft library
|
||||||
|
* itself.
|
||||||
|
*
|
||||||
|
* https://github.com/googlefonts/Inconsolata/issues/42#issuecomment-737508890
|
||||||
|
*/
|
||||||
|
#define WIDE_GLYPH_SPACING_PATCH 0
|
||||||
|
|
||||||
|
/* This patch allows user to specify the initial path st should use as the working directory.
|
||||||
|
* https://st.suckless.org/patches/workingdir/
|
||||||
|
*/
|
||||||
|
#define WORKINGDIR_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds the ability to configure st via Xresources. At startup, st will read and
|
||||||
|
* apply the resources named in the resources[] array in config.h.
|
||||||
|
* https://st.suckless.org/patches/xresources/
|
||||||
|
*/
|
||||||
|
#define XRESOURCES_PATCH 1
|
||||||
|
|
||||||
|
/* This patch adds the ability to reload the Xresources config when a SIGUSR1 signal is received
|
||||||
|
* e.g.: killall -USR1 st
|
||||||
|
* Depends on the XRESOURCES_PATCH.
|
||||||
|
*/
|
||||||
|
#define XRESOURCES_RELOAD_PATCH 1
|
616
sixel.c
Normal file
616
sixel.c
Normal file
|
@ -0,0 +1,616 @@
|
||||||
|
// sixel.c (part of mintty)
|
||||||
|
// originally written by kmiya@cluti (https://github.com/saitoha/sixel/blob/master/fromsixel.c)
|
||||||
|
// Licensed under the terms of the GNU General Public License v3 or later.
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
|
#include "sixel.h"
|
||||||
|
#include "sixel_hls.h"
|
||||||
|
|
||||||
|
#define SIXEL_RGB(r, g, b) ((r) + ((g) << 8) + ((b) << 16))
|
||||||
|
#define SIXEL_PALVAL(n,a,m) (((n) * (a) + ((m) / 2)) / (m))
|
||||||
|
#define SIXEL_XRGB(r,g,b) SIXEL_RGB(SIXEL_PALVAL(r, 255, 100), SIXEL_PALVAL(g, 255, 100), SIXEL_PALVAL(b, 255, 100))
|
||||||
|
|
||||||
|
static sixel_color_t const sixel_default_color_table[] = {
|
||||||
|
SIXEL_XRGB( 0, 0, 0), /* 0 Black */
|
||||||
|
SIXEL_XRGB(20, 20, 80), /* 1 Blue */
|
||||||
|
SIXEL_XRGB(80, 13, 13), /* 2 Red */
|
||||||
|
SIXEL_XRGB(20, 80, 20), /* 3 Green */
|
||||||
|
SIXEL_XRGB(80, 20, 80), /* 4 Magenta */
|
||||||
|
SIXEL_XRGB(20, 80, 80), /* 5 Cyan */
|
||||||
|
SIXEL_XRGB(80, 80, 20), /* 6 Yellow */
|
||||||
|
SIXEL_XRGB(53, 53, 53), /* 7 Gray 50% */
|
||||||
|
SIXEL_XRGB(26, 26, 26), /* 8 Gray 25% */
|
||||||
|
SIXEL_XRGB(33, 33, 60), /* 9 Blue* */
|
||||||
|
SIXEL_XRGB(60, 26, 26), /* 10 Red* */
|
||||||
|
SIXEL_XRGB(33, 60, 33), /* 11 Green* */
|
||||||
|
SIXEL_XRGB(60, 33, 60), /* 12 Magenta* */
|
||||||
|
SIXEL_XRGB(33, 60, 60), /* 13 Cyan* */
|
||||||
|
SIXEL_XRGB(60, 60, 33), /* 14 Yellow* */
|
||||||
|
SIXEL_XRGB(80, 80, 80), /* 15 Gray 75% */
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
set_default_color(sixel_image_t *image)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int n;
|
||||||
|
int r;
|
||||||
|
int g;
|
||||||
|
int b;
|
||||||
|
|
||||||
|
/* palette initialization */
|
||||||
|
for (n = 1; n < 17; n++) {
|
||||||
|
image->palette[n] = sixel_default_color_table[n - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* colors 17-232 are a 6x6x6 color cube */
|
||||||
|
for (r = 0; r < 6; r++) {
|
||||||
|
for (g = 0; g < 6; g++) {
|
||||||
|
for (b = 0; b < 6; b++) {
|
||||||
|
image->palette[n++] = SIXEL_RGB(r * 51, g * 51, b * 51);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* colors 233-256 are a grayscale ramp, intentionally leaving out */
|
||||||
|
for (i = 0; i < 24; i++) {
|
||||||
|
image->palette[n++] = SIXEL_RGB(i * 11, i * 11, i * 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; n < DECSIXEL_PALETTE_MAX; n++) {
|
||||||
|
image->palette[n] = SIXEL_RGB(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
sixel_image_init(
|
||||||
|
sixel_image_t *image,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
int fgcolor,
|
||||||
|
int bgcolor,
|
||||||
|
int use_private_register)
|
||||||
|
{
|
||||||
|
int status = (-1);
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
size = (size_t)(width * height) * sizeof(sixel_color_no_t);
|
||||||
|
image->width = width;
|
||||||
|
image->height = height;
|
||||||
|
image->data = (sixel_color_no_t *)malloc(size);
|
||||||
|
image->ncolors = 2;
|
||||||
|
image->use_private_register = use_private_register;
|
||||||
|
|
||||||
|
if (image->data == NULL) {
|
||||||
|
status = (-1);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
memset(image->data, 0, size);
|
||||||
|
|
||||||
|
image->palette[0] = bgcolor;
|
||||||
|
|
||||||
|
if (image->use_private_register)
|
||||||
|
image->palette[1] = fgcolor;
|
||||||
|
|
||||||
|
image->palette_modified = 0;
|
||||||
|
|
||||||
|
status = (0);
|
||||||
|
|
||||||
|
end:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
image_buffer_resize(
|
||||||
|
sixel_image_t *image,
|
||||||
|
int width,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
int status = (-1);
|
||||||
|
size_t size;
|
||||||
|
sixel_color_no_t *alt_buffer;
|
||||||
|
int n;
|
||||||
|
int min_height;
|
||||||
|
|
||||||
|
size = (size_t)(width * height) * sizeof(sixel_color_no_t);
|
||||||
|
alt_buffer = (sixel_color_no_t *)malloc(size);
|
||||||
|
if (alt_buffer == NULL) {
|
||||||
|
/* free source image */
|
||||||
|
free(image->data);
|
||||||
|
image->data = NULL;
|
||||||
|
status = (-1);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
min_height = height > image->height ? image->height: height;
|
||||||
|
if (width > image->width) { /* if width is extended */
|
||||||
|
for (n = 0; n < min_height; ++n) {
|
||||||
|
/* copy from source image */
|
||||||
|
memcpy(alt_buffer + width * n,
|
||||||
|
image->data + image->width * n,
|
||||||
|
(size_t)image->width * sizeof(sixel_color_no_t));
|
||||||
|
/* fill extended area with background color */
|
||||||
|
memset(alt_buffer + width * n + image->width,
|
||||||
|
0,
|
||||||
|
(size_t)(width - image->width) * sizeof(sixel_color_no_t));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (n = 0; n < min_height; ++n) {
|
||||||
|
/* copy from source image */
|
||||||
|
memcpy(alt_buffer + width * n,
|
||||||
|
image->data + image->width * n,
|
||||||
|
(size_t)width * sizeof(sixel_color_no_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (height > image->height) { /* if height is extended */
|
||||||
|
/* fill extended area with background color */
|
||||||
|
memset(alt_buffer + width * image->height,
|
||||||
|
0,
|
||||||
|
(size_t)(width * (height - image->height)) * sizeof(sixel_color_no_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free source image */
|
||||||
|
free(image->data);
|
||||||
|
|
||||||
|
image->data = alt_buffer;
|
||||||
|
image->width = width;
|
||||||
|
image->height = height;
|
||||||
|
|
||||||
|
status = (0);
|
||||||
|
|
||||||
|
end:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sixel_image_deinit(sixel_image_t *image)
|
||||||
|
{
|
||||||
|
free(image->data);
|
||||||
|
image->data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sixel_parser_init(sixel_state_t *st,
|
||||||
|
sixel_color_t fgcolor, sixel_color_t bgcolor,
|
||||||
|
unsigned char use_private_register,
|
||||||
|
int cell_width, int cell_height)
|
||||||
|
{
|
||||||
|
int status = (-1);
|
||||||
|
|
||||||
|
st->state = PS_DECSIXEL;
|
||||||
|
st->pos_x = 0;
|
||||||
|
st->pos_y = 0;
|
||||||
|
st->max_x = 0;
|
||||||
|
st->max_y = 0;
|
||||||
|
st->attributed_pan = 2;
|
||||||
|
st->attributed_pad = 1;
|
||||||
|
st->attributed_ph = 0;
|
||||||
|
st->attributed_pv = 0;
|
||||||
|
st->repeat_count = 1;
|
||||||
|
st->color_index = 16;
|
||||||
|
st->grid_width = cell_width;
|
||||||
|
st->grid_height = cell_height;
|
||||||
|
st->nparams = 0;
|
||||||
|
st->param = 0;
|
||||||
|
|
||||||
|
/* buffer initialization */
|
||||||
|
status = sixel_image_init(&st->image, 1, 1, fgcolor, bgcolor, use_private_register);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sixel_parser_set_default_color(sixel_state_t *st)
|
||||||
|
{
|
||||||
|
return set_default_color(&st->image);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sixel_parser_finalize(sixel_state_t *st, unsigned char *pixels)
|
||||||
|
{
|
||||||
|
int status = (-1);
|
||||||
|
int sx;
|
||||||
|
int sy;
|
||||||
|
sixel_image_t *image = &st->image;
|
||||||
|
int x, y;
|
||||||
|
sixel_color_no_t *src;
|
||||||
|
unsigned char *dst;
|
||||||
|
int color;
|
||||||
|
|
||||||
|
if (++st->max_x < st->attributed_ph)
|
||||||
|
st->max_x = st->attributed_ph;
|
||||||
|
|
||||||
|
if (++st->max_y < st->attributed_pv)
|
||||||
|
st->max_y = st->attributed_pv;
|
||||||
|
|
||||||
|
sx = (st->max_x + st->grid_width - 1) / st->grid_width * st->grid_width;
|
||||||
|
sy = (st->max_y + st->grid_height - 1) / st->grid_height * st->grid_height;
|
||||||
|
|
||||||
|
if (image->width > sx || image->height > sy) {
|
||||||
|
status = image_buffer_resize(image, sx, sy);
|
||||||
|
if (status < 0)
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image->use_private_register && image->ncolors > 2 && !image->palette_modified) {
|
||||||
|
status = set_default_color(image);
|
||||||
|
if (status < 0)
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
src = st->image.data;
|
||||||
|
dst = pixels;
|
||||||
|
for (y = 0; y < st->image.height; ++y) {
|
||||||
|
for (x = 0; x < st->image.width; ++x) {
|
||||||
|
color = st->image.palette[*src++];
|
||||||
|
*dst++ = color >> 16 & 0xff; /* b */
|
||||||
|
*dst++ = color >> 8 & 0xff; /* g */
|
||||||
|
*dst++ = color >> 0 & 0xff; /* r */
|
||||||
|
*dst++ = 255; /* a */
|
||||||
|
}
|
||||||
|
/* fill right padding with bgcolor */
|
||||||
|
for (; x < st->image.width; ++x) {
|
||||||
|
color = st->image.palette[0]; /* bgcolor */
|
||||||
|
*dst++ = color >> 16 & 0xff; /* b */
|
||||||
|
*dst++ = color >> 8 & 0xff; /* g */
|
||||||
|
*dst++ = color >> 0 & 0xff; /* r */
|
||||||
|
dst++; /* a */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* fill bottom padding with bgcolor */
|
||||||
|
for (; y < st->image.height; ++y) {
|
||||||
|
for (x = 0; x < st->image.width; ++x) {
|
||||||
|
color = st->image.palette[0]; /* bgcolor */
|
||||||
|
*dst++ = color >> 16 & 0xff; /* b */
|
||||||
|
*dst++ = color >> 8 & 0xff; /* g */
|
||||||
|
*dst++ = color >> 0 & 0xff; /* r */
|
||||||
|
dst++; /* a */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = (0);
|
||||||
|
|
||||||
|
end:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* convert sixel data into indexed pixel bytes and palette data */
|
||||||
|
int
|
||||||
|
sixel_parser_parse(sixel_state_t *st, unsigned char *p, size_t len)
|
||||||
|
{
|
||||||
|
int status = (-1);
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int bits;
|
||||||
|
int sixel_vertical_mask;
|
||||||
|
int sx;
|
||||||
|
int sy;
|
||||||
|
int c;
|
||||||
|
int pos;
|
||||||
|
unsigned char *p0 = p;
|
||||||
|
sixel_image_t *image = &st->image;
|
||||||
|
|
||||||
|
if (! image->data)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
while (p < p0 + len) {
|
||||||
|
switch (st->state) {
|
||||||
|
case PS_ESC:
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
case PS_DECSIXEL:
|
||||||
|
switch (*p) {
|
||||||
|
case '\x1b':
|
||||||
|
st->state = PS_ESC;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
st->param = 0;
|
||||||
|
st->nparams = 0;
|
||||||
|
st->state = PS_DECGRA;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '!':
|
||||||
|
st->param = 0;
|
||||||
|
st->nparams = 0;
|
||||||
|
st->state = PS_DECGRI;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
st->param = 0;
|
||||||
|
st->nparams = 0;
|
||||||
|
st->state = PS_DECGCI;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
/* DECGCR Graphics Carriage Return */
|
||||||
|
st->pos_x = 0;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
/* DECGNL Graphics Next Line */
|
||||||
|
st->pos_x = 0;
|
||||||
|
if (st->pos_y < DECSIXEL_HEIGHT_MAX - 5 - 6)
|
||||||
|
st->pos_y += 6;
|
||||||
|
else
|
||||||
|
st->pos_y = DECSIXEL_HEIGHT_MAX + 1;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (*p >= '?' && *p <= '~') { /* sixel characters */
|
||||||
|
if ((image->width < (st->pos_x + st->repeat_count) || image->height < (st->pos_y + 6))
|
||||||
|
&& image->width < DECSIXEL_WIDTH_MAX && image->height < DECSIXEL_HEIGHT_MAX) {
|
||||||
|
sx = image->width * 2;
|
||||||
|
sy = image->height * 2;
|
||||||
|
while (sx < (st->pos_x + st->repeat_count) || sy < (st->pos_y + 6)) {
|
||||||
|
sx *= 2;
|
||||||
|
sy *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sx > DECSIXEL_WIDTH_MAX)
|
||||||
|
sx = DECSIXEL_WIDTH_MAX;
|
||||||
|
if (sy > DECSIXEL_HEIGHT_MAX)
|
||||||
|
sy = DECSIXEL_HEIGHT_MAX;
|
||||||
|
|
||||||
|
status = image_buffer_resize(image, sx, sy);
|
||||||
|
if (status < 0)
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st->color_index > image->ncolors)
|
||||||
|
image->ncolors = st->color_index;
|
||||||
|
|
||||||
|
if (st->pos_x + st->repeat_count > image->width)
|
||||||
|
st->repeat_count = image->width - st->pos_x;
|
||||||
|
|
||||||
|
if (st->repeat_count > 0 && st->pos_y - 5 < image->height) {
|
||||||
|
bits = *p - '?';
|
||||||
|
if (bits != 0) {
|
||||||
|
sixel_vertical_mask = 0x01;
|
||||||
|
if (st->repeat_count <= 1) {
|
||||||
|
for (i = 0; i < 6; i++) {
|
||||||
|
if ((bits & sixel_vertical_mask) != 0) {
|
||||||
|
pos = image->width * (st->pos_y + i) + st->pos_x;
|
||||||
|
image->data[pos] = st->color_index;
|
||||||
|
if (st->max_x < st->pos_x)
|
||||||
|
st->max_x = st->pos_x;
|
||||||
|
if (st->max_y < (st->pos_y + i))
|
||||||
|
st->max_y = st->pos_y + i;
|
||||||
|
}
|
||||||
|
sixel_vertical_mask <<= 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* st->repeat_count > 1 */
|
||||||
|
for (i = 0; i < 6; i++) {
|
||||||
|
if ((bits & sixel_vertical_mask) != 0) {
|
||||||
|
c = sixel_vertical_mask << 1;
|
||||||
|
for (n = 1; (i + n) < 6; n++) {
|
||||||
|
if ((bits & c) == 0)
|
||||||
|
break;
|
||||||
|
c <<= 1;
|
||||||
|
}
|
||||||
|
for (y = st->pos_y + i; y < st->pos_y + i + n; ++y) {
|
||||||
|
for (x = st->pos_x; x < st->pos_x + st->repeat_count; ++x)
|
||||||
|
image->data[image->width * y + x] = st->color_index;
|
||||||
|
}
|
||||||
|
if (st->max_x < (st->pos_x + st->repeat_count - 1))
|
||||||
|
st->max_x = st->pos_x + st->repeat_count - 1;
|
||||||
|
if (st->max_y < (st->pos_y + i + n - 1))
|
||||||
|
st->max_y = st->pos_y + i + n - 1;
|
||||||
|
i += (n - 1);
|
||||||
|
sixel_vertical_mask <<= (n - 1);
|
||||||
|
}
|
||||||
|
sixel_vertical_mask <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (st->repeat_count > 0)
|
||||||
|
st->pos_x += st->repeat_count;
|
||||||
|
st->repeat_count = 1;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PS_DECGRA:
|
||||||
|
/* DECGRA Set Raster Attributes " Pan; Pad; Ph; Pv */
|
||||||
|
switch (*p) {
|
||||||
|
case '\x1b':
|
||||||
|
st->state = PS_ESC;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
st->param = st->param * 10 + *p - '0';
|
||||||
|
if (st->param > DECSIXEL_PARAMVALUE_MAX)
|
||||||
|
st->param = DECSIXEL_PARAMVALUE_MAX;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case ';':
|
||||||
|
if (st->nparams < DECSIXEL_PARAMS_MAX)
|
||||||
|
st->params[st->nparams++] = st->param;
|
||||||
|
st->param = 0;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (st->nparams < DECSIXEL_PARAMS_MAX)
|
||||||
|
st->params[st->nparams++] = st->param;
|
||||||
|
if (st->nparams > 0)
|
||||||
|
st->attributed_pad = st->params[0];
|
||||||
|
if (st->nparams > 1)
|
||||||
|
st->attributed_pan = st->params[1];
|
||||||
|
if (st->nparams > 2 && st->params[2] > 0)
|
||||||
|
st->attributed_ph = st->params[2];
|
||||||
|
if (st->nparams > 3 && st->params[3] > 0)
|
||||||
|
st->attributed_pv = st->params[3];
|
||||||
|
|
||||||
|
if (st->attributed_pan <= 0)
|
||||||
|
st->attributed_pan = 1;
|
||||||
|
if (st->attributed_pad <= 0)
|
||||||
|
st->attributed_pad = 1;
|
||||||
|
|
||||||
|
if (image->width < st->attributed_ph ||
|
||||||
|
image->height < st->attributed_pv) {
|
||||||
|
sx = st->attributed_ph;
|
||||||
|
if (image->width > st->attributed_ph)
|
||||||
|
sx = image->width;
|
||||||
|
|
||||||
|
sy = st->attributed_pv;
|
||||||
|
if (image->height > st->attributed_pv)
|
||||||
|
sy = image->height;
|
||||||
|
|
||||||
|
sx = (sx + st->grid_width - 1) / st->grid_width * st->grid_width;
|
||||||
|
sy = (sy + st->grid_height - 1) / st->grid_height * st->grid_height;
|
||||||
|
|
||||||
|
if (sx > DECSIXEL_WIDTH_MAX)
|
||||||
|
sx = DECSIXEL_WIDTH_MAX;
|
||||||
|
if (sy > DECSIXEL_HEIGHT_MAX)
|
||||||
|
sy = DECSIXEL_HEIGHT_MAX;
|
||||||
|
|
||||||
|
status = image_buffer_resize(image, sx, sy);
|
||||||
|
if (status < 0)
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
st->state = PS_DECSIXEL;
|
||||||
|
st->param = 0;
|
||||||
|
st->nparams = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PS_DECGRI:
|
||||||
|
/* DECGRI Graphics Repeat Introducer ! Pn Ch */
|
||||||
|
switch (*p) {
|
||||||
|
case '\x1b':
|
||||||
|
st->state = PS_ESC;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
st->param = st->param * 10 + *p - '0';
|
||||||
|
if (st->param > DECSIXEL_PARAMVALUE_MAX)
|
||||||
|
st->param = DECSIXEL_PARAMVALUE_MAX;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
st->repeat_count = st->param;
|
||||||
|
if (st->repeat_count == 0)
|
||||||
|
st->repeat_count = 1;
|
||||||
|
st->state = PS_DECSIXEL;
|
||||||
|
st->param = 0;
|
||||||
|
st->nparams = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PS_DECGCI:
|
||||||
|
/* DECGCI Graphics Color Introducer # Pc; Pu; Px; Py; Pz */
|
||||||
|
switch (*p) {
|
||||||
|
case '\x1b':
|
||||||
|
st->state = PS_ESC;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
st->param = st->param * 10 + *p - '0';
|
||||||
|
if (st->param > DECSIXEL_PARAMVALUE_MAX)
|
||||||
|
st->param = DECSIXEL_PARAMVALUE_MAX;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
case ';':
|
||||||
|
if (st->nparams < DECSIXEL_PARAMS_MAX)
|
||||||
|
st->params[st->nparams++] = st->param;
|
||||||
|
st->param = 0;
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
st->state = PS_DECSIXEL;
|
||||||
|
if (st->nparams < DECSIXEL_PARAMS_MAX)
|
||||||
|
st->params[st->nparams++] = st->param;
|
||||||
|
st->param = 0;
|
||||||
|
|
||||||
|
if (st->nparams > 0) {
|
||||||
|
st->color_index = 1 + st->params[0]; /* offset 1(background color) added */
|
||||||
|
if (st->color_index < 0)
|
||||||
|
st->color_index = 0;
|
||||||
|
else if (st->color_index >= DECSIXEL_PALETTE_MAX)
|
||||||
|
st->color_index = DECSIXEL_PALETTE_MAX - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st->nparams > 4) {
|
||||||
|
st->image.palette_modified = 1;
|
||||||
|
if (st->params[1] == 1) {
|
||||||
|
/* HLS */
|
||||||
|
if (st->params[2] > 360)
|
||||||
|
st->params[2] = 360;
|
||||||
|
if (st->params[3] > 100)
|
||||||
|
st->params[3] = 100;
|
||||||
|
if (st->params[4] > 100)
|
||||||
|
st->params[4] = 100;
|
||||||
|
image->palette[st->color_index]
|
||||||
|
= hls_to_rgb(st->params[2], st->params[3], st->params[4]);
|
||||||
|
} else if (st->params[1] == 2) {
|
||||||
|
/* RGB */
|
||||||
|
if (st->params[2] > 100)
|
||||||
|
st->params[2] = 100;
|
||||||
|
if (st->params[3] > 100)
|
||||||
|
st->params[3] = 100;
|
||||||
|
if (st->params[4] > 100)
|
||||||
|
st->params[4] = 100;
|
||||||
|
image->palette[st->color_index]
|
||||||
|
= SIXEL_XRGB(st->params[2], st->params[3], st->params[4]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = (0);
|
||||||
|
|
||||||
|
end:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sixel_parser_deinit(sixel_state_t *st)
|
||||||
|
{
|
||||||
|
if (st)
|
||||||
|
sixel_image_deinit(&st->image);
|
||||||
|
}
|
115
sixel_hls.c
Normal file
115
sixel_hls.c
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
// sixel.c (part of mintty)
|
||||||
|
// this function is derived from a part of graphics.c
|
||||||
|
// in Xterm pl#310 originally written by Ross Combs.
|
||||||
|
//
|
||||||
|
// Copyright 2013,2014 by Ross Combs
|
||||||
|
//
|
||||||
|
// All Rights Reserved
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
// IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
|
||||||
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
// Except as contained in this notice, the name(s) of the above copyright
|
||||||
|
// holders shall not be used in advertising or otherwise to promote the
|
||||||
|
// sale, use or other dealings in this Software without prior written
|
||||||
|
// authorization.
|
||||||
|
|
||||||
|
#define SIXEL_RGB(r, g, b) (((r) << 16) + ((g) << 8) + (b))
|
||||||
|
|
||||||
|
int
|
||||||
|
hls_to_rgb(int hue, int lum, int sat)
|
||||||
|
{
|
||||||
|
double hs = (hue + 240) % 360;
|
||||||
|
double hv = hs / 360.0;
|
||||||
|
double lv = lum / 100.0;
|
||||||
|
double sv = sat / 100.0;
|
||||||
|
double c, x, m, c2;
|
||||||
|
double r1, g1, b1;
|
||||||
|
int r, g, b;
|
||||||
|
int hpi;
|
||||||
|
|
||||||
|
if (sat == 0) {
|
||||||
|
r = g = b = lum * 255 / 100;
|
||||||
|
return SIXEL_RGB(r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((c2 = ((2.0 * lv) - 1.0)) < 0.0) {
|
||||||
|
c2 = -c2;
|
||||||
|
}
|
||||||
|
c = (1.0 - c2) * sv;
|
||||||
|
hpi = (int) (hv * 6.0);
|
||||||
|
x = (hpi & 1) ? c : 0.0;
|
||||||
|
m = lv - 0.5 * c;
|
||||||
|
|
||||||
|
switch (hpi) {
|
||||||
|
case 0:
|
||||||
|
r1 = c;
|
||||||
|
g1 = x;
|
||||||
|
b1 = 0.0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
r1 = x;
|
||||||
|
g1 = c;
|
||||||
|
b1 = 0.0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
r1 = 0.0;
|
||||||
|
g1 = c;
|
||||||
|
b1 = x;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
r1 = 0.0;
|
||||||
|
g1 = x;
|
||||||
|
b1 = c;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
r1 = x;
|
||||||
|
g1 = 0.0;
|
||||||
|
b1 = c;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
r1 = c;
|
||||||
|
g1 = 0.0;
|
||||||
|
b1 = x;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return SIXEL_RGB(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = (int) ((r1 + m) * 100.0 + 0.5);
|
||||||
|
g = (int) ((g1 + m) * 100.0 + 0.5);
|
||||||
|
b = (int) ((b1 + m) * 100.0 + 0.5);
|
||||||
|
|
||||||
|
if (r < 0) {
|
||||||
|
r = 0;
|
||||||
|
} else if (r > 100) {
|
||||||
|
r = 100;
|
||||||
|
}
|
||||||
|
if (g < 0) {
|
||||||
|
g = 0;
|
||||||
|
} else if (g > 100) {
|
||||||
|
g = 100;
|
||||||
|
}
|
||||||
|
if (b < 0) {
|
||||||
|
b = 0;
|
||||||
|
} else if (b > 100) {
|
||||||
|
b = 100;
|
||||||
|
}
|
||||||
|
return SIXEL_RGB(r * 255 / 100, g * 255 / 100, b * 255 / 100);
|
||||||
|
}
|
7
sixel_hls.h
Normal file
7
sixel_hls.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*
|
||||||
|
* Primary color hues:
|
||||||
|
* blue: 0 degrees
|
||||||
|
* red: 120 degrees
|
||||||
|
* green: 240 degrees
|
||||||
|
*/
|
||||||
|
int hls_to_rgb(int hue, int lum, int sat);
|
177
st.1
Normal file
177
st.1
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
.TH ST 1 st\-VERSION
|
||||||
|
.SH NAME
|
||||||
|
st \- simple terminal
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B st
|
||||||
|
.RB [ \-aiv ]
|
||||||
|
.RB [ \-c
|
||||||
|
.IR class ]
|
||||||
|
.RB [ \-f
|
||||||
|
.IR font ]
|
||||||
|
.RB [ \-g
|
||||||
|
.IR geometry ]
|
||||||
|
.RB [ \-n
|
||||||
|
.IR name ]
|
||||||
|
.RB [ \-o
|
||||||
|
.IR iofile ]
|
||||||
|
.RB [ \-T
|
||||||
|
.IR title ]
|
||||||
|
.RB [ \-t
|
||||||
|
.IR title ]
|
||||||
|
.RB [ \-l
|
||||||
|
.IR line ]
|
||||||
|
.RB [ \-w
|
||||||
|
.IR windowid ]
|
||||||
|
.RB [[ \-e ]
|
||||||
|
.IR command
|
||||||
|
.RI [ arguments ...]]
|
||||||
|
.PP
|
||||||
|
.B st
|
||||||
|
.RB [ \-aiv ]
|
||||||
|
.RB [ \-c
|
||||||
|
.IR class ]
|
||||||
|
.RB [ \-f
|
||||||
|
.IR font ]
|
||||||
|
.RB [ \-g
|
||||||
|
.IR geometry ]
|
||||||
|
.RB [ \-n
|
||||||
|
.IR name ]
|
||||||
|
.RB [ \-o
|
||||||
|
.IR iofile ]
|
||||||
|
.RB [ \-T
|
||||||
|
.IR title ]
|
||||||
|
.RB [ \-t
|
||||||
|
.IR title ]
|
||||||
|
.RB [ \-w
|
||||||
|
.IR windowid ]
|
||||||
|
.RB \-l
|
||||||
|
.IR line
|
||||||
|
.RI [ stty_args ...]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B st
|
||||||
|
is a simple terminal emulator.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B \-a
|
||||||
|
disable alternate screens in terminal
|
||||||
|
.TP
|
||||||
|
.BI \-c " class"
|
||||||
|
defines the window class (default $TERM).
|
||||||
|
.TP
|
||||||
|
.BI \-f " font"
|
||||||
|
defines the
|
||||||
|
.I font
|
||||||
|
to use when st is run.
|
||||||
|
.TP
|
||||||
|
.BI \-g " geometry"
|
||||||
|
defines the X11 geometry string.
|
||||||
|
The form is [=][<cols>{xX}<rows>][{+-}<xoffset>{+-}<yoffset>]. See
|
||||||
|
.BR XParseGeometry (3)
|
||||||
|
for further details.
|
||||||
|
.TP
|
||||||
|
.B \-i
|
||||||
|
will fixate the position given with the -g option.
|
||||||
|
.TP
|
||||||
|
.BI \-n " name"
|
||||||
|
defines the window instance name (default $TERM).
|
||||||
|
.TP
|
||||||
|
.BI \-o " iofile"
|
||||||
|
writes all the I/O to
|
||||||
|
.I iofile.
|
||||||
|
This feature is useful when recording st sessions. A value of "-" means
|
||||||
|
standard output.
|
||||||
|
.TP
|
||||||
|
.BI \-T " title"
|
||||||
|
defines the window title (default 'st').
|
||||||
|
.TP
|
||||||
|
.BI \-t " title"
|
||||||
|
defines the window title (default 'st').
|
||||||
|
.TP
|
||||||
|
.BI \-w " windowid"
|
||||||
|
embeds st within the window identified by
|
||||||
|
.I windowid
|
||||||
|
.TP
|
||||||
|
.BI \-l " line"
|
||||||
|
use a tty
|
||||||
|
.I line
|
||||||
|
instead of a pseudo terminal.
|
||||||
|
.I line
|
||||||
|
should be a (pseudo-)serial device (e.g. /dev/ttyS0 on Linux for serial port
|
||||||
|
0).
|
||||||
|
When this flag is given
|
||||||
|
remaining arguments are used as flags for
|
||||||
|
.BR stty(1).
|
||||||
|
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
|
||||||
|
(e.g. 'st -l /dev/ttyS0 115200'). Arguments before the last one are
|
||||||
|
.BR stty(1)
|
||||||
|
flags. If you want to set odd parity on 115200 baud use for example 'st -l
|
||||||
|
/dev/ttyS0 parenb parodd 115200'. Set the number of bits by using for
|
||||||
|
example 'st -l /dev/ttyS0 cs7 115200'. See
|
||||||
|
.BR stty(1)
|
||||||
|
for more arguments and cases.
|
||||||
|
.TP
|
||||||
|
.B \-v
|
||||||
|
prints version information to stderr, then exits.
|
||||||
|
.TP
|
||||||
|
.BI \-e " command " [ " arguments " "... ]"
|
||||||
|
st executes
|
||||||
|
.I command
|
||||||
|
instead of the shell. If this is used it
|
||||||
|
.B must be the last option
|
||||||
|
on the command line, as in xterm / rxvt.
|
||||||
|
This option is only intended for compatibility,
|
||||||
|
and all the remaining arguments are used as a command
|
||||||
|
even without it.
|
||||||
|
.SH SHORTCUTS
|
||||||
|
.TP
|
||||||
|
.B Break
|
||||||
|
Send a break in the serial line.
|
||||||
|
Break key is obtained in PC keyboards
|
||||||
|
pressing at the same time control and pause.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Print Screen
|
||||||
|
Toggle if st should print to the
|
||||||
|
.I iofile.
|
||||||
|
.TP
|
||||||
|
.B Shift-Print Screen
|
||||||
|
Print the full screen to the
|
||||||
|
.I iofile.
|
||||||
|
.TP
|
||||||
|
.B Print Screen
|
||||||
|
Print the selection to the
|
||||||
|
.I iofile.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-Page Up
|
||||||
|
Increase font size.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-Page Down
|
||||||
|
Decrease font size.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-Home
|
||||||
|
Reset to default font size.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-y
|
||||||
|
Paste from primary selection (middle mouse button).
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-c
|
||||||
|
Copy the selected text to the clipboard selection.
|
||||||
|
.TP
|
||||||
|
.B Ctrl-Shift-v
|
||||||
|
Paste from the clipboard selection.
|
||||||
|
.SH CUSTOMIZATION
|
||||||
|
.B st
|
||||||
|
can be customized by creating a custom config.h and (re)compiling the source
|
||||||
|
code. This keeps it fast, secure and simple.
|
||||||
|
.SH AUTHORS
|
||||||
|
See the LICENSE file for the authors.
|
||||||
|
.SH LICENSE
|
||||||
|
See the LICENSE file for the terms of redistribution.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR tabbed (1),
|
||||||
|
.BR utmp (1),
|
||||||
|
.BR stty (1),
|
||||||
|
.BR scroll (1)
|
||||||
|
.SH BUGS
|
||||||
|
See the TODO file in the distribution.
|
||||||
|
|
8
st.desktop
Normal file
8
st.desktop
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=st
|
||||||
|
Comment=st is a simple terminal implementation for X
|
||||||
|
Exec=st
|
||||||
|
Icon=utilities-terminal
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Categories=System;TerminalEmulator;
|
310
st.h
Normal file
310
st.h
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
/* See LICENSE for license details. */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/cursorfont.h>
|
||||||
|
#include <X11/keysym.h>
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
|
|
||||||
|
/* 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 DEFAULT(a, b) (a) = (a) ? (a) : (b)
|
||||||
|
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
|
||||||
|
#define ATTRCMP(a, b) (((a).mode & (~ATTR_WRAP) & (~ATTR_LIGA)) != ((b).mode & (~ATTR_WRAP) & (~ATTR_LIGA)) || \
|
||||||
|
(a).fg != (b).fg || \
|
||||||
|
(a).bg != (b).bg)
|
||||||
|
#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))
|
||||||
|
#define HISTSIZE 2000
|
||||||
|
|
||||||
|
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_BOXDRAW = 1 << 11,
|
||||||
|
ATTR_LIGA = 1 << 12,
|
||||||
|
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
||||||
|
ATTR_DIRTYUNDERLINE = 1 << 15,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum drawing_mode {
|
||||||
|
DRAW_NONE = 0,
|
||||||
|
DRAW_BG = 1 << 0,
|
||||||
|
DRAW_FG = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Used to control which screen(s) keybindings and mouse shortcuts apply to. */
|
||||||
|
enum screen {
|
||||||
|
S_PRI = -1, /* primary screen */
|
||||||
|
S_ALL = 0, /* both primary and alt screen */
|
||||||
|
S_ALT = 1 /* alternate screen */
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef unsigned char uchar;
|
||||||
|
typedef unsigned int uint;
|
||||||
|
typedef unsigned long ulong;
|
||||||
|
typedef unsigned short ushort;
|
||||||
|
|
||||||
|
typedef uint_least32_t Rune;
|
||||||
|
|
||||||
|
typedef XftDraw *Draw;
|
||||||
|
typedef XftColor Color;
|
||||||
|
typedef XftGlyphFontSpec GlyphFontSpec;
|
||||||
|
|
||||||
|
#define Glyph Glyph_
|
||||||
|
typedef struct {
|
||||||
|
Rune u; /* character code */
|
||||||
|
ushort mode; /* attribute flags */
|
||||||
|
uint32_t fg; /* foreground */
|
||||||
|
uint32_t bg; /* background */
|
||||||
|
int ustyle; /* underline style */
|
||||||
|
int ucolor[3]; /* underline color */
|
||||||
|
} 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 */
|
||||||
|
int maxcol;
|
||||||
|
Line *line; /* screen */
|
||||||
|
Line *alt; /* alternate screen */
|
||||||
|
Line hist[HISTSIZE]; /* history buffer */
|
||||||
|
int histi; /* history index */
|
||||||
|
int histn; /* number of history entries */
|
||||||
|
int scr; /* scroll back */
|
||||||
|
int *dirty; /* dirtyness of lines */
|
||||||
|
TCursor c; /* cursor */
|
||||||
|
int ocx; /* old cursor col */
|
||||||
|
int ocy; /* old cursor row */
|
||||||
|
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 *tabs;
|
||||||
|
Rune lastc; /* last printed char outside of sequence, 0 if control */
|
||||||
|
} Term;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
int i;
|
||||||
|
uint ui;
|
||||||
|
float f;
|
||||||
|
const void *v;
|
||||||
|
const char *s;
|
||||||
|
} Arg;
|
||||||
|
|
||||||
|
/* Purely graphic info */
|
||||||
|
typedef struct {
|
||||||
|
int tw, th; /* tty width and height */
|
||||||
|
int w, h; /* window width and height */
|
||||||
|
int hborderpx, vborderpx;
|
||||||
|
int ch; /* char height */
|
||||||
|
int cw; /* char width */
|
||||||
|
int cyo; /* char y offset */
|
||||||
|
int mode; /* window state/mode flags */
|
||||||
|
int cursor; /* cursor style */
|
||||||
|
} TermWindow;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Display *dpy;
|
||||||
|
Colormap cmap;
|
||||||
|
Window win;
|
||||||
|
Drawable buf;
|
||||||
|
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
|
||||||
|
Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid;
|
||||||
|
Atom netwmicon;
|
||||||
|
struct {
|
||||||
|
XIM xim;
|
||||||
|
XIC xic;
|
||||||
|
XPoint spot;
|
||||||
|
XVaNestedList spotlist;
|
||||||
|
} ime;
|
||||||
|
Draw draw;
|
||||||
|
Visual *vis;
|
||||||
|
XSetWindowAttributes attrs;
|
||||||
|
/* Here, we use the term *pointer* to differentiate the cursor
|
||||||
|
* one sees when hovering the mouse over the terminal from, e.g.,
|
||||||
|
* a green rectangle where text would be entered. */
|
||||||
|
Cursor vpointer, bpointer; /* visible and hidden pointers */
|
||||||
|
int pointerisvisible;
|
||||||
|
Cursor upointer;
|
||||||
|
int scr;
|
||||||
|
int isfixed; /* is fixed geometry? */
|
||||||
|
int l, t; /* left and top offset */
|
||||||
|
int gm; /* geometry mask */
|
||||||
|
} XWindow;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Atom xtarget;
|
||||||
|
char *primary, *clipboard;
|
||||||
|
struct timespec tclick1;
|
||||||
|
struct timespec tclick2;
|
||||||
|
} XSelection;
|
||||||
|
|
||||||
|
/* types used in config.h */
|
||||||
|
typedef struct {
|
||||||
|
uint mod;
|
||||||
|
KeySym keysym;
|
||||||
|
void (*func)(const Arg *);
|
||||||
|
const Arg arg;
|
||||||
|
int screen;
|
||||||
|
} Shortcut;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint mod;
|
||||||
|
uint button;
|
||||||
|
void (*func)(const Arg *);
|
||||||
|
const Arg arg;
|
||||||
|
uint release;
|
||||||
|
int screen;
|
||||||
|
} MouseShortcut;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
KeySym k;
|
||||||
|
uint mask;
|
||||||
|
char *s;
|
||||||
|
/* three-valued logic variables: 0 indifferent, 1 on, -1 off */
|
||||||
|
signed char appkey; /* application keypad */
|
||||||
|
signed char appcursor; /* application cursor */
|
||||||
|
} Key;
|
||||||
|
|
||||||
|
/* Font structure */
|
||||||
|
#define Font Font_
|
||||||
|
typedef struct {
|
||||||
|
int height;
|
||||||
|
int width;
|
||||||
|
int ascent;
|
||||||
|
int descent;
|
||||||
|
int badslant;
|
||||||
|
int badweight;
|
||||||
|
short lbearing;
|
||||||
|
short rbearing;
|
||||||
|
XftFont *match;
|
||||||
|
FcFontSet *set;
|
||||||
|
FcPattern *pattern;
|
||||||
|
} Font;
|
||||||
|
|
||||||
|
/* Drawing Context */
|
||||||
|
typedef struct {
|
||||||
|
Color *col;
|
||||||
|
size_t collen;
|
||||||
|
Font font, bfont, ifont, ibfont;
|
||||||
|
GC gc;
|
||||||
|
} DC;
|
||||||
|
|
||||||
|
void die(const char *, ...);
|
||||||
|
void redraw(void);
|
||||||
|
void draw(void);
|
||||||
|
void drawregion(int, int, int, int);
|
||||||
|
void tfulldirt(void);
|
||||||
|
|
||||||
|
void printscreen(const Arg *);
|
||||||
|
void printsel(const Arg *);
|
||||||
|
void sendbreak(const Arg *);
|
||||||
|
void toggleprinter(const Arg *);
|
||||||
|
|
||||||
|
int tattrset(int);
|
||||||
|
int tisaltscr(void);
|
||||||
|
void tnew(int, int);
|
||||||
|
void tresize(int, int);
|
||||||
|
void tsetdirtattr(int);
|
||||||
|
void ttyhangup(void);
|
||||||
|
int ttynew(const char *, char *, const char *, char **);
|
||||||
|
size_t ttyread(void);
|
||||||
|
void ttyresize(int, int);
|
||||||
|
void ttywrite(const char *, size_t, int);
|
||||||
|
|
||||||
|
void resettitle(void);
|
||||||
|
|
||||||
|
void selclear(void);
|
||||||
|
void selinit(void);
|
||||||
|
void selstart(int, int, int);
|
||||||
|
void selextend(int, int, int, int);
|
||||||
|
int selected(int, int);
|
||||||
|
char *getsel(void);
|
||||||
|
|
||||||
|
size_t utf8encode(Rune, char *);
|
||||||
|
|
||||||
|
void *xmalloc(size_t);
|
||||||
|
void *xrealloc(void *, size_t);
|
||||||
|
char *xstrdup(const char *);
|
||||||
|
|
||||||
|
int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
|
||||||
|
|
||||||
|
int isboxdraw(Rune);
|
||||||
|
ushort boxdrawindex(const Glyph *);
|
||||||
|
#ifdef XFT_VERSION
|
||||||
|
/* only exposed to x.c, otherwise we'll need Xft.h for the types */
|
||||||
|
void boxdraw_xinit(Display *, Colormap, XftDraw *, Visual *);
|
||||||
|
void drawboxes(int, int, int, int, XftColor *, XftColor *, const XftGlyphFontSpec *, int);
|
||||||
|
#endif // XFT_VERSION
|
||||||
|
|
||||||
|
/* config.h globals */
|
||||||
|
extern char *utmp;
|
||||||
|
extern char *scroll;
|
||||||
|
extern char *stty_args;
|
||||||
|
extern char *vtiden;
|
||||||
|
extern wchar_t *worddelimiters;
|
||||||
|
extern int allowaltscreen;
|
||||||
|
extern int allowwindowops;
|
||||||
|
extern char *termname;
|
||||||
|
extern unsigned int tabspaces;
|
||||||
|
extern unsigned int defaultfg;
|
||||||
|
extern unsigned int defaultbg;
|
||||||
|
extern unsigned int defaultcs;
|
||||||
|
|
||||||
|
extern const int boxdraw, boxdraw_bold, boxdraw_braille;
|
||||||
|
|
||||||
|
extern DC dc;
|
||||||
|
extern XWindow xw;
|
||||||
|
extern XSelection xsel;
|
||||||
|
extern TermWindow win;
|
||||||
|
extern Term term;
|
248
st.info
Normal file
248
st.info
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
st-mono| simpleterm monocolor,
|
||||||
|
# undercurl patch / UNDERCURL_PATCH
|
||||||
|
Su,
|
||||||
|
acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
|
||||||
|
am,
|
||||||
|
bce,
|
||||||
|
bel=^G,
|
||||||
|
blink=\E[5m,
|
||||||
|
bold=\E[1m,
|
||||||
|
cbt=\E[Z,
|
||||||
|
cvvis=\E[?25h,
|
||||||
|
civis=\E[?25l,
|
||||||
|
clear=\E[H\E[2J,
|
||||||
|
cnorm=\E[?12l\E[?25h,
|
||||||
|
colors#2,
|
||||||
|
cols#80,
|
||||||
|
cr=^M,
|
||||||
|
csr=\E[%i%p1%d;%p2%dr,
|
||||||
|
cub=\E[%p1%dD,
|
||||||
|
cub1=^H,
|
||||||
|
cud1=^J,
|
||||||
|
cud=\E[%p1%dB,
|
||||||
|
cuf1=\E[C,
|
||||||
|
cuf=\E[%p1%dC,
|
||||||
|
cup=\E[%i%p1%d;%p2%dH,
|
||||||
|
cuu1=\E[A,
|
||||||
|
cuu=\E[%p1%dA,
|
||||||
|
dch=\E[%p1%dP,
|
||||||
|
dch1=\E[P,
|
||||||
|
dim=\E[2m,
|
||||||
|
dl=\E[%p1%dM,
|
||||||
|
dl1=\E[M,
|
||||||
|
ech=\E[%p1%dX,
|
||||||
|
ed=\E[J,
|
||||||
|
el=\E[K,
|
||||||
|
el1=\E[1K,
|
||||||
|
enacs=\E)0,
|
||||||
|
E3=\E[3J,
|
||||||
|
flash=\E[?5h$<80/>\E[?5l,
|
||||||
|
fsl=^G,
|
||||||
|
home=\E[H,
|
||||||
|
hpa=\E[%i%p1%dG,
|
||||||
|
hs,
|
||||||
|
ht=^I,
|
||||||
|
hts=\EH,
|
||||||
|
ich=\E[%p1%d@,
|
||||||
|
il1=\E[L,
|
||||||
|
il=\E[%p1%dL,
|
||||||
|
ind=^J,
|
||||||
|
indn=\E[%p1%dS,
|
||||||
|
invis=\E[8m,
|
||||||
|
is2=\E[4l\E>\E[?1034l,
|
||||||
|
it#8,
|
||||||
|
kel=\E[1;2F,
|
||||||
|
ked=\E[1;5F,
|
||||||
|
ka1=\E[1~,
|
||||||
|
ka3=\E[5~,
|
||||||
|
kc1=\E[4~,
|
||||||
|
kc3=\E[6~,
|
||||||
|
kbs=\177,
|
||||||
|
kcbt=\E[Z,
|
||||||
|
kb2=\EOu,
|
||||||
|
kcub1=\EOD,
|
||||||
|
kcud1=\EOB,
|
||||||
|
kcuf1=\EOC,
|
||||||
|
kcuu1=\EOA,
|
||||||
|
kDC=\E[3;2~,
|
||||||
|
kent=\EOM,
|
||||||
|
kEND=\E[1;2F,
|
||||||
|
kIC=\E[2;2~,
|
||||||
|
kNXT=\E[6;2~,
|
||||||
|
kPRV=\E[5;2~,
|
||||||
|
kHOM=\E[1;2H,
|
||||||
|
kLFT=\E[1;2D,
|
||||||
|
kRIT=\E[1;2C,
|
||||||
|
kind=\E[1;2B,
|
||||||
|
kri=\E[1;2A,
|
||||||
|
kclr=\E[3;5~,
|
||||||
|
kdl1=\E[3;2~,
|
||||||
|
kdch1=\E[3~,
|
||||||
|
kich1=\E[2~,
|
||||||
|
kend=\E[4~,
|
||||||
|
kf1=\EOP,
|
||||||
|
kf2=\EOQ,
|
||||||
|
kf3=\EOR,
|
||||||
|
kf4=\EOS,
|
||||||
|
kf5=\E[15~,
|
||||||
|
kf6=\E[17~,
|
||||||
|
kf7=\E[18~,
|
||||||
|
kf8=\E[19~,
|
||||||
|
kf9=\E[20~,
|
||||||
|
kf10=\E[21~,
|
||||||
|
kf11=\E[23~,
|
||||||
|
kf12=\E[24~,
|
||||||
|
kf13=\E[1;2P,
|
||||||
|
kf14=\E[1;2Q,
|
||||||
|
kf15=\E[1;2R,
|
||||||
|
kf16=\E[1;2S,
|
||||||
|
kf17=\E[15;2~,
|
||||||
|
kf18=\E[17;2~,
|
||||||
|
kf19=\E[18;2~,
|
||||||
|
kf20=\E[19;2~,
|
||||||
|
kf21=\E[20;2~,
|
||||||
|
kf22=\E[21;2~,
|
||||||
|
kf23=\E[23;2~,
|
||||||
|
kf24=\E[24;2~,
|
||||||
|
kf25=\E[1;5P,
|
||||||
|
kf26=\E[1;5Q,
|
||||||
|
kf27=\E[1;5R,
|
||||||
|
kf28=\E[1;5S,
|
||||||
|
kf29=\E[15;5~,
|
||||||
|
kf30=\E[17;5~,
|
||||||
|
kf31=\E[18;5~,
|
||||||
|
kf32=\E[19;5~,
|
||||||
|
kf33=\E[20;5~,
|
||||||
|
kf34=\E[21;5~,
|
||||||
|
kf35=\E[23;5~,
|
||||||
|
kf36=\E[24;5~,
|
||||||
|
kf37=\E[1;6P,
|
||||||
|
kf38=\E[1;6Q,
|
||||||
|
kf39=\E[1;6R,
|
||||||
|
kf40=\E[1;6S,
|
||||||
|
kf41=\E[15;6~,
|
||||||
|
kf42=\E[17;6~,
|
||||||
|
kf43=\E[18;6~,
|
||||||
|
kf44=\E[19;6~,
|
||||||
|
kf45=\E[20;6~,
|
||||||
|
kf46=\E[21;6~,
|
||||||
|
kf47=\E[23;6~,
|
||||||
|
kf48=\E[24;6~,
|
||||||
|
kf49=\E[1;3P,
|
||||||
|
kf50=\E[1;3Q,
|
||||||
|
kf51=\E[1;3R,
|
||||||
|
kf52=\E[1;3S,
|
||||||
|
kf53=\E[15;3~,
|
||||||
|
kf54=\E[17;3~,
|
||||||
|
kf55=\E[18;3~,
|
||||||
|
kf56=\E[19;3~,
|
||||||
|
kf57=\E[20;3~,
|
||||||
|
kf58=\E[21;3~,
|
||||||
|
kf59=\E[23;3~,
|
||||||
|
kf60=\E[24;3~,
|
||||||
|
kf61=\E[1;4P,
|
||||||
|
kf62=\E[1;4Q,
|
||||||
|
kf63=\E[1;4R,
|
||||||
|
khome=\E[1~,
|
||||||
|
kil1=\E[2;5~,
|
||||||
|
krmir=\E[2;2~,
|
||||||
|
knp=\E[6~,
|
||||||
|
kmous=\E[M,
|
||||||
|
kpp=\E[5~,
|
||||||
|
lines#24,
|
||||||
|
mir,
|
||||||
|
msgr,
|
||||||
|
npc,
|
||||||
|
op=\E[39;49m,
|
||||||
|
pairs#64,
|
||||||
|
mc0=\E[i,
|
||||||
|
mc4=\E[4i,
|
||||||
|
mc5=\E[5i,
|
||||||
|
rc=\E8,
|
||||||
|
rev=\E[7m,
|
||||||
|
ri=\EM,
|
||||||
|
rin=\E[%p1%dT,
|
||||||
|
ritm=\E[23m,
|
||||||
|
rmacs=\E(B,
|
||||||
|
# CSI 22, 23 patch / CSI_22_23_PATCH
|
||||||
|
# rmcup=\E[?1049l,
|
||||||
|
rmcup=\E[?1049l\E[23;0;0t,
|
||||||
|
rmir=\E[4l,
|
||||||
|
rmkx=\E[?1l\E>,
|
||||||
|
rmso=\E[27m,
|
||||||
|
rmul=\E[24m,
|
||||||
|
rs1=\Ec,
|
||||||
|
rs2=\E[4l\E>\E[?1034l,
|
||||||
|
sc=\E7,
|
||||||
|
sitm=\E[3m,
|
||||||
|
sgr0=\E[0m,
|
||||||
|
smacs=\E(0,
|
||||||
|
# CSI 22, 23 patch / CSI_22_23_PATCH
|
||||||
|
# smcup=\E[?1049h,
|
||||||
|
smcup=\E[?1049h\E[22;0;0t,
|
||||||
|
smir=\E[4h,
|
||||||
|
smkx=\E[?1h\E=,
|
||||||
|
smso=\E[7m,
|
||||||
|
smul=\E[4m,
|
||||||
|
tbc=\E[3g,
|
||||||
|
tsl=\E]0;,
|
||||||
|
xenl,
|
||||||
|
vpa=\E[%i%p1%dd,
|
||||||
|
# XTerm extensions
|
||||||
|
rmxx=\E[29m,
|
||||||
|
smxx=\E[9m,
|
||||||
|
# disabled rep for now: causes some issues with older ncurses versions.
|
||||||
|
# rep=%p1%c\E[%p2%{1}%-%db,
|
||||||
|
# tmux extensions, see TERMINFO EXTENSIONS in tmux(1)
|
||||||
|
Tc,
|
||||||
|
Ms=\E]52;%p1%s;%p2%s\007,
|
||||||
|
Se=\E[2 q,
|
||||||
|
Ss=\E[%p1%d q,
|
||||||
|
# sync patch / SYNC_PATCH
|
||||||
|
Sync=\EP=%p1%ds\E\\,
|
||||||
|
|
||||||
|
st| simpleterm,
|
||||||
|
use=st-mono,
|
||||||
|
colors#8,
|
||||||
|
setab=\E[4%p1%dm,
|
||||||
|
setaf=\E[3%p1%dm,
|
||||||
|
setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
|
||||||
|
setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
|
||||||
|
sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
|
||||||
|
|
||||||
|
st-256color| simpleterm with 256 colors,
|
||||||
|
use=st,
|
||||||
|
ccc,
|
||||||
|
colors#256,
|
||||||
|
oc=\E]104\007,
|
||||||
|
pairs#32767,
|
||||||
|
# Nicked from xterm-256color
|
||||||
|
initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
|
||||||
|
setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
|
||||||
|
setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
|
||||||
|
|
||||||
|
st-meta| simpleterm with meta key,
|
||||||
|
use=st,
|
||||||
|
km,
|
||||||
|
rmm=\E[?1034l,
|
||||||
|
smm=\E[?1034h,
|
||||||
|
rs2=\E[4l\E>\E[?1034h,
|
||||||
|
is2=\E[4l\E>\E[?1034h,
|
||||||
|
|
||||||
|
st-meta-256color| simpleterm with meta key and 256 colors,
|
||||||
|
use=st-256color,
|
||||||
|
km,
|
||||||
|
rmm=\E[?1034l,
|
||||||
|
smm=\E[?1034h,
|
||||||
|
rs2=\E[4l\E>\E[?1034h,
|
||||||
|
is2=\E[4l\E>\E[?1034h,
|
||||||
|
|
||||||
|
st-bs| simpleterm with backspace as backspace,
|
||||||
|
use=st,
|
||||||
|
kbs=\010,
|
||||||
|
kdch1=\177,
|
||||||
|
|
||||||
|
st-bs-256color| simpleterm with backspace as backspace and 256colors,
|
||||||
|
use=st-256color,
|
||||||
|
kbs=\010,
|
||||||
|
kdch1=\177,
|
43
win.h
Normal file
43
win.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/* See LICENSE for license details. */
|
||||||
|
|
||||||
|
enum win_mode {
|
||||||
|
MODE_VISIBLE = 1 << 0,
|
||||||
|
MODE_FOCUSED = 1 << 1,
|
||||||
|
MODE_APPKEYPAD = 1 << 2,
|
||||||
|
MODE_MOUSEBTN = 1 << 3,
|
||||||
|
MODE_MOUSEMOTION = 1 << 4,
|
||||||
|
MODE_REVERSE = 1 << 5,
|
||||||
|
MODE_KBDLOCK = 1 << 6,
|
||||||
|
MODE_HIDE = 1 << 7,
|
||||||
|
MODE_APPCURSOR = 1 << 8,
|
||||||
|
MODE_MOUSESGR = 1 << 9,
|
||||||
|
MODE_8BIT = 1 << 10,
|
||||||
|
MODE_BLINK = 1 << 11,
|
||||||
|
MODE_FBLINK = 1 << 12,
|
||||||
|
MODE_FOCUS = 1 << 13,
|
||||||
|
MODE_MOUSEX10 = 1 << 14,
|
||||||
|
MODE_MOUSEMANY = 1 << 15,
|
||||||
|
MODE_BRCKTPASTE = 1 << 16,
|
||||||
|
MODE_NUMLOCK = 1 << 17,
|
||||||
|
MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
|
||||||
|
|MODE_MOUSEMANY,
|
||||||
|
};
|
||||||
|
|
||||||
|
void xbell(void);
|
||||||
|
void xclipcopy(void);
|
||||||
|
void xdrawcursor(int, int, Glyph, int, int, Glyph, Line, int);
|
||||||
|
void xdrawline(Line, int, int, int);
|
||||||
|
void xfinishdraw(void);
|
||||||
|
void xloadcols(void);
|
||||||
|
int xsetcolorname(int, const char *);
|
||||||
|
void xseticontitle(char *);
|
||||||
|
void xfreetitlestack(void);
|
||||||
|
void xsettitle(char *, int);
|
||||||
|
void xpushtitle(void);
|
||||||
|
int xsetcursor(int);
|
||||||
|
void xsetmode(int, unsigned int);
|
||||||
|
void xsetpointermotion(int);
|
||||||
|
void xsetsel(char *);
|
||||||
|
int xstartdraw(void);
|
||||||
|
void xximspot(int, int);
|
||||||
|
void xclearwin(void);
|
Reference in a new issue