itFigure out DPI while loading font - xmenu - drop-down menu for X11 Err z3bra.org 70 hgit clone git://git.z3bra.org/xmenu.git URL:git://git.z3bra.org/xmenu.git z3bra.org 70 1Log /scm/xmenu/log.gph z3bra.org 70 1Files /scm/xmenu/files.gph z3bra.org 70 1Refs /scm/xmenu/refs.gph z3bra.org 70 i--- Err z3bra.org 70 1commit cee4923f600997aed880b33c886e4300288169e6 /scm/xmenu/commit/cee4923f600997aed880b33c886e4300288169e6.gph z3bra.org 70 1parent 505a6b3bd489b7d60ead607b4e4755134301b55b /scm/xmenu/commit/505a6b3bd489b7d60ead607b4e4755134301b55b.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Wed, 28 Oct 2020 11:04:52 +0100 Err z3bra.org 70 i Err z3bra.org 70 iFigure out DPI while loading font Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M font.c | 42 +++++++++++++++++++++++++++++-- Err z3bra.org 70 i M font.h | 3 ++- Err z3bra.org 70 i M xmenu.c | 6 +----- Err z3bra.org 70 i Err z3bra.org 70 i3 files changed, 43 insertions(+), 8 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/font.c b/font.c /scm/xmenu/file/font.c.gph z3bra.org 70 it@@ -4,9 +4,42 @@ Err z3bra.org 70 i static FT_Face face; Err z3bra.org 70 i static FT_Library ft; Err z3bra.org 70 i Err z3bra.org 70 i+double Err z3bra.org 70 i+xft_forcedpi(xcb_connection_t *dpy) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ xcb_xrm_database_t *db; Err z3bra.org 70 i+ char *r; Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* try to set DPI from "Xft.dpi" resource */ Err z3bra.org 70 i+ db = xcb_xrm_database_from_default(dpy); Err z3bra.org 70 i+ if (db) { Err z3bra.org 70 i+ xcb_xrm_resource_get_string(db, "Xft.dpi", NULL, &r); Err z3bra.org 70 i+ if (r) Err z3bra.org 70 i+ return strtod(r, NULL); Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ return -1; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+double Err z3bra.org 70 i+xft_getxdpi(xcb_screen_t *screen) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ /* return actual screen DPI */ Err z3bra.org 70 i+ return 25.4 * screen->width_in_pixels/screen->width_in_millimeters; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+double Err z3bra.org 70 i+xft_getydpi(xcb_screen_t *screen) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ /* return actual screen DPI */ Err z3bra.org 70 i+ return 25.4 * screen->height_in_pixels/screen->height_in_millimeters; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+ Err z3bra.org 70 i int Err z3bra.org 70 i-xft_loadfont(char *query, double dpi) Err z3bra.org 70 i+xft_loadfont(xcb_connection_t *dpy, xcb_screen_t *screen, char *query) Err z3bra.org 70 i { Err z3bra.org 70 i+ double dpi[2]; Err z3bra.org 70 i FcResult result; Err z3bra.org 70 i FcPattern *pattern, *match; Err z3bra.org 70 i FcValue index, file, pxsz; Err z3bra.org 70 it@@ -49,7 +82,12 @@ xft_loadfont(char *query, double dpi) Err z3bra.org 70 i if (FT_New_Face(ft, (const char *)file.u.s, index.u.i, &face)) Err z3bra.org 70 i return -1; Err z3bra.org 70 i Err z3bra.org 70 i- FT_Set_Char_Size(face, 0, 64 * pxsz.u.d/(dpi/72.0), dpi, dpi); Err z3bra.org 70 i+ dpi[0] = dpi[1] = xft_forcedpi(dpy); Err z3bra.org 70 i+ if (dpi[0] < 0) { Err z3bra.org 70 i+ dpi[0] = xft_getxdpi(screen); Err z3bra.org 70 i+ dpi[1] = xft_getydpi(screen); Err z3bra.org 70 i+ } Err z3bra.org 70 i+ FT_Set_Char_Size(face, 0, 64 * pxsz.u.d, dpi[0], dpi[1]); Err z3bra.org 70 i Err z3bra.org 70 i FcPatternDestroy(match); Err z3bra.org 70 i Err z3bra.org 70 1diff --git a/font.h b/font.h /scm/xmenu/file/font.h.gph z3bra.org 70 it@@ -9,8 +9,9 @@ Err z3bra.org 70 i Err z3bra.org 70 i #include Err z3bra.org 70 i #include Err z3bra.org 70 i+#include Err z3bra.org 70 i Err z3bra.org 70 i-int xft_loadfont(char *, double); Err z3bra.org 70 i+int xft_loadfont(xcb_connection_t *, xcb_screen_t *, char *); Err z3bra.org 70 i int xft_drawtext(xcb_connection_t *, xcb_drawable_t, int, int, int, char *); Err z3bra.org 70 i size_t xft_txtw(char *); Err z3bra.org 70 i size_t xft_txth(char *); Err z3bra.org 70 1diff --git a/xmenu.c b/xmenu.c /scm/xmenu/file/xmenu.c.gph z3bra.org 70 it@@ -247,7 +247,6 @@ int Err z3bra.org 70 i main(int argc, char *argv[]) Err z3bra.org 70 i { Err z3bra.org 70 i int dflag = 0; Err z3bra.org 70 i- long dpi; Err z3bra.org 70 i char *argv0; Err z3bra.org 70 i Err z3bra.org 70 i ARGBEGIN { Err z3bra.org 70 it@@ -280,10 +279,7 @@ main(int argc, char *argv[]) Err z3bra.org 70 i if (!screen) Err z3bra.org 70 i return -1; Err z3bra.org 70 i Err z3bra.org 70 i- /* 1 inch = 25.4 millimeters */ Err z3bra.org 70 i- dpi = screen->height_in_pixels/screen->height_in_millimeters * 25.4; Err z3bra.org 70 i- Err z3bra.org 70 i- xft_loadfont(font, dpi); Err z3bra.org 70 i+ xft_loadfont(dpy, screen, font); Err z3bra.org 70 i Err z3bra.org 70 i entries = argv; Err z3bra.org 70 i for (nent = 0; nent < (size_t)argc; nent++) { Err z3bra.org 70 .