Module Name: src Committed By: macallan Date: Sat Apr 24 00:15:37 UTC 2021
Modified Files: src/sys/dev/wscons: wsconsio.h src/sys/dev/wsfont: wsfontdev.c Log Message: add an ioctl() to get a list of fonts currently available via wsfont To generate a diff of this commit: cvs rdiff -u -r1.124 -r1.125 src/sys/dev/wscons/wsconsio.h cvs rdiff -u -r1.18 -r1.19 src/sys/dev/wsfont/wsfontdev.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/wscons/wsconsio.h diff -u src/sys/dev/wscons/wsconsio.h:1.124 src/sys/dev/wscons/wsconsio.h:1.125 --- src/sys/dev/wscons/wsconsio.h:1.124 Thu Oct 29 09:08:35 2020 +++ src/sys/dev/wscons/wsconsio.h Sat Apr 24 00:15:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: wsconsio.h,v 1.124 2020/10/29 09:08:35 nia Exp $ */ +/* $NetBSD: wsconsio.h,v 1.125 2021/04/24 00:15:37 macallan Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -684,4 +684,24 @@ struct wsdisplayio_blit { #define WSDISPLAYIO_DOBLIT _IOWR('W', 105, struct wsdisplayio_blit) #define WSDISPLAYIO_WAITBLIT _IOWR('W', 106, struct wsdisplayio_blit) +struct wsdisplayio_fontdesc { + char fd_name[64]; + uint16_t fd_height; + uint16_t fd_width; +}; + +struct wsdisplayio_fontinfo { + uint32_t fi_buffersize; + uint32_t fi_numentries; + struct wsdisplayio_fontdesc *fi_fonts; +}; + +/* + * fill buffer pointed at by fi_fonts with wsdisplayio_fontdesc until either + * full or all fonts are listed + * just return the number of entries needed if fi_fonts is NULL + */ + +#define WSDISPLAYIO_LISTFONTS _IOWR('W', 107, struct wsdisplayio_fontinfo) + #endif /* _DEV_WSCONS_WSCONSIO_H_ */ Index: src/sys/dev/wsfont/wsfontdev.c diff -u src/sys/dev/wsfont/wsfontdev.c:1.18 src/sys/dev/wsfont/wsfontdev.c:1.19 --- src/sys/dev/wsfont/wsfontdev.c:1.18 Fri Jun 23 01:57:40 2017 +++ src/sys/dev/wsfont/wsfontdev.c Sat Apr 24 00:15:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: wsfontdev.c,v 1.18 2017/06/23 01:57:40 macallan Exp $ */ +/* $NetBSD: wsfontdev.c,v 1.19 2021/04/24 00:15:37 macallan Exp $ */ /* * Copyright (c) 2001 @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsfontdev.c,v 1.18 2017/06/23 01:57:40 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsfontdev.c,v 1.19 2021/04/24 00:15:37 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -41,8 +41,14 @@ __KERNEL_RCSID(0, "$NetBSD: wsfontdev.c, #include "ioconf.h" +#ifdef WSFONT_DEBUG +#define DPRINTF printf +#else +#define DPRINTF while (0) printf +#endif static int wsfont_isopen; + void wsfontattach(int n) { @@ -70,6 +76,41 @@ wsfontclose(dev_t dev, int flag, int mod return (0); } +static void +fontmatchfunc(struct wsdisplay_font *f, void *cookie, int fontcookie) +{ + struct wsdisplayio_fontinfo *fi = cookie; + struct wsdisplayio_fontdesc fd; + int offset; + + DPRINTF("%s %dx%d\n", f->name, f->fontwidth, f->fontheight); + if (fi->fi_fonts != NULL && fi->fi_buffersize > 0) { + memset(&fd, 0, sizeof(fd)); + strncpy(fd.fd_name, f->name, sizeof(fd.fd_name) - 1); + fd.fd_width = f->fontwidth; + fd.fd_height = f->fontheight; + offset = sizeof(struct wsdisplayio_fontdesc) * (fi->fi_numentries + 1); + if (offset > fi->fi_buffersize) { + fi->fi_fonts = NULL; + } else + copyout(&fd, &fi->fi_fonts[fi->fi_numentries], + sizeof(struct wsdisplayio_fontdesc)); + } + fi->fi_numentries++; +} + +static int +wsdisplayio_listfonts(struct wsdisplayio_fontinfo *f) +{ + void *addr = f->fi_fonts; + DPRINTF("%s: %d %d\n", __func__, f->fi_buffersize, f->fi_numentries); + f->fi_numentries = 0; + wsfont_walk(fontmatchfunc, f); + /* check if we ran out of buffer space */ + if (f->fi_fonts == NULL && addr != NULL) return ENOMEM; + return 0; +} + static int wsfontioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) @@ -101,6 +142,8 @@ wsfontioctl(dev_t dev, u_long cmd, void free(buf, M_DEVBUF); #undef d return (res); + case WSDISPLAYIO_LISTFONTS: + return wsdisplayio_listfonts(data); default: return (EINVAL); }