Split X-specific code into x.c

dev
Michael Forney 2017-01-20 00:06:39 -08:00
parent c63a87cd93
commit e2ee5ee611
6 changed files with 2167 additions and 1993 deletions

View File

@ -3,7 +3,7 @@
include config.mk include config.mk
SRC = st.c SRC = st.c x.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options st all: options st
@ -21,6 +21,9 @@ config.h:
@echo CC $< @echo CC $<
@${CC} -c ${CFLAGS} $< @${CC} -c ${CFLAGS} $<
st.o: config.h st.h win.h
x.o: arg.h st.h win.h
${OBJ}: config.h config.mk ${OBJ}: config.h config.mk
st: ${OBJ} st: ${OBJ}

View File

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

2024
st.c

File diff suppressed because it is too large Load Diff

272
st.h 100644
View File

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

29
win.h 100644
View File

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

1766
x.c 100644

File diff suppressed because it is too large Load Diff