Use Xft.dpi for DPI if available.

fixes #2465
This commit is contained in:
Ingo Bürk
2016-09-23 15:09:49 +02:00
parent 1437271e65
commit cb1fcfed6a
8 changed files with 75 additions and 14 deletions

View File

@ -7,6 +7,61 @@
*/
#include "libi3.h"
#include <math.h>
#include <stdlib.h>
#include <xcb/xcb_xrm.h>
static long dpi;
static long init_dpi_fallback(void) {
return (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters;
}
/*
* Initialize the DPI setting.
* This will use the 'Xft.dpi' X resource if available and fall back to
* guessing the correct value otherwise.
*/
void init_dpi(void) {
xcb_xrm_database_t *database = NULL;
if (conn == NULL) {
goto init_dpi_end;
}
database = xcb_xrm_database_from_default(conn);
if (database == NULL) {
ELOG("Failed to open the resource database.\n");
goto init_dpi_end;
}
char *resource;
xcb_xrm_resource_get_string(database, "Xft.dpi", NULL, &resource);
if (resource == NULL) {
DLOG("Resource Xft.dpi not specified, skipping.\n");
goto init_dpi_end;
}
char *endptr;
dpi = strtol(resource, &endptr, 10);
if (dpi == LONG_MAX || dpi == LONG_MIN || dpi < 0 || *endptr != '\0' || endptr == resource) {
ELOG("Xft.dpi = %s is an invalid number and couldn't be parsed.\n", resource);
dpi = 0;
goto init_dpi_end;
}
DLOG("Found Xft.dpi = %ld.\n", dpi);
init_dpi_end:
if (database != NULL) {
xcb_xrm_database_free(database);
}
if (dpi == 0) {
DLOG("Using fallback for calculating DPI.\n");
dpi = init_dpi_fallback();
DLOG("Using dpi = %ld\n", dpi);
}
}
/*
* Convert a logical amount of pixels (e.g. 2 pixels on a “standard” 96 DPI
@ -21,8 +76,6 @@ int logical_px(const int logical) {
return logical;
}
const int dpi = (double)root_screen->height_in_pixels * 25.4 /
(double)root_screen->height_in_millimeters;
/* There are many misconfigurations out there, i.e. systems with screens
* whose dpi is in fact higher than 96 dpi, but not significantly higher,
* so software was never adapted. We could tell people to reconfigure their