Introduction
Introduction Statistics Contact Development Disclaimer Help
tConformity in the -g geometry handling. - st - [fork] customized build of st, …
git clone git://src.adamsgaard.dk/st
Log
Files
Refs
README
LICENSE
---
commit fe31a3f6344b0a1dbe72540aad63812f1edb6c12
parent 6b7f63bac597ca03e18fe63ad522b4d1bded08d1
Author: Christoph Lohmann <[email protected]>
Date: Fri, 25 Apr 2014 22:34:24 +0200
Conformity in the -g geometry handling.
Thanks to Yuri Karaban for suggesting this!
These changes make -g correspond to <cols>x<rows> and honor it so non-tiling
window managers can work with the size hints afterwards. It also adds a -i
flag to force the window size. This is needed so -g keeps being useful in dwm.
Diffstat:
M st.1 | 8 ++++++--
M st.c | 106 +++++++++++++++--------------…
2 files changed, 56 insertions(+), 58 deletions(-)
---
diff --git a/st.1 b/st.1
t@@ -10,6 +10,7 @@ st \- simple terminal
.IR font ]
.RB [ \-g
.IR geometry ]
+.RB [ \-i ]
.RB [ \-o
.IR file ]
.RB [ \-t
t@@ -36,11 +37,14 @@ defines the
to use when st is run.
.TP
.BI \-g " geometry"
-defines the X11 geometry string, which will fixate the height and width of st.
-The form is [=][<width>{xX}<height>][{+-}<xoffset>{+-}<yoffset>]. See
+defines the X11 geometry string.
+The form is [=][<cols>{xX}<rows>][{+-}<xoffset>{+-}<yoffset>]. See
.BR XParseGeometry (3)
for further details.
.TP
+.B \-f
+will fixate the position given with the -g option.
+.TP
.BI \-o " file"
writes all the I/O to
.I file.
diff --git a/st.c b/st.c
t@@ -250,7 +250,8 @@ typedef struct {
XSetWindowAttributes attrs;
int scr;
bool isfixed; /* is fixed geometry? */
- int fx, fy, fw, fh; /* fixed geometry */
+ int l, t; /* left and top offset */
+ int gm; /* geometry mask */
int tw, th; /* tty width and height */
int w, h; /* window width and height */
int ch; /* char height */
t@@ -406,6 +407,7 @@ static void xdrawcursor(void);
static void xinit(void);
static void xloadcols(void);
static int xsetcolorname(int, const char *);
+static int xgeommasktogravity(int);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, double);
static int xloadfontset(Font *);
t@@ -2804,18 +2806,24 @@ xhints(void) {
XSizeHints *sizeh = NULL;
sizeh = XAllocSizeHints();
- if(xw.isfixed == False) {
- sizeh->flags = PSize | PResizeInc | PBaseSize;
- sizeh->height = xw.h;
- sizeh->width = xw.w;
- sizeh->height_inc = xw.ch;
- sizeh->width_inc = xw.cw;
- sizeh->base_height = 2 * borderpx;
- sizeh->base_width = 2 * borderpx;
- } else {
- sizeh->flags = PMaxSize | PMinSize;
- sizeh->min_width = sizeh->max_width = xw.fw;
- sizeh->min_height = sizeh->max_height = xw.fh;
+
+ sizeh->flags = PSize | PResizeInc | PBaseSize;
+ sizeh->height = xw.h;
+ sizeh->width = xw.w;
+ sizeh->height_inc = xw.ch;
+ sizeh->width_inc = xw.cw;
+ sizeh->base_height = 2 * borderpx;
+ sizeh->base_width = 2 * borderpx;
+ if(xw.isfixed == True) {
+ sizeh->flags |= PMaxSize | PMinSize;
+ sizeh->min_width = sizeh->max_width = xw.w;
+ sizeh->min_height = sizeh->max_height = xw.h;
+ }
+ if(xw.gm & (XValue|YValue)) {
+ sizeh->flags |= USPosition | PWinGravity;
+ sizeh->x = xw.l;
+ sizeh->y = xw.t;
+ sizeh->win_gravity = xgeommasktogravity(xw.gm);
}
XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm,
t@@ -2824,6 +2832,19 @@ xhints(void) {
}
int
+xgeommasktogravity(int mask) {
+ switch(mask & (XNegative|YNegative)) {
+ case 0:
+ return NorthWestGravity;
+ case XNegative:
+ return NorthEastGravity;
+ case YNegative:
+ return SouthWestGravity;
+ }
+ return SouthEastGravity;
+}
+
+int
xloadfont(Font *f, FcPattern *pattern) {
FcPattern *match;
FcResult result;
t@@ -2968,7 +2989,6 @@ xinit(void) {
XGCValues gcvalues;
Cursor cursor;
Window parent;
- int sw, sh;
pid_t thispid = getpid();
if(!(xw.dpy = XOpenDisplay(NULL)))
t@@ -2988,23 +3008,12 @@ xinit(void) {
xloadcols();
/* adjust fixed window geometry */
- if(xw.isfixed) {
- sw = DisplayWidth(xw.dpy, xw.scr);
- sh = DisplayHeight(xw.dpy, xw.scr);
- if(xw.fx < 0)
- xw.fx = sw + xw.fx - xw.fw - 1;
- if(xw.fy < 0)
- xw.fy = sh + xw.fy - xw.fh - 1;
-
- xw.h = xw.fh;
- xw.w = xw.fw;
- } else {
- /* window - default size */
- xw.h = 2 * borderpx + term.row * xw.ch;
- xw.w = 2 * borderpx + term.col * xw.cw;
- xw.fx = 0;
- xw.fy = 0;
- }
+ xw.w = 2 * borderpx + term.col * xw.cw;
+ xw.h = 2 * borderpx + term.row * xw.ch;
+ if(xw.gm & XNegative)
+ xw.l += DisplayWidth(xw.dpy, xw.scr) - xw.w - 2;
+ if(xw.gm & YNegative)
+ xw.t += DisplayWidth(xw.dpy, xw.scr) - xw.h - 2;
/* Events */
xw.attrs.background_pixel = dc.col[defaultbg].pixel;
t@@ -3017,7 +3026,7 @@ xinit(void) {
parent = opt_embed ? strtol(opt_embed, NULL, 0) : \
XRootWindow(xw.dpy, xw.scr);
- xw.win = XCreateWindow(xw.dpy, parent, xw.fx, xw.fy,
+ xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
xw.w, xw.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOut…
xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
| CWEventMask | CWColormap, &xw.attrs);
t@@ -3714,10 +3723,7 @@ run(void) {
}
ttynew();
- if(!xw.isfixed)
- cresize(w, h);
- else
- cresize(xw.fw, xw.fh);
+ cresize(w, h);
gettimeofday(&last, NULL);
lastblink = last;
t@@ -3807,11 +3813,10 @@ usage(void) {
int
main(int argc, char *argv[]) {
- int bitm, xr, yr;
- uint wr, hr;
char *titles;
+ uint cols = 80, rows = 24;
- xw.fw = xw.fh = xw.fx = xw.fy = 0;
+ xw.l = xw.t = 0;
xw.isfixed = False;
ARGBEGIN {
t@@ -3835,22 +3840,11 @@ main(int argc, char *argv[]) {
opt_font = EARGF(usage());
break;
case 'g':
- bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr);
- if(bitm & XValue)
- xw.fx = xr;
- if(bitm & YValue)
- xw.fy = yr;
- if(bitm & WidthValue)
- xw.fw = (int)wr;
- if(bitm & HeightValue)
- xw.fh = (int)hr;
- if(bitm & XNegative && xw.fx == 0)
- xw.fx = -1;
- if(bitm & YNegative && xw.fy == 0)
- xw.fy = -1;
-
- if(xw.fh != 0 && xw.fw != 0)
- xw.isfixed = True;
+ xw.gm = XParseGeometry(EARGF(usage()),
+ &xw.l, &xw.t, &cols, &rows);
+ break;
+ case 'i':
+ xw.isfixed = True;
break;
case 'o':
opt_io = EARGF(usage());
t@@ -3869,7 +3863,7 @@ main(int argc, char *argv[]) {
run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
- tnew(80, 24);
+ tnew(cols? cols : 1, rows? rows : 1);
xinit();
selinit();
run();
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.