diff --git a/snippets/calc_ppi.xsh b/snippets/calc_ppi.xsh new file mode 100755 index 00000000..56bbe8b9 --- /dev/null +++ b/snippets/calc_ppi.xsh @@ -0,0 +1,64 @@ +#!env xonsh +''' +Compute the pxs-per-inch (PPI) naively for the local DE. + +NOTE, currently this only supports the `sway`-TWM on wayland. + +!TODO! +- [ ] support Xorg (and possibly other OSs as well? +- [ ] conver this to pure py code, dropping the `.xsh` specifics + instead for `subprocess` API calls? +- [ ] possibly unify all this with `./qt_screen_info.py` as part of + a "PPI config wizard" or something, but more then likely we'll + have lib-ified version inside modden/piker by then? + +''' + +import math +import json + +# XXX, xonsh part using "subprocess mode" +disp_infos: list[dict] = json.loads($(wlr-randr --json)) +lappy: dict = disp_infos[0] + +dims: dict[str, int] = lappy['physical_size'] +w_cm: int = dims['width'] +h_cm: int = dims['height'] + +# cm per inch +cpi: float = 25.4 + +# compute "diagonal" size (aka hypot) +diag_inches: float = math.sqrt((h_cm/cpi)**2 + (w_cm/cpi)**2) + +# compute reso-hypot / inches-hypot +hi_res: dict[str, float|bool] = lappy['modes'][0] +w_px: int = hi_res['width'] +h_px: int = hi_res['height'] + +diag_pxs: float = math.sqrt(h_px**2 + w_px**2) +unscaled_ppi: float = diag_pxs/diag_inches + +# retrieve TWM info on the display (including scaling info) +sway_disp_info: dict = json.loads($(swaymsg -r -t get_outputs))[0] +scale: float = sway_disp_info['scale'] + +print( + f'output: {sway_disp_info["name"]!r}\n' + f'--- DIMENSIONS ---\n' + f'w_cm: {w_cm!r}\n' + f'h_cm: {h_cm!r}\n' + f'w_px: {w_px!r}\n' + f'h_cm: {h_px!r}\n' + f'\n' + f'--- DIAGONALS ---\n' + f'diag_inches: {diag_inches!r}\n' + f'diag_pxs: {diag_pxs!r}\n' + f'\n' + f'--- PPI-related-info ---\n' + f'(DE reported) scale: {scale!r}\n' + f'unscaled PPI: {unscaled_ppi!r}\n' + f'|_ =sqrt(h_px**2 + w_px**2) / sqrt(h_in**2 + w_in**2)\n' + f'scaled PPI: {unscaled_ppi/scale!r}\n' + f'|_ =unscaled_ppi/scale\n' +)