#!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' )