Compare commits
14 Commits
5eb745581e
...
b3e54a9a07
| Author | SHA1 | Date |
|---|---|---|
|
|
b3e54a9a07 | |
|
|
edfebb8efd | |
|
|
9059114a15 | |
|
|
bfdd78f62e | |
|
|
bf69a28e25 | |
|
|
1713adec5f | |
|
|
6d944657ba | |
|
|
e4d2c3eede | |
|
|
86b3cf543c | |
|
|
00564f7748 | |
|
|
a13b28316b | |
|
|
c1429d50d6 | |
|
|
e0cd8f0863 | |
|
|
8bdfc5f929 |
73
config.def.h
73
config.def.h
|
|
@ -135,13 +135,20 @@ unsigned int defaultcs = 256;
|
||||||
static unsigned int defaultrcs = 257;
|
static unsigned int defaultrcs = 257;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default shape of cursor
|
* 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
|
||||||
* 2: Block ("█")
|
* Default style of cursor
|
||||||
* 4: Underline ("_")
|
* 0: blinking block
|
||||||
* 6: Bar ("|")
|
* 1: blinking block (default)
|
||||||
* 7: Snowman ("☃")
|
* 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 cursorshape = 2;
|
static unsigned int cursorstyle = 1;
|
||||||
|
static Rune stcursor = 0x2603; /* snowman ("☃") */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default columns and rows numbers
|
* Default columns and rows numbers
|
||||||
|
|
@ -170,12 +177,60 @@ static unsigned int defaultattr = 11;
|
||||||
*/
|
*/
|
||||||
static uint forcemousemod = ShiftMask;
|
static uint forcemousemod = ShiftMask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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[256] },
|
||||||
|
{ "foreground", STRING, &colorname[257] },
|
||||||
|
{ "cursorColor", STRING, &colorname[258] },
|
||||||
|
{ "termname", STRING, &termname },
|
||||||
|
{ "shell", STRING, &shell },
|
||||||
|
{ "minlatency", INTEGER, &minlatency },
|
||||||
|
{ "maxlatency", INTEGER, &maxlatency },
|
||||||
|
{ "blinktimeout", INTEGER, &blinktimeout },
|
||||||
|
{ "bellvolume", INTEGER, &bellvolume },
|
||||||
|
{ "tabspaces", INTEGER, &tabspaces },
|
||||||
|
{ "borderpx", INTEGER, &borderpx },
|
||||||
|
{ "cwscale", FLOAT, &cwscale },
|
||||||
|
{ "chscale", FLOAT, &chscale },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The number of lines to scroll by.
|
||||||
|
*/
|
||||||
|
const unsigned int scrollrate = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The rate to zoom in (adjust the font size).
|
||||||
|
*/
|
||||||
|
const unsigned int zoomrate = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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[] = {
|
static MouseShortcut mshortcuts[] = {
|
||||||
/* mask button function argument release */
|
/* mask button function argument release */
|
||||||
|
{ XK_ANY_MOD, Button4, kscrollup, {.i = scrollrate}, 0, /* !alt */ -1 },
|
||||||
|
{ XK_ANY_MOD, Button5, kscrolldown, {.i = scrollrate}, 0, /* !alt */ -1 },
|
||||||
{ XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
|
{ XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
|
||||||
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
|
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
|
||||||
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
|
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
|
||||||
|
|
@ -193,14 +248,16 @@ static Shortcut shortcuts[] = {
|
||||||
{ 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} },
|
||||||
{ TERMMOD, XK_Prior, zoom, {.f = +1} },
|
{ TERMMOD, XK_Prior, zoom, {.f = +1 * zoomrate} },
|
||||||
{ TERMMOD, XK_Next, zoom, {.f = -1} },
|
{ TERMMOD, XK_Next, zoom, {.f = -1 * zoomrate} },
|
||||||
{ TERMMOD, XK_Home, zoomreset, {.f = 0} },
|
{ TERMMOD, XK_Home, zoomreset, {.f = 0} },
|
||||||
{ TERMMOD, XK_C, clipcopy, {.i = 0} },
|
{ TERMMOD, XK_C, clipcopy, {.i = 0} },
|
||||||
{ TERMMOD, XK_V, clippaste, {.i = 0} },
|
{ TERMMOD, XK_V, clippaste, {.i = 0} },
|
||||||
{ TERMMOD, XK_Y, selpaste, {.i = 0} },
|
{ TERMMOD, XK_Y, selpaste, {.i = 0} },
|
||||||
{ ShiftMask, XK_Insert, selpaste, {.i = 0} },
|
{ ShiftMask, XK_Insert, selpaste, {.i = 0} },
|
||||||
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
|
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1 * scrollrate} },
|
||||||
|
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1 * scrollrate} },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
29
st.h
29
st.h
|
|
@ -22,17 +22,19 @@
|
||||||
|
|
||||||
enum glyph_attribute {
|
enum glyph_attribute {
|
||||||
ATTR_NULL = 0,
|
ATTR_NULL = 0,
|
||||||
ATTR_BOLD = 1 << 0,
|
ATTR_SET = 1 << 0,
|
||||||
ATTR_FAINT = 1 << 1,
|
ATTR_BOLD = 1 << 1,
|
||||||
ATTR_ITALIC = 1 << 2,
|
ATTR_FAINT = 1 << 2,
|
||||||
ATTR_UNDERLINE = 1 << 3,
|
ATTR_ITALIC = 1 << 3,
|
||||||
ATTR_BLINK = 1 << 4,
|
ATTR_UNDERLINE = 1 << 4,
|
||||||
ATTR_REVERSE = 1 << 5,
|
ATTR_BLINK = 1 << 5,
|
||||||
ATTR_INVISIBLE = 1 << 6,
|
ATTR_REVERSE = 1 << 6,
|
||||||
ATTR_STRUCK = 1 << 7,
|
ATTR_INVISIBLE = 1 << 7,
|
||||||
ATTR_WRAP = 1 << 8,
|
ATTR_STRUCK = 1 << 8,
|
||||||
ATTR_WIDE = 1 << 9,
|
ATTR_WRAP = 1 << 9,
|
||||||
ATTR_WDUMMY = 1 << 10,
|
ATTR_WIDE = 1 << 10,
|
||||||
|
ATTR_WDUMMY = 1 << 11,
|
||||||
|
ATTR_SELECTED = 1 << 12,
|
||||||
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -81,13 +83,18 @@ void die(const char *, ...);
|
||||||
void redraw(void);
|
void redraw(void);
|
||||||
void draw(void);
|
void draw(void);
|
||||||
|
|
||||||
|
void kscrolldown(const Arg *);
|
||||||
|
void kscrollup(const Arg *);
|
||||||
|
void externalpipe(const Arg *);
|
||||||
void printscreen(const Arg *);
|
void printscreen(const Arg *);
|
||||||
void printsel(const Arg *);
|
void printsel(const Arg *);
|
||||||
void sendbreak(const Arg *);
|
void sendbreak(const Arg *);
|
||||||
void toggleprinter(const Arg *);
|
void toggleprinter(const Arg *);
|
||||||
|
|
||||||
int tattrset(int);
|
int tattrset(int);
|
||||||
|
int tisaltscr(void);
|
||||||
void tnew(int, int);
|
void tnew(int, int);
|
||||||
|
int tisaltscreen(void);
|
||||||
void tresize(int, int);
|
void tresize(int, int);
|
||||||
void tsetdirtattr(int);
|
void tsetdirtattr(int);
|
||||||
void ttyhangup(void);
|
void ttyhangup(void);
|
||||||
|
|
|
||||||
1
win.h
1
win.h
|
|
@ -39,3 +39,4 @@ void xsetpointermotion(int);
|
||||||
void xsetsel(char *);
|
void xsetsel(char *);
|
||||||
int xstartdraw(void);
|
int xstartdraw(void);
|
||||||
void xximspot(int, int);
|
void xximspot(int, int);
|
||||||
|
void xclearwin(void);
|
||||||
|
|
|
||||||
206
x.c
206
x.c
|
|
@ -14,6 +14,7 @@
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/Xft/Xft.h>
|
#include <X11/Xft/Xft.h>
|
||||||
#include <X11/XKBlib.h>
|
#include <X11/XKBlib.h>
|
||||||
|
#include <X11/Xresource.h>
|
||||||
|
|
||||||
char *argv0;
|
char *argv0;
|
||||||
#include "arg.h"
|
#include "arg.h"
|
||||||
|
|
@ -34,6 +35,7 @@ typedef struct {
|
||||||
void (*func)(const Arg *);
|
void (*func)(const Arg *);
|
||||||
const Arg arg;
|
const Arg arg;
|
||||||
uint release;
|
uint release;
|
||||||
|
int altscrn; /* 0: don't care, -1: not alt screen, 1: alt screen */
|
||||||
} MouseShortcut;
|
} MouseShortcut;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -45,6 +47,19 @@ typedef struct {
|
||||||
signed char appcursor; /* application cursor */
|
signed char appcursor; /* application cursor */
|
||||||
} Key;
|
} Key;
|
||||||
|
|
||||||
|
/* Xresources preferences */
|
||||||
|
enum resource_type {
|
||||||
|
STRING = 0,
|
||||||
|
INTEGER = 1,
|
||||||
|
FLOAT = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *name;
|
||||||
|
enum resource_type type;
|
||||||
|
void *dst;
|
||||||
|
} ResourcePref;
|
||||||
|
|
||||||
/* X modifiers */
|
/* X modifiers */
|
||||||
#define XK_ANY_MOD UINT_MAX
|
#define XK_ANY_MOD UINT_MAX
|
||||||
#define XK_NO_MOD 0
|
#define XK_NO_MOD 0
|
||||||
|
|
@ -81,6 +96,7 @@ typedef XftGlyphFontSpec GlyphFontSpec;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int tw, th; /* tty width and height */
|
int tw, th; /* tty width and height */
|
||||||
int w, h; /* window width and height */
|
int w, h; /* window width and height */
|
||||||
|
int hborderpx, vborderpx;
|
||||||
int ch; /* char height */
|
int ch; /* char height */
|
||||||
int cw; /* char width */
|
int cw; /* char width */
|
||||||
int mode; /* window state/mode flags */
|
int mode; /* window state/mode flags */
|
||||||
|
|
@ -253,6 +269,7 @@ static char *opt_name = NULL;
|
||||||
static char *opt_title = NULL;
|
static char *opt_title = NULL;
|
||||||
|
|
||||||
static uint buttons; /* bit field of pressed buttons */
|
static uint buttons; /* bit field of pressed buttons */
|
||||||
|
static int cursorblinks = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
clipcopy(const Arg *dummy)
|
clipcopy(const Arg *dummy)
|
||||||
|
|
@ -331,7 +348,7 @@ ttysend(const Arg *arg)
|
||||||
int
|
int
|
||||||
evcol(XEvent *e)
|
evcol(XEvent *e)
|
||||||
{
|
{
|
||||||
int x = e->xbutton.x - borderpx;
|
int x = e->xbutton.x - win.hborderpx;
|
||||||
LIMIT(x, 0, win.tw - 1);
|
LIMIT(x, 0, win.tw - 1);
|
||||||
return x / win.cw;
|
return x / win.cw;
|
||||||
}
|
}
|
||||||
|
|
@ -339,7 +356,7 @@ evcol(XEvent *e)
|
||||||
int
|
int
|
||||||
evrow(XEvent *e)
|
evrow(XEvent *e)
|
||||||
{
|
{
|
||||||
int y = e->xbutton.y - borderpx;
|
int y = e->xbutton.y - win.vborderpx;
|
||||||
LIMIT(y, 0, win.th - 1);
|
LIMIT(y, 0, win.th - 1);
|
||||||
return y / win.ch;
|
return y / win.ch;
|
||||||
}
|
}
|
||||||
|
|
@ -455,6 +472,7 @@ mouseaction(XEvent *e, uint release)
|
||||||
for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
|
for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
|
||||||
if (ms->release == release &&
|
if (ms->release == release &&
|
||||||
ms->button == e->xbutton.button &&
|
ms->button == e->xbutton.button &&
|
||||||
|
(!ms->altscrn || (ms->altscrn == (tisaltscr() ? 1 : -1))) &&
|
||||||
(match(ms->mod, state) || /* exact or forced */
|
(match(ms->mod, state) || /* exact or forced */
|
||||||
match(ms->mod, state & ~forcemousemod))) {
|
match(ms->mod, state & ~forcemousemod))) {
|
||||||
ms->func(&(ms->arg));
|
ms->func(&(ms->arg));
|
||||||
|
|
@ -739,6 +757,9 @@ cresize(int width, int height)
|
||||||
col = MAX(1, col);
|
col = MAX(1, col);
|
||||||
row = MAX(1, row);
|
row = MAX(1, row);
|
||||||
|
|
||||||
|
win.hborderpx = (win.w - col * win.cw) / 2;
|
||||||
|
win.vborderpx = (win.h - row * win.ch) / 2;
|
||||||
|
|
||||||
tresize(col, row);
|
tresize(col, row);
|
||||||
xresize(col, row);
|
xresize(col, row);
|
||||||
ttyresize(win.tw, win.th);
|
ttyresize(win.tw, win.th);
|
||||||
|
|
@ -856,11 +877,17 @@ xclear(int x1, int y1, int x2, int y2)
|
||||||
x1, y1, x2-x1, y2-y1);
|
x1, y1, x2-x1, y2-y1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xclearwin(void)
|
||||||
|
{
|
||||||
|
xclear(0, 0, win.w, win.h);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xhints(void)
|
xhints(void)
|
||||||
{
|
{
|
||||||
XClassHint class = {opt_name ? opt_name : termname,
|
XClassHint class = {opt_name ? opt_name : "st",
|
||||||
opt_class ? opt_class : termname};
|
opt_class ? opt_class : "St"};
|
||||||
XWMHints wm = {.flags = InputHint, .input = 1};
|
XWMHints wm = {.flags = InputHint, .input = 1};
|
||||||
XSizeHints *sizeh;
|
XSizeHints *sizeh;
|
||||||
|
|
||||||
|
|
@ -869,8 +896,8 @@ xhints(void)
|
||||||
sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
|
sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
|
||||||
sizeh->height = win.h;
|
sizeh->height = win.h;
|
||||||
sizeh->width = win.w;
|
sizeh->width = win.w;
|
||||||
sizeh->height_inc = win.ch;
|
sizeh->height_inc = 1;
|
||||||
sizeh->width_inc = win.cw;
|
sizeh->width_inc = 1;
|
||||||
sizeh->base_height = 2 * borderpx;
|
sizeh->base_height = 2 * borderpx;
|
||||||
sizeh->base_width = 2 * borderpx;
|
sizeh->base_width = 2 * borderpx;
|
||||||
sizeh->min_height = win.ch + 2 * borderpx;
|
sizeh->min_height = win.ch + 2 * borderpx;
|
||||||
|
|
@ -1135,8 +1162,6 @@ xinit(int cols, int rows)
|
||||||
pid_t thispid = getpid();
|
pid_t thispid = getpid();
|
||||||
XColor xmousefg, xmousebg;
|
XColor xmousefg, xmousebg;
|
||||||
|
|
||||||
if (!(xw.dpy = XOpenDisplay(NULL)))
|
|
||||||
die("can't open display\n");
|
|
||||||
xw.scr = XDefaultScreen(xw.dpy);
|
xw.scr = XDefaultScreen(xw.dpy);
|
||||||
xw.vis = XDefaultVisual(xw.dpy, xw.scr);
|
xw.vis = XDefaultVisual(xw.dpy, xw.scr);
|
||||||
|
|
||||||
|
|
@ -1152,8 +1177,8 @@ xinit(int cols, int rows)
|
||||||
xloadcols();
|
xloadcols();
|
||||||
|
|
||||||
/* adjust fixed window geometry */
|
/* adjust fixed window geometry */
|
||||||
win.w = 2 * borderpx + cols * win.cw;
|
win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw;
|
||||||
win.h = 2 * borderpx + rows * win.ch;
|
win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch;
|
||||||
if (xw.gm & XNegative)
|
if (xw.gm & XNegative)
|
||||||
xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
|
xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
|
||||||
if (xw.gm & YNegative)
|
if (xw.gm & YNegative)
|
||||||
|
|
@ -1245,7 +1270,7 @@ xinit(int cols, int rows)
|
||||||
int
|
int
|
||||||
xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
|
xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
|
||||||
{
|
{
|
||||||
float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp;
|
float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp;
|
||||||
ushort mode, prevmode = USHRT_MAX;
|
ushort mode, prevmode = USHRT_MAX;
|
||||||
Font *font = &dc.font;
|
Font *font = &dc.font;
|
||||||
int frcflags = FRC_NORMAL;
|
int frcflags = FRC_NORMAL;
|
||||||
|
|
@ -1378,7 +1403,7 @@ void
|
||||||
xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
|
xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
|
||||||
{
|
{
|
||||||
int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1);
|
int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1);
|
||||||
int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch,
|
int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch,
|
||||||
width = charlen * win.cw;
|
width = charlen * win.cw;
|
||||||
Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
|
Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
|
||||||
XRenderColor colfg, colbg;
|
XRenderColor colfg, colbg;
|
||||||
|
|
@ -1468,17 +1493,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
|
||||||
|
|
||||||
/* Intelligent cleaning up of the borders. */
|
/* Intelligent cleaning up of the borders. */
|
||||||
if (x == 0) {
|
if (x == 0) {
|
||||||
xclear(0, (y == 0)? 0 : winy, borderpx,
|
xclear(0, (y == 0)? 0 : winy, win.hborderpx,
|
||||||
winy + win.ch +
|
winy + win.ch +
|
||||||
((winy + win.ch >= borderpx + win.th)? win.h : 0));
|
((winy + win.ch >= win.vborderpx + win.th)? win.h : 0));
|
||||||
}
|
}
|
||||||
if (winx + width >= borderpx + win.tw) {
|
if (winx + width >= win.hborderpx + win.tw) {
|
||||||
xclear(winx + width, (y == 0)? 0 : winy, win.w,
|
xclear(winx + width, (y == 0)? 0 : winy, win.w,
|
||||||
((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch)));
|
((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch)));
|
||||||
}
|
}
|
||||||
if (y == 0)
|
if (y == 0)
|
||||||
xclear(winx, 0, winx + width, borderpx);
|
xclear(winx, 0, winx + width, win.vborderpx);
|
||||||
if (winy + win.ch >= borderpx + win.th)
|
if (winy + win.ch >= win.vborderpx + win.th)
|
||||||
xclear(winx, winy + win.ch, winx + width, win.h);
|
xclear(winx, winy + win.ch, winx + width, win.h);
|
||||||
|
|
||||||
/* Clean up the region we want to draw to. */
|
/* Clean up the region we want to draw to. */
|
||||||
|
|
@ -1523,6 +1548,7 @@ void
|
||||||
xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
|
xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
|
||||||
{
|
{
|
||||||
Color drawcol;
|
Color drawcol;
|
||||||
|
XRenderColor colbg;
|
||||||
|
|
||||||
/* remove the old cursor */
|
/* remove the old cursor */
|
||||||
if (selected(ox, oy))
|
if (selected(ox, oy))
|
||||||
|
|
@ -1551,56 +1577,81 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
|
||||||
if (selected(cx, cy)) {
|
if (selected(cx, cy)) {
|
||||||
g.fg = defaultfg;
|
g.fg = defaultfg;
|
||||||
g.bg = defaultrcs;
|
g.bg = defaultrcs;
|
||||||
} else {
|
} else if (!(og.mode & ATTR_REVERSE)) {
|
||||||
g.fg = defaultbg;
|
unsigned long col = g.bg;
|
||||||
g.bg = defaultcs;
|
g.bg = g.fg;
|
||||||
|
g.fg = col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_TRUECOL(g.bg)) {
|
||||||
|
colbg.alpha = 0xffff;
|
||||||
|
colbg.red = TRUERED(g.bg);
|
||||||
|
colbg.green = TRUEGREEN(g.bg);
|
||||||
|
colbg.blue = TRUEBLUE(g.bg);
|
||||||
|
XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &drawcol);
|
||||||
|
} else {
|
||||||
drawcol = dc.col[g.bg];
|
drawcol = dc.col[g.bg];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* draw the new one */
|
/* draw the new one */
|
||||||
if (IS_SET(MODE_FOCUSED)) {
|
if (IS_SET(MODE_FOCUSED)) {
|
||||||
switch (win.cursor) {
|
switch (win.cursor) {
|
||||||
case 7: /* st extension */
|
default:
|
||||||
g.u = 0x2603; /* snowman (U+2603) */
|
case 0: /* blinking block */
|
||||||
|
case 1: /* blinking block (default) */
|
||||||
|
if (IS_SET(MODE_BLINK))
|
||||||
|
break;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case 0: /* Blinking Block */
|
case 2: /* steady block */
|
||||||
case 1: /* Blinking Block (Default) */
|
|
||||||
case 2: /* Steady Block */
|
|
||||||
xdrawglyph(g, cx, cy);
|
xdrawglyph(g, cx, cy);
|
||||||
break;
|
break;
|
||||||
case 3: /* Blinking Underline */
|
case 3: /* blinking underline */
|
||||||
case 4: /* Steady Underline */
|
if (IS_SET(MODE_BLINK))
|
||||||
|
break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 4: /* steady underline */
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + cx * win.cw,
|
win.hborderpx + cx * win.cw,
|
||||||
borderpx + (cy + 1) * win.ch - \
|
win.vborderpx + (cy + 1) * win.ch - \
|
||||||
cursorthickness,
|
cursorthickness,
|
||||||
win.cw, cursorthickness);
|
win.cw, cursorthickness);
|
||||||
break;
|
break;
|
||||||
case 5: /* Blinking bar */
|
case 5: /* blinking bar */
|
||||||
case 6: /* Steady bar */
|
if (IS_SET(MODE_BLINK))
|
||||||
|
break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 6: /* steady bar */
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + cx * win.cw,
|
win.hborderpx + cx * win.cw,
|
||||||
borderpx + cy * win.ch,
|
win.vborderpx + cy * win.ch,
|
||||||
cursorthickness, win.ch);
|
cursorthickness, win.ch);
|
||||||
break;
|
break;
|
||||||
|
case 7: /* blinking st cursor */
|
||||||
|
if (IS_SET(MODE_BLINK))
|
||||||
|
break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 8: /* steady st cursor */
|
||||||
|
g.u = stcursor;
|
||||||
|
xdrawglyph(g, cx, cy);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + cx * win.cw,
|
win.hborderpx + cx * win.cw,
|
||||||
borderpx + cy * win.ch,
|
win.vborderpx + cy * win.ch,
|
||||||
win.cw - 1, 1);
|
win.cw - 1, 1);
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + cx * win.cw,
|
win.hborderpx + cx * win.cw,
|
||||||
borderpx + cy * win.ch,
|
win.vborderpx + cy * win.ch,
|
||||||
1, win.ch - 1);
|
1, win.ch - 1);
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + (cx + 1) * win.cw - 1,
|
win.hborderpx + (cx + 1) * win.cw - 1,
|
||||||
borderpx + cy * win.ch,
|
win.vborderpx + cy * win.ch,
|
||||||
1, win.ch - 1);
|
1, win.ch - 1);
|
||||||
XftDrawRect(xw.draw, &drawcol,
|
XftDrawRect(xw.draw, &drawcol,
|
||||||
borderpx + cx * win.cw,
|
win.hborderpx + cx * win.cw,
|
||||||
borderpx + (cy + 1) * win.ch - 1,
|
win.vborderpx + (cy + 1) * win.ch - 1,
|
||||||
win.cw, 1);
|
win.cw, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1746,9 +1797,12 @@ xsetmode(int set, unsigned int flags)
|
||||||
int
|
int
|
||||||
xsetcursor(int cursor)
|
xsetcursor(int cursor)
|
||||||
{
|
{
|
||||||
if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
|
if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
|
||||||
return 1;
|
return 1;
|
||||||
win.cursor = cursor;
|
win.cursor = cursor;
|
||||||
|
cursorblinks = win.cursor == 0 || win.cursor == 1 ||
|
||||||
|
win.cursor == 3 || win.cursor == 5 ||
|
||||||
|
win.cursor == 7;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1995,6 +2049,10 @@ run(void)
|
||||||
if (FD_ISSET(ttyfd, &rfd) || xev) {
|
if (FD_ISSET(ttyfd, &rfd) || xev) {
|
||||||
if (!drawing) {
|
if (!drawing) {
|
||||||
trigger = now;
|
trigger = now;
|
||||||
|
if (IS_SET(MODE_BLINK)) {
|
||||||
|
win.mode ^= MODE_BLINK;
|
||||||
|
}
|
||||||
|
lastblink = now;
|
||||||
drawing = 1;
|
drawing = 1;
|
||||||
}
|
}
|
||||||
timeout = (maxlatency - TIMEDIFF(now, trigger)) \
|
timeout = (maxlatency - TIMEDIFF(now, trigger)) \
|
||||||
|
|
@ -2005,7 +2063,7 @@ run(void)
|
||||||
|
|
||||||
/* idle detected or maxlatency exhausted -> draw */
|
/* idle detected or maxlatency exhausted -> draw */
|
||||||
timeout = -1;
|
timeout = -1;
|
||||||
if (blinktimeout && tattrset(ATTR_BLINK)) {
|
if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK))) {
|
||||||
timeout = blinktimeout - TIMEDIFF(now, lastblink);
|
timeout = blinktimeout - TIMEDIFF(now, lastblink);
|
||||||
if (timeout <= 0) {
|
if (timeout <= 0) {
|
||||||
if (-timeout > blinktimeout) /* start visible */
|
if (-timeout > blinktimeout) /* start visible */
|
||||||
|
|
@ -2023,6 +2081,59 @@ run(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(void)
|
||||||
|
{
|
||||||
|
char *resm;
|
||||||
|
XrmDatabase db;
|
||||||
|
ResourcePref *p;
|
||||||
|
|
||||||
|
XrmInitialize();
|
||||||
|
resm = XResourceManagerString(xw.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
|
void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
|
|
@ -2041,7 +2152,7 @@ main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
xw.l = xw.t = 0;
|
xw.l = xw.t = 0;
|
||||||
xw.isfixed = False;
|
xw.isfixed = False;
|
||||||
xsetcursor(cursorshape);
|
xsetcursor(cursorstyle);
|
||||||
|
|
||||||
ARGBEGIN {
|
ARGBEGIN {
|
||||||
case 'a':
|
case 'a':
|
||||||
|
|
@ -2096,6 +2207,11 @@ run:
|
||||||
|
|
||||||
setlocale(LC_CTYPE, "");
|
setlocale(LC_CTYPE, "");
|
||||||
XSetLocaleModifiers("");
|
XSetLocaleModifiers("");
|
||||||
|
|
||||||
|
if(!(xw.dpy = XOpenDisplay(NULL)))
|
||||||
|
die("Can't open display\n");
|
||||||
|
|
||||||
|
config_init();
|
||||||
cols = MAX(cols, 1);
|
cols = MAX(cols, 1);
|
||||||
rows = MAX(rows, 1);
|
rows = MAX(rows, 1);
|
||||||
tnew(cols, rows);
|
tnew(cols, rows);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue