Source code for ewmh_m2m.screen
import logging
import math
from typing import Set, Iterable, Dict, List, Optional
import pprint
import xpybutil.xinerama
from ewmh_m2m.geometry import Geometry
from ewmh_m2m.ordinal import Ordinal
_logger = logging.getLogger(__name__)
[docs]
def get_screens() -> Set[Geometry]:
"""Get the list of active screens.
Its geometry represents each screen."""
return {Geometry(x=s[0], y=s[1], w=s[2], h=s[3]) for s in xpybutil.xinerama.get_monitors()}
[docs]
def get_sibling_screens(current: Geometry, screens: Iterable[Geometry]) -> Dict[Ordinal, List[Geometry]]:
"""Given a screen and the list of active screens, return the sibling ones.
Each list is ordered from the nearest screen to the furthest one.
"""
directions = [
(g, current.directions_to(g)) for g in screens if g != current
]
res = {
o: sorted(
[g for g, dirs in directions if o in dirs],
key=lambda g: (
math.hypot(g.x - current.x, g.y - current.y),
(
math.copysign(g.x, o.cos)
if abs(o.cos) > abs(o.sin)
else math.copysign(g.y, o.sin)
),
),
)
for o in Ordinal
}
_logger.debug("siblings of %s:\n%s", current, pprint.pformat(res))
return res
[docs]
def get_sibling_screen(siblings: Dict[Ordinal, List[Geometry]],
direction: Ordinal,
no_wrap: bool) -> Optional[Geometry]:
if siblings[direction]:
return siblings[direction][0]
else:
if not no_wrap and siblings[direction.opposite]:
_logger.debug("Wrapping")
return siblings[direction.opposite][-1]
return None