some work on using drw.c done
This commit is contained in:
parent
da9f788877
commit
de1dc79944
@ -1,7 +1,7 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
|
||||||
/* The three fields set to 0 have to stay that way for a scalable font */
|
/* 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 NUMFONTS 30
|
||||||
#define FONTSZ(x) ((int)(100.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTS-1] */
|
#define FONTSZ(x) ((int)(100.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTS-1] */
|
||||||
|
|
||||||
|
121
sent.c
121
sent.c
@ -22,6 +22,7 @@ char *argv0;
|
|||||||
/* macros */
|
/* macros */
|
||||||
#define LEN(a) (sizeof(a) / sizeof(a)[0])
|
#define LEN(a) (sizeof(a) / sizeof(a)[0])
|
||||||
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
|
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
|
||||||
|
#define MAXFONTSTRLEN 128
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NONE = 0,
|
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 struct DC *getfontsize(char *str, size_t len, int *width, int *height);
|
||||||
static void cleanup(struct DC *cur);
|
static void cleanup(struct DC *cur);
|
||||||
static void eprintf(const char *, ...);
|
static void eprintf(const char *, ...);
|
||||||
|
static void die(const char *, ...);
|
||||||
static void load(FILE *fp);
|
static void load(FILE *fp);
|
||||||
static void advance(const Arg *arg);
|
static void advance(const Arg *arg);
|
||||||
static void quit(const Arg *arg);
|
static void quit(const Arg *arg);
|
||||||
@ -124,7 +126,6 @@ static struct DC dc;
|
|||||||
static Drw *d = NULL;
|
static Drw *d = NULL;
|
||||||
static ClrScheme sc;
|
static ClrScheme sc;
|
||||||
static int running = 1;
|
static int running = 1;
|
||||||
static char *opt_font = NULL;
|
|
||||||
|
|
||||||
static void (*handler[LASTEvent])(XEvent *) = {
|
static void (*handler[LASTEvent])(XEvent *) = {
|
||||||
[ButtonPress] = bpress,
|
[ButtonPress] = bpress,
|
||||||
@ -311,7 +312,7 @@ void pngdraw(struct image *img)
|
|||||||
{
|
{
|
||||||
int xoffset = (xw.w - img->ximg->width) / 2;
|
int xoffset = (xw.w - img->ximg->width) / 2;
|
||||||
int yoffset = (xw.h - img->ximg->height) / 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);
|
xoffset, yoffset, img->ximg->width, img->ximg->height);
|
||||||
XFlush(xw.dpy);
|
XFlush(xw.dpy);
|
||||||
img->state |= DRAWN;
|
img->state |= DRAWN;
|
||||||
@ -401,8 +402,8 @@ struct DC *getfontsize(char *str, size_t len, int *width, int *height)
|
|||||||
|
|
||||||
void cleanup(struct DC *cur)
|
void cleanup(struct DC *cur)
|
||||||
{
|
{
|
||||||
XFreeFont(xw.dpy, cur->font);
|
// XFreeFont(xw.dpy, cur->font);
|
||||||
XFreeGC(xw.dpy, cur->gc);
|
// XFreeGC(xw.dpy, cur->gc);
|
||||||
|
|
||||||
if (cur->next) {
|
if (cur->next) {
|
||||||
cleanup(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, ...)
|
void eprintf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -441,7 +459,6 @@ void eprintf(const char *fmt, ...)
|
|||||||
} else {
|
} else {
|
||||||
fputc('\n', stderr);
|
fputc('\n', stderr);
|
||||||
}
|
}
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void load(FILE *fp)
|
void load(FILE *fp)
|
||||||
@ -529,9 +546,9 @@ void usage()
|
|||||||
void xdraw()
|
void xdraw()
|
||||||
{
|
{
|
||||||
int line_len = strlen(slides[idx].text);
|
int line_len = strlen(slides[idx].text);
|
||||||
int height;
|
// int height;
|
||||||
int width;
|
// int width;
|
||||||
struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
|
// struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
|
||||||
struct image *im = slides[idx].img;
|
struct image *im = slides[idx].img;
|
||||||
|
|
||||||
XClearWindow(xw.dpy, xw.win);
|
XClearWindow(xw.dpy, xw.win);
|
||||||
@ -539,7 +556,7 @@ void xdraw()
|
|||||||
if (!im) {
|
if (!im) {
|
||||||
// XDrawString(xw.dpy, xw.win, dc->gc, (xw.w - width)/2, (xw.h + height)/2,
|
// XDrawString(xw.dpy, xw.win, dc->gc, (xw.w - width)/2, (xw.h + height)/2,
|
||||||
// slides[idx].text, line_len);
|
// 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);
|
drw_map(d, xw.win, 0, 0, xw.w, xw.h);
|
||||||
} else if (!(im->state & LOADED) && !pngread(im))
|
} else if (!(im->state & LOADED) && !pngread(im))
|
||||||
eprintf("could not read image %s", slides[idx].text + 1);
|
eprintf("could not read image %s", slides[idx].text + 1);
|
||||||
@ -597,7 +614,7 @@ void xinit()
|
|||||||
sc.fg = drw_clr_create(d, "#000000");
|
sc.fg = drw_clr_create(d, "#000000");
|
||||||
drw_setscheme(d, &sc);
|
drw_setscheme(d, &sc);
|
||||||
|
|
||||||
xloadfonts(opt_font ? opt_font : font);
|
xloadfonts(font);
|
||||||
|
|
||||||
XStringListToTextProperty(&argv0, 1, &prop);
|
XStringListToTextProperty(&argv0, 1, &prop);
|
||||||
XSetWMName(xw.dpy, xw.win, &prop);
|
XSetWMName(xw.dpy, xw.win, &prop);
|
||||||
@ -615,41 +632,61 @@ void xloadfonts(char *fontstr)
|
|||||||
XFontStruct *fnt;
|
XFontStruct *fnt;
|
||||||
XGCValues gcvalues;
|
XGCValues gcvalues;
|
||||||
struct DC *cur = &dc;
|
struct DC *cur = &dc;
|
||||||
char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
|
// char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
|
||||||
|
char *fstrs;
|
||||||
|
const char **fonts;
|
||||||
|
|
||||||
while (count-- && !xfontisscalable(fstr[count]))
|
if (!(fstrs = malloc(NUMFONTS * MAXFONTSTRLEN)))
|
||||||
; /* nothing, just get first scalable font result */
|
die("could not malloc fontstrings");
|
||||||
|
if (!(fonts = malloc(NUMFONTS * sizeof(char*)))) {
|
||||||
if (count < 0)
|
free(fstrs);
|
||||||
eprintf("sent: could not find a scalable font matching %s", fontstr);
|
die("could not malloc fontarray");
|
||||||
|
|
||||||
memset(&gcvalues, 0, sizeof(gcvalues));
|
|
||||||
|
|
||||||
const char *fonts[] = {
|
|
||||||
"Sans:size=10.5",
|
|
||||||
"VL Gothic:size=10.5",
|
|
||||||
"WenQuanYi Micro Hei:size=10.5",
|
|
||||||
};
|
|
||||||
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);
|
/* const char *fonts[] = {
|
||||||
cur->font = fnt;
|
"Sans:size=80:size=10.5",
|
||||||
XSetFont(xw.dpy, cur->gc, fnt->fid);
|
"VL Gothic:size=10.5",
|
||||||
XSetForeground(xw.dpy, cur->gc, BlackPixel(xw.dpy, xw.scr));
|
"WenQuanYi Micro Hei:size=10.5",
|
||||||
cur->next = (++i < NUMFONTS) ? malloc(sizeof(struct DC)) : NULL;
|
}; */
|
||||||
cur = cur->next;
|
// drw_load_fonts(d, fonts, LEN(fonts));
|
||||||
} while (cur && i < NUMFONTS);
|
|
||||||
|
|
||||||
if (cur == &dc)
|
for (i = 0; i < NUMFONTS; i++) {
|
||||||
eprintf("sent: could not load fonts.");
|
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)
|
void bpress(XEvent *e)
|
||||||
@ -700,7 +737,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
ARGBEGIN {
|
ARGBEGIN {
|
||||||
case 'f':
|
case 'f':
|
||||||
opt_font = EARGF(usage());
|
font = EARGF(usage());
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
default:
|
default:
|
||||||
@ -712,7 +749,7 @@ int main(int argc, char *argv[])
|
|||||||
load(fp);
|
load(fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
} else {
|
} else {
|
||||||
eprintf("could not open file %s for reading:", argv[i]);
|
eprintf("could not open %s for reading:", argv[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user