Compare commits
	
		
			14 Commits
		
	
	
		
			667493fbc4
			...
			9aa119dc5b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9aa119dc5b | |||
| b72575e0ba | |||
| b9e3a50a5e | |||
| 3a5cb6f5fa | |||
| 290270185f | |||
| 71e9008164 | |||
| 74f7d621e1 | |||
| 636c250557 | |||
| 24b6482415 | |||
| 
						 | 
					a0274bc20e | ||
| 
						 | 
					5dbcca4926 | ||
| 
						 | 
					d63b9eb902 | ||
| 
						 | 
					497a756382 | ||
| 
						 | 
					8c68ec5241 | 
							
								
								
									
										15
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								config.def.h
									
									
									
									
									
								
							@ -5,7 +5,11 @@
 | 
			
		||||
 *
 | 
			
		||||
 * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | 
			
		||||
 */
 | 
			
		||||
static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
 | 
			
		||||
static char *font = "Liberation Mono:pixelsize=16:antialias=true:autohint=true";
 | 
			
		||||
/* Spare fonts */
 | 
			
		||||
static char *font2[] = { "Kochi Gothic:pixelsize=16:antialias=true:autohint=true" };
 | 
			
		||||
/*	"Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */
 | 
			
		||||
 | 
			
		||||
static int borderpx = 2;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -176,6 +180,8 @@ static uint forcemousemod = ShiftMask;
 | 
			
		||||
 */
 | 
			
		||||
static MouseShortcut mshortcuts[] = {
 | 
			
		||||
	/* mask                 button   function        argument       release */
 | 
			
		||||
	{ XK_ANY_MOD,           Button4, kscrollup,      {.i = 1},		0, /* !alt */ -1 },
 | 
			
		||||
	{ XK_ANY_MOD,           Button5, kscrolldown,    {.i = 1},		0, /* !alt */ -1 },
 | 
			
		||||
	{ XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
 | 
			
		||||
	{ ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} },
 | 
			
		||||
	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
 | 
			
		||||
@ -201,6 +207,9 @@ static Shortcut shortcuts[] = {
 | 
			
		||||
	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
 | 
			
		||||
	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
 | 
			
		||||
	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
 | 
			
		||||
	{ TERMMOD,              XK_Escape,      keyboard_select,{.i =  0} },
 | 
			
		||||
	{ ShiftMask,            XK_Page_Up,     kscrollup,      {.i = -1} },
 | 
			
		||||
	{ ShiftMask,            XK_Page_Down,   kscrolldown,    {.i = -1} },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -278,7 +287,7 @@ static Key key[] = {
 | 
			
		||||
	{ 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_KP_Delete,     XK_ANY_MOD,     "\033[P",       -1,    0},
 | 
			
		||||
	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",       -1,    0},
 | 
			
		||||
	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",      +1,    0},
 | 
			
		||||
	{ XK_KP_Multiply,   XK_ANY_MOD,     "\033Oj",       +2,    0},
 | 
			
		||||
	{ XK_KP_Add,        XK_ANY_MOD,     "\033Ok",       +2,    0},
 | 
			
		||||
@ -346,7 +355,7 @@ static Key key[] = {
 | 
			
		||||
	{ XK_Delete,        ControlMask,    "\033[3;5~",    +1,    0},
 | 
			
		||||
	{ XK_Delete,        ShiftMask,      "\033[2K",      -1,    0},
 | 
			
		||||
	{ XK_Delete,        ShiftMask,      "\033[3;2~",    +1,    0},
 | 
			
		||||
	{ XK_Delete,        XK_ANY_MOD,     "\033[P",       -1,    0},
 | 
			
		||||
	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",       -1,    0},
 | 
			
		||||
	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",      +1,    0},
 | 
			
		||||
	{ XK_BackSpace,     XK_NO_MOD,      "\177",          0,    0},
 | 
			
		||||
	{ XK_BackSpace,     Mod1Mask,       "\033\177",      0,    0},
 | 
			
		||||
 | 
			
		||||
@ -1,14 +1,14 @@
 | 
			
		||||
# st version
 | 
			
		||||
VERSION = 0.9.1
 | 
			
		||||
VERSION = 0.9.2
 | 
			
		||||
 | 
			
		||||
# Customize below to fit your system
 | 
			
		||||
 | 
			
		||||
# paths
 | 
			
		||||
PREFIX = /usr/local
 | 
			
		||||
PREFIX = /usr
 | 
			
		||||
MANPREFIX = $(PREFIX)/share/man
 | 
			
		||||
 | 
			
		||||
X11INC = /usr/X11R6/include
 | 
			
		||||
X11LIB = /usr/X11R6/lib
 | 
			
		||||
X11INC = /usr/include/X11
 | 
			
		||||
X11LIB = /usr/lib64
 | 
			
		||||
 | 
			
		||||
PKG_CONFIG = pkg-config
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								st.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								st.h
									
									
									
									
									
								
							@ -22,17 +22,19 @@
 | 
			
		||||
 | 
			
		||||
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_SET        = 1 << 0,
 | 
			
		||||
	ATTR_BOLD       = 1 << 1,
 | 
			
		||||
	ATTR_FAINT      = 1 << 2,
 | 
			
		||||
	ATTR_ITALIC     = 1 << 3,
 | 
			
		||||
	ATTR_UNDERLINE  = 1 << 4,
 | 
			
		||||
	ATTR_BLINK      = 1 << 5,
 | 
			
		||||
	ATTR_REVERSE    = 1 << 6,
 | 
			
		||||
	ATTR_INVISIBLE  = 1 << 7,
 | 
			
		||||
	ATTR_STRUCK     = 1 << 8,
 | 
			
		||||
	ATTR_WRAP       = 1 << 9,
 | 
			
		||||
	ATTR_WIDE       = 1 << 10,
 | 
			
		||||
	ATTR_WDUMMY     = 1 << 11,
 | 
			
		||||
	ATTR_SELECTED   = 1 << 12,
 | 
			
		||||
	ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -81,6 +83,8 @@ void die(const char *, ...);
 | 
			
		||||
void redraw(void);
 | 
			
		||||
void draw(void);
 | 
			
		||||
 | 
			
		||||
void kscrolldown(const Arg *);
 | 
			
		||||
void kscrollup(const Arg *);
 | 
			
		||||
void printscreen(const Arg *);
 | 
			
		||||
void printsel(const Arg *);
 | 
			
		||||
void sendbreak(const Arg *);
 | 
			
		||||
@ -88,6 +92,7 @@ void toggleprinter(const Arg *);
 | 
			
		||||
 | 
			
		||||
int tattrset(int);
 | 
			
		||||
void tnew(int, int);
 | 
			
		||||
int tisaltscreen(void);
 | 
			
		||||
void tresize(int, int);
 | 
			
		||||
void tsetdirtattr(int);
 | 
			
		||||
void ttyhangup(void);
 | 
			
		||||
@ -110,6 +115,7 @@ size_t utf8encode(Rune, char *);
 | 
			
		||||
void *xmalloc(size_t);
 | 
			
		||||
void *xrealloc(void *, size_t);
 | 
			
		||||
char *xstrdup(const char *);
 | 
			
		||||
int  trt_kbdselect(KeySym, char *, int);
 | 
			
		||||
 | 
			
		||||
/* config.h globals */
 | 
			
		||||
extern char *utmp;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								win.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								win.h
									
									
									
									
									
								
							@ -21,6 +21,7 @@ enum win_mode {
 | 
			
		||||
	MODE_NUMLOCK     = 1 << 17,
 | 
			
		||||
	MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
 | 
			
		||||
	                  |MODE_MOUSEMANY,
 | 
			
		||||
	MODE_KBDSELECT   = 1 << 18,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void xbell(void);
 | 
			
		||||
@ -38,4 +39,6 @@ void xsetmode(int, unsigned int);
 | 
			
		||||
void xsetpointermotion(int);
 | 
			
		||||
void xsetsel(char *);
 | 
			
		||||
int xstartdraw(void);
 | 
			
		||||
void toggle_winmode(int);
 | 
			
		||||
void keyboard_select(const Arg *);
 | 
			
		||||
void xximspot(int, int);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										190
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										190
									
								
								x.c
									
									
									
									
									
								
							@ -34,6 +34,7 @@ typedef struct {
 | 
			
		||||
	void (*func)(const Arg *);
 | 
			
		||||
	const Arg arg;
 | 
			
		||||
	uint  release;
 | 
			
		||||
	int  altscrn;  /* 0: don't care, -1: not alt screen, 1: alt screen */
 | 
			
		||||
} MouseShortcut;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@ -81,6 +82,7 @@ typedef XftGlyphFontSpec GlyphFontSpec;
 | 
			
		||||
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 mode; /* window state/mode flags */
 | 
			
		||||
@ -157,6 +159,8 @@ static void xhints(void);
 | 
			
		||||
static int xloadcolor(int, const char *, Color *);
 | 
			
		||||
static int xloadfont(Font *, FcPattern *);
 | 
			
		||||
static void xloadfonts(const char *, double);
 | 
			
		||||
static int xloadsparefont(FcPattern *, int);
 | 
			
		||||
static void xloadsparefonts(void);
 | 
			
		||||
static void xunloadfont(Font *);
 | 
			
		||||
static void xunloadfonts(void);
 | 
			
		||||
static void xsetenv(void);
 | 
			
		||||
@ -306,6 +310,7 @@ zoomabs(const Arg *arg)
 | 
			
		||||
{
 | 
			
		||||
	xunloadfonts();
 | 
			
		||||
	xloadfonts(usedfont, arg->f);
 | 
			
		||||
	xloadsparefonts();
 | 
			
		||||
	cresize(0, 0);
 | 
			
		||||
	redraw();
 | 
			
		||||
	xhints();
 | 
			
		||||
@ -331,7 +336,7 @@ ttysend(const Arg *arg)
 | 
			
		||||
int
 | 
			
		||||
evcol(XEvent *e)
 | 
			
		||||
{
 | 
			
		||||
	int x = e->xbutton.x - borderpx;
 | 
			
		||||
	int x = e->xbutton.x - win.hborderpx;
 | 
			
		||||
	LIMIT(x, 0, win.tw - 1);
 | 
			
		||||
	return x / win.cw;
 | 
			
		||||
}
 | 
			
		||||
@ -339,7 +344,7 @@ evcol(XEvent *e)
 | 
			
		||||
int
 | 
			
		||||
evrow(XEvent *e)
 | 
			
		||||
{
 | 
			
		||||
	int y = e->xbutton.y - borderpx;
 | 
			
		||||
	int y = e->xbutton.y - win.vborderpx;
 | 
			
		||||
	LIMIT(y, 0, win.th - 1);
 | 
			
		||||
	return y / win.ch;
 | 
			
		||||
}
 | 
			
		||||
@ -455,6 +460,7 @@ mouseaction(XEvent *e, uint release)
 | 
			
		||||
	for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
 | 
			
		||||
		if (ms->release == release &&
 | 
			
		||||
		    ms->button == e->xbutton.button &&
 | 
			
		||||
		    (!ms->altscrn || (ms->altscrn == (tisaltscreen() ? 1 : -1))) &&
 | 
			
		||||
		    (match(ms->mod, state) ||  /* exact or forced */
 | 
			
		||||
		     match(ms->mod, state & ~forcemousemod))) {
 | 
			
		||||
			ms->func(&(ms->arg));
 | 
			
		||||
@ -739,6 +745,9 @@ cresize(int width, int height)
 | 
			
		||||
	col = MAX(1, col);
 | 
			
		||||
	row = MAX(1, row);
 | 
			
		||||
 | 
			
		||||
	win.hborderpx = (win.w - col * win.cw) / 2;
 | 
			
		||||
	win.vborderpx = (win.h - row * win.ch) / 2;
 | 
			
		||||
 | 
			
		||||
	tresize(col, row);
 | 
			
		||||
	xresize(col, row);
 | 
			
		||||
	ttyresize(win.tw, win.th);
 | 
			
		||||
@ -869,8 +878,8 @@ xhints(void)
 | 
			
		||||
	sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
 | 
			
		||||
	sizeh->height = win.h;
 | 
			
		||||
	sizeh->width = win.w;
 | 
			
		||||
	sizeh->height_inc = win.ch;
 | 
			
		||||
	sizeh->width_inc = win.cw;
 | 
			
		||||
	sizeh->height_inc = 1;
 | 
			
		||||
	sizeh->width_inc = 1;
 | 
			
		||||
	sizeh->base_height = 2 * borderpx;
 | 
			
		||||
	sizeh->base_width = 2 * borderpx;
 | 
			
		||||
	sizeh->min_height = win.ch + 2 * borderpx;
 | 
			
		||||
@ -1050,6 +1059,101 @@ xloadfonts(const char *fontstr, double fontsize)
 | 
			
		||||
	FcPatternDestroy(pattern);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xloadsparefont(FcPattern *pattern, int flags)
 | 
			
		||||
{
 | 
			
		||||
	FcPattern *match;
 | 
			
		||||
	FcResult result;
 | 
			
		||||
 | 
			
		||||
	match = FcFontMatch(NULL, pattern, &result);
 | 
			
		||||
	if (!match) {
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) {
 | 
			
		||||
		FcPatternDestroy(match);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	frc[frclen].flags = flags;
 | 
			
		||||
	/* Believe U+0000 glyph will present in each default font */
 | 
			
		||||
	frc[frclen].unicodep = 0;
 | 
			
		||||
	frclen++;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xloadsparefonts(void)
 | 
			
		||||
{
 | 
			
		||||
	FcPattern *pattern;
 | 
			
		||||
	double sizeshift, fontval;
 | 
			
		||||
	int fc;
 | 
			
		||||
	char **fp;
 | 
			
		||||
 | 
			
		||||
	if (frclen != 0)
 | 
			
		||||
		die("can't embed spare fonts. cache isn't empty");
 | 
			
		||||
 | 
			
		||||
	/* Calculate count of spare fonts */
 | 
			
		||||
	fc = sizeof(font2) / sizeof(*font2);
 | 
			
		||||
	if (fc == 0)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	/* Allocate memory for cache entries. */
 | 
			
		||||
	if (frccap < 4 * fc) {
 | 
			
		||||
		frccap += 4 * fc - frccap;
 | 
			
		||||
		frc = xrealloc(frc, frccap * sizeof(Fontcache));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (fp = font2; fp - font2 < fc; ++fp) {
 | 
			
		||||
 | 
			
		||||
		if (**fp == '-')
 | 
			
		||||
			pattern = XftXlfdParse(*fp, False, False);
 | 
			
		||||
		else
 | 
			
		||||
			pattern = FcNameParse((FcChar8 *)*fp);
 | 
			
		||||
 | 
			
		||||
		if (!pattern)
 | 
			
		||||
			die("can't open spare font %s\n", *fp);
 | 
			
		||||
 | 
			
		||||
		if (defaultfontsize > 0) {
 | 
			
		||||
			sizeshift = usedfontsize - defaultfontsize;
 | 
			
		||||
			if (sizeshift != 0 &&
 | 
			
		||||
					FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) ==
 | 
			
		||||
					FcResultMatch) {
 | 
			
		||||
				fontval += sizeshift;
 | 
			
		||||
				FcPatternDel(pattern, FC_PIXEL_SIZE);
 | 
			
		||||
				FcPatternDel(pattern, FC_SIZE);
 | 
			
		||||
				FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		FcPatternAddBool(pattern, FC_SCALABLE, 1);
 | 
			
		||||
 | 
			
		||||
		FcConfigSubstitute(NULL, pattern, FcMatchPattern);
 | 
			
		||||
		XftDefaultSubstitute(xw.dpy, xw.scr, pattern);
 | 
			
		||||
 | 
			
		||||
		if (xloadsparefont(pattern, FRC_NORMAL))
 | 
			
		||||
			die("can't open spare font %s\n", *fp);
 | 
			
		||||
 | 
			
		||||
		FcPatternDel(pattern, FC_SLANT);
 | 
			
		||||
		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
 | 
			
		||||
		if (xloadsparefont(pattern, FRC_ITALIC))
 | 
			
		||||
			die("can't open spare font %s\n", *fp);
 | 
			
		||||
 | 
			
		||||
		FcPatternDel(pattern, FC_WEIGHT);
 | 
			
		||||
		FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
 | 
			
		||||
		if (xloadsparefont(pattern, FRC_ITALICBOLD))
 | 
			
		||||
			die("can't open spare font %s\n", *fp);
 | 
			
		||||
 | 
			
		||||
		FcPatternDel(pattern, FC_SLANT);
 | 
			
		||||
		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN);
 | 
			
		||||
		if (xloadsparefont(pattern, FRC_BOLD))
 | 
			
		||||
			die("can't open spare font %s\n", *fp);
 | 
			
		||||
 | 
			
		||||
		FcPatternDestroy(pattern);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xunloadfont(Font *f)
 | 
			
		||||
{
 | 
			
		||||
@ -1131,7 +1235,7 @@ xinit(int cols, int rows)
 | 
			
		||||
{
 | 
			
		||||
	XGCValues gcvalues;
 | 
			
		||||
	Cursor cursor;
 | 
			
		||||
	Window parent;
 | 
			
		||||
	Window parent, root;
 | 
			
		||||
	pid_t thispid = getpid();
 | 
			
		||||
	XColor xmousefg, xmousebg;
 | 
			
		||||
 | 
			
		||||
@ -1147,13 +1251,16 @@ xinit(int cols, int rows)
 | 
			
		||||
	usedfont = (opt_font == NULL)? font : opt_font;
 | 
			
		||||
	xloadfonts(usedfont, 0);
 | 
			
		||||
 | 
			
		||||
	/* spare fonts */
 | 
			
		||||
	xloadsparefonts();
 | 
			
		||||
 | 
			
		||||
	/* colors */
 | 
			
		||||
	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
 | 
			
		||||
	xloadcols();
 | 
			
		||||
 | 
			
		||||
	/* adjust fixed window geometry */
 | 
			
		||||
	win.w = 2 * borderpx + cols * win.cw;
 | 
			
		||||
	win.h = 2 * borderpx + rows * win.ch;
 | 
			
		||||
	win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw;
 | 
			
		||||
	win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch;
 | 
			
		||||
	if (xw.gm & XNegative)
 | 
			
		||||
		xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
 | 
			
		||||
	if (xw.gm & YNegative)
 | 
			
		||||
@ -1168,16 +1275,19 @@ xinit(int cols, int rows)
 | 
			
		||||
		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
 | 
			
		||||
	xw.attrs.colormap = xw.cmap;
 | 
			
		||||
 | 
			
		||||
	root = XRootWindow(xw.dpy, xw.scr);
 | 
			
		||||
	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
 | 
			
		||||
		parent = XRootWindow(xw.dpy, xw.scr);
 | 
			
		||||
	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
 | 
			
		||||
		parent = root;
 | 
			
		||||
	xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t,
 | 
			
		||||
			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
 | 
			
		||||
			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
 | 
			
		||||
			| CWEventMask | CWColormap, &xw.attrs);
 | 
			
		||||
	if (parent != root)
 | 
			
		||||
		XReparentWindow(xw.dpy, xw.win, parent, xw.l, xw.t);
 | 
			
		||||
 | 
			
		||||
	memset(&gcvalues, 0, sizeof(gcvalues));
 | 
			
		||||
	gcvalues.graphics_exposures = False;
 | 
			
		||||
	dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
 | 
			
		||||
	dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures,
 | 
			
		||||
			&gcvalues);
 | 
			
		||||
	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
 | 
			
		||||
			DefaultDepth(xw.dpy, xw.scr));
 | 
			
		||||
@ -1242,7 +1352,7 @@ xinit(int cols, int rows)
 | 
			
		||||
int
 | 
			
		||||
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;
 | 
			
		||||
	Font *font = &dc.font;
 | 
			
		||||
	int frcflags = FRC_NORMAL;
 | 
			
		||||
@ -1375,7 +1485,7 @@ void
 | 
			
		||||
xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
 | 
			
		||||
{
 | 
			
		||||
	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;
 | 
			
		||||
	Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
 | 
			
		||||
	XRenderColor colfg, colbg;
 | 
			
		||||
@ -1465,17 +1575,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
 | 
			
		||||
 | 
			
		||||
	/* Intelligent cleaning up of the borders. */
 | 
			
		||||
	if (x == 0) {
 | 
			
		||||
		xclear(0, (y == 0)? 0 : winy, borderpx,
 | 
			
		||||
		xclear(0, (y == 0)? 0 : winy, win.hborderpx,
 | 
			
		||||
			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,
 | 
			
		||||
			((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)
 | 
			
		||||
		xclear(winx, 0, winx + width, borderpx);
 | 
			
		||||
	if (winy + win.ch >= borderpx + win.th)
 | 
			
		||||
		xclear(winx, 0, winx + width, win.vborderpx);
 | 
			
		||||
	if (winy + win.ch >= win.vborderpx + win.th)
 | 
			
		||||
		xclear(winx, winy + win.ch, winx + width, win.h);
 | 
			
		||||
 | 
			
		||||
	/* Clean up the region we want to draw to. */
 | 
			
		||||
@ -1569,35 +1679,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
 | 
			
		||||
		case 3: /* Blinking Underline */
 | 
			
		||||
		case 4: /* Steady Underline */
 | 
			
		||||
			XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
					borderpx + cx * win.cw,
 | 
			
		||||
					borderpx + (cy + 1) * win.ch - \
 | 
			
		||||
					win.hborderpx + cx * win.cw,
 | 
			
		||||
					win.vborderpx + (cy + 1) * win.ch - \
 | 
			
		||||
						cursorthickness,
 | 
			
		||||
					win.cw, cursorthickness);
 | 
			
		||||
			break;
 | 
			
		||||
		case 5: /* Blinking bar */
 | 
			
		||||
		case 6: /* Steady bar */
 | 
			
		||||
			XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
					borderpx + cx * win.cw,
 | 
			
		||||
					borderpx + cy * win.ch,
 | 
			
		||||
					win.hborderpx + cx * win.cw,
 | 
			
		||||
					win.vborderpx + cy * win.ch,
 | 
			
		||||
					cursorthickness, win.ch);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
				borderpx + cx * win.cw,
 | 
			
		||||
				borderpx + cy * win.ch,
 | 
			
		||||
				win.hborderpx + cx * win.cw,
 | 
			
		||||
				win.vborderpx + cy * win.ch,
 | 
			
		||||
				win.cw - 1, 1);
 | 
			
		||||
		XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
				borderpx + cx * win.cw,
 | 
			
		||||
				borderpx + cy * win.ch,
 | 
			
		||||
				win.hborderpx + cx * win.cw,
 | 
			
		||||
				win.vborderpx + cy * win.ch,
 | 
			
		||||
				1, win.ch - 1);
 | 
			
		||||
		XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
				borderpx + (cx + 1) * win.cw - 1,
 | 
			
		||||
				borderpx + cy * win.ch,
 | 
			
		||||
				win.hborderpx + (cx + 1) * win.cw - 1,
 | 
			
		||||
				win.vborderpx + cy * win.ch,
 | 
			
		||||
				1, win.ch - 1);
 | 
			
		||||
		XftDrawRect(xw.draw, &drawcol,
 | 
			
		||||
				borderpx + cx * win.cw,
 | 
			
		||||
				borderpx + (cy + 1) * win.ch - 1,
 | 
			
		||||
				win.hborderpx + cx * win.cw,
 | 
			
		||||
				win.vborderpx + (cy + 1) * win.ch - 1,
 | 
			
		||||
				win.cw, 1);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1617,6 +1727,9 @@ xseticontitle(char *p)
 | 
			
		||||
	XTextProperty prop;
 | 
			
		||||
	DEFAULT(p, opt_title);
 | 
			
		||||
 | 
			
		||||
	if (p[0] == '\0')
 | 
			
		||||
		p = opt_title;
 | 
			
		||||
 | 
			
		||||
	if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
 | 
			
		||||
	                                &prop) != Success)
 | 
			
		||||
		return;
 | 
			
		||||
@ -1631,6 +1744,9 @@ xsettitle(char *p)
 | 
			
		||||
	XTextProperty prop;
 | 
			
		||||
	DEFAULT(p, opt_title);
 | 
			
		||||
 | 
			
		||||
	if (p[0] == '\0')
 | 
			
		||||
		p = opt_title;
 | 
			
		||||
 | 
			
		||||
	if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
 | 
			
		||||
	                                &prop) != Success)
 | 
			
		||||
		return;
 | 
			
		||||
@ -1850,6 +1966,12 @@ kpress(XEvent *ev)
 | 
			
		||||
	} else {
 | 
			
		||||
		len = XLookupString(e, buf, sizeof buf, &ksym, NULL);
 | 
			
		||||
	}
 | 
			
		||||
	if ( IS_SET(MODE_KBDSELECT) ) {
 | 
			
		||||
		if ( match(XK_NO_MOD, e->state) ||
 | 
			
		||||
		     (XK_Shift_L | XK_Shift_R) & e->state )
 | 
			
		||||
			win.mode ^= trt_kbdselect(ksym, buf, len);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	/* 1. shortcuts */
 | 
			
		||||
	for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
 | 
			
		||||
		if (ksym == bp->keysym && match(bp->mod, e->state)) {
 | 
			
		||||
@ -2027,6 +2149,14 @@ usage(void)
 | 
			
		||||
	    " [stty_args ...]\n", argv0, argv0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void toggle_winmode(int flag) {
 | 
			
		||||
	win.mode ^= flag;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void keyboard_select(const Arg *dummy) {
 | 
			
		||||
	win.mode ^= trt_kbdselect(-1, NULL, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user