57
libi3/dpi.c
57
libi3/dpi.c
@ -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
|
||||
|
Reference in New Issue
Block a user