diff --git a/include/libi3.h b/include/libi3.h index 3815777b..dc5d537f 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -381,3 +381,11 @@ char *get_process_filename(const char *prefix); * Returned value must be freed by the caller. */ char *get_exe_path(const char *argv0); + +/** + * Convert a logical amount of pixels (e.g. 2 pixels on a “standard” 96 DPI + * screen) to a corresponding amount of physical pixels on a standard or retina + * screen, e.g. 5 pixels on a 227 DPI MacBook Pro 13" Retina screen. + * + */ +int logical_px(const int logical); diff --git a/libi3/dpi.c b/libi3/dpi.c new file mode 100644 index 00000000..c015065b --- /dev/null +++ b/libi3/dpi.c @@ -0,0 +1,16 @@ +#include "libi3.h" +#include + +extern xcb_screen_t *root_screen; + +/* + * Convert a logical amount of pixels (e.g. 2 pixels on a “standard” 96 DPI + * screen) to a corresponding amount of physical pixels on a standard or retina + * screen, e.g. 5 pixels on a 227 DPI MacBook Pro 13" Retina screen. + * + */ +int logical_px(const int logical) { + const double dpi = (double)root_screen->height_in_pixels * 25.4 / + (double)root_screen->height_in_millimeters; + return ceil((dpi / 96.0) * logical); +}