Xinqi Bao's Git

patch: anysize
authorXinqi Bao <[email protected]>
Sun, 13 Mar 2022 14:39:14 +0000 (22:39 +0800)
committerXinqi Bao <[email protected]>
Sun, 13 Mar 2022 14:39:14 +0000 (22:39 +0800)
patches/st-anysize-0.8.4.diff [new file with mode: 0644]
x.c

diff --git a/patches/st-anysize-0.8.4.diff b/patches/st-anysize-0.8.4.diff
new file mode 100644 (file)
index 0000000..2f9a291
--- /dev/null
@@ -0,0 +1,152 @@
+diff --git a/x.c b/x.c
+index 8bf998e..e2cda07 100644
+--- a/x.c
++++ b/x.c
+@@ -81,6 +81,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 */
+@@ -331,7 +332,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 +340,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;
+ }
+@@ -723,6 +724,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);
+@@ -840,8 +844,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;
+@@ -1123,8 +1127,8 @@ xinit(int cols, int rows)
+       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)
+@@ -1213,7 +1217,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;
+@@ -1346,7 +1350,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;
+@@ -1436,17 +1440,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. */
+@@ -1540,35 +1544,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);
+       }
+ }
diff --git a/x.c b/x.c
index 27e81d1..752348f 100644 (file)
--- a/x.c
+++ b/x.c
@@ -81,6 +81,7 @@ typedef XftGlyphFontSpec GlyphFontSpec;
 typedef struct {
        int tw, th; /* tty width and height */
        int w, h; /* window width and height */
 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 */
        int ch; /* char height */
        int cw; /* char width  */
        int mode; /* window state/mode flags */
@@ -333,7 +334,7 @@ ttysend(const Arg *arg)
 int
 evcol(XEvent *e)
 {
 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;
 }
        LIMIT(x, 0, win.tw - 1);
        return x / win.cw;
 }
@@ -341,7 +342,7 @@ evcol(XEvent *e)
 int
 evrow(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;
 }
        LIMIT(y, 0, win.th - 1);
        return y / win.ch;
 }
@@ -741,6 +742,9 @@ cresize(int width, int height)
        col = MAX(1, col);
        row = MAX(1, row);
 
        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);
        tresize(col, row);
        xresize(col, row);
        ttyresize(win.tw, win.th);
@@ -878,8 +882,8 @@ xhints(void)
        sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
        sizeh->height = win.h;
        sizeh->width = win.w;
        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;
        sizeh->base_height = 2 * borderpx;
        sizeh->base_width = 2 * borderpx;
        sizeh->min_height = win.ch + 2 * borderpx;
@@ -1173,8 +1177,8 @@ xinit(int cols, int rows)
        xloadcols();
 
        /* adjust fixed window geometry */
        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)
        if (xw.gm & XNegative)
                xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
        if (xw.gm & YNegative)
@@ -1259,7 +1263,7 @@ xinit(int cols, int rows)
 int
 xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
 {
 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;
        ushort mode, prevmode = USHRT_MAX;
        Font *font = &dc.font;
        int frcflags = FRC_NORMAL;
@@ -1392,7 +1396,7 @@ void
 xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
 {
        int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1);
 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;
            width = charlen * win.cw;
        Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
        XRenderColor colfg, colbg;
@@ -1482,17 +1486,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
 
        /* Intelligent cleaning up of the borders. */
        if (x == 0) {
 
        /* 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 +
-                       ((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);
-       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. */
                xclear(winx, winy + win.ch, winx + width, win.h);
 
        /* Clean up the region we want to draw to. */
@@ -1586,35 +1590,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,
                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,
                                                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,
                                        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,
                                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,
                                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,
                                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);
        }
 }
                                win.cw, 1);
        }
 }