Compare commits
77 Commits
Author | SHA1 | Date | |
---|---|---|---|
6e79e8357e | |||
308bfbf6be | |||
c4f245eccd | |||
2251f6465a | |||
235b438e68 | |||
528241aa38 | |||
60aeb37edb | |||
66556d9670 | |||
39964614b7 | |||
0e48a1995e | |||
6d8f85232e | |||
034a5c8a09 | |||
30440295bc | |||
4fdba860c8 | |||
6d636beb22 | |||
6e70bb97d4 | |||
82335583eb | |||
0cd5117a2c | |||
bd5fdbe64c | |||
504a165277 | |||
9031e228ce | |||
610723a58f | |||
ff241199ed | |||
375b28720f | |||
d836561b96 | |||
00873e65ee | |||
9f6d8845df | |||
f0398db4d1 | |||
e2aa03e6b7 | |||
f56c58a968 | |||
293f573efd | |||
2ea02c937e | |||
80fe97f8a6 | |||
a2a60f0a2c | |||
52d0e82df7 | |||
78b04865fb | |||
f7b80caebe | |||
594a259836 | |||
91c70213d1 | |||
2677296147 | |||
5ece2b5f4a | |||
2bef36ab81 | |||
1682484327 | |||
4be353e381 | |||
20d53cebc1 | |||
bf8c71e429 | |||
5d2d9d540d | |||
a1ed5071e5 | |||
3ba9c8fc3f | |||
1f087aa8b7 | |||
473326f2e3 | |||
aa5d4c3b34 | |||
080a5ae425 | |||
9eeb4e1ea2 | |||
0c94f8621b | |||
0d838b7243 | |||
7e61f5e4c5 | |||
9984ad4ba7 | |||
ee5cad439b | |||
dc33d1d66e | |||
b5e29cce52 | |||
4a193b9686 | |||
1d348e98e3 | |||
62756fdb49 | |||
d032b61597 | |||
684c72d05e | |||
b823f57fa0 | |||
684f0a0729 | |||
d3c7b6fb73 | |||
41f70a1cff | |||
261ea4b7e0 | |||
f8c6e7d041 | |||
539afe3af1 | |||
f1307d91e2 | |||
13233574ed | |||
9de853a98d | |||
abfad4c4fc |
2
LICENSE
2
LICENSE
@ -10,7 +10,7 @@ MIT/X Consortium License
|
|||||||
© 2013 Eric Pruitt <eric.pruitt at gmail dot com>
|
© 2013 Eric Pruitt <eric.pruitt at gmail dot com>
|
||||||
© 2013 Michael Forney <mforney at mforney dot org>
|
© 2013 Michael Forney <mforney at mforney dot org>
|
||||||
© 2013-2014 Markus Teich <markus dot teich at stusta dot mhn dot de>
|
© 2013-2014 Markus Teich <markus dot teich at stusta dot mhn dot de>
|
||||||
© 2014 Laslo Hunhold <dev at frign dot de>
|
© 2014-2015 Laslo Hunhold <dev at frign dot de>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
19
arg.h
19
arg.h
@ -10,8 +10,8 @@ extern char *argv0;
|
|||||||
|
|
||||||
/* use main(int argc, char *argv[]) */
|
/* use main(int argc, char *argv[]) */
|
||||||
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
||||||
argv[0] && argv[0][1]\
|
argv[0] && argv[0][0] == '-'\
|
||||||
&& argv[0][0] == '-';\
|
&& argv[0][1];\
|
||||||
argc--, argv++) {\
|
argc--, argv++) {\
|
||||||
char argc_;\
|
char argc_;\
|
||||||
char **argv_;\
|
char **argv_;\
|
||||||
@ -28,26 +28,11 @@ extern char *argv0;
|
|||||||
break;\
|
break;\
|
||||||
argc_ = argv[0][0];\
|
argc_ = argv[0][0];\
|
||||||
switch (argc_)
|
switch (argc_)
|
||||||
|
|
||||||
/* Handles obsolete -NUM syntax */
|
|
||||||
#define ARGNUM case '0':\
|
|
||||||
case '1':\
|
|
||||||
case '2':\
|
|
||||||
case '3':\
|
|
||||||
case '4':\
|
|
||||||
case '5':\
|
|
||||||
case '6':\
|
|
||||||
case '7':\
|
|
||||||
case '8':\
|
|
||||||
case '9'
|
|
||||||
|
|
||||||
#define ARGEND }\
|
#define ARGEND }\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ARGC() argc_
|
#define ARGC() argc_
|
||||||
|
|
||||||
#define ARGNUMF(base) (brk_ = 1, estrtol(argv[0], (base)))
|
|
||||||
|
|
||||||
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
||||||
((x), abort(), (char *)0) :\
|
((x), abort(), (char *)0) :\
|
||||||
(brk_ = 1, (argv[0][1] != '\0')?\
|
(brk_ = 1, (argv[0][1] != '\0')?\
|
||||||
|
82
config.def.h
82
config.def.h
@ -5,11 +5,20 @@
|
|||||||
*
|
*
|
||||||
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
|
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
|
||||||
*/
|
*/
|
||||||
static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=false";
|
static char font[] = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
|
||||||
static int borderpx = 2;
|
static int borderpx = 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* What program is execed by st depends of these precedence rules:
|
||||||
|
* 1: program passed with -e
|
||||||
|
* 2: utmp option
|
||||||
|
* 3: SHELL environment variable
|
||||||
|
* 4: value of shell in /etc/passwd
|
||||||
|
* 5: value of shell in config.h
|
||||||
|
*/
|
||||||
static char shell[] = "/bin/sh";
|
static char shell[] = "/bin/sh";
|
||||||
static char *utmp = NULL;
|
static char *utmp = NULL;
|
||||||
static char stty_args[] = "stty raw -echo -iexten echonl";
|
static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400";
|
||||||
|
|
||||||
/* identification sequence returned in DA and DECID */
|
/* identification sequence returned in DA and DECID */
|
||||||
static char vtiden[] = "\033[?6c";
|
static char vtiden[] = "\033[?6c";
|
||||||
@ -30,7 +39,7 @@ static unsigned int doubleclicktimeout = 300;
|
|||||||
static unsigned int tripleclicktimeout = 600;
|
static unsigned int tripleclicktimeout = 600;
|
||||||
|
|
||||||
/* alt screens */
|
/* alt screens */
|
||||||
static bool allowaltscreen = true;
|
static int allowaltscreen = 1;
|
||||||
|
|
||||||
/* frames per second st should at maximum draw to the screen */
|
/* frames per second st should at maximum draw to the screen */
|
||||||
static unsigned int xfps = 120;
|
static unsigned int xfps = 120;
|
||||||
@ -53,12 +62,26 @@ static unsigned int cursorthickness = 2;
|
|||||||
*/
|
*/
|
||||||
static int bellvolume = 0;
|
static int bellvolume = 0;
|
||||||
|
|
||||||
/* TERM value */
|
/* default TERM value */
|
||||||
static char termname[] = "st-256color";
|
static 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
|
||||||
|
*/
|
||||||
static unsigned int tabspaces = 8;
|
static unsigned int tabspaces = 8;
|
||||||
|
|
||||||
|
|
||||||
/* Terminal colors (16 first used in escape sequence) */
|
/* Terminal colors (16 first used in escape sequence) */
|
||||||
static const char *colorname[] = {
|
static const char *colorname[] = {
|
||||||
/* 8 normal colors */
|
/* 8 normal colors */
|
||||||
@ -85,16 +108,34 @@ static const char *colorname[] = {
|
|||||||
|
|
||||||
/* more colors can be added after 255 to use with DefaultXX */
|
/* more colors can be added after 255 to use with DefaultXX */
|
||||||
"#cccccc",
|
"#cccccc",
|
||||||
|
"#555555",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default colors (colorname index)
|
* Default colors (colorname index)
|
||||||
* foreground, background, cursor
|
* foreground, background, cursor, reverse cursor
|
||||||
*/
|
*/
|
||||||
static unsigned int defaultfg = 7;
|
static unsigned int defaultfg = 7;
|
||||||
static unsigned int defaultbg = 0;
|
static unsigned int defaultbg = 0;
|
||||||
static unsigned int defaultcs = 256;
|
static unsigned int defaultcs = 256;
|
||||||
|
static unsigned int defaultrcs = 257;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default shape of cursor
|
||||||
|
* 2: Block ("█")
|
||||||
|
* 4: Underline ("_")
|
||||||
|
* 6: Bar ("|")
|
||||||
|
* 7: Snowman ("☃")
|
||||||
|
*/
|
||||||
|
static unsigned int cursorshape = 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default colour and shape of the mouse cursor
|
||||||
|
*/
|
||||||
|
static unsigned int mouseshape = XC_xterm;
|
||||||
|
static unsigned int mousefg = 7;
|
||||||
|
static unsigned int mousebg = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Colors used, when the specific fg == defaultfg. So in reverse mode this
|
* Colors used, when the specific fg == defaultfg. So in reverse mode this
|
||||||
@ -104,9 +145,11 @@ static unsigned int defaultcs = 256;
|
|||||||
static unsigned int defaultitalic = 11;
|
static unsigned int defaultitalic = 11;
|
||||||
static unsigned int defaultunderline = 7;
|
static unsigned int defaultunderline = 7;
|
||||||
|
|
||||||
/* Internal mouse shortcuts. */
|
/*
|
||||||
/* Beware that overloading Button1 will disable the selection. */
|
* Internal mouse shortcuts.
|
||||||
static Mousekey mshortcuts[] = {
|
* Beware that overloading Button1 will disable the selection.
|
||||||
|
*/
|
||||||
|
static MouseShortcut mshortcuts[] = {
|
||||||
/* button mask string */
|
/* button mask string */
|
||||||
{ Button4, XK_ANY_MOD, "\031" },
|
{ Button4, XK_ANY_MOD, "\031" },
|
||||||
{ Button5, XK_ANY_MOD, "\005" },
|
{ Button5, XK_ANY_MOD, "\005" },
|
||||||
@ -117,6 +160,7 @@ static Mousekey mshortcuts[] = {
|
|||||||
|
|
||||||
static Shortcut shortcuts[] = {
|
static Shortcut shortcuts[] = {
|
||||||
/* mask keysym function argument */
|
/* mask keysym function argument */
|
||||||
|
{ XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
|
||||||
{ ControlMask, XK_Print, toggleprinter, {.i = 0} },
|
{ ControlMask, XK_Print, toggleprinter, {.i = 0} },
|
||||||
{ ShiftMask, XK_Print, printscreen, {.i = 0} },
|
{ ShiftMask, XK_Print, printscreen, {.i = 0} },
|
||||||
{ XK_ANY_MOD, XK_Print, printsel, {.i = 0} },
|
{ XK_ANY_MOD, XK_Print, printsel, {.i = 0} },
|
||||||
@ -167,11 +211,17 @@ static KeySym mappedkeys[] = { -1 };
|
|||||||
*/
|
*/
|
||||||
static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
|
static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
|
||||||
|
|
||||||
/* Override mouse-select while mask is active (when MODE_MOUSE is set).
|
/*
|
||||||
|
* Override mouse-select while mask is active (when MODE_MOUSE is set).
|
||||||
* Note that if you want to use ShiftMask with selmasks, set this to an other
|
* Note that if you want to use ShiftMask with selmasks, set this to an other
|
||||||
* modifier, set to 0 to not use it. */
|
* modifier, set to 0 to not use it.
|
||||||
|
*/
|
||||||
static uint forceselmod = ShiftMask;
|
static uint forceselmod = ShiftMask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the huge key array which defines all compatibility to the Linux
|
||||||
|
* world. Please decide about changes wisely.
|
||||||
|
*/
|
||||||
static Key key[] = {
|
static Key key[] = {
|
||||||
/* keysym mask string appkey appcursor crlf */
|
/* keysym mask string appkey appcursor crlf */
|
||||||
{ XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0},
|
{ XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0},
|
||||||
@ -268,6 +318,7 @@ static Key key[] = {
|
|||||||
{ XK_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0},
|
{ XK_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0},
|
||||||
{ XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0},
|
{ XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0},
|
||||||
{ XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
|
{ XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
|
||||||
|
{ XK_BackSpace, Mod1Mask, "\033\177", 0, 0, 0},
|
||||||
{ XK_Home, ShiftMask, "\033[2J", 0, -1, 0},
|
{ XK_Home, ShiftMask, "\033[2J", 0, -1, 0},
|
||||||
{ XK_Home, ShiftMask, "\033[1;2H", 0, +1, 0},
|
{ XK_Home, ShiftMask, "\033[1;2H", 0, +1, 0},
|
||||||
{ XK_Home, XK_ANY_MOD, "\033[H", 0, -1, 0},
|
{ XK_Home, XK_ANY_MOD, "\033[H", 0, -1, 0},
|
||||||
@ -382,3 +433,12 @@ static uint selmasks[] = {
|
|||||||
[SEL_RECTANGULAR] = Mod1Mask,
|
[SEL_RECTANGULAR] = Mod1Mask,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Printable characters in ASCII, used to estimate the advance width
|
||||||
|
* of single wide characters.
|
||||||
|
*/
|
||||||
|
static char ascii_printable[] =
|
||||||
|
" !\"#$%&'()*+,-./0123456789:;<=>?"
|
||||||
|
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
|
||||||
|
"`abcdefghijklmnopqrstuvwxyz{|}~";
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# st version
|
# st version
|
||||||
VERSION = 0.6
|
VERSION = 0.7
|
||||||
|
|
||||||
# Customize below to fit your system
|
# Customize below to fit your system
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ X11LIB = /usr/X11R6/lib
|
|||||||
INCS = -I. -I/usr/include -I${X11INC} \
|
INCS = -I. -I/usr/include -I${X11INC} \
|
||||||
`pkg-config --cflags fontconfig` \
|
`pkg-config --cflags fontconfig` \
|
||||||
`pkg-config --cflags freetype2`
|
`pkg-config --cflags freetype2`
|
||||||
LIBS = -L/usr/lib -lc -L${X11LIB} -lm -lrt -lX11 -lutil -lXext -lXft \
|
LIBS = -L/usr/lib -lc -L${X11LIB} -lm -lrt -lX11 -lutil -lXft \
|
||||||
`pkg-config --libs fontconfig` \
|
`pkg-config --libs fontconfig` \
|
||||||
`pkg-config --libs freetype2`
|
`pkg-config --libs freetype2`
|
||||||
|
|
||||||
|
94
st.1
94
st.1
@ -3,47 +3,49 @@
|
|||||||
st \- simple terminal
|
st \- simple terminal
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B st
|
.B st
|
||||||
.RB [ \-a ]
|
.RB [ \-aiv ]
|
||||||
.RB [ \-c
|
.RB [ \-c
|
||||||
.IR class ]
|
.IR class ]
|
||||||
.RB [ \-f
|
.RB [ \-f
|
||||||
.IR font ]
|
.IR font ]
|
||||||
.RB [ \-g
|
.RB [ \-g
|
||||||
.IR geometry ]
|
.IR geometry ]
|
||||||
.RB [ \-i ]
|
.RB [ \-n
|
||||||
|
.IR name ]
|
||||||
.RB [ \-o
|
.RB [ \-o
|
||||||
.IR file ]
|
.IR iofile ]
|
||||||
.RB [ \-t
|
.RB [ \-T
|
||||||
.IR title ]
|
.IR title ]
|
||||||
.RB [ \-l
|
|
||||||
.IR line ]
|
|
||||||
.RB [ \-w
|
|
||||||
.IR windowid ]
|
|
||||||
.RB [ \-v ]
|
|
||||||
.RB [ \-e
|
|
||||||
.IR command ...]
|
|
||||||
.RI [ commands ...]
|
|
||||||
.PP
|
|
||||||
.B st
|
|
||||||
.RB [ \-a ]
|
|
||||||
.RB [ \-c
|
|
||||||
.IR class ]
|
|
||||||
.RB [ \-f
|
|
||||||
.IR font ]
|
|
||||||
.RB [ \-g
|
|
||||||
.IR geometry ]
|
|
||||||
.RB [ \-i ]
|
|
||||||
.RB [ \-o
|
|
||||||
.IR file ]
|
|
||||||
.RB [ \-t
|
.RB [ \-t
|
||||||
.IR title ]
|
.IR title ]
|
||||||
.RB [ \-l
|
.RB [ \-l
|
||||||
.IR line ]
|
.IR line ]
|
||||||
.RB [ \-w
|
.RB [ \-w
|
||||||
.IR windowid ]
|
.IR windowid ]
|
||||||
.RB [ \-v ]
|
.RB [[ \-e ]
|
||||||
.RB [ \-l
|
.IR command
|
||||||
.IR line ]
|
.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 ...]
|
.RI [ stty_args ...]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B st
|
.B st
|
||||||
@ -70,30 +72,51 @@ for further details.
|
|||||||
.B \-i
|
.B \-i
|
||||||
will fixate the position given with the -g option.
|
will fixate the position given with the -g option.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-n " name"
|
||||||
|
defines the window instance name (default $TERM).
|
||||||
|
.TP
|
||||||
.BI \-o " iofile"
|
.BI \-o " iofile"
|
||||||
writes all the I/O to
|
writes all the I/O to
|
||||||
.I iofile.
|
.I iofile.
|
||||||
This feature is useful when recording st sessions. A value of "-" means
|
This feature is useful when recording st sessions. A value of "-" means
|
||||||
standard output.
|
standard output.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-T " title"
|
||||||
|
defines the window title (default 'st').
|
||||||
|
.TP
|
||||||
.BI \-t " title"
|
.BI \-t " title"
|
||||||
defines the window title (default 'st').
|
defines the window title (default 'st').
|
||||||
.TP
|
.TP
|
||||||
.BI \-w " windowid"
|
.BI \-w " windowid"
|
||||||
embeds st within the window identified by
|
embeds st within the window identified by
|
||||||
.I windowid
|
.I windowid
|
||||||
.TP
|
.TP
|
||||||
.BI \-l " line"
|
.BI \-l " line"
|
||||||
use a tty line instead of a pseudo terminal.
|
use a tty
|
||||||
When this flag is used
|
.I line
|
||||||
remaining arguments are used as flags for stty.
|
instead of a pseudo terminal.
|
||||||
|
.I line
|
||||||
|
should be a (pseudo-)serial device (e.g. /dev/ttySO 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 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
|
||||||
|
parenb parodd 115200'. Set the number of bits by using for example 'st -l cs7
|
||||||
|
115200'. See
|
||||||
|
.BR stty(1)
|
||||||
|
for more arguments and cases.
|
||||||
.TP
|
.TP
|
||||||
.B \-v
|
.B \-v
|
||||||
prints version information to stderr, then exits.
|
prints version information to stderr, then exits.
|
||||||
.TP
|
.TP
|
||||||
.BI \-e " program " [ " arguments " "... ]"
|
.BI \-e " command " [ " arguments " "... ]"
|
||||||
st executes
|
st executes
|
||||||
.I program
|
.I command
|
||||||
instead of the shell. If this is used it
|
instead of the shell. If this is used it
|
||||||
.B must be the last option
|
.B must be the last option
|
||||||
on the command line, as in xterm / rxvt.
|
on the command line, as in xterm / rxvt.
|
||||||
@ -102,6 +125,11 @@ and all the remaining arguments are used as a command
|
|||||||
even without it.
|
even without it.
|
||||||
.SH SHORTCUTS
|
.SH SHORTCUTS
|
||||||
.TP
|
.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
|
.B Ctrl-Print Screen
|
||||||
Toggle if st should print to the
|
Toggle if st should print to the
|
||||||
.I iofile.
|
.I iofile.
|
||||||
|
Reference in New Issue
Block a user