# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit a80f3ae5ce9bc3b294eb831fac8cba411880e605
    parent 151082c8e5c4d306a462ace20c94936c7d7f1ae7
    Author: c0dev0id <sh+github@codevoid.de>
    Date:   Sun, 19 Sep 2021 08:31:43 +0200

    sdk - adapt geometry anysize patch

    Diffstat:
    Mconfig.def.h | 13+++++++++++++
    Mconfig.h | 13+++++++++++++
    Mx.c | 96++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------

    3 files changed, 94 insertions(+), 28 deletions(-)
    diff --git a/config.def.h b/config.def.h
    @@ -166,6 +166,12 @@ static unsigned int defaultrcs = 257;
     static unsigned int cursorshape = 2;

     /*
    + * Whether to use pixel geometry or cell geometry
    + */
    +
    +static Geometry geometry = CellGeometry;
    +
    +/*
      * Default columns and rows numbers
      */

    @@ -173,6 +179,13 @@ static unsigned int cols = 80;
     static unsigned int rows = 24;

     /*
    + * Default width and height (including borders!)
    + */
    +
    +static unsigned int width = 564;
    +static unsigned int height = 364;
    +
    +/*
      * Default colour and shape of the mouse cursor
      */
     static unsigned int mouseshape = XC_xterm;
    diff --git a/config.h b/config.h
    @@ -165,6 +165,12 @@ static unsigned int defaultrcs = 257;
     static unsigned int cursorshape = 2;

     /*
    + * Whether to use pixel geometry or cell geometry
    + */
    +
    +static Geometry geometry = AnySize;
    +
    +/*
      * Default columns and rows numbers
      */

    @@ -172,6 +178,13 @@ static unsigned int cols = 80;
     static unsigned int rows = 24;

     /*
    + * Default width and height (including borders!)
    + */
    +
    +static unsigned int width = 564;
    +static unsigned int height = 364;
    +
    +/*
      * Default colour and shape of the mouse cursor
      */
     static unsigned int mouseshape = XC_xterm;
    diff --git a/x.c b/x.c
    @@ -45,6 +45,12 @@ typedef struct {
     	signed char appcursor; /* application cursor */
     } Key;

    +typedef enum {
    +	PixelGeometry,
    +	CellGeometry,
    +	AnySize
    +} Geometry;
    +
     /* X modifiers */
     #define XK_ANY_MOD    UINT_MAX
     #define XK_NO_MOD     0
    @@ -81,6 +87,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 cyo; /* char y offset */
    @@ -335,7 +342,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;
     }
    @@ -343,7 +350,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;
     }
    @@ -727,6 +734,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);
    @@ -850,8 +860,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;
    @@ -1204,7 +1214,7 @@ xicdestroy(XIC xim, XPointer client, XPointer call)
     }

     void
    -xinit(int cols, int rows)
    +xinit(int w, int h)
     {
     	XGCValues gcvalues;
     	Cursor cursor;
    @@ -1232,8 +1242,20 @@ xinit(int cols, int rows)
     	xloadcols();

     	/* adjust fixed window geometry */
    -	win.w = 2 * borderpx + cols * win.cw;
    -	win.h = 2 * borderpx + rows * win.ch;
    +	switch (geometry) {
    +	case CellGeometry:
    +		win.w = 2 * borderpx + w * win.cw;
    +		win.h = 2 * borderpx + h * win.ch;
    +		break;
    +	case PixelGeometry:
    +		win.w = w;
    +		win.h = h;
    +		break;
    +	case AnySize:
    +		win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw;
    +		win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch;
    +		break;
    +	}
     	if (xw.gm & XNegative)
     		xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
     	if (xw.gm & YNegative)
    @@ -1324,7 +1346,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;
    @@ -1462,7 +1484,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;
    @@ -1552,17 +1574,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.vborderpx,
     			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. */
    @@ -1749,35 +1771,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);
     	}
     }
    @@ -2246,6 +2268,12 @@ main(int argc, char *argv[])
     	case 'g':
     		xw.gm = XParseGeometry(EARGF(usage()),
     				&xw.l, &xw.t, &cols, &rows);
    +		geometry = CellGeometry;
    +		break;
    +	case 'G':
    +		xw.gm = XParseGeometry(EARGF(usage()),
    +				&xw.l, &xw.t, &width, &height);
    +		geometry = PixelGeometry;
     		break;
     	case 'i':
     		xw.isfixed = 1;
    @@ -2282,10 +2310,22 @@ run:

     	setlocale(LC_CTYPE, "");
     	XSetLocaleModifiers("");
    +	switch (geometry) {
    +	case CellGeometry:
    +		xinit(cols, rows);
    +		break;
    +	case AnySize:
    +		xinit(cols, rows);
    +		break;
    +	case PixelGeometry:
    +		xinit(width, height);
    +		cols = (win.w - 2 * borderpx) / win.cw;
    +		rows = (win.h - 2 * borderpx) / win.ch;
    +		break;
    +	}
     	cols = MAX(cols, 1);
     	rows = MAX(rows, 1);
     	tnew(cols, rows);
    -	xinit(cols, rows);
     	xsetenv();
     	selinit();
     	run();