some work on using drw.c done - sent - simple plaintext presentation tool
 (HTM) git clone git://git.suckless.org/sent
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit de1dc79944848f4f27537df3600f6adf35f4e76a
 (DIR) parent da9f788877f950752eca4b0b8cad6eb8817d5cfd
 (HTM) Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Thu,  9 Apr 2015 19:23:31 +0200
       
       some work on using drw.c done
       
       Diffstat:
         M config.def.h                        |       2 +-
         M sent.c                              |     121 ++++++++++++++++++++-----------
       
       2 files changed, 80 insertions(+), 43 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -1,7 +1,7 @@
        /* See LICENSE file for copyright and license details. */
        
        /* The three fields set to 0 have to stay that way for a scalable font */
       -static char font[] = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*";
       +static char *font = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*";
        #define NUMFONTS 30
        #define FONTSZ(x) ((int)(100.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTS-1] */
        
 (DIR) diff --git a/sent.c b/sent.c
       @@ -22,6 +22,7 @@ char *argv0;
        /* macros */
        #define LEN(a)     (sizeof(a) / sizeof(a)[0])
        #define LIMIT(x, a, b)    (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
       +#define MAXFONTSTRLEN 128
        
        typedef enum {
                NONE = 0,
       @@ -95,6 +96,7 @@ static XFontStruct *xloadqueryscalablefont(char *name, int size);
        static struct DC *getfontsize(char *str, size_t len, int *width, int *height);
        static void cleanup(struct DC *cur);
        static void eprintf(const char *, ...);
       +static void die(const char *, ...);
        static void load(FILE *fp);
        static void advance(const Arg *arg);
        static void quit(const Arg *arg);
       @@ -124,7 +126,6 @@ static struct DC dc;
        static Drw *d = NULL;
        static ClrScheme sc;
        static int running = 1;
       -static char *opt_font = NULL;
        
        static void (*handler[LASTEvent])(XEvent *) = {
                [ButtonPress] = bpress,
       @@ -311,7 +312,7 @@ void pngdraw(struct image *img)
        {
                int xoffset = (xw.w - img->ximg->width) / 2;
                int yoffset = (xw.h - img->ximg->height) / 2;
       -        XPutImage(xw.dpy, xw.win, dc.gc, img->ximg, 0, 0,
       +        XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0,
                                xoffset, yoffset, img->ximg->width, img->ximg->height);
                XFlush(xw.dpy);
                img->state |= DRAWN;
       @@ -401,8 +402,8 @@ struct DC *getfontsize(char *str, size_t len, int *width, int *height)
        
        void cleanup(struct DC *cur)
        {
       -        XFreeFont(xw.dpy, cur->font);
       -        XFreeGC(xw.dpy, cur->gc);
       +//        XFreeFont(xw.dpy, cur->font);
       +//        XFreeGC(xw.dpy, cur->gc);
        
                if (cur->next) {
                        cleanup(cur->next);
       @@ -427,6 +428,23 @@ void cleanup(struct DC *cur)
                }
        }
        
       +void die(const char *fmt, ...)
       +{
       +        va_list ap;
       +
       +        va_start(ap, fmt);
       +        vfprintf(stderr, fmt, ap);
       +        va_end(ap);
       +
       +        if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
       +                fputc(' ', stderr);
       +                perror(NULL);
       +        } else {
       +                fputc('\n', stderr);
       +        }
       +        exit(1);
       +}
       +
        void eprintf(const char *fmt, ...)
        {
                va_list ap;
       @@ -441,7 +459,6 @@ void eprintf(const char *fmt, ...)
                } else {
                        fputc('\n', stderr);
                }
       -        exit(EXIT_FAILURE);
        }
        
        void load(FILE *fp)
       @@ -529,9 +546,9 @@ void usage()
        void xdraw()
        {
                int line_len = strlen(slides[idx].text);
       -        int height;
       -        int width;
       -        struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
       +//        int height;
       +//        int width;
       +//        struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
                struct image *im = slides[idx].img;
        
                XClearWindow(xw.dpy, xw.win);
       @@ -539,7 +556,7 @@ void xdraw()
                if (!im) {
        //                XDrawString(xw.dpy, xw.win, dc->gc, (xw.w - width)/2, (xw.h + height)/2,
        //                                slides[idx].text, line_len);
       -                drw_text(d, (xw.w - width)/2, (xw.h + height)/2, 100, 20, slides[idx].text, line_len);
       +                drw_text(d, xw.w/2, xw.h/2, 1000, 200, slides[idx].text, 0);
                        drw_map(d, xw.win, 0, 0, xw.w, xw.h);
                } else if (!(im->state & LOADED) && !pngread(im))
                        eprintf("could not read image %s", slides[idx].text + 1);
       @@ -597,7 +614,7 @@ void xinit()
                sc.fg = drw_clr_create(d, "#000000");
                drw_setscheme(d, &sc);
        
       -        xloadfonts(opt_font ? opt_font : font);
       +        xloadfonts(font);
        
                XStringListToTextProperty(&argv0, 1, &prop);
                XSetWMName(xw.dpy, xw.win, &prop);
       @@ -615,41 +632,61 @@ void xloadfonts(char *fontstr)
                XFontStruct *fnt;
                XGCValues gcvalues;
                struct DC *cur = &dc;
       -        char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
       -
       -        while (count-- && !xfontisscalable(fstr[count]))
       -                ; /* nothing, just get first scalable font result */
       -
       -        if (count < 0)
       -                eprintf("sent: could not find a scalable font matching %s", fontstr);
       -
       -        memset(&gcvalues, 0, sizeof(gcvalues));
       +//        char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
       +        char *fstrs;
       +        const char **fonts;
       +
       +        if (!(fstrs = malloc(NUMFONTS * MAXFONTSTRLEN)))
       +                die("could not malloc fontstrings");
       +        if (!(fonts = malloc(NUMFONTS * sizeof(char*)))) {
       +                free(fstrs);
       +                die("could not malloc fontarray");
       +        }
        
       -        const char *fonts[] = {
       -                "Sans:size=10.5",
       +/*        const char *fonts[] = {
       +                "Sans:size=80:size=10.5",
                        "VL Gothic:size=10.5",
                        "WenQuanYi Micro Hei:size=10.5",
       -        };
       -        drw_load_fonts(d, fonts, LEN(fonts));
       +        }; */
       +//        drw_load_fonts(d, fonts, LEN(fonts));
        
       -        do {
       -                if (!(fnt = xloadqueryscalablefont(fstr[count], FONTSZ(i)))) {
       -                        i++;
       -                        continue;
       -                }
       -
       -                cur->gc = XCreateGC(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, &gcvalues);
       -                cur->font = fnt;
       -                XSetFont(xw.dpy, cur->gc, fnt->fid);
       -                XSetForeground(xw.dpy, cur->gc, BlackPixel(xw.dpy, xw.scr));
       -                cur->next = (++i < NUMFONTS) ? malloc(sizeof(struct DC)) : NULL;
       -                cur = cur->next;
       -        } while (cur && i < NUMFONTS);
       -
       -        if (cur == &dc)
       -                eprintf("sent: could not load fonts.");
       +        for (i = 0; i < NUMFONTS; i++) {
       +                snprintf(&fstrs[i*MAXFONTSTRLEN], MAXFONTSTRLEN, "%s:size=%d", fontstr, FONTSZ(i));
       +                puts(&fstrs[i*MAXFONTSTRLEN]);
       +                fonts[i] = &fstrs[i*MAXFONTSTRLEN];
       +        }
        
       -        XFreeFontNames(fstr);
       +        drw_load_fonts(d, fonts, NUMFONTS);
       +
       +        free(fstrs);
       +        free(fonts);
       +
       +//        while (count-- && !xfontisscalable(fstr[count]))
       +//                ; /* nothing, just get first scalable font result */
       +//
       +//        if (count < 0)
       +//                eprintf("sent: could not find a scalable font matching %s", fontstr);
       +//
       +//        memset(&gcvalues, 0, sizeof(gcvalues));
       +//
       +//        do {
       +//                if (!(fnt = xloadqueryscalablefont(fstr[count], FONTSZ(i)))) {
       +//                        i++;
       +//                        continue;
       +//                }
       +//
       +//                cur->gc = XCreateGC(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, &gcvalues);
       +//                cur->font = fnt;
       +//                XSetFont(xw.dpy, cur->gc, fnt->fid);
       +//                XSetForeground(xw.dpy, cur->gc, BlackPixel(xw.dpy, xw.scr));
       +//                cur->next = (++i < NUMFONTS) ? malloc(sizeof(struct DC)) : NULL;
       +//                cur = cur->next;
       +//        } while (cur && i < NUMFONTS);
       +//
       +//        if (cur == &dc)
       +//                eprintf("sent: could not load fonts.");
       +//
       +//        XFreeFontNames(fstr);
        }
        
        void bpress(XEvent *e)
       @@ -700,7 +737,7 @@ int main(int argc, char *argv[])
        
                ARGBEGIN {
                case 'f':
       -                opt_font = EARGF(usage());
       +                font = EARGF(usage());
                        break;
                case 'v':
                default:
       @@ -712,7 +749,7 @@ int main(int argc, char *argv[])
                                load(fp);
                                fclose(fp);
                        } else {
       -                        eprintf("could not open file %s for reading:", argv[i]);
       +                        eprintf("could not open %s for reading:", argv[i]);
                        }
                }