Source code for ewmh_m2m.window

from contextlib import contextmanager
from typing import Tuple, Optional

from ewmh_m2m.geometry import Geometry
import xpybutil.ewmh
import xpybutil.util
import xpybutil.window


[docs] class ActiveWindow: """Class to manage the currently active window.""" def __init__(self): cookie = xpybutil.ewmh.get_active_window() self.conn = cookie.cookie.conn self.window = cookie.reply()[0] @property def geometry(self) -> Geometry: """Geometry of the window""" g = xpybutil.window.get_geometry(self.window) return Geometry(x=g[0], y=g[1], w=g[2], h=g[3]) @geometry.setter def geometry(self, geometry: Geometry): xpybutil.window.moveresize( self.window, **geometry.__dict__ ) @property def fullscreen(self) -> bool: """Is the window in fullscreen mode""" state = [xpybutil.util.get_atom_name(a) for a in xpybutil.ewmh.get_wm_state(self.window).reply()] return '_NET_WM_STATE_FULLSCREEN' in state @fullscreen.setter def fullscreen(self, state: bool): xpybutil.ewmh.request_wm_state( self.window, int(state), xpybutil.util.get_atom('_NET_WM_STATE_FULLSCREEN') ) @property def maximized(self) -> Tuple[bool, bool]: """Is the window maximized. Returns a boolean 2-tuple: (horizontally maximized?, vertically maximized?).""" state = [xpybutil.util.get_atom_name(a) for a in xpybutil.ewmh.get_wm_state(self.window).reply()] return '_NET_WM_STATE_MAXIMIZED_HORZ' in state, '_NET_WM_STATE_MAXIMIZED_VERT' in state @maximized.setter def maximized(self, state: Tuple[Optional[bool], Optional[bool]]): """Set the maximized state of the window. Pass a boolean 2-tuple (see func:maximized) which can contain None to leave this state unchanged.""" atom = xpybutil.util.get_atom if state[0] and state[1]: xpybutil.ewmh.request_wm_state( self.window, 1, atom('_NET_WM_STATE_MAXIMIZED_HORZ'), atom('_NET_WM_STATE_MAXIMIZED_VERT')) elif state[0]: xpybutil.ewmh.request_wm_state(self.window, 1, atom('_NET_WM_STATE_MAXIMIZED_HORZ')) if state[1] is not None: xpybutil.ewmh.request_wm_state(self.window, 0, atom('_NET_WM_STATE_MAXIMIZED_VERT')) elif state[1]: xpybutil.ewmh.request_wm_state(self.window, 1, atom('_NET_WM_STATE_MAXIMIZED_VERT')) if state[0] is not None: xpybutil.ewmh.request_wm_state(self.window, 0, atom('_NET_WM_STATE_MAXIMIZED_HORZ')) elif state[0] is not None and state[1] is not None: xpybutil.ewmh.request_wm_state( self.window, 0, atom('_NET_WM_STATE_MAXIMIZED_HORZ'), atom('_NET_WM_STATE_MAXIMIZED_VERT')) else: return
[docs] @contextmanager def movable(self): """Context manager to prepare the window to be moved.""" initial_maximized_state = self.maximized initial_fullscreen_state = self.fullscreen self.maximized = (False, False) self.fullscreen = False try: yield self finally: self.maximized = initial_maximized_state self.fullscreen = initial_fullscreen_state self.conn.flush()