Move font/fontspec variables into x.c and XWindow
[st.git] / x.c
diff --git a/x.c b/x.c
index df2a88c..186e408 100644 (file)
--- a/x.c
+++ b/x.c
 #include <X11/Xft/Xft.h>
 #include <X11/XKBlib.h>
 
+static char *argv0;
 #include "arg.h"
-
-#define Glyph Glyph_
-#define Font Font_
-
-#include "win.h"
 #include "st.h"
+#include "win.h"
 
 /* XEMBED messages */
 #define XEMBED_FOCUS_IN  4
@@ -34,6 +31,7 @@
 
 typedef XftDraw *Draw;
 typedef XftColor Color;
+typedef XftGlyphFontSpec GlyphFontSpec;
 
 /* Purely graphic info */
 typedef struct {
@@ -41,6 +39,7 @@ typedef struct {
        Colormap cmap;
        Window win;
        Drawable buf;
+       GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
        Atom xembed, wmdeletewin, netwmname, netwmpid;
        XIM xim;
        XIC xic;
@@ -58,6 +57,7 @@ typedef struct {
 } XSelection;
 
 /* Font structure */
+#define Font Font_
 typedef struct {
        int height;
        int width;
@@ -87,9 +87,13 @@ static void xdrawglyph(Glyph, int, int);
 static void xclear(int, int, int, int);
 static void xdrawcursor(void);
 static int xgeommasktogravity(int);
+static void xinit(void);
 static int xloadfont(Font *, FcPattern *);
+static void xloadfonts(char *, double);
 static void xunloadfont(Font *);
+static void xunloadfonts(void);
 static void xsetenv(void);
+static void xseturgency(int);
 
 static void expose(XEvent *);
 static void visibility(XEvent *);
@@ -110,6 +114,9 @@ static void selcopy(Time);
 static void getbuttoninfo(XEvent *);
 static void mousereport(XEvent *);
 
+static void run(void);
+static void usage(void);
+
 static void (*handler[LASTEvent])(XEvent *) = {
        [KeyPress] = kpress,
        [ClientMessage] = cmessage,
@@ -158,6 +165,40 @@ typedef struct {
 /* Fontcache is an array now. A new font will be appended to the array. */
 static Fontcache frc[16];
 static int frclen = 0;
+static char *usedfont = NULL;
+static double usedfontsize = 0;
+static double defaultfontsize = 0;
+
+void
+zoom(const Arg *arg)
+{
+       Arg larg;
+
+       larg.f = usedfontsize + arg->f;
+       zoomabs(&larg);
+}
+
+void
+zoomabs(const Arg *arg)
+{
+       xunloadfonts();
+       xloadfonts(usedfont, arg->f);
+       cresize(0, 0);
+       ttyresize();
+       redraw();
+       xhints();
+}
+
+void
+zoomreset(const Arg *arg)
+{
+       Arg larg;
+
+       if (defaultfontsize > 0) {
+               larg.f = defaultfontsize;
+               zoomabs(&larg);
+       }
+}
 
 void
 getbuttoninfo(XEvent *e)
@@ -566,6 +607,9 @@ xresize(int col, int row)
                        DefaultDepth(xw.dpy, xw.scr));
        XftDrawChange(xw.draw, xw.buf);
        xclear(0, 0, win.w, win.h);
+
+       /* resize to new width */
+       xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec));
 }
 
 ushort
@@ -926,6 +970,9 @@ xinit(void)
        XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
        XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
 
+       /* font spec buffer */
+       xw.specbuf = xmalloc(term.col * sizeof(GlyphFontSpec));
+
        /* Xft rendering context */
        xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap);
 
@@ -1417,7 +1464,7 @@ drawregion(int x1, int y1, int x2, int y2)
 
                term.dirty[y] = 0;
 
-               specs = term.specbuf;
+               specs = xw.specbuf;
                numspecs = xmakeglyphfontspecs(specs, &term.line[y][x1], x2 - x1, x1, y);
 
                i = ox = 0;
@@ -1483,9 +1530,12 @@ xseturgency(int add)
 }
 
 void
-xbell(int vol)
+xbell(void)
 {
-       XkbBell(xw.dpy, xw.win, vol, (Atom)NULL);
+       if (!(win.state & WIN_FOCUSED))
+               xseturgency(1);
+       if (bellvolume)
+               XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL);
 }
 
 void
@@ -1698,6 +1748,19 @@ run(void)
        }
 }
 
+void
+usage(void)
+{
+       die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]"
+           " [-n name] [-o file]\n"
+           "          [-T title] [-t title] [-w windowid]"
+           " [[-e] command [args ...]]\n"
+           "       %s [-aiv] [-c class] [-f font] [-g geometry]"
+           " [-n name] [-o file]\n"
+           "          [-T title] [-t title] [-w windowid] -l line"
+           " [stty_args ...]\n", argv0, argv0);
+}
+
 int
 main(int argc, char *argv[])
 {