[hackers] [st] Remove x.c dependency on term || Devin J. Pohly

From: <git_AT_suckless.org>
Date: Fri, 9 Mar 2018 15:37:39 +0100 (CET)

commit a3beb626d2dae9d4d0883c7c8cb6ba58b0609105
Author: Devin J. Pohly <djpohly_AT_gmail.com>
AuthorDate: Sat Feb 24 15:32:48 2018 -0600
Commit: Devin J. Pohly <djpohly_AT_gmail.com>
CommitDate: Sun Feb 25 21:56:26 2018 -0600

    Remove x.c dependency on term
    
    The xinit function only needs to the rows/cols, so pass those in rather
    than accessing term directly. With a bit of arithmetic, we are able to
    avoid the need for term.row and term.col in x2col, y2row, and
    xdrawglyphfontspecs as well, completing the removal.
    
    Term is now fully internal to st.c.
    
    Signed-off-by: Devin J. Pohly <djpohly_AT_gmail.com>

diff --git a/st.c b/st.c
index 4bf6378..da832ed 100644
--- a/st.c
+++ b/st.c
_AT_@ -95,6 +95,26 @@ enum escape_state {
         ESC_DCS =128,
 };
 
+/* Internal representation of the screen */
+typedef struct {
+ int row; /* nb row */
+ int col; /* nb col */
+ Line *line; /* screen */
+ Line *alt; /* alternate screen */
+ int *dirty; /* dirtyness of lines */
+ TCursor c; /* cursor */
+ int ocx; /* old cursor col */
+ int ocy; /* old cursor row */
+ int top; /* top scroll limit */
+ int bot; /* bottom scroll limit */
+ int mode; /* terminal mode flags */
+ int esc; /* escape state flags */
+ char trantbl[4]; /* charset table translation */
+ int charset; /* current charset */
+ int icharset; /* selected charset for sequence */
+ int *tabs;
+} Term;
+
 /* CSI Escape sequence structs */
 /* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */
 typedef struct {
_AT_@ -181,11 +201,11 @@ static char *base64dec(const char *);
 static ssize_t xwrite(int, const char *, size_t);
 
 /* Globals */
-Term term;
 int cmdfd;
 pid_t pid;
 int oldbutton = 3; /* button event on startup: 3 = release */
 
+static Term term;
 static Selection sel;
 static CSIEscape csiescseq;
 static STREscape strescseq;
diff --git a/st.h b/st.h
index 27c48cf..b5bc1b5 100644
--- a/st.h
+++ b/st.h
_AT_@ -76,26 +76,6 @@ typedef struct {
         char state;
 } TCursor;
 
-/* Internal representation of the screen */
-typedef struct {
- int row; /* nb row */
- int col; /* nb col */
- Line *line; /* screen */
- Line *alt; /* alternate screen */
- int *dirty; /* dirtyness of lines */
- TCursor c; /* cursor */
- int ocx; /* old cursor col */
- int ocy; /* old cursor row */
- int top; /* top scroll limit */
- int bot; /* bottom scroll limit */
- int mode; /* terminal mode flags */
- int esc; /* escape state flags */
- char trantbl[4]; /* charset table translation */
- int charset; /* current charset */
- int icharset; /* selected charset for sequence */
- int *tabs;
-} Term;
-
 /* Purely graphic info */
 typedef struct {
         int tw, th; /* tty width and height */
_AT_@ -168,7 +148,6 @@ void *xrealloc(void *, size_t);
 char *xstrdup(char *);
 
 /* Globals */
-extern Term term;
 extern int cmdfd;
 extern pid_t pid;
 extern int oldbutton;
diff --git a/x.c b/x.c
index d205ca7..873ff08 100644
--- a/x.c
+++ b/x.c
_AT_@ -130,7 +130,7 @@ static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int);
 static void xdrawglyph(Glyph, int, int);
 static void xclear(int, int, int, int);
 static int xgeommasktogravity(int);
-static void xinit(void);
+static void xinit(int, int);
 static void cresize(int, int);
 static void xresize(int, int);
 static int xloadfont(Font *, FcPattern *);
_AT_@ -299,18 +299,16 @@ int
 x2col(int x)
 {
         x -= borderpx;
- x /= win.cw;
-
- return LIMIT(x, 0, term.col-1);
+ LIMIT(x, 0, win.tw - 1);
+ return x / win.cw;
 }
 
 int
 y2row(int y)
 {
         y -= borderpx;
- y /= win.ch;
-
- return LIMIT(y, 0, term.row-1);
+ LIMIT(y, 0, win.th - 1);
+ return y / win.ch;
 }
 
 void
_AT_@ -984,7 +982,7 @@ xunloadfonts(void)
 }
 
 void
-xinit(void)
+xinit(int cols, int rows)
 {
         XGCValues gcvalues;
         Cursor cursor;
_AT_@ -1009,8 +1007,8 @@ xinit(void)
         xloadcols();
 
         /* adjust fixed window geometry */
- win.w = 2 * borderpx + term.col * win.cw;
- win.h = 2 * borderpx + term.row * win.ch;
+ win.w = 2 * borderpx + cols * win.cw;
+ win.h = 2 * borderpx + rows * win.ch;
         if (xw.gm & XNegative)
                 xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
         if (xw.gm & YNegative)
_AT_@ -1042,7 +1040,7 @@ xinit(void)
         XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
 
         /* font spec buffer */
- xw.specbuf = xmalloc(term.col * sizeof(GlyphFontSpec));
+ xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec));
 
         /* Xft rendering context */
         xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap);
_AT_@ -1337,15 +1335,16 @@ 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,
- winy + win.ch + ((y >= term.row-1)? win.h : 0));
+ winy + win.ch +
+ ((winy + win.ch >= borderpx + win.th)? win.h : 0));
         }
- if (x + charlen >= term.col) {
+ if (winx + width >= borderpx + win.tw) {
                 xclear(winx + width, (y == 0)? 0 : winy, win.w,
- ((y >= term.row-1)? win.h : (winy + win.ch)));
+ ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch)));
         }
         if (y == 0)
                 xclear(winx, 0, winx + width, borderpx);
- if (y == term.row-1)
+ if (winy + win.ch >= borderpx + win.th)
                 xclear(winx, winy + win.ch, winx + width, win.h);
 
         /* Clean up the region we want to draw to. */
_AT_@ -1930,8 +1929,10 @@ run:
         }
         setlocale(LC_CTYPE, "");
         XSetLocaleModifiers("");
- tnew(MAX(cols, 1), MAX(rows, 1));
- xinit();
+ cols = MAX(cols, 1);
+ rows = MAX(rows, 1);
+ tnew(cols, rows);
+ xinit(cols, rows);
         xsetenv();
         selinit();
         run();
Received on Fri Mar 09 2018 - 15:37:39 CET

This archive was generated by hypermail 2.3.0 : Fri Mar 09 2018 - 15:51:00 CET